Hinweis: Dies ist eine Fortsetzung und Überarbeitung meiner anderen Antwort .
Probleme mit der Reduzierung
Erinnern Sie sich an das Entscheidungsproblem:
Gibt es eine perfekte Kachelung für ein gegebenes Raster mit einzigartigen Kacheln?n(n+1)×(n+2)n
Für ein Gitter können wir also nur Variablen verwenden.n(n+1)×(n+2)n
Aber:
- Unsere Reduktion erfordert viele eindeutige Variablen, viel mehr als .O(n)
- Darüber hinaus sind unsere Drähte offen, was zu Folgendem führt:
- Woher wissen wir, dass wir die offenen Bereiche kacheln können?
Um das erste Problem zu lösen, müssen wir das Spielbrett künstlich viel größer machen. Im Wesentlichen machen wir gleich der Anzahl der Variablen, die wir tatsächlich benötigen, erstellen dann ein Raster mit der Größe und platzieren unser Raster in der unteren linken Ecke. Dies führt zu einer quadratischen Explosion.( n + 1 ) × ( n + 2 )n(n+1)×(n+2)
Für das zweite Problem müssen wir unsere Geräte ein wenig überdenken.
Es kann ein wenig entmutigend erscheinen, zu beweisen, dass wir den Rest des Brettes gemäß der Regel erfolgreich kacheln können. Also fangen wir mit der gleichen Strategie an, die man verwenden würde, um Spielbretter der Größe zu generieren :(n+1)×(n+2)
Zuerst generieren wir eine Menge aller möglichen Kacheln. Alle diese Kacheln müssen auf das Brett gelegt werden. Dann entfernen wir die Kacheln und lassen ihre Quadrate zurück.
Unsere Gadgets garantieren jedoch nicht, dass ein bestimmter Kachelsatz platziert wird. die platzierten fliesen hängen vom zustand ab. Daher müssen wir die Minianwendungen sorgfältig modifizieren, um sicherzustellen, dass bestimmte Kacheln entfernt werden, unabhängig davon, welcher Status ausgewählt wurde.
Lassen Sie uns dann über unsere Geräte gehen.
Der Draht und das Klausel-Gate sind aus zwei Gründen problematisch.
- Wir wissen nicht, dass die Quadrate, die einen Draht oder ein Klauseltor umgeben, korrekt gekachelt werden können. Schließlich können einige Drähte nach links und andere nach rechts verschoben werden, und das Kacheln der verbleibenden Leerraumquadrate ist nicht mehr ganz einfach. Wir werden dieses Problem als "Fluss" -Problem bezeichnen.
- Es gibt keine Möglichkeit zu wissen, welche Kacheln aus dem Kachelsatz entfernt werden sollen. In einem Zustand wird eine Gruppe von Quadraten in der Leitung oder in der Klausel nebeneinander angeordnet, in einem anderen Zustand wird eine völlig andere Gruppe von Quadraten nebeneinander angeordnet.
So lösen Sie diese Probleme:
- Zuerst generieren wir eine Menge aller möglichen Kacheln. Alle diese Kacheln müssen auf das Brett gelegt werden. Wenn wir sie auf das Brett legen, entfernen wir die Kacheln aus dem Satz. Obwohl wir zunächst möglicherweise nicht kennen , da wir die Formulierung noch nicht vollständig beschreiben können, können wir bei Bedarf alle neuen Kachel-Möglichkeiten hinzufügen, wenn wir erhöhen. Alle Kacheln, die wir aus diesem Set entfernen, müssen garantiert platzierbar sein (zumindest muss garantiert werden, dass sie platzierbar sind, wenn die Formel erfüllt werden kann). Wir rufen auf, ein Plättchen aus dem Plättchenset zu entfernen, um das Plättchen aus dem Plättchenset zu "entladen", um unsere Verpflichtung zu erfüllen, es auf den Spielplan zu legen.nnn
- Wir müssen die Geräte sorgfältig entwerfen, um sicherzustellen, dass bestimmte Kacheln entfernt werden, unabhängig davon, welches Bundesland ausgewählt wurde.
- Wir müssen unsere Minianwendungen schließen, damit sie je nach Status keine Kacheln um das Spielfeld schieben. vielmehr dürfen alle ihre Staaten nur ein bestimmtes, genau definiertes Gebiet einnehmen.
- Alternativ müssen alle ihre Staaten garantiert werden , um die Lage , einen gut definierten Bereich zu übernehmen; Dies garantiert eine zufriedenstellende Kachelung, garantiert jedoch nicht, dass eine bestimmte Kachelung auftritt. So wird ein Dominosa-Spiel erstellt:
- Zuerst werden die Kacheln zu einem Set zusammengesetzt.
- Dann werden die Fliesen in einer zufälligen Konfiguration abgelegt,
- Wenn ein Plättchen platziert wird, wird es aus dem Plättchenset entfernt.
- Dann werden die Kacheln vom Brett entfernt und hinterlassen ihre Quadrate.
- Dies garantiert nicht , dass die vorgesehene Konfiguration wird gewählt werden,
- Vielmehr gewährleistet es , dass die beabsichtigte Konfiguration kann gewählt werden, und somit eine Lösung existiert. Hier können wir dasselbe tun.
- Nachdem Sie alle Gadgets der Formulierung platziert haben, anstatt standardmäßig eindeutige -Quadrate zu platzieren, dh auf allen "Leerzeichen", stellen Sie sicher, dass das Leerzeichen ein rechteckiger Bereich mit einer geraden Dimension ist, oder zerlegen Sie das Leerzeichen in Rechtecke mit eine gerade Dimension, und wir kacheln einfach das Leerzeichen mit den restlichen Kacheln im Kachelsatz.⋆
- Nachdem wir alle Kacheln aus dem Set platziert haben, wissen wir, dass alles platzierbar ist.
- Einige Kacheln sind offensichtlich platzierbar, z. B. in Wänden, andere sind nur dann platzierbar, wenn die Formel aufgrund der Art der Beziehungen zwischen den Minianwendungen erfüllt werden kann.
- Dann entfernen wir die Kacheln und lassen ihre Quadrate zurück.
Lassen Sie uns dann über unsere Geräte gehen.
Gadget erzwingen
Wir können eine beliebige Anzahl von Bausteinen erstellen, indem wir sicherstellen, dass nicht jeder mit sich selbst gekoppelt werden kann.
Nehmen wir zum Beispiel an, wir möchten eine Kachel erzwingen , damit wir als verwenden können Baustein. (Beachten Sie, dass eine beliebige Variable ist, die wir als Paar für sich erzwingen möchten, nicht unbedingt als Baustein, da wir zuvor den Wert haben.)1 ⋆ 1 ⋆ 1(1⋆,1⋆)1⋆1⋆1
Um zu gewährleisten, dass unser -Baustein Reserven , werden wir ihn an die Bodenwand in der folgende Konfiguration: Wir werden die reservierte Nummer platzieren, nennen wir sie an der Wand wie eine Wende (geformt wie ); gegen die Wand und eine in der 2. Reihe in der Mitte. Dann platzieren wir noch zwei Zahlen und nennen sie und ; Diese sind einzigartig für dieses Gadget. Wir platzieren diese oben auf dem linken und rechten .( 1 ⋆ , 1 ⋆ ) 1 ⋆ 2 3 2 ⋆ 3 ⋆ 1 ⋆1⋆(1⋆,1⋆)1⋆⊥32⋆3⋆1⋆
Unten abgebildet ist der gemeinsame schwarze Rand die Unterseite des Spielplans. Die Beschreibung erfolgt von links nach rechts.
- Konfiguration des Gadgets. Jedes und hier ist für dieses Gadget einzigartig.3 ⋆2⋆3⋆
- Die 3 möglichen Zustände des Kachelns des Zentrums .1⋆
Danach können wir sicherstellen, dass unser Gadget mit einem bestimmten Kachelsatz gekachelt werden kann, während wir sicherstellen, dass unser Gadget das Paar erzwingen muss .(1⋆,1⋆)
- Wir wissen, dass vorkommen muss, da alle 3 möglichen Kachelzustände der unteren Mitte mit , wie in der Abbildung rechts oben dargestellt.1 ⋆ ( 1 ⋆ , 1 ⋆ )(1⋆,1⋆)1⋆(1⋆,1⋆)
- Die verbleibenden Kacheln können als und nebeneinander angeordnet werden und das Gadget abdecken. Somit können wir diese Kacheln aus unserem globalen Kachelsatz entfernen. Unten abgebildet.( 1 ⋆ , 3 ⋆ )(1⋆,2⋆)(1⋆,3⋆)
Beschreibung von links nach rechts:
- Links, oben: Linker Zustand, Links, unten: Eine gültige Aufteilung der verbleibenden Quadrate.
- Mitte, oben: Mittlerer Zustand, Mitte, unten: Eine gültige Kachelung der verbleibenden Quadrate.
- Rechts, oben: Rechter Zustand, Rechts, unten: Eine gültige Aufteilung der verbleibenden Quadrate.
Beachten Sie, dass das Kacheln der verbleibenden Felder nicht erzwungen wird , da sie mit Nachbarn in der Nähe anstelle von , aber in allen Bundesstaaten ein gültiges Kacheln des Spielbretts ist Wir können sie aus dem Kachelsatz entfernen und davon ausgehen, dass sie genau so gekachelt werden. Da wir wissen, dass es ein gültiges mögliches Kacheln gibt, haben wir mindestens ein mögliches Kacheln des Spielbretts, wenn die Formel erfüllt werden kann. Obwohl es keine Garantie dafür gibt, dass diese Kacheln auf diese Weise gekachelt werden, gibt es eine Garantie dafür, dass die Kacheln erzwungen werden.( 1 ⋆ , 1 ⋆ )1⋆(1⋆,1⋆)
Hinweis: Wenn Sie damit nicht zufrieden sind oder verwirrt sind, können Sie auf die gleiche Weise eine Wand um das Gadget Wir erstellen unten eine Wand für das Klausel-Gadget.3 × 23×23×2
Dieses Gadget ist nicht geschlossen, da es nicht geschlossen sein muss (aber Sie können, wenn Sie möchten). Es muss nicht sein, weil es eine mögliche Konfiguration hat, die wir aus dem Kachelsatz entfernen können. Möglicherweise kann eine andere Konfiguration vorgenommen werden, dies beeinträchtigt jedoch nicht die Erfüllbarkeit des Problems.
Die folgenden Kacheln müssen garantiert gekachelt werden (können also aus dem Kachelsatz entfernt werden): (1⋆,1⋆)
Die folgenden Fliesen sind garantiert werden kann gefliest werden (so kann aus dem Kachel-Set entfernt werden): (1⋆,2⋆),(1⋆,3⋆)
Wenn Sie dieses Gadget mit einer Wand schließen, wird auch angezeigt garantiert abgedeckt werden.(1⋆,2⋆),(1⋆,3⋆)
Neue Draht- und Klauseltore
Wegen der Probleme des Fließens und des Entleerens des Kachelsatzes müssen wir den Draht etwas umgestalten.
Eine Möglichkeit, das Flussproblem zu lösen, besteht darin, den Draht zu einem Stromkreis zu machen, anstatt nur einfache Links-Rechts-Zustände. Das heißt, es wäre kreisförmig anstelle einer Linie, und wenn der obere Teil des Kreises nach rechts verschoben wird, wird der untere Teil nach links verschoben. Dies löst das Strömungsproblem.
Nach dieser Route können wir das Wire- und das Klausel-Gate ändern, um beide Probleme zu lösen.
Reservierung von undFTF
Lassen Sie uns zwei neue universelle Werte einzuführen, und . Diese beiden Werte sind universell; tatsächliche Werte im Raster, z. B. Quadratwerte und (da wir vereinbarungsgemäß als Baustein für Wände reserviert haben ), oder was auch immer Sie wählen. Sie stehen für wahr bzw. falsch.F 2 3 1TF231
Wir erzwingen die Reservierung der Kacheln , , wie folgt; Abbildung unten, Beschreibung von links nach rechts:( T , T ) ( F , F )(T,F)(T,T)(F,F)
- Wir verwenden dasselbe Schema wie das Erzwingen von Kacheln, wobei als . Jedes und hier ist für dieses Gadget einzigartig.T 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)T1⋆2⋆3⋆
- Wir verwenden dasselbe Schema wie das Erzwingen von Kacheln, wobei als jedes und sind für dieses Gadget eindeutig.F 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆2⋆3⋆
- Wir verwenden dasselbe Schema wie das Erzwingen einer Kachel, wobei als in der Mitte verwendet wird, und Verwenden von an den anderen Stellen des Up-Tacks. Dies zwingt zum Kacheln. und können mit , also entfernen wir sie aus dem Kachelsatz. Jedes und hier ist für dieses Gadget einzigartig.F 1 ⋆ T ( F , T ) 2 ⋆ 3 ⋆ T 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆T(F,T)2⋆3⋆T2⋆3⋆
Draht
Jede Verbindung beginnt und endet mit einem Wert. Nennen wir ihn , der für die Verbindung eindeutig ist. Für jede Klausel, an der die Verbindung teilnimmt, hat die Verbindung zwei Verbindungswerte, und , die für jede Verbindung eindeutig sind und an derselben Klausel teilnehmen. Abbildung unten mit Beschreibung von links nach rechts.x ⋆ x ′ ⋆A⋆x⋆x′⋆
- Ein Draht, der an einer Klausel teilnimmt. Der Draht hat eine Höhe von und eine Länge von , wobei die Anzahl der Klauseln ist, an denen der Draht teilnimmt. Der Draht ist mit zwei -Quadraten links und gepolstert zwei auf der rechten Seite. Es ist natürlich allseitig von einer Mauer umgeben, angedeutet durch den blauen Umriss. Beachten Sie, dass die für diese Verbindung eindeutig ist und nur in der Verbindung und der Klausel verwendet wird, an der sie teilnimmt.2 * p + 3 p A ⋆ 1 ⋆22∗p+3pA⋆1⋆
Unten sind die beiden Zustände dargestellt, Beschreibungen von links nach rechts.
- Eine Leitung, die im wahren Zustand an einer Klausel beteiligt ist. Der Draht gilt als wahr, wenn die -Quadrate mit den Quadraten und die -Quadrate mit den Quadraten gepaart sind . In dem anderen Zustand, in dem die Kacheln umgekehrt sind, wird dies als falsch betrachtet. Beachten Sie, wie das Kacheln erzwungen wird, sobald die Kachel ausgewählt wird: werden bereits früher erzwungen, daher müssen die restlichen Kacheln horizontal sein.T x ' ⋆ F A ⋆ ( T , F )x⋆Tx′⋆FA⋆(T,F)
- Der gleiche Draht im falschen Zustand.
Wenn in mehr Klauseln teilnehmen, gibt es mehr Wert und , ein Paar für jede Klausel in dem Draht partizipiert. Sie alternative Wesen oben und unten, wie auch die und Quadrate, die jedes Paar trennen .x ' ⋆ T F x ⋆ , x ' ⋆x⋆x′⋆TFx⋆,x′⋆
Die zwei entsprechenden Zustände.
Dieses Gadget ist geschlossen , daher gibt es kein "Flussproblem".
Beachten Sie, dass wir in beiden Bundesstaaten unabhängig vom Bundesstaat die folgenden Kacheln sammeln: , , .( A ⋆ , T ) ( A ⋆ , F )(A⋆,A⋆)(A⋆,T)(A⋆,F)
Es gibt jedoch einige Kacheln, bei denen wir uns nicht sicher sind. In einem Zustand können wir aus dem Kachelsatz, während wir in einem anderen Zustand aus dem Kachelsatz, also welche Kacheln können wir? eigentlich entfernen? Die Antwort lautet: Das Klauseltor hat das gleiche Problem, jedoch mit der entgegengesetzten Kachelmenge. Es werden immer die verbleibenden, gegenüberliegenden und nicht gesammelten Kacheln gesammelt, wie wir im nächsten Abschnitt sehen werden. Da jedes dieser Elemente mit einem Klausel-Gate gekoppelt ist, können beide Elemente entfernt werden.( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2 ⋆ , F ) , ( 2 ′ ⋆ , T )(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...(1⋆,F),(1′⋆,T),(2⋆,F),(2′⋆,T)...
Klausel
Als nächstes erstellen wir die erste Iteration des neuen Klauselgatters. Es besteht aus einem Gadget, das von Wänden umschlossen ist. Im Gadget platzieren wir ein in der oberen Mitte und zwei Quadrate in den unteren Ecken. eine unten links und eine unten rechts. Die verbleibenden Quadrate sind Werte, die Drahtvariablen von drei verschiedenen Drähten darstellen. Nennen wir diese und . Das muss mit einer der Drahtvariablen gepaart werden, und die verbleibenden Drahtvariablen werden mit den Werten gepaart. Abbildungen unten, Beschreibungen von links nach rechts.F T a b , b ⋆ , c ⋆ F T2×3FTa⋆,b⋆,c⋆FT
- Links: Die Konfiguration für die erste Iteration des neuen Klauselgatters.
- Richtig Die drei möglichen Zustände der Kachelung.F
Diese drei Zustände führen zu drei möglichen Kacheln. Abbildung unten, Beschreibungen von links nach rechts.
- Links, oben : links nebeneinander, Links, unten: Die verbleibenden Quadrate nebeneinander.F
- Mitte, oben : rechts gekachelt, Mitte, unten: Kacheln der verbleibenden Quadrate.F
- Rechts oben : unten gekachelt. Rechts unten: Kacheln der verbleibenden Quadrate.F
Da mit einer der Wire-Variablen in der Klausel gepaart wird, kann diese Wire-Variable nicht mehr mit in der Wire gepaart werden . Dadurch wird der Draht auf "wahr" gesetzt. Umgekehrt werden die verbleibenden Wire-Variablen, die mit kacheln, gezwungen, innerhalb ihrer Drähte mit kacheln. Dies sind genau die gleichen Einschränkungen wie bei einer -Klausel.F T F 1 -in 3 - S A TFF TF1-in-3-SAT
Beachten Sie, dass und Drahtvariablen sind, die sich jedoch jeweils auf ein oder ein beziehen können. wire-variable; Die Verwendung eines negiert im Wesentlichen die wire-Variable.c ⋆ x ⋆ x ' ⋆ x ' ⋆a⋆,b⋆,c⋆x⋆x′⋆x′⋆
Ein Zusatz: Um die Pflicht zu erfüllen, zu wissen, welche Kacheln aus dem Kachelsatz entfernt werden können, müssen wir die Klausel "verdoppeln und kontrapositiv". Damit meine ich ein weiteres Gadget mit , wobei zusätzliche Variablen die Negationen von und . Nennen wir diese und . Dies müssen die negierten variablen Drahtwerte von und . Dieses Gadget unterscheidet sich darin, dass es ein in der Mitte und zwei hat3 a ⋆ , b ⋆ , c ⋆ a ' ⋆ , b ' ⋆ , c ' ⋆ a ⋆ , b ⋆ , c ⋆ 3 × 2 T F ( T , x ⋆ ) , ( T , x ' ⋆ ) , ( F , x ⋆ ) , ( F ,3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆a⋆,b⋆,c⋆3×2TF Werte an den Ecken; genau das Gegenteil des bisher beschriebenen Klausel-Gadgets. Durch "Verdoppeln" der Klausel wie folgt fügen wir die gleichen Einschränkungen wie im oben beschriebenen Gadget hinzu. Wir entladen jedoch auch alle Kombinationen von aus dem Kachelsatz für jede Variable (und damit für und auch, weil es sich immerhin um Drahtvariablen handelt). Unten abgebildet, Beschreibungen von links nach rechts. a ⋆ , b ⋆ , c ⋆(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- Eine "doppelte und kontrapositive" Klausel. Der untere Abschnitt ist die oben beschriebene Klausel; der oberste Abschnitt ist die neu beschriebene kontrapositive Klausel. Die neue Klausel hat genau die gleichen logischen Einschränkungen. es ist das Gegenteil der Bottom-Klausel. Zusammen entladen diese kombinierten Geräte und der Draht alle Kombinationen von aus dem Kachelsatz für jede an der Klausel beteiligte Drahtvariable.(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- Die blaue Linie in der Mitte der Figur ganz links dient der besseren Übersichtlichkeit. In Wirklichkeit kann es entfernt werden, ohne weitere Zustände zuzulassen.
Nehmen wir also ein Beispiel, um zu zeigen, dass alle Kacheln wie versprochen entladen werden. Unten abgebildet, Beschreibung von links nach rechts.
- Figur eines Drahtes, der an einer einzigen Klausel teilnimmt; Für die Klausel wird ein Staat gewählt. Hier verwenden wir , während und andere Drahtwerte in dieser Klausel darstellen.a ⋆ b ⋆1⋆=b⋆a⋆b⋆
- Für den in der Klausel angegebenen Status muss der Wert mit dem benachbarten gepaart werden .T1⋆T
- Dies bewirkt, dass die Verbindung zu einem echten Wert gezwungen wird (Sie können feststellen, dass die positive Variable der Verbindung gezwungen wird, sich mit zu paaren , und die negative Variable gezwungen wird, sich mit zu paaren , wie oben erläutert ).FTF
- Dies zwingt die in der kontrapositiven Klausel (der obere Abschnitt der Klausel) dazu, mit in der Klausel gepaart zu werden . Wenn Sie sich nun den Draht ansehen, ist garantiert, dass jede Fliese im Draht entladen wird: entweder im Draht selbst oder im entsprechenden Klausel-Gadget. In diesem Zustand haben wir die Kacheln , , , , , und .T ( A ⋆ , A ⋆ )( A ⋆ , T )( A ⋆ , F )1′⋆T(A⋆,A⋆)(A⋆,T)(A⋆,F)( 1 ⋆ , F ) ( 1 ' ⋆ , F ) ( 1 ' ⋆ , T )(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
Wenn wir den anderen Zustand versuchen, erhalten wir die Abbildung unten, Beschreibung von links nach rechts.
- Die Klausel befindet sich im anderen Status und kann auf zwei Arten nebeneinander angeordnet werden.(1⋆,T
- Daher wird auf den Draht gezwungen,(1⋆,F
- Führen Sie den Rest des Drahts so, dass er entsprechend kachelt, und bewerten Sie den Draht als falsch.
- Schließlich muss im kontrapositiven / oberen Abschnitt des Klausel-Gadgets gekachelt werden, da in der genommen wird Draht. In diesem Zustand haben wir die Kacheln , , , , , und . Dies sind die gleichen Kacheln wie im anderen Zustand .( 1 ′ ⋆ , T ) ( A ⋆ , A ⋆ ) ( A ⋆ , T ) ( A ⋆ , F ) ( 1 ⋆ , T ) ( 1 ⋆ , F ) ( 1 ′ ⋆ , F ) ( 1 ′ ⋆ , T )(1′⋆,F)(1′⋆,T)(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
In beiden Zuständen werden die gleichen Kacheln abgelegt. Daher entladen der Draht und die Klausel zusammen erfolgreich bestimmte Kacheln, wenn eine zufriedenstellende Zuordnung vorliegt.
Dieses Gadget ist geschlossen , sodass es kein Flussproblem gibt.
Das Klausel-Gadget entlädt zusammen mit dem Draht-Gadget garantiert immer die gleichen Kachel-Paar-Werte , und daher können wir diese entladen, auch wenn wir nicht wissen, auf welche Weise es kacheln wird.
Jetzt erfüllen alle unsere Geräte die Kriterien.
Formulierung
In unserer endgültigen Formulierung erstellen wir drei Reihen von Gadgets, die jeweils durch eine horizontale Wand getrennt sind.
- Unten platzieren wir die zwei Kacheln hohen Forcing-Gadgets. Wir brauchen ein zwingen Gadget für den Baustein und für Kombinationen von und . Wir platzieren die Forcing-Gadgets direkt nebeneinander.FTF
- In der mittleren Reihe platzieren wir die Drahtvorrichtungen horizontal, die zwei Kacheln hoch sind. Die Drahtgadgets sollten durch eine senkrechte Wand voneinander getrennt sein.
- In der oberen Reihe platzieren wir Klausel-Gadgets, die vier Kacheln hoch sind. Die Klausel-Gadgets sollten durch eine vertikale Wand voneinander getrennt sein.
Abbildungen folgen, Beschreibungen über jeder Abbildung. Klicken Sie auf die Bilder, um sie in voller Auflösung anzuzeigen. Der Quellcode zum Reproduzieren / Generieren der Bilder ist unten auf der Seite aufgeführt.
Am Beispiel der Formel haben wir ein befriedigendes Lösung als Zeuge.( ¬ x 1 , x 2 , x 3 , ¬ x 4 )Φ(x)=(x1,¬x2,x3)∧(x2,¬x3,x4)∧(x1,x2,¬x4)(¬x1,x2,x3,¬x4)
Zuerst beginnen wir mit den horizontalen Wänden, die die Gadgetreihen trennen. Wir zeigen die Quadrate und die Paare, die gezwungen sind, innerhalb der Wände zu kacheln.
Als nächstes zeigen wir die Gadgets. Der blaue Umriss stellt die Grenzen der Geräte dar; blau gestrichelt für die Forcing-Geräte, da diese nicht von Mauern umgeben sind. Beachten Sie, dass die Linie in der Mitte des Klausel-Gadgets nicht von einer Mauer umgeben ist. Es dient der besseren Übersichtlichkeit. Wenn Sie die Zeile entfernen, können in der oben erläuterten Klausel keine Zustände mehr auftreten. Wir zeigen jedoch die blaue Linie für diese Demonstration. Hinweis: Wir verwenden quadratische Namen, um die semantische Lesbarkeit der Zahlen zu gewährleisten. Jeder Name steht für einen numerischen Wert.
Hier füllen wir die senkrechten Wände aus.
Hier füllen wir die Zeugenlösung aus; Das heißt, dies ist die Kachellösung, wenn Sie die SAT-Lösung verwenden, um sie zu generieren.
Als nächstes kacheln wir den Füllbereich; Der Rest der Platine, so groß wie nötig, für so groß wie ist erforderlich, um bisher zu kacheln. Somit entladen wir die verbleibenden Paare im Plättchenset. Die gestrichelten Linien hier stellen eine gültige, aber nicht erzwungene Kachelung dar; Es könnte eine andere Möglichkeit geben, diese zu kacheln. Hier zeigen wir die linke untere Ecke.n
Hier füllen wir die restlichen Felder mit einer trivial gültigen Kachelung aus.
Hier zeigen wir die untere rechte Ecke des Gitters.
Hier zeigen wir die obere rechte Ecke des Gitters. Beachten Sie, dass die vertikalen Kacheln nicht mehr passen. Deshalb kacheln wir die oberste Reihe bei Bedarf horizontal.
Und schließlich die linke obere Ecke.
Das Generieren des gesamten Spielplans auf einmal über TeX schlägt fehl, da pdflatex nicht über genügend Arbeitsspeicher verfügt. Wenn Sie dies also sehen möchten, müssen Sie Clips generieren und diese zusammenfügen. Schauen Sie sich unbedingt den Notebook-Viewer an .
TikZ-Quellen
Spielgenerator:
graphtex.py
Konvertiert TeX nach svg mit pdflatex, pdfcairo (poppler) und rsvg-convert (libsvg)
dominosa.py
Enthält die Konvertierungslogik, die Spielelösungsüberprüfung und die Zeichenlogik
dominosa_demo.py
Eine ausführbare Demo, die die in der obigen Antwort verwendeten Bilder generiert. Speichert Bilder in das aktuelle Arbeitsverzeichnis.
dominosa_demo.ipynb
Eine ipython-Demo, die die in der obigen Antwort verwendeten Bilder generiert.