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.
Czas wykonania?
DEF. Tautologia n-łatwa (ang. n-easy) - tautologia, która może być
udowodniona za pomocą n-Saturacji. Analogicznie formuła n-trudna
(ang. n-hard) - taka, która nie może być udowodniona za pomocą (n-1)-Saturacji.
Czas wykonania algorytmu Stalmarcka zależy głównie od stopnia trudności
tautologii. Stalmarck wykazał:
Jeśli tautologia A rozmiaru |A| jest n-łatwa => istnieje jej dowód rozmiaru O(|A|^(n+1)).
Ponadto, algorytm n-saturacji na pewno znajdzie dowód tej tautologii i to w czasie
O(|A|^(2n+1)).
Czas jest wielomianowy, ale potencjalnie dużego stopnia. Czy o nie za dużo,
żeby stosować algorytm w praktyce?
Rzeczywiście, dla dużych formuł już 2-Saturacja trwa niepraktycznie długo.
Okazuje się jednak, że w większości przypadków 1-Saturacja wystarcza.
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.