หมายเหตุ: นี่คือความต่อเนื่องและการแก้ไขของฉันคำตอบอื่น ๆ
มีปัญหากับการลด
ระลึกถึงปัญหาการตัดสินใจ:
มีการปูกระเบื้องที่สมบูรณ์แบบครอบคลุมที่กำหนดตารางที่มีกระเบื้องที่ไม่ซ้ำกัน?n(n+1)×(n+2)n
ดังนั้นสำหรับตารางเราสามารถใช้เพียงตัวแปรn(n+1)×(n+2)n
แต่:
- การลดลงของเราต้องใช้จำนวนมากของตัวแปรที่ไม่ซ้ำกันมากขึ้นกว่า(n)O(n)
- นอกจากนี้สายไฟของเรายังคงเปิดให้บริการซึ่งนำไปสู่:
- เราจะรู้ได้อย่างไรว่าเราสามารถเรียงพื้นที่เปิดโล่งได้?
เพื่อแก้ปัญหาแรกเราได้ทำให้เกมกระดานมีขนาดใหญ่ขึ้น โดยพื้นฐานแล้วเราสร้างเท่ากับจำนวนของตัวแปรที่เราต้องการจริงจากนั้นสร้างกริดที่มีขนาดและวางกริดของเราที่มุมซ้ายล่าง สิ่งนี้จะนำไปสู่การระเบิดเป็นกำลังสอง( n + 1 ) × ( n + 2 )n(n+1)×(n+2)
สำหรับปัญหาที่สองเราต้องคิดใหม่เกี่ยวกับแกดเจ็ตของเราเล็กน้อย
ดูเหมือนว่าอาจเป็นเรื่องเล็กน้อยที่จะพิสูจน์ว่าเราสามารถปูกระเบื้องกระดานที่เหลือตามกฎได้สำเร็จ ดังนั้นเราจึงเริ่มด้วยกลยุทธ์เดียวกับที่จะใช้เพื่อสร้างบอร์ดเกมขนาด :(n+1)×(n+2)
ก่อนอื่นเราสร้างชุดไพ่ทั้งหมดที่เป็นไปได้ ไพ่เหล่านี้ทั้งหมดจะต้องถูกวางไว้บนกระดาน จากนั้นเราก็เอากระเบื้องออกและทิ้งไว้ข้างหลังสี่เหลี่ยม
อย่างไรก็ตามแกดเจ็ตของเราไม่รับประกันว่าจะมีการวางกระเบื้องชุดใดชุดหนึ่ง กระเบื้องวางขึ้นอยู่กับสถานะ ดังนั้นเราจะต้องแก้ไขแกดเจ็ตอย่างระมัดระวังเพื่อรับประกันว่าจะลบไทล์ใดโดยเฉพาะ
มาดูแกดเจ็ตของเรากันดีกว่า
wire และ clause-gate นั้นมีปัญหาด้วยเหตุผลสองประการ
- เราไม่ทราบว่าช่องสี่เหลี่ยมที่ล้อมรอบด้วยเส้นลวดหรือประตูส่วนคำสั่งสามารถปูกระเบื้องได้อย่างถูกต้อง หลังจากทั้งหมดสายบางอย่างสามารถผลักไปทางซ้ายอื่น ๆ ไปทางขวาและการเรียงสี่เหลี่ยมพื้นที่สีขาวที่เหลือจะกลายเป็นเรื่องไม่สำคัญ เราจะอ้างถึงปัญหานี้ว่าเป็นปัญหา "ไหล"
- ไม่มีทางรู้ว่าไม่เป็นที่กระเบื้องจะลบออกจากกระเบื้องชุด; ในรัฐหนึ่งชุดสี่เหลี่ยมหนึ่งชุดในลวดหรือข้อเกตจะถูกปูกระเบื้องในอีกสถานะหนึ่งชุดสี่เหลี่ยมที่แตกต่างกันอย่างสิ้นเชิงจะถูกเรียงต่อกัน
ในการแก้ปัญหาเหล่านี้:
- อันดับแรกเราสร้างชุดไพ่ทั้งหมดที่เป็นไปได้ ไพ่เหล่านี้ทั้งหมดจะต้องถูกวางไว้บนกระดาน ในขณะที่เราวางมันไว้บนกระดานเราจะลบแผ่นกระเบื้องออกจากชุด แม้ว่าในตอนแรกเราอาจไม่รู้จักเนื่องจากเรายังไม่ได้อธิบายสูตรอย่างสมบูรณ์ แต่เราสามารถเพิ่มความเป็นไปได้ของไทล์ใหม่เมื่อเราเพิ่มตามที่ต้องการ กระเบื้องทั้งหมดที่เราลบออกจากชุดนี้จะต้องรับประกันว่าสามารถวางตำแหน่งได้ (อย่างน้อยต้องได้รับการรับประกันว่าจะสามารถวางได้หากสูตรเป็นที่น่าพอใจ) เราเรียกการเอาไทล์ออกจากชุดไพ่เพื่อ "ปลด" ไทล์ออกจากชุดไพ่เพื่อที่จะปลดเปลื้องภาระหน้าที่ของเราที่จะวางไว้บนกระดานเกมnnn
- เราจะต้องออกแบบอุปกรณ์อย่างระมัดระวังเพื่อรับประกันว่าจะลบกระเบื้องใดโดยเฉพาะไม่ว่าสถานะใดจะถูกเลือก
- เราต้องปิดแกดเจ็ตของเราเพื่อไม่ให้มีการปูกระเบื้องทั่วกระดานโดยขึ้นอยู่กับสถานะ ค่อนข้างทุกรัฐของพวกเขาจะต้องใช้พื้นที่ที่กำหนดโดยเฉพาะเท่านั้น
- รัฐทั้งหมดของพวกเขาจะต้องรับประกันว่าจะสามารถใช้พื้นที่ที่กำหนดไว้อย่างดี สิ่งนี้รับประกันว่าจะได้ผลงานที่น่าพอใจ แต่ไม่รับประกันว่าจะมีการเรียงต่อกันโดยเฉพาะ นี่เป็นวิธีเดียวกับที่เกมโดมิโนทำ:
- ก่อนอื่นไพ่ถูกสร้างเป็นชุด
- จากนั้นวางไพ่ลงในการกำหนดค่าแบบสุ่ม
- เมื่อวางกระเบื้องแต่ละอันมันจะถูกลบออกจากชุดไพ่
- จากนั้นกระเบื้องจะถูกลบออกจากกระดานทิ้งไว้ด้านหลังสี่เหลี่ยม
- สิ่งนี้ไม่รับประกันว่าจะมีการเลือกการกำหนดค่าที่ต้องการ
- แต่เป็นการรับประกันว่าสามารถเลือกการกำหนดค่าที่ต้องการได้และจึงมีวิธีแก้ไขปัญหาอยู่ เราสามารถทำสิ่งเดียวกันได้ที่นี่
- หลังจากวางแกดเจ็ตทั้งหมดของสูตรแล้วแทนที่จะวางสี่เหลี่ยมไม่ซ้ำกันโดยค่าเริ่มต้นคือใน "ช่องว่าง" ทั้งหมดเราตรวจสอบให้แน่ใจว่าช่องว่างนั้นเป็นพื้นที่รูปสี่เหลี่ยมผืนผ้าที่มีขนาดเท่ากันหรือแยกช่องว่างลงในสี่เหลี่ยม แม้แต่มิติเดียวและเราก็เรียงช่องว่างด้วยกระเบื้องที่เหลือในชุดไพ่⋆
- หลังจากวางกระเบื้องทั้งหมดจากชุดเรารู้ว่าทุกอย่างจะถูกวาง
- เห็นได้ชัดว่ามีบางตำแหน่งที่สามารถวางกระเบื้องได้เช่นในกำแพงและอื่น ๆ จะสามารถติดตั้งได้ถ้ามีสูตรที่น่าพอใจเนื่องจากลักษณะของความสัมพันธ์ระหว่างแกดเจ็ต
- จากนั้นเราก็เอากระเบื้องออกและทิ้งไว้ข้างหลังสี่เหลี่ยม
มาดูแกดเจ็ตของเรากันดีกว่า
กำลังบังคับให้อุปกรณ์
เราสามารถสร้างบล็อคจำนวนตามอำเภอใจโดยทำให้แน่ใจว่าแต่ละบล็อคไม่สามารถจับคู่กับตัวเองได้
ตัวอย่างเช่นให้เราบอกว่าเราต้องการบังคับไพ่เพื่อให้เราสามารถใช้เป็น บล็อคอาคาร (หมายเหตุเป็นตัวแปรตามอำเภอใจซึ่งเราต้องการบังคับให้เป็นคู่กับตัวเองไม่จำเป็นต้องเป็นแบบเอกสารสำเร็จรูปในขณะที่เราใช้ค่าก่อนหน้านี้)1 ⋆ 1 ⋆ 1(1⋆,1⋆)1⋆1⋆1
เพื่อรับประกันว่าของเรา - การสร้างบล็อกสำรองเราจะวางมันไว้กับผนังด้านล่างใน การกำหนดค่าต่อไปนี้: เราจะวางหมายเลขที่สงวนไว้ให้เราเรียกมันว่าเทียบกับกำแพงเหมือนขึ้นตะปู (รูปร่างเหมือน ); ต่อกำแพงและอีกหนึ่งในแถวที่ 2 ที่อยู่ตรงกลาง จากนั้นเราจะใส่อีกสองตัวเลขให้เราเรียกพวกเขาว่าและ ; สิ่งเหล่านี้ไม่ซ้ำกับ gadget นี้ เราวางเหล่านี้บนซ้ายและขวาดาว}( 1 ⋆ , 1 ⋆ ) 1 ⋆ ⊥ 3 2 ⋆ 3 ⋆ 1 ⋆1⋆(1⋆,1⋆)1⋆⊥32⋆3⋆1⋆
ภาพประกอบด้านล่างขอบสีดำที่ใช้ร่วมกันอยู่ด้านล่างของกระดานเกมคำอธิบายจากซ้ายไปขวา
- การกำหนดค่าของอุปกรณ์ แต่ละและนี่เป็นเอกลักษณ์ของ Gadget นี้3 ⋆2⋆3⋆
- 3 รัฐเป็นไปได้ของการปูกระเบื้องศูนย์ดาว}1⋆
หลังจากทำเช่นนี้เราสามารถรับประกันได้ว่าแกดเจ็ตของเราสามารถได้รับการปูกระเบื้องที่มีเฉพาะชุดของกระเบื้องในขณะที่รับประกันว่าแกดเจ็ตของเราจะต้องบังคับให้คู่ .(1⋆,1⋆)
- เรารู้ว่าจะต้องเกิดขึ้นเนื่องจากทั้ง 3 สถานะที่เป็นไปได้ของการเรียงต่อกันของกระเบื้องตรงกลางเรียงเป็นดังที่แสดงในรูปด้านขวาด้านบน1 ⋆ ( 1 ⋆ , 1 ⋆ )(1⋆,1⋆)1⋆(1⋆,1⋆)
- กระเบื้องที่เหลือสามารถปูกระเบื้องเป็นและซึ่งครอบคลุมแกดเจ็ต ดังนั้นเราสามารถลบกระเบื้องเหล่านั้นออกจากชุดกระเบื้องทั่วโลก ภาพประกอบด้านล่าง(1⋆,2⋆)(1⋆,3⋆)
คำอธิบายจากซ้ายไปขวา:
- ซ้าย, บนสุด:ซ้าย, ซ้าย, ล่าง:ปูกระเบื้องที่ถูกต้องของสี่เหลี่ยมที่เหลือ
- Middle, top:รัฐ Middle, Middle, bottom:กระเบื้องที่ถูกต้องของสี่เหลี่ยมที่เหลือ
- ขวา, ด้านบน:สถานะด้านขวา, ด้านล่างขวา:ปูกระเบื้องที่ถูกต้องของสี่เหลี่ยมที่เหลืออยู่
โปรดสังเกตว่าการเรียงตัวของสี่เหลี่ยมจัตุรัสที่เหลือไม่ได้ถูกบังคับเนื่องจากสามารถเรียงต่อกับเพื่อนบ้านใกล้เคียงแทนแต่เนื่องจากเป็นการปูกระเบื้องที่ถูกต้องของเกมกระดานในทุกรัฐ เราสามารถลบพวกมันออกจากชุดไพ่ได้และสมมติว่าพวกเขาจะถูกปูกระเบื้องด้วยวิธีนั้น เนื่องจากเรารู้ว่ามีความเป็นไปได้ที่จะมีการเรียงต่อกันเรามีอย่างน้อยหนึ่งรายการที่เป็นไปได้ของเกมกระดานหากสูตรเป็นที่น่าพอใจ แม้ว่าจะไม่มีการรับประกันว่าสิ่งเหล่านี้จะได้รับการปูกระเบื้องด้วยวิธีนี้ แต่มีการรับประกันว่าแผ่นกระเบื้องจะถูกบังคับ( 1 ⋆ , 1 ⋆ )1⋆(1⋆,1⋆)
หมายเหตุ:หากคุณไม่พอใจกับสิ่งนี้หรือสับสนกับความแตกต่างของ "ความสามารถในการเรียงภาพ" และ "ถูกบังคับให้เรียงภาพ" คุณสามารถวางกำแพงล้อมรอบGadgetเช่นเดียวกัน เราสร้างกำแพงด้านล่างสำหรับ clause-gadget3 × 23×23×2
แกดเจ็ตนี้ไม่ได้ปิดเพราะไม่จำเป็นต้อง (แต่คุณสามารถทำได้ถ้าต้องการ) ไม่จำเป็นเพราะมันมีการกำหนดค่าที่เป็นไปได้ซึ่งเราสามารถลบออกจากชุดไพ่ได้ แม้ว่ามันอาจจะเป็นไปได้ที่จะทำการกำหนดค่าที่แตกต่างกันนี้ไม่ได้ส่งผลกระทบต่อความพึงพอใจของปัญหา
กระเบื้องต่อไปนี้รับประกันว่าจะได้รับการปูกระเบื้อง (ซึ่งสามารถลบออกได้จากชุดไพ่): (1⋆,1⋆)
กระเบื้องต่อไปนี้รับประกันว่าจะสามารถปูกระเบื้อง (ซึ่งสามารถลบออกจากชุดไพ่ได้): (1⋆,2⋆),(1⋆,3⋆)
หากคุณเลือกที่จะปิดแกดเจ็ตนี้ด้วยกำแพงดังนั้นก็จะเป็นเช่นกัน รับประกันที่จะครอบคลุม(1⋆,2⋆),(1⋆,3⋆)
ใหม่ลวดและประตูมาตรา
เนื่องจากปัญหาการไหลและการล้างชุดกระเบื้องเราจึงต้องออกแบบลวดใหม่อีกเล็กน้อย
วิธีหนึ่งในการแก้ปัญหาการไหลคือทำให้ลวดเป็นวงจรแทนที่จะเป็นสถานะทางซ้ายขวาที่เรียบง่าย นั่นคือมันจะเป็นวงกลมแทนที่จะเป็นบรรทัดดังนั้นถ้าส่วนบนของวงกลมถูกผลักไปทางขวาล่างจะถูกผลักออกไป วิธีนี้จะช่วยแก้ปัญหาการไหล
ตามเส้นทางนี้เราสามารถเปลี่ยนลวดและประตูข้อเพื่อแก้ปัญหาทั้งสอง
กำลังสำรองและFTF
ให้เราแนะนำสองค่าสากลใหม่และF ค่าทั้งสองนี้เป็นค่าสากล ค่าจริงในตารางเช่นค่าสแควร์และ (เนื่องจากตามแบบแผนเราสงวนเป็นแบบเอกสารสำเร็จรูปสำหรับกำแพง) หรือสิ่งที่คุณเลือก พวกเขาเป็นตัวแทนของจริงและเท็จตามลำดับF 2 3 1 1TF231
เราบังคับให้จองกระเบื้อง , ,ดังต่อไปนี้; ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:( T , T ) ( F , F )(T,F)(T,T)(F,F)
- เราใช้รูปแบบเดียวกับการบังคับใด ๆกระเบื้องใช้เป็นดาว} แต่ละและนี่เป็นเอกลักษณ์ของ Gadget นี้T 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)T1⋆2⋆3⋆
- เราใช้รูปแบบเดียวกันกับการบังคับให้ไพ่โดยใช้เป็นแต่ละและที่นี่ไม่ซ้ำกับ gadget นี้F 1 ⋆ 2 ⋆ 3 ⋆(1⋆,1⋆)F1⋆2⋆3⋆
- เราใช้รูปแบบเดียวกันกับการบังคับให้ไพ่โดยใช้เป็นที่กึ่งกลางและ กำลังใช้ในตำแหน่งอื่นของขาขึ้น กองกำลังนี้กับไทล์ และสามารถเรียงต่อกันด้วยดังนั้นเราจึงลบออกจากชุดไพ่ แต่ละและนี่เป็นเอกลักษณ์ของ Gadget นี้F 1 ⋆ T ( F , T ) 2 ⋆ 3 ⋆ T(1⋆,1⋆)F1⋆T(F,T)2⋆3⋆T3 ⋆2⋆3⋆
ลวด
เส้นลวดแต่ละเส้นจะเริ่มต้นและสิ้นสุดด้วยค่าให้เราเรียกว่าซึ่งเป็นสายที่ไม่ซ้ำกัน สำหรับแต่ละประโยคที่ wire เข้าร่วมนั้น wire จะมี wire-value สองค่าคือและซึ่งมีลักษณะเฉพาะสำหรับแต่ละ wire และมีส่วนร่วมใน clause เดียวกัน ภาพประกอบด้านล่างพร้อมคำอธิบายจากซ้ายไปขวาx ⋆ x ′ ⋆A⋆x⋆x′⋆
- สายไฟที่เข้าร่วมในข้อเดียว ลวดมีความสูงและมีความยาวโดยที่คือจำนวนส่วนคำสั่งที่ลวดเข้าร่วมลวดจะถูกหุ้มด้วยสี่เหลี่ยมทางซ้ายสองอันและ สองอยู่ทางขวา แน่นอนว่ามันล้อมรอบด้วยกำแพงทุกด้านที่ระบุด้วยโครงร่างสีน้ำเงิน โปรดทราบว่ามีลักษณะเฉพาะกับสายนี้และจะใช้เฉพาะในสายและมีส่วนร่วมในประโยค2 ∗ p + 3 p A ⋆ 1 ⋆22∗p+3pA⋆1⋆
ภาพประกอบด้านล่างนี้เป็นสองสถานะคำอธิบายจากซ้ายไปขวา
- สายไฟที่เข้าร่วมในหนึ่งประโยคในสถานะที่แท้จริง ลวดถือเป็นจริงเมื่อกำลังจับคู่กับกำลังสองและกำลังจับคู่กับสี่เหลี่ยม ถือว่าเป็นเท็จในอีกสถานะหนึ่งที่เรียงต่อกัน โปรดสังเกตว่าการบังคับให้เรียงต่อกันอย่างไรเมื่อเลือกไพ่ :ถูกบังคับใช้ก่อนหน้านี้แล้วดังนั้นส่วนที่เหลือของแนวนอนจะต้องเป็นแนวนอนT x ′ ⋆ F A ⋆ ( T , F )x⋆Tx′⋆FA⋆(T,F)
- สายเดียวกันในสถานะเท็จ
เมื่อเข้าร่วมในส่วนคำสั่งเพิ่มเติมมีค่ามากขึ้น และคู่หนึ่งคู่สำหรับแต่ละข้อที่ลวดเข้าร่วมพวกเขาสลับกันอยู่ด้านบนและด้านล่างเช่นเดียวกับและสี่เหลี่ยมที่แยกแต่ละคู่x ′ ⋆ T F x ⋆ , x ′ ⋆x⋆x′⋆TFx⋆,x′⋆
สถานะที่สอดคล้องกันสองสถานะ
แกดเจ็ตนี้ถูกปิดดังนั้นจึงไม่มี "ปัญหาการไหล"
โปรดสังเกตว่าในทั้งสองสถานะเรารวบรวมไพ่ต่อไปนี้ไม่ว่าจะเป็นรัฐ: , , mathcal)( A ⋆ , T ) ( A ⋆ , F )(A⋆,A⋆)(A⋆,T)(A⋆,F)
อย่างไรก็ตามมีบางกระเบื้องที่เราไม่แน่ใจ ในสถานะเดียวเราสามารถลบจากชุดไพ่ในขณะที่อยู่ในสถานะอื่นเราสามารถลบจากชุดไพ่เพื่อที่เราจะได้ ต้องการลบจริงหรือ คำตอบคือ: ประตูประโยคมีปัญหาเดียวกัน แต่มีชุดของกระเบื้องที่ตรงกันข้าม มันจะรวบรวมไพ่ที่เหลือตรงข้ามและที่ไม่ได้รวบรวมเสมอซึ่งเราจะเห็นในส่วนถัดไป เนื่องจากแต่ละรายการเหล่านี้จับคู่กับส่วนคำสั่งเราจะสามารถลบออกได้ทั้งคู่(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...(1⋆,F),(1′⋆,T),(2⋆,F),(2′⋆,T)...
ประโยค
ต่อไปเราจะสร้างการวนซ้ำครั้งแรกของส่วนคำสั่งใหม่ มันประกอบไปด้วยแกดเจ็ตล้อมรอบด้วยกำแพง ภายในแกดเจ็ตเราวางหนึ่งตัวที่กึ่งกลางด้านบนและสองกำลังสองที่มุมด้านล่าง หนึ่งอันที่มุมล่างซ้ายและอีกอันที่มุมล่างขวา สี่เหลี่ยมจัตุรัสที่เหลือจะเป็นค่าที่แสดงถึงตัวแปรลวดของสายไฟสามเส้น ให้เราเรียกและเหล่านี้ จะถูกบังคับให้คู่กับหนึ่งในสายตัวแปรและที่เหลือลวดตัวแปรจะจับคู่กับค่า ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวาF T2×3FTa⋆,b⋆,c⋆FT
- ซ้าย:การกำหนดค่าสำหรับการวนซ้ำครั้งแรกของ clause-gate ใหม่
- ถูกต้องสามสถานะที่เป็นไปได้ของการปูกระเบื้องF
ทั้งสามรัฐนำไปสู่การเอียงสามที่เป็นไปได้ ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา
- ซ้าย, บนสุด :ปูกระเบื้องซ้าย, ซ้าย, ล่าง:ปูกระเบื้องสี่เหลี่ยมที่เหลือF
- กลางด้านบน :ปูกระเบื้องด้านขวากลางด้านล่าง:เรียงลำดับสี่เหลี่ยมที่เหลือF
- ขวา, บนสุด :ปูกระเบื้อง, ล่าง, ขวา:ปูกระเบื้องสี่เหลี่ยมที่เหลือF
เนื่องจากจะถูกจับคู่กับหนึ่งในตัวแปรลวดในประโยค , ลวด - ตัวแปรนั้นไม่สามารถจับคู่กับในลวดอีกต่อไป; จึงบังคับให้ลวดเป็นจริง ในทางกลับกันตัวแปรลวดที่เหลือที่เรียงด้วยจะถูกบังคับให้เรียงต่อด้วยภายในสายของพวกเขา ตรงนี้เป็นข้อ จำกัด เช่นเดียวกับข้อFF TF1-in-3-SAT
หมายเหตุและเป็นตัวแปรลวด แต่พวกเขาแต่ละคนสามารถอ้างถึงหรือตัวแปรลวด; การใช้โดยหลักแล้วก็คือการปฏิเสธตัวแปรลวดa⋆,b⋆,c⋆x⋆x′⋆x′⋆
นอกจากนี้หนึ่งในการปลดภาระหน้าที่ในการทราบว่าสามารถถอดกระเบื้องใดออกจากชุดกระเบื้องได้เราต้อง "อนุประโยคและการทับซ้อน" ข้อ สิ่งที่ผมหมายถึงนี้คือการทำให้อีกแกดเจ็ตที่มีตัวแปรเพิ่มเติมตัวแทน negations ของและดาว} ให้เราเรียกและเหล่านี้ เหล่านี้จะต้องเป็นค่าเมื่อตะกี้ตัวแปรลวดและดาว} นี้แกดเจ็ตที่แตกต่างกันในการที่จะมีที่ศูนย์และสอง3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆a⋆,b⋆,c⋆3×2TFค่าที่มุม; ตรงข้ามกับแกดเจ็ตประโยคที่อธิบายไว้จนถึง โดยการ "เพิ่ม" อนุประโยคเช่นนี้เราจะเพิ่มข้อ จำกัด เดียวกันกับแกดเจ็ตที่อธิบายไว้ข้างต้นอีกครั้ง อย่างไรก็ตามเรายังปล่อยชุดค่าผสมทั้งหมดของ จากชุดไพ่สำหรับแต่ละตัวแปร (และสำหรับและเช่นกันเพราะมันคือตัวแปรลวด) ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- ประโยค "double and contrapositive" ส่วนด้านล่างเป็นประโยคที่อธิบายไว้ข้างต้น ส่วนด้านบนเป็นส่วนคำสั่งที่อธิบายใหม่ ประโยคใหม่มีข้อ จำกัด เชิงตรรกะเหมือนกันทุกประการ มันเป็น contrapositive ของประโยคด้านล่าง อุปกรณ์เสริมที่รวมกันเหล่านี้และการปล่อยลวดทั้งหมดของจากชุดไพ่สำหรับแต่ละตัวแปรลวดที่เข้าร่วมในข้อ(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- เส้นสีน้ำเงินที่อยู่ตรงกลางของรูปซ้ายสุดจะอยู่ที่นั่นเพื่อความสะดวกในการดู ในความเป็นจริงมันสามารถลบออกได้โดยไม่อนุญาตให้มีสถานะใด ๆ เพิ่มเติม
ดังนั้นให้เรายกตัวอย่างเพื่อแสดงให้เห็นว่าไพ่ทั้งหมดถูกปลดตามที่สัญญา ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา
- รูปของ wire ที่เข้าร่วมใน clause เดียว สถานะถูกเลือกสำหรับส่วนคำสั่ง ที่นี่เราใช้ในขณะที่และแทนค่าสายอื่น ๆ ในข้อนี้1⋆=b⋆a⋆b⋆
- สำหรับรัฐที่กำหนดในข้อที่ค่าถูกบังคับให้ต้องจับคู่กับเพื่อนบ้านT1⋆T
- สิ่งนี้ทำให้ลวดถูกบังคับให้เป็นค่าจริง (คุณสามารถบอกได้ว่าตัวแปรบวกของสายถูกบังคับให้จับคู่กับและตัวแปรลบจะถูกบังคับให้จับคู่กับดังที่อธิบายไว้ข้างต้น )TF
- สิ่งนี้บังคับให้อยู่ในส่วนคำสั่ง contrapositive (ส่วนบนของประโยค) เพื่อจับคู่กับภายในส่วนคำสั่ง ตอนนี้ถ้าคุณดูที่ wire ทุกไทล์ที่อยู่ใน wire นั้นจะรับประกันว่าจะถูกปล่อยออกมา: ไม่ว่าจะปล่อยออกมาใน wire หรือใน clause-gadget ในรัฐนี้เรามีแผ่นกระเบื้อง , , , , ,และT)1′⋆T(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
ลองรัฐอื่นเราได้ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา
- ส่วนคำสั่งอยู่ในอีกสถานะหนึ่งเรียงต่อกันในหนึ่งในสองวิธี(1⋆,T
- ดังนั้นถูกบังคับบนสาย(1⋆,F
- นำส่วนที่เหลือของลวดไปที่แผ่นกระเบื้องตามลำดับและให้ค่าลวดเป็นเท็จ
- ในที่สุดในส่วนของอนุประโยค / เบ็ดเตล็ดต้องเรียงลำดับเนื่องจากอยู่ใน ลวด ในรัฐนี้เรามีแผ่นกระเบื้อง , , , , ,และT) เหล่านี้เป็นกระเบื้องเดียวกันที่ปล่อยออกมาในขณะที่รัฐอื่น ๆ(1′⋆,F)(1′⋆,T)(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T)(1⋆,F)(1′⋆,F)(1′⋆,T)
ดังนั้นในรัฐใดรัฐหนึ่งเราปล่อยกระเบื้องเดียวกัน ดังนั้นสายและส่วนคำสั่งรวมกันประสบความสำเร็จในการปล่อยกระเบื้องเฉพาะถ้ามีการมอบหมายที่น่าพอใจ
แกดเจ็ตนี้ถูกปิดดังนั้นจึงไม่มีปัญหาเรื่องการไหล
clause-gadget พร้อมกับ wire gadgetรับประกันว่าจะปล่อยค่าไทล์คู่เดียวกันเสมอและทำให้เราสามารถปลดปล่อยสิ่งเหล่านี้ได้แม้ว่าเราจะไม่รู้ว่ามันจะเรียงต่อกันอย่างไร
ตอนนี้แกดเจ็ตของเราทั้งหมดเป็นไปตามเกณฑ์
การกำหนด
ในการกำหนดขั้นสุดท้ายของเราเราสร้างอุปกรณ์สามแถวแต่ละอันคั่นด้วยกำแพงแนวนอน
- ที่ด้านล่างเราวางเครื่องมือบังคับซึ่งเป็นสองแผ่นสูง เราจำเป็นต้องมีแกดเจ็ตบังคับสำหรับการสร้างบล็อกและสำหรับการรวมกันของและF เราวางแกดเจ็ตที่บังคับให้ติดกันโดยตรงTF
- ในแถวกลางเราวางแกดเจ็ตลวดในแนวนอนซึ่งมีความสูงสองแผ่น แกดเจ็ตสายควรแยกออกจากกันด้วยกำแพงแนวตั้ง
- ในแถวบนสุดเราวางประโยคเบ็ดเตล็ดซึ่งมีความสูงสี่แผ่น แกดเจ็ตประโยคควรแยกออกจากกันโดยผนังแนวตั้ง
ภาพประกอบปฏิบัติตามคำอธิบายด้านบนแต่ละรูป คลิกที่ภาพเพื่อความละเอียดเต็ม ซอร์สโค้ดสำหรับสร้างซ้ำ / สร้างอิมเมจแสดงอยู่ที่ด้านล่างของหน้า
การใช้สูตรเป็นตัวอย่างที่น่าพอใจ โซลูชันในฐานะพยานΦ(x)=(x1,¬x2,x3)∧(x2,¬x3,x4)∧(x1,x2,¬x4)(¬x1,x2,x3,¬x4)
ก่อนอื่นเราเริ่มด้วยผนังแนวนอนเพื่อแยกแถวของแกดเจ็ต เราแสดงสี่เหลี่ยมและคู่ที่ถูกบังคับให้ติดกระเบื้องภายในกำแพง
ต่อไปเราจะแสดงแกดเจ็ต โครงร่างสีน้ำเงินแสดงถึงเส้นขอบของแกดเจ็ต เส้นประสีฟ้าสำหรับอุปกรณ์บังคับใช้เนื่องจากจะไม่ถูกล้อมรอบด้วยกำแพง โปรดสังเกตว่าบรรทัดที่อยู่ตรงกลางของส่วนคำสั่งเบ็ดเตล็ดนั้นไม่ล้อมรอบด้วยกำแพง มันอยู่ที่นั่นเพื่อความสะดวกในการดู; การถอดสายไม่อนุญาตให้มีสถานะใด ๆ เกิดขึ้นอีกในประโยคตามที่อธิบายไว้ข้างต้น แต่เราแสดงเส้นสีน้ำเงินสำหรับการสาธิตนี้ หมายเหตุ:เราใช้ชื่อแบบเหลี่ยมเพื่อให้สามารถอ่านค่า semantic ได้เมื่อมีการใช้ แต่ละชื่อแสดงถึงค่าตัวเลข
ที่นี่เราเติมในผนังแนวตั้ง
ที่นี่เรากรอกคำตอบของพยาน; นั่นคือนี่เป็นวิธีการปูกระเบื้องถ้าใช้โซลูชัน SAT เพื่อสร้างมันขึ้นมา
ต่อไปเราจะเรียงแผ่นฟิลเลอร์ - พื้นที่ ส่วนที่เหลือของคณะกรรมการมีขนาดใหญ่เท่าที่จำเป็นสำหรับขนาดใหญ่เป็นจะต้องกระเบื้องป่านนี้ ดังนั้นเราจึงปล่อยคู่ที่เหลือในชุดไพ่ เส้นประที่นี่แสดงถึงการเรียงต่อกันที่ถูกต้อง แต่ไม่บังคับ อาจมีวิธีอื่นในการปูกระเบื้องเหล่านี้ ที่นี่เราแสดงมุมซ้ายล่างn
ที่นี่เราเติมเต็มสี่เหลี่ยมที่เหลือด้วยการเรียงต่อกันที่ถูกต้องเล็กน้อย
ที่นี่เราแสดงมุมขวาล่างของตาราง
ที่นี่เราแสดงมุมบนขวาของตาราง สังเกตว่ากระเบื้องแนวตั้งไม่พอดีอีกต่อไปอย่างไร ดังนั้นเราจึงเรียงแถวบนสุดในแนวนอนหากจำเป็น
และในที่สุดมุมบนซ้าย
การสร้างเกมกระดานทั้งหมดในครั้งเดียวผ่าน TeX ล้มเหลวโดยมีข้อผิดพลาดออกจากหน่วยความจำจาก pdflatex ดังนั้นหากคุณต้องการดูคุณจะต้องสร้างคลิปและปะเข้าด้วยกัน ให้แน่ใจว่าได้ตรวจสอบผู้ชมโน๊ตบุ๊ค
แหล่ง TikZ
ตัวกำเนิดเกม:
graphtex.py
แปลง TeX เป็น svg โดยใช้ pdflatex, pdfcairo (poppler) และ rsvg-convert (libsvg)
dominosa.py
มีตรรกะการแปลงการตรวจสอบวิธีแก้ปัญหาเกมและตรรกะการวาด
dominosa_demo.py
การสาธิตการปฏิบัติการที่สร้างภาพที่ใช้ในคำตอบข้างต้น ดัมพ์อิมเมจไปที่ไดเร็กทอรีการทำงานปัจจุบัน
dominosa_demo.ipynb
การสาธิต ipython ที่สร้างภาพที่ใช้ในคำตอบข้างต้น