Unterschiedliche Variablen für verschiedene Klauseln

10

Beim Auflösen des Auflösungssatzes wird normalerweise angenommen, dass Variablen in verschiedenen Sätzen unterschiedlich sind. Dies geschieht nicht automatisch. Für die Implementierung sind erheblicher zusätzlicher Code und Berechnungen erforderlich. Vor diesem Hintergrund suche ich einen Testfall dafür.

Das Problem ist, dass es in allen Testfällen, die ich bisher ausprobiert habe, keinen Unterschied macht. Vermutlich ist es nur in ungewöhnlichen Randfällen wichtig. Wie Wikipedia es ausdrückt, "sind Variablen in verschiedenen Klauseln unterschiedlich ... Wenn Sie nun Q (X) im ersten Satz mit Q (Y) im zweiten Satz vereinen, werden X und Y ohnehin dieselbe Variable."

Gibt es bekannte Testfälle, die tatsächlich die falsche Antwort geben, wenn verschiedene Klauseln dieselben Variablen verwenden?

rwallace
quelle

Antworten:

6

Edit: Ich habe ein besseres Beispiel gefunden. Betrachten Sie diese Klauseln: Offensichtlich ist dieser Satz von Klauseln widersprüchlich. Aber ohne Variablen umbenennen, das einzig mögliche resolvent ist und nicht mehr Resolventen sind möglich - alle führen zu ersetzen für , was unmöglich ist.

¬P(x)P(f(x))P(x)¬P(f(f(x)))
P(f(x))f(x)x

Bearbeiten: Berücksichtigen Sie die Bedeutung von Klauseln. Jede Klausel ist implizit universell quantifiziert. Die Bedeutung seiner Variablen ist also an nichts gebunden. Angenommen, Sie haben zwei Klauseln, die beide enthalten . Wenn Sie eine Auflösung durchführen, ohne in einem von ihnen umzubenennen, fügen Sie eine Bedeutung hinzu, die es nicht hat: Sie sagen, dass in beiden Klauseln dasselbe bedeutet, was nicht wahr ist. Wenn Ihre Klauseln keine eindeutigen Variablen enthalten, führt die Auflösung zu zu schwachen Schlussfolgerungen.xxxx


(Die ursprüngliche Antwort.) Lassen Sie uns zum Beispiel 4 Klauseln haben:

  1. AB(x)
  2. ¬AC(x)
  3. ¬B(c)
  4. ¬C(d)

Dabei sind Variablen und Konstanten. Wenn wir die ersten beiden auflösen, ohne umzubenennen , erhalten wir . Wir können mit fortfahren , um aber jetzt können wir es nicht mit auflösen .x,yc,dxB(x)C(x)¬B(c)C(c)¬C(d)

Wenn wir andererseits in im zweiten umbenennen , um einen disjunkten Satz von Variablen zu haben, erhalten wir aus dem ersten Auflösungsschritt und können eine leere Klausel mit ableiten und nicht .xyB(x)C(y)¬B(c)¬B(d)

Petr Pudlák
quelle
Wenn ich dies in meinem Prüfer mit deaktivierten unterschiedlichen Variablen versuche, wird mit , um . In ähnlicher Weise erhält man und von dort die leere Klausel, sodass das Endergebnis dasselbe ist. Vermisse ich etwas B(x)¬B(c)A¬A
Wallwall
@rwallace Wenn Sie keine eindeutigen Variablen haben, können Sie die leere Klausel nicht ableiten, nur dass die Methoden nicht vollständig sind. Wenn Sie Variablen immer umbenennen, spielt es keine Rolle, in welcher Reihenfolge Sie Klauseln auswählen. Sie leiten die leere Klausel immer ab, wenn die ursprüngliche Menge nicht zufriedenstellend ist - die Methode ist abgeschlossen. Wenn Sie jedoch keine Variablen umbenennen, spielt die Reihenfolge plötzlich eine Rolle (wie das Beispiel zeigt) - einige Ableitungssequenzen finden die leere Klausel nicht. Und ein Prüfer kann nicht im Voraus "sagen", welche Ableitungssequenz die richtige ist.
Petr Pudlák
Aber ist es nicht so, dass eine vollständige Methode irgendwann jede mögliche Ableitung versuchen muss (es sei denn, sie findet zuerst die leere Klausel)? Um sicher zu sein, dass es keine Garantie gibt, dass die zuvor erwähnten Ableitungen versucht werden, aber wenn die von Ihnen erwähnten aufgrund fehlender eindeutiger Variablen fehlschlagen, sind die von mir erwähnten noch offen und eine vollständige Methode muss zurückgehen und versuchen die früher oder später?
Wallwall
Ihr Nachtrag zur Bedeutung von Klauseln in der Zusammenfassung ist sinnvoll, aber es scheint mir, wenn dies der Fall ist, sollte es möglich sein, einen Testfall zu finden, den ich einem Prüfer zuführen und ihn veranlassen kann, die falsche Antwort zu geben, wenn Die Funktion für unterschiedliche Variablen ist deaktiviert. Ich konnte einen solchen Testfall bisher einfach nicht finden.
Wallwall
@rwallace Warum willst du das tun? Die Auflösung ist eine vollständige Methode, und Sie wissen, dass es unter keinen Umständen erforderlich ist, die Auflösung für jedes Klauselpaar nur einmal durchzuführen. Sie schlagen vor, eventuell alle möglichen Sequenzen auszuprobieren, um mit dem Backtracking fortzufahren. Dies führt zu einer wirklich enormen Zunahme der Komplexität des Algorithmus, die nicht einmal im entferntesten mit dem einfachen Umbenennen von Variablen bei jedem Schritt vergleichbar ist.
Petr Pudlák