Es wird nicht angenommen, dass die allgemeine Erfüllbarkeit (mit wenigen Ausnahmen wie Horn-Klauseln) eine algorithmische Lösung hat. Der folgende Algorithmus scheint jedoch eine Lösung für die allgemeine Erfüllbarkeit zu sein. Was genau ist der Fehler mit dem folgenden Algorithmus?
- Sei eine leere Menge, die alle Variablen enthält, die notwendigerweise wahr oder falsch sein müssen.
- Sei die Menge der Klauseln.
- Schleife durch .
- Jedes Mal, wenn eine nicht bedingte Variable † gefunden wird, entfernen Sie sie aus und fügen Sie sie in .
- Wenn dies eine leere UND-Implikation hinterlässt ‡ , entfernen Sie alle Variablen in dieser leeren Implikation aus und fügen Sie sie in .
- Wenn dies eine leere ODER-Implikation hinterlässt ‡ , erstellen Sie neue Instanzen des Algorithmus, wobei jede Instanz eine Variable in der Implikation behandelt (dh wenn die Implikation lautet: , erstellen Sie eine Instanz, in der in eingefügt wird, eine, in der in eingefügt wird,und eine, in der und in eingefügt werden.
- Setzen Sie alle Variablen in auf den Wert, den sie unbedingt haben müssen.
- Fügen Sie die Variablen in in L mit ihren geänderten Werten erneut ein und prüfen Sie, ob alle Klauseln erfüllt sind.
- Wenn die Erfüllbarkeit erfüllt ist, geben Sie , andernfalls "Nicht zufriedenstellend".
† Eine nicht bedingte Variable ist definiert als eine Variable, die notwendig ist, wahr oder falsch, z oder .
‡ Eine leere Implikation ist definiert als eine Implikation, bei der eine Seite leer ist (z ) oder die andere Seite ist notwendigerweise wahr (z. B. t r u e ∨ a .
Um ein intuitiveres Verständnis des Algorithmus zu erhalten, betrachten Sie die folgenden Klauseln :
Der Algorithmus führt Folgendes aus:
1) Da , f , g nicht bedingte Variablen sind, fügt der Algorithmus sie in W ein . W = { c , f , g } .
2) Wenn Sie , f und g entfernen , bleiben die leeren Klauseln: . Diese werden zu W hinzugefügt. W = { c , f , g , b , ¬ a } .
3) Das erneute Einfügen der Variablen in führt dazu, dass die ersten Klauseln verletzt werden: a ∧ b . Da a falsch ist, ist c falsch, was bedeutet, dass Klausel (v) verletzt wird. Der Algorithmus gibt "Nicht zufriedenstellend" zurück.
Mir ist bewusst, dass der Algorithmus verwirrend erscheint. Bitte zögern Sie nicht um Klarstellung.
Aus Kommentaren geht hervor, dass kein effizienter Algorithmus für die allgemeine Erfüllbarkeit bekannt ist. Ich bin immer noch an Feedback zu meinem Algorithmus interessiert. Funktioniert es? Wie ist der Vergleich mit gängigen Algorithmen?