Małe przypomnienie z Logiki
Wartościowanie formuły to przypisanie zmiennym wartości
TRUE
lub
FALSE.
Formuła spełnialna to taka, dla której istnieje
wartościowanie, przy którym przyjmuje ona wartość
TRUE.
Tautologia - formuła prawdziwa przy każdym wartościowaniu.
Problem co-NP to taki, że jego dopełnienie jest problemem NP
(można je zweryfikować w czasie wielomianowym). Analogicznie jak
dla problemów NP, definiujemy klasę problemów co-CP-zupełnych. Nie jest znana
relacja między klasami co-NP i NP (patrz
Cormen).
Problem spełnialności formuł SAT jest problemem NP-zupełnym (nawet
spełanialność formuł postaci 3-CNF jest NP-zupełna). Szkic dowodów
można znaleźć w
Algorytm Stalmarcka
UW. Spis reguł i przykład wykonania algorytmu Stalmarcka można znaleźć
tutaj.
Etap 0 - Wstępna kanonizacja (ang. Canonisation)
Wstępna obróbka formuły, pozwalająca w późniejszych etapach
uniknąć redundancji. Polega na przekształceniu formuły do formuły
prostszej i równoważnej formule wyjściowej (konkretna metoda jest
mało istotna, aby tylko była niedroga i żeby nie
zwiększała radykalnie rozmiaru formuły).
Przykładowo -
aplikujemy gdzie się da określony zbiór reguł.
Te sprytne reguły umożliwiają pozbycie się z formuły alternatyw
i implikacji, a pozostawienie tylko negacji, koniunkcji i równoważności.
Jeśli dostaniemy od razu
TRUE lub
FALSE to koniec.
Jeśli nie - męczymy tę formułę dalej.
Etap I - Redukcja do trójek (ang. Reduction to triplets)
Przekształcamy formułę do zbioru "równań", dokładniej trójek typu
x <-> y • z
gdzie
x, y, z - literały, a &bull - koniunkcja lub równoważność.
UW. Traktujemy
TRUE (T) jak zmienną dla wygody, czyli piszemy
v = TRUE zamiast
v.
Etap II - 0-Saturacja (ang. 0-Saturation)
Stosujemy
zbiór prostych reguł (ang.
simple rules), żeby
uprościć zbiór równań i
wywnioskować nowe równania.
Jeśli dostaniemy sprzeczność, to koniec. Jeśli nie, pracujemy dalej.
UW. Zakładamy, że równania symetryczne są tożsame, tj. jak mamy
w zbiorze
x = y to nie generujemy już
y = x.
Etap III - 1-Saturacja (ang. 1-Saturation)
Używamy
reguły dylematu (ang.
dilemma rule), aby
rozdzielić bieżący zbiór równań na dwa względem wybranej
zmiennej.
Działamy tak: jeśli 0-Saturacja wygenerowała zbiór równań
S,
to wybieramy zmienną
v, a następnie:
wykonujemy 0-Saturację dla zbioru S + {v = T} i dostajemy
zbiór S(T)
wykonujemy 0-Saturację dla zbioru S + {v = ¬T}
i otrzymujemy zbiór S(¬T)
Jeżeli którykolwiek z nich jest sprzeczny, to za nowe S przyjmujemy
ten niesprzeczny, a w przeciwnym razie
S := S(+) przecięte z S(-)
Tę procedurę wykonujemy dla wszystkich zmiennych dopóki dostajemy nowe
równania. Jeśli dostaniemy sprzeczność, to koniec. Wpr. saturujemy się dalej.
Etap IV, V, ... -n-Saturacja (ang.n-Saturation)
Gdy 1-Saturacja nie pomogła, stosujemy 2-Saturację, tj. rozdzielamy zbiór S
równań względem par zmiennych, tj.
S(T, T) := S + {v = T, z = T}
i postępujemy analigocznie do kroku III. Saturacje można wykonać dla dowolnej
liczby zmiennych.
Logika wyższego rzędu (ang. HOL - Higher order logic) - logika(i) zaprojektowana
dla programów dowodzących twierdzenia (ang.
theorem provers). Dokładniejsze informacje
można znaleźć
tutaj,
ale na potrzeby tego referatu możemy mysleć o
HOL jako o logice pierwszego rzędu,
albo nawet o rachunku predykatów.