З коментаря вище:
Я використовував бібліотеку Choco Java для програмування обмежень, щоб перевірити правильність поведінки гаджетів, що використовуються для доведення NP-повноти наступних головоломок: Бінарний пазл, Намети, головоломка з кубиком без вільних комірок, Net. Я ще не встиг їх опублікувати, але проекти документів доступні в моєму блозі.
Використовувана техніка схожа: усі ці головоломки можуть бути змодельовані як сітчастий графік, у якому кожен вузол може містити інший елемент (наприклад, у двійковій головоломці елементами є: порожня клітинка, фіксований 0, фіксований 1, 0, 1), правила головоломки дозволяють або забороняють деякі (локальні) конфігурації (наприклад, у двійковій головоломці допускається не більше двох с або 1 с поруч або під ними). Потім, щоб довести NP-повноту, достатньо побудувати квадратний n × n гаджет, який імітує:01n×n
(A) логічний затвор (AND + OR) та посилання, якщо ми хочемо використовувати PLANAR SAT в якості вихідної проблеми NPC; або
(B) вузол 3 ступеня, в якому рівно 1 вхід і 1 вихід можуть бути активовані одночасно, якщо ми хочемо використовувати ГАМИЛТОНСЬКИЙ ЦИКЛ на сіткових графіках як вихідну проблему NPC (зауважте, що в цьому випадку повинна бути інша умова, яка змушує "пов'язаний шлях").
В обох випадках ми використовуємо початкову конфігурацію, яка фіксує межі гаджетів (щоб заборонити небажану взаємодію), і ми допускаємо взаємодію двох суміжних гаджетів лише через центральний елемент (або групу елементів). Конфігурація такого центрального елемента повинна представляти логічне значення у випадку (A) або перехід у (B) випадку.
Наприклад, для моделювання І:
***C*** *=fixed elements (initial config. of the puzzle)
*xxxxx* x=internal logic (some elements can be fixed,
AxxxxxB other must be completed/traversed)
*xxxxx* A,B,C=elements shared with adjacent gadgets
*******
На цьому етапі, щоб перевірити гаджет за допомогою розв'язувача SAT (краще використовувати CPL), досить виконати правила головоломки, а потім перевірити відповідність, коли A, B, C приймають усі можливі комбінації значень; і подивіться, чи відповідають вони бажаній поведінці. Наприклад, у випадку AND у всіх допустимих (задовольняються) конфігураціях гаджета, в яких C є істинним (C являє собою значення логічного значення true), і A, і B повинні бути істинними.
Якщо гаджети дуже складні (наприклад, у головоломці Rolling cube), я думаю, що це єдиний спосіб переконатися, що вони працюють правильно (і що доказ NPC є правильним).