Prolog, scheitern und nicht denselben Weg zurückverfolgen
-
04-10-2019 - |
Frage
Gibt es eine build-in-Prädikat in SWI-Prolog, die immer fehlschlagen und verhindern Maschine aus Rückzieher - es ist das Programm zu stoppen sofort ausführen (dies ist nicht das, was fail/0
der Fall ist)?
Ich konnte Schnitte verwenden, aber ich mag sie nicht.
so etwas wie !, fail
zu tun, ist kein Problem für mich, sondern um das zu erreichen, was ich will, würde ich Schnitte in mehreren Orten verwenden, und das ist, was, wie ich dies nicht tun.
Lösung
Sie könnten Ausnahmen verwenden. Auf der Grundlage Ihrer Frage - sollte es helfen. Siehe Link
Andere Tipps
Sie können den Mechanismus explizit Hilfe entworfen verwenden Sie etwas erreichen, aber sie tun nicht, wie es?
Sie können nicht immer verwenden, die für Schnitt nicht
syntaktischer ZuckerZwei Alternativen in den Sinn kommen:
- Pass um einen
backtrack(true)
oderbacktrack(false)
Begriff durch den Code, den Sie steuern möchten, und interpretieren sie in der Definition der Prädikate Sie schreiben schnell zum Scheitern verurteilt, wenn es zubacktrack(false)
gesetzt ist, oder wennbacktrack(true)
fortzusetzen. Beachten Sie, dass diese Rückzieher verhindern wird nicht wirklich; es sollte nur aktivieren Fast-Ausfall . Selbst wenn Ihr Beweis Baum tief ist, das eine schnelle Art und Weise zu verhindern, die Ausführung bestimmten Code auf Rückzieher bieten soll. - Verwenden Sie Ausnahmen, wie @Xonix vorgeschlagen (+1). Auslösen einer Ausnahme wird den Beweis Baumkonstruktion sofort beenden und Sie Zeitdaten durch die Ausnahme bis zum Handler passieren können, mehr Ausführung umgehen - es wahrscheinlich schneller sein als die erste Option, aber vielleicht nicht so tragbar sein.
Persönlich habe ich beiden Methoden vor - die ersten, wo ich die Notwendigkeit zu erwarten habe, bevor Sie den Code zu schreiben, wobei die letztere, wo ich nicht.
Schade, dass das, was Schnitte sind für.