2015-11-17 3 views
5

In Prolog - Programmierung für Künstliche Intelligenz, sagt Bratko folgendes auf Seite 58.Prolog Matching vs miniKanren Vereinigung

„Matching in Prolog entspricht dem, was Vereinigung in der Logik aufgerufen wird jedoch vermeiden wir die Vereinigung Wort, weil passend. B. aus Effizienzgründen in den meisten Prolog-Systemen in einer Weise implementiert, die nicht genau einer Vereinheitlichung entspricht.Eine ordnungsgemäße Vereinheitlichung erfordert die sogenannte Vorkommnis-Prüfung: Tritt eine gegebene Variable in einem gegebenen Term auf? . "

Meine Fragen ist, wenn die Vereinheitlichung in MiniKanren diese Effizienz Strafe leidet oder wie ist dieses Problem gelöst?

Antwort

4

Es gibt einige Missverständnisse hier. Zunächst ist die Klangvereinheitlichung auch in Prolog mit dem ISO-Prädikat unify_with_occurs_check/2 verfügbar.

Zweitens kann diese Klangvereinheitlichung in einigen Prolog-Systemen standardmäßig für alle Einheiten aktiviert werden. Siehe zum Beispiel die occurs_check Prolog Flagge in SWI-Prolog.

Drittens ist es einfach, Beispiele zu konstruieren, bei denen das Aktivieren der Überprüfung Ihrer Programme bewirkt, dass Ihre Programmbestellungen von schneller als die Überprüfung deaktivieren.

Viertens mit dem Begriff Vereinheitlichungen zu beschreiben, die passende auslassen die auftritt Check eine sehr schlechte Idee ist: Passende bedeutet Einbahn Vereinigung in funktionalen Sprachen. In Prolog funktionieren Vereinheitlichungen immer in allen Richtungen, auch wenn die Vorkommnisprüfung deaktiviert ist.

Also, für den Prolog-Teil der Frage, empfehle ich sehr, die Vorkommensprüfung zu aktivieren, um Ihre Programme zu testen, wenn Ihr Prolog-System es unterstützt. In der Regel ist eine Vereinheitlichung, bei der eine Überprüfung auftritt, erforderlich zeigt einen Programmierfehler in Prolog-Programmen an. Aus diesem Grund können Sie das Flag beispielsweise so setzen, dass das System eine Ausnahme auslöst, in der es ansonsten einen zyklischen Term anlegen würde.

+1

"Eine Vereinheitlichung, bei der eine Prüfung erforderlich ist, weist auf einen Programmierfehler hin": Sie könnten zu diesem Punkt noch expliziter sein. Ich muss noch ein gutes praktisches Beispiel für Prolog-Code sehen, der zyklische Ausdrücke benötigt. Kennst du solche Beispiele? –

+0

Eine verwandte Frage: Können Sie realistische Beispiele zeigen oder verlinken? Langsamer? Ich muss zugeben, dass ich nie versucht habe, zyklische Ausdrücke zu verwenden, und einfach die Vanilla-Vereinheitlichung (ohne Vorkommensprüfung) verwendet habe, weil ich angenommen habe, dass es keine Rolle spielt. –

+1

Ich habe einmal eine geniale Anwendung von zyklischen Termen von Stefan Kral gesehen, wo er zyklische Terme benutzte, um das unendliche Band einer Turing-Maschine darzustellen (anfänglich mit '0' gefüllt), beginnend mit 'Tape = [0 | Tape]', und von dort aus fortfahren. Für ein realistisches Beispiel, das hunderte Male schneller arbeitet * mit * tritt ein, siehe Ulrich Neumerkel bei al. "[Deklarative Spracherweiterungen für Prologkurse] (http://www.complang.tuwien.ac.at/ulrich/papers/PDF/2008-fdpe.pdf)". – mat