Was sind die Verwendungen des fail-Prädikats in Prolog?
Ich kann nicht kommen mit einer situation, wo ich es brauche.
InformationsquelleAutor der Frage Igor | 2010-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich kann nicht kommen mit einer situation, wo ich es brauche.
InformationsquelleAutor der Frage Igor | 2010-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Elegante Systeme bieten
false/0
als deklarative synonym für den Imperativfail/0
. Ein Beispiel, wo es nützlich ist, wenn Sie manuell erzwingen wollen backtracking für Nebenwirkungen, wie:Statt
false/0
können Sie auch jedes Ziel, das schlägt fehl, zum Beispiel ein bisschen kürzer:So
false/0
ist nicht unbedingt notwendig, aber ganz nett.BEARBEITEN: manchmal sehe ich, Anfänger, die wollen, Zustand, zum Beispiel "meine Beziehung nicht für die leere Liste" und dann hinzufügen:
my_relation([]) :- false.
Ihren code. Dies ist nicht notwendig, und nicht ein gutes Beispiel für die Nutzung
false/0
außer zum Beispiel bei Ausfall Scheiben, die programmgesteuert generiert. Stattdessen konzentrieren Sie sich auf die Angabe der Dinge, die halten über Ihre Beziehung. In diesem Fall lassen Sie einfach die gesamte Klausel, und definieren Sie die Beziehung nur für Listen, die nicht leer sind, d.h., mindestens ein element:my_relation([L|Ls]) :- etc.
oder, wenn Sie sind, andere Bedingungen zusätzlich zu den Listen, wie gut, verwenden Sie eine Einschränkung wie:
my_relation(T) :- dif(T, []), etc.
Nur eines (oder sogar beide) der beiden Klauseln, die Abfrage
?- my_relation([]).
wird, automatisch scheitern. Es ist nicht notwendig, die Einführung einer zusätzlichen Klausel, die nie gelingt, für diesen Zweck.InformationsquelleAutor der Antwort mat
Expliziten Fehler.
fail
wird oft in Verbindung mit cut:... !, fail.
durchzusetzen, scheitern.Für alle zu konstruieren. Die explizite Verwendung von
fail
/false
auflisten über backtracking ist eine sehr fehleranfällige Tätigkeit. Betrachten Sie einen Fall:Die Idee ist, damit zu "tun" - Aktion für alle
X
. Aber was passiert, wennaction(X)
ausfällt? Dieses Konstrukt einfach weiter mit dem nächsten Kandidaten — als wäre nichts geschehen. Auf diese Weise bestimmte Fehler können unerkannt bleiben für sehr lange.Für solche Fälle ist es besser, zu verwenden
\+ ( generator(X), \+ action(X) )
was nicht, sollteaction(X)
scheitern für einigeX
. Einige Systeme bieten eine integrierteforall/2
. Persönlich bevorzuge ich\+
in diesem Fall, weil die\+
ist ein bisschen klarer, dass das Konstrukt nicht verlassen verbindlich.Failure-slice. Für diagnostische Zwecke ist es oft sinnvoll hinzufügen auf den Zweck
false
in Ihre Programme ein. Siehe failure-slice für weitere details.InformationsquelleAutor der Antwort false
Einem Fall (aus Constraint-Logik-Programmierung mit Eclipse) ist eine Umsetzung nicht/1:
Wenn Q erfolgreich ist, wird der cut (!) bewirkt, dass die zweite Klausel nicht verworfen werden, und das scheitern, sorgt für ein negatives Ergebnis. Wenn Q aus, so wird der zweite nicht-Klausel feuert zuerst.
InformationsquelleAutor der Antwort G__
Andere Verwendung für das scheitern ist die Kraft backtracking durch alternativen bei der Verwendung von Prädikaten mit Nebenwirkungen:
Einige Leute könnten das nicht als besonders guter Programmierstil, wenn. 🙂
InformationsquelleAutor der Antwort hdan