Verwendet Prolog Eager Evaluation?

7

Da Prolog chronologische Rückverfolgung (von der Wikipedia-Seite von Prolog) verwendet, selbst nachdem eine Antwort gefunden wurde (in diesem Beispiel, wo es nur eine Lösung geben kann), würde dies Prolog als eifrige Auswertung rechtfertigen?

%Vor%

Mit folgender Ausgabe:

%Vor%     
user1334896 09.12.2013, 22:00
quelle

4 Antworten

7

Um die Diskussion mit @WillNess zusammenzufassen, yes, Prolog ist streng. Prologs Ausführungsmodell und Semantik unterscheiden sich jedoch wesentlich von den Sprachen, die normalerweise als streng oder nicht streng bezeichnet werden. Mehr dazu finden Sie unten.

Ich bin mir nicht sicher, ob die Frage wirklich auf Prolog zutrifft, denn sie hat nicht die Art von impliziten Bewertungsreihenfolgen, die andere Sprachen haben. Wo dies in einer Sprache wie Haskell wirklich zum Tragen kommt, könnte ein Ausdruck wie folgt aussehen:

%Vor%

In einer strengen Sprache wie ML gibt es eine definierte Bewertungsreihenfolge: g x wird ausgewertet, dann h y und f (g x) (h y) zuletzt. In einer Sprache wie Haskell werden g x und h y nur nach Bedarf ausgewertet ("non-strict" ist genauer als "faul"). Aber in Prolog,

%Vor%

hat nicht die gleiche Bedeutung, weil es keine Funktionsnotation verwendet. Die Abfrage würde in drei Teile unterteilt, g(X, A) , h(Y, B) und f(A,B,C) , und diese Bestandteile können in beliebiger Reihenfolge angeordnet werden. Die Evaluierungsstrategie ist streng in dem Sinne, dass das, was früher in einer Sequenz kommt wird vor dem nächsten bewertet wird, aber es ist nicht strikt in dem Sinne, dass es kein gibt Voraussetzung, dass Variablen in Grundbedingungen instanziiert werden, bevor die Auswertung fortgesetzt werden kann. Die Vereinheitlichung ist vollkommen zufrieden mit der Fertigstellung, ohne Ihnen Werte für jede Variable zu geben. Ich führe das auf, weil Sie einen komplexen verschachtelten Ausdruck in einer anderen Sprache in mehrere Ausdrücke in Prolog aufteilen müssen.

Backtracking hat damit nichts zu tun, soweit ich das beurteilen kann. Ich denke nicht, dass ich zurück zum nächsten Auswahlpunkt gehe und von dort aus eine nicht-strikte Bewertungsmethode ausschließe, es passiert einfach, dass Prologs streng ist.

    
Daniel Lyons 10.12.2013, 04:25
quelle
5

Dass Prolog innehält, nachdem jede der verschiedenen richtigen Antworten auf ein Problem gegeben wurde, hat nichts mit Faulheit zu tun; es ist ein Teil seines Benutzerinteraktionsprotokolls. Jede Antwort wird eifrig berechnet.

Manchmal gibt es nur eine Antwort, aber Prolog weiß das nicht im Voraus, also wartet es darauf, dass wir ; drücken, um die Suche fortzusetzen, in der Hoffnung, eine andere Lösung zu finden. Manchmal ist es in der Lage, es im Voraus abzuleiten und wird sofort aufhören, aber nur manchmal.

Aktualisierung:

Prolog führt keine eigene Bewertung durch. Alle Begriffe werden nicht bewertet, als ob sie in Lisp "zitiert" würden.

Prolog wird Ihre Prädikatdefinitionen wie beschrieben entfalten und ist vollkommen glücklich, Ihre Datenstrukturen mit unevaluierten uninstantiierten Lücken zu füllen, wenn Ihre Prädikatdefinitionen dies erfordern.

Haskell benötigt keine Werte, wie ein Benutzer , wenn er eine Ausgabe anfordert.

Auf ähnliche Weise erstellt Prolog nach den Benutzeranforderungen Lösungen einzeln.

Prolog kann sogar als fauler angesehen werden als Haskell, wo alle Arithmetik streng ist, d. h. unmittelbar, während in Prolog explizit die arithmetische Auswertung angefordert werden muss, mit is/2 .

Vielleicht ist die Frage also schlecht gestellt. Prologs Operationsmodell ist zu zu unterschiedlich . Es gibt keine "Ergebnisse" noch "Funktionen" für einen; aber aus einem anderen Blickwinkel betrachtet, ist alles ein Ergebnis, und Prädikate sind "multi" -Funktionen.

    
Will Ness 10.12.2013 22:03
quelle
3

Wie es aussieht, ist die Frage nicht richtig in dem, was es sagt. Chronologisches Backtracking bedeutet nicht, dass Prolog notwendigerweise "in einem Beispiel, in dem es nur eine Lösung geben kann" zurückgeht.

Bedenken Sie Folgendes:

%Vor%

Das ist also ein Beispiel, das nur eine Lösung hat, und Prolog erkennt das und versucht nicht, zurückzugehen. Es gibt Fälle, in denen Sie eine Lösung für ein Problem so implementieren können, dass Prolog nicht erkennt , dass es nur eine logische Lösung gibt, aber dies liegt an der Implementierung und ist nicht inhärent für Prologs Ausführung Modell.

Sie sollten das Ausführungsmodell von Prolog lesen. Aus dem Wikipedia-Artikel , den Sie zu zitieren scheinen, "kann die Ausführungsstrategie von Prolog operationell als eine Verallgemeinerung von Funktionsaufrufen betrachtet werden In anderen Sprachen besteht ein Unterschied darin, dass mehrere Klauselköpfe einem bestimmten Aufruf entsprechen können. In diesem Fall, [Betonung meins], erstellt das System einen Auswahlpunkt, vereinigt das Ziel mit dem Klauselkopf des ersten Alternative, und fährt mit den Zielen dieser ersten Alternative fort. " Lesen Sie Sterling und Shapiros "The Art of Prolog" für eine weit umfassendere Diskussion des Themas.

    
user1812457 10.12.2013 07:47
quelle
3

von Wikipedia habe ich

  

Bei der Eager-Evaluierung wird ein Ausdruck ausgewertet, sobald er an eine Variable gebunden ist.

Dann denke ich, dass es zwei Ebenen gibt - auf Benutzerebene (unsere Prädikate). Prolog ist nicht eifrig. Aber es ist auf Systemebene, weil Variablen so effizient wie möglich implementiert werden.

Tatsächlich werden attributierte Variablen implementiert, um faul zu sein, und sind eher "orthogonal" zu "logischen" Prolog-Variablen.

    
CapelliC 10.12.2013 13:49
quelle

Tags und Links