Prädikat control in Prolog
Haben eine Neugier bezogen auf Prolog-Prädikat Kontrolle.
Angeblich habe ich ein Prädikat f(A,X) und g(B).
f(A,X):- a,b,c, g(X).
g(B):- true.
a - returns true
b - returns true.
c - returns false.
where a,b and c are random predicates.
Wie kann ich weiterhin bewerten g(X)
im Prädikat f(A,X)
wenn c false zurückgibt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihre Absicht ist, zu definieren
f(A,X)
so dassg(X)
sollte beurteilt werden, ob oder nichtc
fehlschlägt, dann entweder:->
) und/oder Disjunktion (;
), oderf(A,X)
muss nicht definiert werden im Sinne vonc
. Dies setzt Vorausc
hat keine Nebenwirkungen (z.B. Geltendmachung Datenbank Sachverhalte mitassert
oder drucken IO auf einen stream), die die Umgebung ändern und die nicht rückgängig gemacht werden kann bei Ausfall derc
, in welchem Fall die erste option ist vorzuziehen.Gibt es mehrere alternativen für die Verwendung der Disjunktion, wie:
Diese definition (siehe oben) nicht davon abhängig
c
bei allen, aber es wird immer ausführenc
(solangea
undb
erfolgreich). Die Disjunktion (;
) ermöglicht PROLOG ansetzen, um zu versuchen, die Ausführunga, b
wieder wennc
scheiterten an alle, und weiterhin aufg(X)
. Beachten Sie, dass dies ist äquivalent zu:Damit der PROLOG nicht zu backtrack zu bewerten
f(A,X)
doppelt, weil der zweite (identische) Kopf-Prädikatf(A,X)
für jede Auswertung können Sie wählen, um einen Schnitt (!
), wenn Ihre Implementierung das unterstützt, sofort nach diec
subgoal in der ersten Klausel. Der Schnitt gelegt wird nachc
weil wir nicht wollen, dass der Dolmetscher zu verpflichten, die Wahl derf(A,X)
- Klausel, wennc
gescheitert, sondern wir wollen den interpreter zu Versagen, aus dieser Klausel und versuchen, die nächsten ein, um effektiv zu ignorierenc
und weiter verarbeiteng(X)
.Beachten Sie auch, dass diese Lösung basiert auf
a
undb
haben keine Nebenwirkungen, weil wennc
ausfällt,a
undb
sind, wieder ausgeführt. Wenn allea
,b
, undc
Nebenwirkungen haben, können Sie versuchen, mit Implikation:Diese auch effektiv immer ausführen
g(X)
obc
ausfällt oder nicht, und wird nicht ausgeführta
undb
wieder, wennc
ausfällt. Diese single-definition-Klausel wird auch nicht verlassen, eine Wahl-Punkt wie der Vorherige Vorschlag.Ich denke, man könnte wickeln
c
imignore/1
. Betrachten Sie z.B.Aber warum würden Sie wollen, um fortzufahren, wenn
c
ausfällt? Was ist der Anwendungsfall?Getestet habe ich diesen code in SWI-Prolog, ich bin mir nicht sicher, ob andere Prologe haben
false/0
undignore/1
.Letzteres kann definiert werden, wie dieses aber:
fail
, btw. (Das ist trivial zu implementieren:fail :- 0=1.
)c
ausfällt, ist wennc
hat Nebenwirkungen; siehe meine Antwort auf diese Frage für mehr Details.