Suche…


Argumentation über monotone Prädikate

Monotone Prädikate können durch Anwendung deklarativer Argumente debuggt werden.

In reinem Prolog kann ein Programmierfehler zu einem oder allen der folgenden Phänomene führen:

  1. Das Prädikat schlägt fehl, wenn es versagen sollte
  2. das Prädikat nicht falsch in einem Fall , in dem es gelingen sollte ,
  3. Das Prädikat schleift unerwartet , wo es nur eine begrenzte Anzahl von Antworten erzeugen soll.

Stellen Sie sich als Beispiel vor, wie Sie den Fall (2) durch deklarative Argumentation debuggen können: Wir können Ziele der Prädikatsklauseln systematisch entfernen und prüfen, ob die Abfrage weiterhin fehlschlägt. Beim monotonen Code kann das Entfernen von Zielen das generierte Programm höchstens allgemeiner machen . Daher können wir Fehler feststellen, indem wir herausfinden, welches der Ziele zum unerwarteten Ausfall führt.

Beispiele für monotone Prädikate

Beispiele für monotone Prädikate sind:

  • Vereinheitlichung mit (=)/2 oder unify_with_occurs_check/2
  • dif/2 , das die Ungleichung der Begriffe ausdrückt
  • CLP (FD) -Einschränkungen wie (#=)/2 und (#>)/2 verwenden einen monotonen Ausführungsmodus

Prologprädikate, die nur monotone Ziele verwenden, sind selbst monoton.

Monotone Prädikate erlauben deklarative Überlegungen:

  1. Das Hinzufügen einer Einschränkung (z. B. eines Ziels) zu einer Abfrage kann höchstens die Anzahl der Lösungen reduzieren oder niemals erweitern.
  2. Durch das Entfernen eines Ziels solcher Prädikate kann der Lösungssatz höchstens erweitert , niemals reduziert werden.

Nicht monotone Prädikate

Hier sind Beispiele für Prädikate, die nicht monoton sind:

  • meta-logische Prädikate wie var/1 , integer/1 usw.
  • Termvergleichs-Prädikate wie (@<)/2 und (@>=)/2
  • Prädikate, die !/0 , (\+)/1 und andere Konstrukte verwenden, die die Monotonie brechen
  • All-Solutions-Prädikate wie findall/3 und setof/3 .

Wenn diese Prädikate verwendet werden, kann das Hinzufügen von Zielen zu mehr Lösungen führen. Dies widerspricht der aus der Logik bekannten wichtigen deklarativen Eigenschaft, dass das Hinzufügen von Einschränkungen die Menge der Lösungen höchstens reduzieren oder niemals erweitern kann.

Folglich sind auch andere Eigenschaften, auf die wir uns für deklaratives Debugging und andere Argumente verlassen, beschädigt. Zum Beispiel widerlegen nicht monotone Prädikate den aus der Logik erster Ordnung bekannten Grundbegriff der Kommutativität der Konjunktion. Das folgende Beispiel veranschaulicht dies:

?- var(X), X = a.
X = a.

?- X = a, var(X).
false.

All-Lösungen Prädikate wie findall/3 auch Monotonie brechen: Hinzufügen von Klauseln zum Scheitern der Ziele führen können, die bisher gehalten. Dies steht auch im Widerspruch zur Monotonie, wie man es aus der Logik erster Ordnung kennt, wo das Hinzufügen von Fakten höchstens zunehmen kann , ohne die Konsequenzen zu mindern .

Monotone Alternativen für nicht monotone Konstrukte

Hier einige Beispiele, wie Sie monotone Prädikate anstelle von unreinen, nicht monotonen Konstrukten in Ihren Programmen verwenden können:

  • dif/2 soll anstelle von nicht monotonen Konstrukten wie (\=)/2
  • Arithmetische Einschränkungen (CLP (FD), CLP (Q) und andere) sollen anstelle von modifizierten arithmetischen Prädikaten verwendet werden
  • !/0 fast immer zu nicht-monotonen Programmen und sollte vollständig vermieden werden.
  • Instantiierungsfehler können in Situationen ausgelöst werden, in denen Sie zu diesem Zeitpunkt keine fundierte Entscheidung treffen können.

Monotonie mit Effizienz verbinden

Es wird manchmal argumentiert, dass wir aus Effizienzgründen die Verwendung von nicht monotonen Konstrukten in Prolog-Programmen der realen Welt akzeptieren müssen.

Dafür gibt es keine Beweise. Neuere Forschungen weisen darauf hin, dass die rein monotone Untergruppe von Prolog nicht nur ausreicht, um die meisten realen Programme zu beschreiben, sondern auch in der Praxis akzeptabel ist. Ein kürzlich entdecktes Konstrukt, das diese Sichtweise fördert, ist if_/3 : Es kombiniert Monotonie mit einer Verringerung der if_/3 . Siehe Indexierung von dif / 2 .

Zum Beispiel Code des Formulars:

pred(L, Ls) :-
    condition(L),
    then(Ls).
pred(L, Ls) :-
    \+ condition(L),
    else(Ls).

Kann mit if_/3 als:

pred(L, Ls) :-
    if_(condition(L),
        then(Ls),
        else(Ls)).

und verbindet Monotonie mit Determinismus.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow