sift

Solver SAT (DPLL) z zestawem narzędzi logiki zdaniowej i parserem DIMACS, w Haskellu. Rozwiązuje realne instancje i tłumaczy formuły do CNF (Tseitin).

sift
TL;DR

Solver SAT oparty na algorytmie DPLL, napisany w Haskellu, plus zestaw narzędzi logiki zdaniowej: parser DIMACS i tłumaczenie formuł do CNF metodą Tseitina. Rozwiązuje realne instancje.

Wprowadzenie

sift to solver SAT oparty na algorytmie DPLL, napisany w Haskellu, wraz z zestawem narzędzi logiki zdaniowej: parserem formatu DIMACS i tłumaczeniem formuł do postaci CNF metodą Tseitina. Nie jest ćwiczeniem na papierze - rozwiązuje realne instancje.

SAT to jedno z tych zagadnień, które łączą pozorną prostotę z ogromną głębią. Pytanie brzmi niewinnie, a odpowiedź na nie potrafi rozstrzygnąć problemy z zupełnie innych dziedzin. Ten projekt dotyka właśnie tego rdzenia, i to od strony, która zmusza do zrozumienia, dlaczego solver w ogóle działa.

SAT pyta o rzecz na pozór banalną: czy da się tak dobrać wartości logiczne, żeby cała formuła była prawdziwa? Banalne aż do momentu, gdy zmiennych są setki, a od odpowiedzi zależy planowanie, weryfikacja układów albo rozwiązanie łamigłówki. Solver SAT siedzi pod wieloma trudnymi problemami, które najpierw tłumaczy się na jego język.

Standardowe wejście to format DIMACS - każda linia to klauzula, liczby to zmienne, minus to negacja, zero kończy klauzulę. Prosty tekst, który potrafi zakodować zaskakująco trudne pytania.

example.cnf · text
p cnf 3 2
1 -3 0
2 3 -1 0

Jak działa DPLL

DPLL to inteligentne przeszukiwanie z nawrotami. Zamiast próbować wszystkich kombinacji, na każdym kroku wybiera zmienną, zakłada jej wartość i pilnuje dwóch skrótów: jeśli klauzula ma tylko jeden nierozstrzygnięty literał, jego wartość jest wymuszona; jeśli zmienna występuje zawsze w tej samej postaci, można ją od razu ustawić.

To właśnie te dwa skróty robią różnicę między sekundą a wiecznością. Bez nich solver błądzi po drzewie wszystkich możliwości; z nimi całe poddrzewa odpadają, zanim w ogóle zostaną odwiedzone. Zaimplementowanie ich poprawnie jest sercem całego solvera.

Tseitin: dlaczego CNF nie wybucha

DPLL wymaga formuły w postaci CNF, ale nie każda formuła już taka jest. Naiwne przekształcenie potrafi wysadzić jej rozmiar wykładniczo, zamieniając mały problem w gigantyczny jeszcze przed startem solvera. Metoda Tseitina wprowadza pomocnicze zmienne i utrzymuje wzrost liniowy.

Rozmiar formuły po konwersji (orientacyjnie)

Konwersja naiwna
1000
Metoda Tseitina
40
i
Informacja

Metoda Tseitina to jedna z tych sztuczek, które wyglądają na magię, dopóki nie zrozumiesz, dlaczego działają. Dodaje pomocnicze zmienne, które z pozoru komplikują formułę, a w rzeczywistości ratują jej rozmiar - bez nich naiwna konwersja potrafi rosnąć wykładniczo.

Efekt: solver, który naprawdę rozwiązuje

Na wyjściu jest działający solver, który bierze realne instancje w formacie DIMACS i zwraca odpowiedź, a po drodze tłumaczy dowolną formułę do CNF bez wysadzania jej rozmiaru. Napisany w Haskellu, bo dopasowanie wzorca i typy pilnujące poprawności sprawiają, że logika czyta się niemal jak matematyka. Mały projekt, który dotyka bardzo głębokiej części informatyki - i naprawdę ją rozwiązuje.

Więcej projektów

Inne realizacje z tej samej kategorii - zobacz, jak podchodzimy do podobnych wyzwań.

Masz podobny projekt?

Napisz do nas - wycena jest bezpłatna i wraca w godzinę.