Lưu ý: Đây là phần tiếp theo và sửa đổi câu trả lời khác của tôi .
Vấn đề với việc giảm
Nhớ lại vấn đề quyết định:
Có một lát hoàn hảo bao gồm một lưới với ô duy nhất không?n(n+1)×(n+2)n
Vì vậy, đối với lưới , chúng ta chỉ có thể sử dụng biến.n(n+1)×(n+2)n
Nhưng:
- Việc giảm của chúng tôi đòi hỏi rất nhiều biến số duy nhất, nhiều hơn .O(n)
- Hơn nữa, dây của chúng tôi đã kết thúc mở, dẫn đến:
- Làm thế nào để chúng ta biết chúng ta có thể lát các khu vực mở?
Để giải quyết vấn đề đầu tiên, chúng tôi làm cho bảng trò chơi lớn hơn nhiều; về cơ bản, chúng tôi tạo bằng số lượng biến chúng tôi thực sự yêu cầu, sau đó tạo lưới có kích thước và đặt lưới của chúng tôi ở góc dưới bên trái. Điều này sẽ dẫn đến một vụ nổ bậc hai.( n + 1 ) × ( n + 2 )n(n+1)×(n+2)
Đối với vấn đề thứ hai, chúng ta phải suy nghĩ lại về các tiện ích của mình một chút.
Có vẻ hơi nản chí khi chứng minh rằng chúng ta có thể xếp thành công phần còn lại của bảng theo quy tắc. Vì vậy, chúng tôi bắt đầu với cùng một chiến lược mà người ta sẽ sử dụng để thực sự tạo ra các bảng trò chơi có kích thước :(n+1)×(n+2)
Đầu tiên chúng tôi tạo ra một tập hợp tất cả các gạch có thể. Tất cả các gạch này sẽ phải được đặt trên bảng. Sau đó, chúng tôi loại bỏ các gạch, và để lại phía sau hình vuông của họ.
Tuy nhiên, các tiện ích của chúng tôi không đảm bảo sẽ đặt một bộ gạch cụ thể; gạch được đặt tùy thuộc vào nhà nước. Vì vậy, chúng tôi phải sửa đổi cẩn thận các tiện ích để đảm bảo gạch cụ thể sẽ bị xóa, bất kể trạng thái nào được chọn.
Chúng ta hãy đi qua các tiện ích của chúng tôi sau đó.
Dây và cổng mệnh đề có vấn đề vì hai lý do.
- Chúng ta không biết rằng các ô vuông xung quanh một dây hoặc cổng mệnh đề có thể được lát chính xác; Rốt cuộc, một số dây có thể được đẩy sang trái, một số khác ở bên phải và ốp các ô vuông không gian trắng còn lại trở nên không tầm thường. Chúng ta sẽ gọi vấn đề này là vấn đề "dòng chảy".
- Không có cách nào để biết mà gạch để loại bỏ từ gạch-đề ra; ở một trạng thái, một tập hợp các ô vuông, trong dây hoặc cổng mệnh đề, sẽ được lát gạch, ở trạng thái khác, một tập hợp các ô vuông hoàn toàn khác sẽ được lát.
Để giải quyết những vấn đề này:
- Đầu tiên, chúng tôi tạo ra một tập hợp tất cả các gạch có thể. Tất cả các gạch này sẽ phải được đặt trên bảng; khi chúng ta đặt chúng lên bảng, chúng ta sẽ loại bỏ gạch khỏi bộ. Mặc dù lúc đầu chúng tôi có thể không biết , vì chúng tôi chưa mô tả đầy đủ về công thức, chúng tôi có thể thêm tất cả các khả năng gạch mới khi chúng tôi tăng , khi cần. Tất cả các gạch mà chúng tôi loại bỏ khỏi bộ này phải được đảm bảo có thể đánh dấu được (ít nhất, được đảm bảo có thể đánh dấu được nếu công thức đạt yêu cầu). Chúng tôi gọi loại bỏ một lát từ bộ gạch, để "xả" gạch khỏi bộ gạch, như để thực hiện nghĩa vụ của chúng tôi là đặt nó lên bảng trò chơi.nnn
- Chúng tôi phải cẩn thận thiết kế các tiện ích để đảm bảo gạch cụ thể sẽ được gỡ bỏ, bất kể trạng thái nào được chọn.
- Chúng tôi phải đóng các tiện ích của chúng tôi để chúng không đẩy gạch xung quanh bảng tùy theo trạng thái của chúng; thay vì tất cả các trạng thái của họ chỉ phải chiếm một khu vực được xác định rõ.
- Ngoài ra, tất cả các trạng thái của họ phải được đảm bảo để có thể chiếm một khu vực được xác định rõ; điều này đảm bảo ốp lát thỏa đáng, nhưng không đảm bảo rằng một lát gạch cụ thể sẽ xảy ra. Đây là cách tương tự như một trò chơi Dominosa được tạo ra:
- Đầu tiên các gạch được tạo thành một bộ;
- Sau đó, các ô được đặt xuống trong một cấu hình ngẫu nhiên,
- Khi mỗi ô được đặt, nó sẽ được gỡ bỏ khỏi tập hợp ô.
- Sau đó, gạch được loại bỏ khỏi bảng, để lại phía sau hình vuông của họ.
- Điều này không đảm bảo rằng cấu hình dự định sẽ được chọn,
- Thay vào đó, nó đảm bảo rằng cấu hình dự định có thể được chọn, và do đó tồn tại một giải pháp. Chúng ta có thể làm điều tương tự ở đây.
- Sau khi đặt tất cả các tiện ích của công thức, thay vì đặt các ô vuông duy nhất theo mặc định, tức là trên tất cả "khoảng trắng", chúng tôi đảm bảo khoảng trắng là một khu vực hình chữ nhật có một chiều chẵn hoặc chia nhỏ khoảng trắng thành hình chữ nhật với một chiều chẵn và chúng ta chỉ cần xếp khoảng trắng với các ô còn lại trong tập hợp ô.⋆
- Sau khi đặt tất cả các ô từ tập hợp, chúng tôi biết mọi thứ đều có thể xem được.
- Một số gạch sẽ rõ ràng có thể dễ dàng, chẳng hạn như những người trong các bức tường, những người khác sẽ được đánh dấu chỉ khi công thức là thỏa đáng, do tính chất của các mối quan hệ giữa các tiện ích.
- Sau đó, chúng tôi loại bỏ các gạch, và để lại phía sau hình vuông của họ.
Chúng ta hãy đi qua các tiện ích của chúng tôi sau đó.
Buộc tiện ích
Chúng ta có thể tạo một số khối xây dựng tùy ý bằng cách đảm bảo rằng mỗi khối không thể được ghép với chính chúng.
Ví dụ: giả sử chúng ta muốn buộc một khối , để chúng ta có thể sử dụng làm khối xây dựng. (lưu ý, là một biến tùy ý, chúng tôi muốn buộc thành cặp với chính nó, không nhất thiết phải là một khối xây dựng như chúng tôi đã sử dụng giá trị trước đó)1 ⋆ 1 ⋆ 1(1⋆,1⋆)1⋆1⋆1
Để đảm bảo rằng dự trữ khối xây dựng , chúng tôi sẽ đặt nó vào bức tường phía dưới trong cấu hình sau: chúng tôi sẽ đặt số dành riêng, chúng ta hãy gọi nó là dựa vào tường giống như một cú đánh lên (có hình dạng như ); dựa vào tường, và một ở hàng thứ 2 ở giữa. Sau đó, chúng tôi sẽ đặt hai số khác, chúng ta hãy gọi chúng là và ; đây là duy nhất cho tiện ích này. Chúng tôi đặt chúng ở trên cùng bên trái và bên phải .( 1 ⋆ , 1 ⋆ ) 1 ⋆ ⊥ 3 2 ⋆ 3 ⋆ 1 ⋆1⋆(1⋆,1⋆)1⋆⊥32⋆3⋆1⋆
Minh họa bên dưới, viền đen được chia sẻ là phần dưới cùng của bảng trò chơi, mô tả từ trái sang phải.
- Cấu hình của tiện ích. Mỗi và ở đây là duy nhất cho tiện ích này.3 ⋆2⋆3⋆
- 3 trạng thái có thể của ốp lát trung tâm .1⋆
Sau khi làm điều này, chúng ta có thể đảm bảo rằng tiện ích của chúng tôi có thể được lát gạch với một tập hợp cụ thể của gạch, trong khi đảm bảo rằng tiện ích của chúng tôi phải buộc các cặp .(1⋆,1⋆)
- Chúng tôi biết rằng phải xảy ra, bởi vì cả 3 trạng thái ốp lát có thể có của , gạch dưới là , như được minh họa trong hình bên phải, ở trên.1 ⋆ ( 1 ⋆ , 1 ⋆ )(1⋆,1⋆)1⋆(1⋆,1⋆)
- Các ô còn lại có thể được xếp thành và , bao phủ tiện ích. Vì vậy, chúng ta có thể loại bỏ các ô đó khỏi bộ gạch toàn cầu của mình. Minh họa dưới đây.( 1 ⋆ , 3 ⋆ )(1⋆,2⋆)(1⋆,3⋆)
Mô tả, từ trái sang phải:
- Trái, trên cùng: Trạng thái trái, Trái, dưới cùng: Một lát xếp hợp lệ của các ô vuông còn lại.
- Middle, top: Middle state, Middle, bottom: Một lát gạch hợp lệ của các ô vuông còn lại.
- Phải, trên cùng: Trạng thái bên phải, Phải, dưới cùng: Một lát xếp hợp lệ của các ô vuông còn lại.
Lưu ý rằng việc xếp các ô vuông còn lại không bị ép buộc , vì chúng có thể xếp chồng với các hàng xóm lân cận thay vì , nhưng vì đó là một lát gạch hợp lệ của bảng trò chơi ở tất cả các trạng thái , chúng ta có thể loại bỏ chúng khỏi bộ gạch và giả sử chúng sẽ được lát gạch chính xác theo cách đó. Vì chúng tôi biết có một ốp lát hợp lệ có thể, chúng tôi có ít nhất một ốp lát có thể có của bảng trò chơi, nếu công thức là thỏa đáng. Mặc dù không có gì đảm bảo rằng những thứ này sẽ được xếp theo cách này, nhưng có một đảm bảo rằng gạch sẽ bị ép buộc.( 1 ⋆ , 1 ⋆ )1⋆(1⋆,1⋆)
Lưu ý: nếu bạn không hài lòng với điều này hoặc bị nhầm lẫn bởi sự khác biệt giữa "có thể xếp gạch" so với "bị buộc phải xếp", bạn có thể chỉ cần đặt một bức tường xung quanh tiện ích , theo cách tương tự chúng tôi tạo một bức tường dưới đây cho tiện ích mệnh đề.3 × 23×23×2
Tiện ích này không bị đóng, bởi vì nó không cần phải có (nhưng bạn có thể nếu bạn muốn). Không cần thiết, bởi vì nó có cấu hình khả thi, chúng ta có thể loại bỏ khỏi tập hợp ô. Mặc dù có thể thực hiện một cấu hình khác, nhưng điều này không ảnh hưởng đến sự thỏa mãn của vấn đề.
Các lát sau được đảm bảo sẽ được lát gạch (do đó có thể được xóa khỏi bộ gạch): (1⋆,1⋆)
Các ô sau đây được đảm bảo có thể được lát gạch (do đó có thể được xóa khỏi bộ gạch): (1⋆,2⋆),(1⋆,3⋆)
Nếu bạn chọn đóng tiện ích này bằng tường, thì cũng sẽ Đảm bảo được bảo hiểm.(1⋆,2⋆),(1⋆,3⋆)
Cổng dây và khoản mới
Do các vấn đề về dòng chảy và làm trống bộ gạch, chúng ta cần thiết kế lại dây một chút.
Một cách để giải quyết vấn đề dòng chảy, là làm cho dây thành một mạch, thay vì chỉ các trạng thái trái phải đơn giản; nghĩa là, nó sẽ là hình tròn thay vì một đường và do đó, nếu phần trên cùng của vòng tròn được đẩy sang phải, phần dưới sẽ được đẩy sang trái. Điều này giải quyết vấn đề dòng chảy.
Theo lộ trình này, chúng ta có thể thay đổi cổng dây và mệnh đề để giải quyết cả hai vấn đề.
Bảo lưu vàFTF
Hãy để chúng tôi giới thiệu hai giá trị phổ quát mới, và . Hai giá trị này là phổ quát; các giá trị thực trong lưới, chẳng hạn như giá trị vuông và (theo quy ước, chúng tôi dành làm khối xây dựng cho các bức tường) hoặc bất cứ thứ gì bạn chọn. Chúng đại diện cho đúng và sai, tương ứng.F 2 3 1TF231
Chúng tôi buộc dự trữ các ô , , , như sau; minh họa bên dưới, mô tả từ trái sang phải:(T,F)( F , F )(T,T)(F,F)
- Chúng tôi sử dụng sơ đồ tương tự như buộc bất kỳ , sử dụng là . Mỗi và ở đây là duy nhất cho tiện ích này.T 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)T1⋆2⋆3⋆
- Chúng tôi sử dụng cùng một lược đồ như buộc bất kỳ , sử dụng là Mỗi và ở đây là duy nhất cho tiện ích này.F 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆2⋆3⋆
- Chúng tôi sử dụng sơ đồ tương tự như buộc một khối , sử dụng làm ở giữa và sử dụng ở các vị trí khác của up-tack. Điều này buộc để xếp. và có thể xếp chồng với , vì vậy chúng tôi xóa chúng khỏi tập hợp ô. Mỗi và ở đây là duy nhất cho tiện ích này.F 1 ⋆ T ( F , T ) 2 ⋆ 3 ⋆ T 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆T(F,T)2⋆3⋆T2⋆3⋆
Dây điện
Mỗi dây sẽ bắt đầu và kết thúc bằng một giá trị, chúng ta hãy gọi nó là , là duy nhất cho dây. Đối với mỗi mệnh đề mà dây tham gia, dây sẽ có hai giá trị dây là và , là duy nhất cho mỗi dây và tham gia vào cùng một mệnh đề. Minh họa dưới đây, với mô tả từ trái sang phải.A⋆x⋆x′⋆
- Một dây tham gia vào một mệnh đề. Dây có chiều cao là và có chiều dài , trong đó là số mệnh đề mà dây tham gia. Dây được đệm bởi hai hình vuông ở bên trái và hai bên phải Tất nhiên, nó được bao quanh bởi một bức tường ở tất cả các phía, được biểu thị bằng đường viền màu xanh. Lưu ý rằng là duy nhất cho dây này và sẽ chỉ được sử dụng trong dây và mệnh đề mà nó tham gia.22∗p+3pA⋆1⋆
Minh họa dưới đây là hai trạng thái, mô tả từ trái sang phải.
- Một dây tham gia vào một mệnh đề, ở trạng thái thực. Dây được coi là đúng, khi các hình vuông được ghép với một hình vuông hình vuông được ghép với hình vuôngNó được coi là sai ở trạng thái khác, nơi ốp lát bị đảo ngược. Lưu ý cách ốp lát được buộc sau khi lát được chọn: đã được buộc trước đó, do đó phần còn lại của gạch phải nằm ngang.x⋆Tx′⋆FA⋆(T,F)
- Các dây giống nhau trong trạng thái sai.
Khi tham gia vào nhiều mệnh đề, có nhiều giá trị và , một cặp cho mỗi mệnh đề mà dây tham gia. Chúng xen kẽ ở trên và dưới, cũng như và bình phương tách rời từng cặp .x⋆x′⋆TFx⋆,x′⋆
Hai trạng thái tương ứng.
Tiện ích này được đóng lại , do đó không có "vấn đề dòng chảy".
Lưu ý làm thế nào ở một trong hai trạng thái, chúng tôi thu thập các ô sau, bất kể trạng thái: , , .(A⋆,A⋆)(A⋆,T)(A⋆,F)
Có một số gạch tuy nhiên, chúng tôi không chắc chắn; ở một trạng thái, chúng ta có thể xóa từ tập hợp ô, trong khi ở trạng thái khác, chúng tôi có thể xóa từ bộ gạch, vì vậy chúng ta có thể xếp gạch nào Thực sự loại bỏ? Câu trả lời là: cổng mệnh đề có cùng một vấn đề, nhưng với bộ gạch đối diện. Nó sẽ luôn thu thập các gạch còn lại, đối diện và không bị chặn, như chúng ta sẽ thấy trong phần tiếp theo. Vì mỗi trong số này được ghép nối với một cổng mệnh đề, chúng tôi sẽ có thể loại bỏ cả hai.( 1 ⋆ , F ) , ( 1 ' ⋆ , T ) , ( 2 ⋆ , F ) , ( 2 ' ⋆ , T )(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...(1⋆,F),(1′⋆,T),(2⋆,F),(2′⋆,T)...
Khoản
Tiếp theo chúng ta sẽ tạo lần lặp đầu tiên của cổng mệnh đề mới. Nó bao gồm một tiện ích , được bao quanh bởi các bức tường. Bên trong tiện ích, chúng tôi đặt một ở trung tâm trên cùng và hai hình vuông ở các góc dưới; một ở phía dưới bên trái và một ở phía dưới bên phải. Các hình vuông còn lại sẽ là các giá trị đại diện cho các biến dây của ba dây khác nhau. Chúng ta hãy gọi những và . Các sẽ bị buộc phải cặp với một trong những dây-biến, và các dây biến còn lại sẽ ghép nối với giá trị. Minh họa dưới đây, mô tả từ trái sang phải.F T một ⋆ , b ⋆ , c ⋆ F T2×3FTa⋆,b⋆,c⋆FT
- Bên trái: Cấu hình cho lần lặp đầu tiên của cổng mệnh đề mới.
- Phải Ba trạng thái có thể của ốp látF
Ba trạng thái này dẫn đến ba nghiêng có thể. Minh họa dưới đây, mô tả từ trái sang phải.
- Trái, trên cùng : lát gạch trái, Trái, dưới: Ốp các ô vuông còn lại.F
- Giữa, trên cùng : lát gạch phải, Giữa, dưới: Ốp các ô vuông còn lại.F
- Phải, trên cùng : xếp xuống, Phải, dưới: Xếp các hình vuông còn lại.F
Vì sẽ được ghép nối với một trong các biến dây trong mệnh đề , biến dây đó không còn có thể được ghép với trong dây ; do đó buộc dây phải đúng. Ngược lại, các biến dây còn lại xếp với sẽ bị buộc phải xếp gạch với trong các dây của chúng. Đây chính xác là các ràng buộc tương tự như mệnh đề .FF TF1-in-3-SAT
Lưu ý, và là các biến dây, nhưng mỗi biến có thể tham chiếu đến hoặc biến dây; sử dụng về cơ bản là phủ định biến dây.a⋆,b⋆,c⋆x⋆x′⋆x′⋆
Một bổ sung: để thực hiện nghĩa vụ phải biết loại gạch nào có thể được loại bỏ khỏi bộ gạch, chúng ta phải "nhân đôi và chống lại" mệnh đề. Ý của tôi là, tạo ra một tiện ích , với biến bổ sung đại diện cho các phủ định của và . Chúng ta hãy gọi những và . Đây phải là các giá trị dây biến bị phủ định của và . Đây tiện ích là khác nhau, trong đó nó sẽ có một ở trung tâm, và hai3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆a⋆,b⋆,c⋆3×2TF giá trị ở các góc; chính xác ngược lại với các điều khoản tiện ích được mô tả cho đến nay. Bằng cách "nhân đôi" mệnh đề như thế này, chúng tôi thêm lại các ràng buộc tương tự như tiện ích được mô tả ở trên. Tuy nhiên, chúng tôi cũng xả tất cả các kết hợp của từ tập hợp ô, cho từng biến (và do đó cho và cũng vậy, vì rốt cuộc chúng là các biến dây). Minh họa dưới đây, mô tả từ trái sang phải.(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- Một mệnh đề "kép và contrapositive". Phần dưới cùng là mệnh đề được mô tả ở trên; phần trên cùng là mệnh đề contrapositive mới được mô tả. Mệnh đề mới có chính xác các ràng buộc logic tương tự; nó là phần phụ của mệnh đề dưới. Cùng với nhau, các tiện ích kết hợp này và dây xả tất cả các kết hợp của từ tập hợp ô, cho mỗi biến dây tham gia vào mệnh đề.(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- Đường màu xanh ở giữa hình bên trái nhất là ở đó để dễ nhìn; trong thực tế, nó có thể được gỡ bỏ mà không cho phép bất kỳ trạng thái nào nữa.
Vì vậy, chúng ta hãy lấy một ví dụ, để cho thấy rằng tất cả các gạch được xả như đã hứa. Minh họa dưới đây, mô tả từ trái sang phải.
- Hình của một dây tham gia vào một mệnh đề duy nhất; một trạng thái được chọn cho mệnh đề. Ở đây, chúng tôi đang sử dụng , trong khi và đại diện cho các giá trị dây khác trong mệnh đề này.1⋆=b⋆a⋆b⋆
- Đối với tình trạng được đưa ra trong mệnh đề, các giá trị buộc phải được ghép nối với các láng giềng .1⋆T
- Điều này làm cho dây bị buộc phải có giá trị thực (bạn có thể nói là biến dương của dây bị buộc phải ghép với và biến âm được buộc phải ghép với , như đã giải thích ở trên ).TF
- Điều này buộc trong mệnh đề contrapositive (phần trên của mệnh đề) được ghép với trong mệnh đề. Bây giờ nếu bạn nhìn vào dây, mọi ô trong dây đều được đảm bảo được xả: hoặc được xả trong chính dây hoặc trong mệnh đề tiện ích tương ứng. Ở trạng thái này, chúng ta có các ô, , , , , , và .1′⋆T(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
Thử trạng thái khác, chúng ta có được hình minh họa bên dưới, mô tả từ trái sang phải.
- Mệnh đề ở trạng thái khác, ốp lát theo một trong hai cách.(1⋆,T
- Do đó, bị buộc trên dây,(1⋆,F
- Dẫn phần còn lại của dây vào lát tương ứng và định giá dây là sai.
- Cuối cùng, trong phần dự phòng / phần trên của mệnh đề-tiện ích, phải xếp, vì được lấy trong dây điện. Ở trạng thái này, chúng ta có các ô, , , , , , và . Đây là những viên gạch giống nhau được thải ra như ở trạng thái khác .(1′⋆,F)(1′⋆,T)(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
Do đó, trong cả hai trạng thái, chúng tôi xả gạch giống nhau. Do đó, dây và mệnh đề cùng nhau xả thành công gạch cụ thể nếu có một nhiệm vụ thỏa mãn.
Tiện ích này đã bị đóng , vì vậy sẽ không có vấn đề về dòng chảy.
Tiện ích mệnh đề cùng với tiện ích dây được đảm bảo luôn luôn xả các giá trị cặp gạch giống nhau và do đó chúng ta có thể xả chúng ngay cả khi chúng ta không biết nó sẽ xếp theo cách nào.
Bây giờ tất cả các tiện ích của chúng tôi đáp ứng các tiêu chí.
Xây dựng
Trong công thức cuối cùng của chúng tôi, chúng tôi tạo ra ba hàng tiện ích, mỗi hàng cách nhau bởi một bức tường ngang.
- Ở phía dưới, chúng tôi đặt các tiện ích cưỡng bức, có hai gạch cao. Chúng ta cần một tiện ích buộc cho các khối xây dựng, và cho các kết hợp của và . Chúng tôi đặt các tiện ích buộc trực tiếp cạnh nhau.TF
- Ở hàng giữa, chúng tôi đặt các tiện ích dây, theo chiều ngang, là hai gạch cao. Các tiện ích dây phải được tách biệt với nhau bằng một bức tường thẳng đứng.
- Ở hàng trên cùng, chúng tôi đặt các tiện ích mệnh đề, có bốn gạch cao. Các tiện ích mệnh đề nên được ngăn cách với nhau bằng một bức tường thẳng đứng.
Minh họa theo sau, mô tả trên mỗi con số. Nhấp vào hình ảnh để giải quyết đầy đủ. Mã nguồn để tái tạo / tạo hình ảnh được liệt kê ở cuối trang.
Sử dụng công thức làm ví dụ giải pháp làm nhân chứng.Φ(x)=(x1,¬x2,x3)∧(x2,¬x3,x4)∧(x1,x2,¬x4)(¬x1,x2,x3,¬x4)
Đầu tiên chúng ta bắt đầu với các bức tường ngang ngăn cách các hàng tiện ích. Chúng tôi hiển thị các hình vuông, và các cặp buộc phải xếp gạch trong các bức tường.
Tiếp theo, chúng tôi hiển thị các tiện ích. Các phác thảo màu xanh đại diện cho biên giới của các tiện ích; màu xanh nét đứt cho các tiện ích cưỡng bức, vì chúng sẽ không được bao quanh bởi các bức tường. Lưu ý dòng ở giữa tiện ích mệnh đề không được bao quanh bởi một bức tường; nó ở đó để dễ nhìn; mang dòng đi không cho phép bất kỳ trạng thái nào xảy ra trong mệnh đề, như đã giải thích ở trên, nhưng chúng tôi hiển thị đường màu xanh cho trình diễn này. Lưu ý: rằng chúng tôi sử dụng tên hình vuông để cung cấp cho các số dễ đọc ngữ nghĩa, khi áp dụng. Mỗi tên đại diện cho một giá trị số.
Ở đây chúng tôi điền vào các bức tường thẳng đứng.
Ở đây chúng tôi điền vào giải pháp nhân chứng; tức là đây là giải pháp ốp lát nếu sử dụng giải pháp SAT để tạo ra nó.
Tiếp theo, chúng ta lát khu vực phụ; phần còn lại của bảng, lớn như cần thiết, cho đến lớn như được yêu cầu cho đến nay. Do đó, chúng tôi xả các cặp còn lại trong tập hợp gạch. Các đường đứt nét ở đây đại diện cho một lát gạch hợp lệ nhưng không bắt buộc; có thể có một cách khác để ốp lát những thứ này. Ở đây chúng tôi hiển thị góc dưới bên trái.n
Ở đây chúng ta điền vào các ô vuông còn lại với một lát hợp lệ tầm thường.
Ở đây chúng tôi hiển thị góc dưới bên phải của lưới.
Ở đây chúng tôi hiển thị góc trên bên phải của lưới. Lưu ý làm thế nào gạch dọc không còn phù hợp; vì vậy chúng tôi xếp hàng trên cùng theo chiều ngang, nếu cần thiết.
Và cuối cùng là góc trên bên trái.
Việc tạo toàn bộ bảng trò chơi cùng một lúc thông qua TeX không thành công với các lỗi hết bộ nhớ từ pdflatex, vì vậy nếu bạn muốn xem nó, bạn sẽ phải tạo các clip và vá chúng lại với nhau. Hãy chắc chắn để kiểm tra trình xem máy tính xách tay .
Nguồn TikZ
Trình tạo trò chơi:
graphtex.py
Chuyển đổi TeX thành svg, sử dụng pdflatex, pdfcairo (poppler) và rsvg-convert (libsvg)
dominosa.py
Chứa logic chuyển đổi, xác minh giải pháp trò chơi và logic vẽ
dominosa_demo.py
Một bản demo thực thi tạo ra các hình ảnh được sử dụng trong câu trả lời ở trên. Kết xuất hình ảnh vào thư mục làm việc hiện tại.
dominosa_demo.ipynb
Một bản demo ipython tạo ra các hình ảnh được sử dụng trong câu trả lời ở trên.