Klauzulami Horna nazywamy zbiór formuł logicznych wykorzystywany do przeprowadzenia wnioskowania np. w automatycznym dowodzeniu twierdzeń i systemach eksperckich.
Podstawowym obiektem jest zmienna logiczna przyjmująca wartość lub .
Dla przykładu, zmienne mogą oznaczać następujące możliwości:
Literałem nazywamy zmienną np. lub jej negację .
deklaracja procedury
Lewa strona implikacji jest koniunkcją pozytywnych literałów (niezanegowanych zmiennych), prawa strona implikacji składa się z jednego pozytywnego literału. Formuła taka odpowiada stwierdzeniom: jeśli warunki po lewej stronie zachodzą to stwierdzenie po prawej stronie również musi być prawdziwe.
formuła celu
Formuła negacyjna jest alternatywną negatywnych literałów (zanegowanych zmiennych).
rozszerzenie wcześniejszego przykładu
Dla przykładu może oznaczać: obie postacie nie mogą być niewinne.
Celem znalezienie takiego wartościowania zmiennych występujących w klauzuli Horna, aby wszystkie jej formuły miały wartościowanie spełniające.
Zauważmy, że dwa rodzaje formuł sprzyjają nadawaniu różnych wartościowań zmiennym:
Użyjmy następującego zachłannego rozwiązania problemu znalezienia wartościowania spełniającego:
Horn
:
while
istnieje niespełniona implikacja:
if
wszystkie formuły negacyjne są spełnione:
return
wartościowanie spełniające wejściową klauzulęelse
:
return
wartościowanie spełniające nie istniejeJeśli algorytm zwróci wartościowanie spełniające to nie ma czego dowodzić, bo wartościowanie to rzeczywiście musi spełniać wejściową klauzulę Horna.
Zatem jedyny przypadek, który wymaga udowodnienia, to ten kiedy algorytm zwróci, że wartościowanie spełniające wejściową klauzulę Horna nie istnieje. Musimy pokazać, że rzeczywiśćie nie da się znaleźć innego przypisania wartości zmiennym, które spełni wejściową klauzulę.
W tym celu zauważmy, że nasze zachłanne nadawanie wartości zmiennym w pętli while
spełnia następujący niezmiennik: > Jeśli zmienna ustawiona na w pętli while
, to musi ona mieć wartość w każdym spełniającym wartościowaniu.
Zatem, jeśli wartościowanie znalezione po pętli while
nie spełnia wszystkich formuł negacyjnych wejściowej klauzuli, to nie istnieje takie wartościowanie.