Uwaga: Jest to kontynuacja i poprawka mojej innej odpowiedzi .
Problemy z redukcją
Przypomnij sobie problem decyzyjny:
Czy istnieje idealne kafelkowanie pokrywające daną siatkę unikalnymi płytkami?(n+1)×(n+2)n
Tak więc dla siatki możemy użyć tylko zmiennych.(n+1)×(n+2)n
Ale:
- Nasza redukcja wymaga wielu unikalnych zmiennych, znacznie więcej niż .O(n)
- Ponadto nasze przewody są otwarte, co prowadzi do:
- Skąd wiemy, że możemy kafelkować otwarte obszary?
Aby rozwiązać pierwszy problem, sztucznie powiększamy planszę; Zasadniczo tworzymy równą liczbie zmiennych, których faktycznie potrzebujemy, a następnie tworzymy siatkę wielkości ( n + 1 ) × ( n + 2 ) i umieszczamy naszą siatkę w lewym dolnym rogu. Doprowadzi to do kwadratowego wybuchu.n(n+1)×(n+2)
W przypadku drugiego problemu musimy nieco przemyśleć nasze gadżety.
Może to wydawać się nieco zniechęcające, aby udowodnić, że możemy z powodzeniem ułożyć resztę planszy zgodnie z regułą. Zaczynamy więc od tej samej strategii, której użyłbyś do wygenerowania plansz wielkości :(n+1)×(n+2)
Najpierw generujemy zestaw wszystkich możliwych płytek. Wszystkie te płytki będą musiały zostać umieszczone na planszy. Następnie usuwamy płytki i pozostawiamy ich kwadraty.
Jednak nasze gadżety nie gwarantują umieszczenia określonego zestawu płytek; umieszczone płytki zależą od stanu. Musimy więc ostrożnie modyfikować gadżety, aby zagwarantować, że poszczególne kafelki zostaną usunięte, bez względu na wybrany stan.
Zobaczmy więc nasze gadżety.
Drut i bramka-klauzula są problematyczne z dwóch powodów.
- Nie wiemy, czy kwadraty otaczające drut lub bramę klauzulową można poprawnie kafelkować; w końcu niektóre druty można przesunąć w lewo, inne w prawo, a kafelkowanie pozostałych białych pól staje się trywialne. Będziemy odnosić się do tego problemu jako do problemu „przepływu”.
- Nie ma możliwości dowiedzenia się, które kafelki usunąć z zestawu kafelków; w jednym stanie, jeden zestaw kwadratów, w drucie lub bramie klauzulowej, zostanie wyłożony kafelkami, w innym stanie, będzie wyłożony zupełnie inny zestaw kwadratów.
Aby rozwiązać te problemy:
- Najpierw generujemy zestaw wszystkich możliwych kafelków. Wszystkie te płytki będą musiały zostać umieszczone na planszy; umieszczając je na planszy, usuwamy płytkę z zestawu. Chociaż na początku możemy nie wiedzieć , ponieważ musimy jeszcze w pełni opisać formułę, możemy dodać wszystkie nowe możliwości płytek, zwiększając n , w razie potrzeby. Wszystkie płytki, które usuwamy z tego zestawu, muszą gwarantować możliwość umieszczenia (przynajmniej, aby można je było umieścić, jeśli formuła jest zadowalająca). Wzywamy do usunięcia płytki z zestawu płytek, aby „rozładować” płytkę z zestawu płytek, tak jak w celu wywiązania się z naszego obowiązku umieszczenia jej na planszy.nn
- Musimy ostrożnie zaprojektować gadżety, aby zagwarantować, że poszczególne kafelki zostaną usunięte, bez względu na wybrany stan.
- Musimy zamknąć nasze gadżety, aby nie pchały płytek wokół planszy, w zależności od ich stanu; raczej wszystkie ich państwa muszą zajmować tylko określony, dobrze określony obszar.
- Alternatywnie, należy zagwarantować , że wszystkie ich państwa będą w stanie zająć dobrze określony obszar; gwarantuje to zadowalające układanie płytek, ale nie gwarantuje, że wystąpią określone kafelki. W ten sam sposób powstaje gra Dominosa:
- Najpierw płytki są generowane w zestawie;
- Następnie płytki są układane w losowej konfiguracji,
- Po umieszczeniu każdego kafelka jest on usuwany z zestawu kafelków.
- Następnie płytki są usuwane z planszy, pozostawiając za sobą kwadraty.
- Nie gwarantuje to, że zostanie wybrana zamierzona konfiguracja ,
- Raczej to gwarancję, że przeznaczony konfiguracja może być wybrany, a więc istnieje rozwiązanie. Możemy zrobić to samo tutaj.
- Po umieszczeniu wszystkich gadżetów formuły, zamiast domyślnego umieszczania unikalnych kwadratów, tj. Na całej „białej spacji”, upewniamy się, że biała przestrzeń to prostokątny obszar o jednym parzystym wymiarze, lub rozbicie białe na prostokąty o jednym parzystym wymiarze , i po prostu układamy białe pola pozostałymi kafelkami w zestawie kafelków.⋆
- Po umieszczeniu wszystkich płytek z zestawu wiemy, że wszystko można układać.
- Niektóre kafelki można oczywiście umieścić, na przykład te w ścianach, inne można umieścić tylko wtedy, gdy formuła jest zadowalająca, ze względu na charakter relacji między gadżetami.
- Następnie usuwamy płytki i pozostawiamy ich kwadraty.
Zobaczmy więc nasze gadżety.
Wymuszanie gadżetu
Możemy wykonać dowolną liczbę elementów składowych, upewniając się, że nie można ich sparować ze sobą.
Powiedzmy na przykład, że chcemy wymusić płytkę , abyśmy mogli użyć 1 ⋆ jako elementu konstrukcyjnego. (zauważ, że 1 ⋆ jest dowolną zmienną, którą chcemy zmusić jako parę do siebie, niekoniecznie element konstrukcyjny, ponieważ wcześniej używaliśmy wartości 1 )(1⋆,1⋆)1⋆1⋆1
Aby zagwarantować, że nasze zastrzega -building blokowe ( 1 ⋆ , 1 ⋆ ) , będziemy umieścić go na dolnej ścianie w następującej konfiguracji: będziemy umieszczać numer zastrzeżony, nazwijmy go 1 ⋆ ścianę niczym up-tack (w kształcie ⊥ ); 3 przy ścianie i jeden w drugim rzędzie pośrodku. Następnie umieścimy kolejne dwa numery, nazwijmy je 2 ⋆ i 3 ⋆ ; są one unikalne dla tego gadżetu. Umieszczamy je na lewym i prawym 1 ⋆ .1 ⋆( 1 ⋆ , 1 ⋆ )1 ⋆⊥3)2 ⋆3 ⋆1 ⋆
Zilustrowana poniżej wspólna czarna ramka jest dolną częścią planszy, opis od lewej do prawej.
- Konfiguracja gadżetu. Każdy i 3 ⋆ tutaj są unikalne dla tego gadżetu.2 ⋆3 ⋆
- 3 możliwe stany sąsiadującego środka .1 ⋆
Po wykonaniu tej czynności możemy zagwarantować, że nasz gadżet będzie można kafelkować za pomocą określonego zestawu płytek, jednocześnie gwarantując, że nasz gadżet musi wymusić parę .( 1 ⋆ , 1 ⋆ )
- Wiemy, że muszą wystąpić , ponieważ wszystkie 3 możliwe stany kafelkowania dolnej środkowej 1 ⋆ , kafelek jako ( 1 ⋆ , 1 ⋆ ) , jak pokazano na rysunku po prawej stronie powyżej.( 1 ⋆ , 1 ⋆ )1 ⋆( 1 ⋆ , 1 ⋆ )
- Pozostałe kafelki można kafelkować jako i ( 1 ⋆ , 3 ⋆ ) , zakrywając gadżet. W ten sposób możemy usunąć te płytki z naszego globalnego zestawu płytek. Zilustrowane poniżej.( 1 ⋆ , 2 ⋆ )( 1 ⋆ , 3 ⋆ )
Opis, od lewej do prawej:
- Lewy, górny: Lewy stan, Lewy, dolny: Prawidłowe kafelki pozostałych kwadratów.
- Środek, góra: stan środkowy, środek, dół: prawidłowe kafelki pozostałych kwadratów.
- Z prawej, u góry: Stan z prawej, Z prawej, u dołu: Prawidłowe zestawienie pozostałych kwadratów.
Pamiętaj, że kafelki pozostałych kwadratów nie są wymuszone , ponieważ mogą kafelkować sąsiadów w pobliżu zamiast , ale ponieważ jest to prawidłowe kafelkowanie planszy we wszystkich stanach, możemy je usunąć z zestaw kafelków i załóżmy, że zostaną ułożone w taki sam sposób. Ponieważ wiemy, że możliwe jest prawidłowe kafelkowanie, mamy co najmniej jeden możliwy kafelek planszy, jeśli formuła jest zadowalająca. Chociaż nie ma żadnej gwarancji, że zostaną one ułożone w ten sposób, istnieje gwarancja, że płytka ( 1 ⋆ , 1 ⋆ ) zostanie wymuszona.1 ⋆( 1 ⋆ , 1 ⋆ )
Uwaga: jeśli nie jesteś z tego zadowolony lub jesteś zdezorientowany różnicą między „zdolnością do układania płytek” a „zmuszaniem do układania płytek”, możesz po prostu umieścić ścianę wokół gadżetu , tak samo jak my zrób ścianę 3 × 2 poniżej dla gadżetu klauzulowego.3 × 23 × 2
Ten gadżet nie jest zamknięty, ponieważ nie musi być (ale możesz, jeśli chcesz). Nie musi tak być, ponieważ ma wykonalną konfigurację, którą możemy usunąć z zestawu kafelków. Chociaż może być możliwe wykonanie innej konfiguracji, nie wpływa to na satysfakcję problemu.
Następujące płytki są gwarantowane do kafelkowania (dzięki czemu można je usunąć z zestawu płytek): ( 1 ⋆ , 1 ⋆ )
Poniżej płytki gwarancją mogą być wyłożone (a zatem mogą być usuwane z płytek-zestaw) ( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3 ⋆ )
Jeśli zdecydujesz się zamknąć ten gadżet ścianą, wówczas również będzie objęty gwarancją.( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3 ⋆ )
Nowe bramy drutowe i klauzulowe
Ze względu na problemy z przepływem i opróżnianiem zestawu płytek musimy nieco przeprojektować drut.
Jednym ze sposobów rozwiązania problemu z przepływem jest uczynienie z drutu obwodu, a nie tylko prostych stanów z lewej strony; oznacza to, że byłby okrągły zamiast linii, a zatem jeśli górna część koła zostanie przesunięta w prawo, spód zostanie przesunięty w lewo. To rozwiązuje problem z przepływem.
Idąc tą drogą, możemy zmienić drut i bramkę, aby rozwiązać oba problemy.
Zastrzeganie i F.T.fa
Pozwól nam przedstawić dwa nowe uniwersalne wartości, i F . Te dwie wartości są uniwersalne; rzeczywiste wartości w siatce, takie jak wartości kwadratowe 2 i 3 (ponieważ zgodnie z umową zarezerwowaliśmy 1 jako element konstrukcyjny ścian) lub cokolwiek innego. Reprezentują odpowiednio prawdę i fałsz.T.fa2)3)1
Wymuszamy rezerwację płytek , ( T , T ) , ( F , F ) w następujący sposób; ilustracja poniżej, opis od lewej do prawej:( T, F.)( T, T)( F., F.)
- Używamy tego samego schematu, jak wymuszanie dowolnego kafelka , używając T jako 1 ⋆ . Każdy 2 ⋆ i 3 ⋆ tutaj są unikalne dla tego gadżetu.( 1 ⋆ , 1 ⋆ )T.1 ⋆2 ⋆3 ⋆
- Używamy tego samego schematu, jak wymuszanie dowolnego kafelka , używając F jako 1 ⋆ Każde 2 ⋆ i 3 ⋆ są tutaj unikalne dla tego gadżetu.( 1 ⋆ , 1 ⋆ )fa1 ⋆2 ⋆3 ⋆
- Korzystamy z tego samego schematu, co wymuszanie płytki , używając F jako 1 ⋆ na środku i T w innych miejscach podwyższenia. To zmusza ( F , T ) do układania płytek. 2 ⋆ i 3 ⋆ mogą układać kafelki za pomocą T , więc usuwamy je z zestawu kafelków. Każdy 2 ⋆ i 3 ⋆ tutaj są unikalne dla tego gadżetu.( 1 ⋆ , 1 ⋆ )fa1 ⋆T.( F., T)2 ⋆3 ⋆T.2 ⋆3 ⋆
Drut
Każdy drut zaczyna się i kończy wartością, nazwijmy go , który jest unikalny dla drutu. Dla każdej klauzuli, w której uczestniczy drut, drut będzie miał dwie wartości drutu, x ⋆ i x ′ ⋆ , które są unikalne dla każdego drutu i uczestniczą w tej samej klauzuli. Ilustracja poniżej z opisem od lewej do prawej.A ⋆x ⋆x′⋆
- Drut, który uczestniczy w jednej klauzuli. Drut ma wysokość i ma długość 2 ∗ p + 3 , gdzie p jest liczbą klauzul, w których uczestniczy drut. Drut jest wypełniony dwoma kwadratami A ⋆ po lewej stronie i dwoma po prawej stronie. Jest on oczywiście otoczony ze wszystkich stron ścianą, oznaczoną niebieskim konturem. Zauważ, że 1 ⋆ jest unikalny dla tego drutu i będzie używany tylko w tym drucie oraz w klauzuli, w której uczestniczy.2)2 ∗ p + 3pA ⋆1 ⋆
Poniżej pokazano dwa stany, opisy od lewej do prawej.
- Drut, który uczestniczy w jednej klauzuli, w stanie prawdziwym. Drut uważa się za prawdziwy, gdy kwadraty są sparowane z kwadratami T , a kwadraty x ′ are są sparowane z kwadratami F. Jest uważane za fałszywe w innym stanie, w którym kafelkowanie jest odwrócone. Uwaga jak Dachówka jest zmuszony raz A ⋆ płytki wybrano: ( T , F ) są już zmuszeni wcześniej, więc reszta płytki musi być pozioma.x ⋆T.x′⋆faA ⋆( T, F.)
- Ten sam drut w stanie fałszywym.
Gdy uczestniczysz w większej liczbie klauzul, istnieje większa wartość i x ′ ⋆ , jedna para dla każdej klauzuli, w której uczestniczy drut. Naprzemiennie znajdują się na górze i na dole, podobnie jak kwadraty T i F, które oddzielają każdy x ⋆ , x ′ ⋆ para.x ⋆x′⋆T.fax ⋆ , x′⋆
Dwa odpowiadające stany.
Ten gadżet jest zamknięty , więc nie ma „problemu z przepływem”.
Zauważ, że w obu stanach zbieramy następujące kafelki, bez względu na stan: , ( A ⋆ , T ) , ( A ⋆ , F ) .( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)
Istnieją jednak pewne kafelki, których nie jesteśmy pewni; w jednym stanie możemy usunąć z zestawu kafelków, podczas gdy w innym stanie możemy usunąć ( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2( 1 ⋆ , T) , ( 1′⋆ , F) , ( 2 ⋆ , T) , ( 2′⋆ , F) . . .z zestawu kafelków, więc które kafelki rzeczywiście możemy usunąć? Odpowiedź brzmi: brama klauzuli ma ten sam problem, ale z przeciwległym zestawem płytek. Zawsze będzie zbierać pozostałe, przeciwne i niepobrane płytki, jak zobaczymy w następnej sekcji. Ponieważ każde z nich jest połączone z bramką klauzuli, będziemy mogli usunąć je obie.( 1 ⋆ , F.),(1′⋆,T),(2⋆,F),(2′⋆,T)...
Klauzula
Następnie stworzymy pierwszą iterację nowej bramki klauzuli. Składa się z gadżetu , otoczonego ścianami. Wewnątrz gadżetu umieszczamy jedną literę F w górnej środkowej części i dwa kwadraty T w dolnych rogach; jeden w lewym dolnym rogu i jeden w prawym dolnym rogu. Pozostałe kwadraty będą wartościami reprezentującymi zmienne drutowe trzech różnych drutów. Nazwijmy te ⋆ , b ⋆ , i c ⋆ . F zostanie zmuszone do parowania się z jednym z przewodów-zmiennych, pozostałe zmienne z drutu będzie parować z T wartości. Ilustracje poniżej, opisy od lewej do prawej.2×3FTa⋆,b⋆,c⋆FT
- Po lewej: konfiguracja dla pierwszej iteracji nowej klauzuli-klauzuli.
- Prawo Trzy możliwe stany płytki F
Te trzy stany prowadzą do trzech możliwych przechyleń. Ilustracja poniżej, opisy od lewej do prawej.
- Lewy, górny : kafelkowy lewy, lewy, dolny: Kafelkowy pozostałe kwadraty.F
- Środkowy, górny : kafelkowy prawy, Środkowy, dolny: Kafelkowy pozostałe kwadraty.F
- Prawo, góra : sąsiadująco, prawo, dół: sąsiadujące kwadraty.F
Ponieważ zostanie sparowany z jedną ze zmiennych drutowych w klauzuli , tej zmiennej drutowej nie można już sparować z F zmienną w przewodzie ; w ten sposób zmuszając drut do prawdziwości. I odwrotnie, pozostałe zmienne drutowe, które sąsiadują z T, będą zmuszone do wstawiania F z przewodami. Jest to dokładnie te same ograniczenia jak 1 -in- 3 - S T punktu.FF TF1-in-3-SAT
Uwaga, ⋆ , b ⋆ , i c ⋆ są z drutu są zmienne, ale mogą odnosić się do każdego x ⋆ lub x ' ⋆ drutu zmiennej; użycie x ′ ⋆ zasadniczo neguje zmienną drutową.a⋆,b⋆,c⋆x⋆x′⋆x′⋆
Jeden dodatek: aby wywiązać się z obowiązku wiedzieć, które płytki można usunąć z zestawu płytek, musimy „podwoić i przeciwstawić” klauzulę. Co mam na myśli to, jest, aby kolejne gadżet, z 3 dodatkowych zmiennych reprezentujących negacji w ⋆ , b ⋆ , oraz c ⋆ . Nazwijmy te ' ⋆ , b ' ⋆ , i c ' ⋆ . Te muszą być zanegowane wartości zmiennej druciane o ⋆ , b ⋆3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆ I c ⋆ . Tengadżet 3 × 2 jest inny, ponieważ będzie miał T w środku i dwiewartości F w rogach; dokładnie przeciwnie do opisanego dotychczas gadżetu klauzulowego. Poprzez „podwojenie” takiej klauzuli ponownie dodajemy te same ograniczenia, co gadżet opisany powyżej. Jednak rozładowujemy również wszystkie kombinacje ( T , x ⋆ ) , ( T , x ′ ⋆ ) , ( F , x ⋆ ) , ( F , xa⋆,b⋆,c ⋆3 × 2TF z płytek-zestawu, dla każdej zmiennej (a zatem ⋆ , b ⋆ ,i c ⋆ , a także, ponieważ są one przecież, drut-zmienne). Zilustrowane poniżej opisy od lewej do prawej.(T,x⋆),(T,x′⋆),(F, x ⋆ ) , ( F, x′⋆ )a ⋆ , b ⋆ ,c ⋆
- Klauzula „podwójnego i antykoncepcyjnego”. Dolna sekcja to klauzula opisana powyżej; górna sekcja to nowo opisana klauzula antykoncepcyjna. Nowa klauzula ma dokładnie takie same ograniczenia logiczne; jest to przeciwieństwo dolnej klauzuli. Łącznie te połączone gadżety i drut rozładowują wszystkie kombinacje z zestawu płytek, dla każda zmienna przewodowa uczestnicząca w klauzuli.( T, x ⋆ ) , ( F, x ⋆ ) , ( T, x′⋆ ),( F., x′⋆ )
- Niebieska linia pośrodku lewej skrajnej figury ułatwia przeglądanie; w rzeczywistości można go usunąć bez zezwolenia na kolejne stany.
Weźmy więc przykład, aby pokazać, że wszystkie płytki są rozładowywane zgodnie z obietnicą. Zilustrowane poniżej, opis od lewej do prawej.
- Figura drutu uczestniczącego w jednej klauzuli; dla klauzuli wybrano stan. Tutaj używamy , podczas gdy a ⋆ i b ⋆ reprezentują inne wartości drutów w tym punkcie.1 ⋆ = b ⋆a ⋆b ⋆
- Dla danego państwa w klauzuli, w wartość jest zmuszona być połączony z sąsiednim T .1 ⋆T.
- Powoduje to, że drut jest zmuszony do prawdziwej wartości (można powiedzieć, gdy dodatnia zmienna drutu jest zmuszona do sparowania z , a ujemna zmienna jest zmuszona do sparowania z F , jak wyjaśniono powyżej).T.fa
- Wymusza to sparowanie w klauzuli antykoncepcyjnej (górna część klauzuli) z T w klauzuli. Teraz, gdy spojrzysz na drut, każda płytka w przewodzie jest z pewnością rozładowana: albo rozładowana w samym przewodzie, albo w odpowiednim gadżecie klauzuli. W tym stanie mamy kafelki, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 11′⋆T.( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)( 1 ⋆ , T) , ( 1 ′ ⋆ , F ) i ( 1 ′ ⋆ , T ) .( 1 ⋆ , F.)( 1′⋆ , F)( 1′⋆ , T)
Próbując w innym stanie, otrzymujemy ilustrację poniżej, opis od lewej do prawej.
- Klauzula jest w innym stanie, kafelkowanie na jeden z dwóch sposobów.( 1⋆ , T
- Dlatego jest wymuszone na drucie,( 1⋆ , F.
- Prowadząc resztę drutu do płytki odpowiednio, i oceniaj drut jako fałszywy.
- Wreszcie, w przeciwstawnym / górnym odcinku gadżetu klauzulowego musi sąsiadować , ponieważ ( 1 ′ ⋆ , T ) jest brane do drutu. W tym stanie mamy kafelki, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 1 ⋆ , F( 1′⋆ , F)( 1′⋆ , T)( A ⋆ , A ⋆ )( A⋆ , T)(A⋆ , F)(1⋆ , T) , ( 1 ′ ⋆ , F ) i ( 1 ′ ⋆ , T ) . Są to te same płytki, które zostały rozładowane jak w drugim stanie.( 1⋆ , F.)( 1′⋆ , F)(1′⋆ , T)
Dlatego w obu stanach rozładowujemy te same płytki. Dlatego drut i klauzula razem z powodzeniem rozładowują określone płytki, jeśli jest zadowalające przypisanie.
Ten gadżet jest zamknięty , więc nie będzie problemu z przepływem.
Klauzula-gadżet wraz z gadżetem drucianym gwarantują zawsze rozładowywanie tych samych wartości pary kafelków , a zatem możemy je rozładować, nawet jeśli nie wiemy, w jaki sposób będą kafelki.
Teraz wszystkie nasze gadżety spełniają kryteria.
Sformułowanie
W naszym ostatecznym sformułowaniu tworzymy trzy rzędy gadżetów, każdy oddzielony poziomą ścianą.
- Na dole umieszczamy gadżety do wymuszania, które mają dwa kafelki wysokości. Musimy zmuszając gadżet dla bloku budowlanego, a dla połączeń i F . Umieszczamy wymuszone gadżety bezpośrednio obok siebie.T.fa
- W środkowym rzędzie umieszczamy druciane gadżety, poziomo, które mają dwie płytki wysokości. Druciane gadżety powinny być oddzielone od siebie pionową ścianą.
- W górnym rzędzie umieszczamy gadżety klauzulowe, które mają cztery płytki wysokości. Gadżety klauzulowe powinny być oddzielone od siebie pionową ścianą.
Poniższe ilustracje, opisy nad każdą figurą. Kliknij obrazy, aby uzyskać pełną rozdzielczość. Kod źródłowy do reprodukcji / generowania obrazów znajduje się na dole strony.
Używając wzoru jako przykład, mamy satysfakcjonujące rozwiązanie ( ¬ x 1 , x 2 , x 3 , ¬ x 4 )Φ ( x ) = ( x1, ¬ x2),x3)) ∧ ( x2), ¬ x3),x4) ∧ ( x1,x2), ¬ x4)( ¬ x1,x2),x3), ¬ x4) jako świadek.
Najpierw zaczynamy od poziomych ścian oddzielających rzędy gadżetów. Pokazujemy kwadraty i pary, które są zmuszone do układania płytek w ścianach.
Następnie pokazujemy gadżety. Niebieski kontur reprezentuje granice gadżetów; niebieski przerywany dla gadżetów forsowania, ponieważ nie będą otoczone ścianami. Uwaga: linia pośrodku gadżetu klauzuli nie jest otoczona ścianą; ma na celu ułatwienie oglądania; usunięcie linii nie pozwala na pojawienie się więcej stanów w klauzuli, jak wyjaśniono powyżej, ale pokazujemy niebieską linię dla tej demonstracji. Uwaga: używamy nazw kwadratowych, aby nadać liczbom czytelność semantyczną, jeśli ma to zastosowanie. Każda nazwa reprezentuje wartość liczbową.
Tutaj wypełniamy pionowe ściany.
Tutaj wypełniamy rozwiązanie dla świadka; tzn. jest to rozwiązanie kafelkowe, jeśli używasz rozwiązania SAT do jego wygenerowania.
n
Tutaj wypełniamy pozostałe kwadraty trywialnym prawidłowym kafelkiem.
Tutaj pokazujemy prawy dolny róg siatki.
Tutaj pokazujemy prawy górny róg siatki. Zwróć uwagę, że pionowe płytki nie pasują już; więc w razie potrzeby układamy górny rząd poziomo.
I wreszcie lewy górny róg.
Generowanie całej planszy naraz przez TeX kończy się niepowodzeniem z błędami braku pamięci z pdflatex, więc jeśli chcesz to zobaczyć, musisz wygenerować klipy i połączyć je razem. Koniecznie sprawdź przeglądarkę notebooków .
Źródła TikZ
Generator gier:
graphtex.py
Konwertuje TeX na svg, używając pdflatex, pdfcairo (poppler) i rsvg-convert (libsvg)
dominosa.py
Zawiera logikę konwersji, weryfikację rozwiązania gry i logikę rysowania
dominosa_demo.py
Wykonalne demo, które generuje obrazy użyte w powyższej odpowiedzi. Zrzuca obrazy do bieżącego katalogu roboczego.
dominosa_demo.ipynb
Demo ipython, które generuje obrazy użyte w powyższej odpowiedzi.