Gibt einen Wert zurück, nachdem eine Rekursion in Prolog
Ich entschied mich für das Studium einige Logik-Programmierung und ich stieß auf ein problem.
Es ist programmiert in SWI-Prolog.
test(A, B, N):-
nonvar(B),
B = final,
true.
test(A, B, N):-
N > 2,
test(A, final, N).
test(A, B, N):-
N1 is N + 1,
test(N1, B, N1).
Es ist nur ein Beispiel, keine wirkliche Verwendung, außer es ist driving me crazy.
Das problem ist, dass wenn der code erreicht wahr wäre, dann startet die Verfolgung zurück und Antworten "wahr". Aber ich muss die "return" - Wert A. Wie mache ich das?
Eine kurze Frage: was tun Sie eigentlich den code zu tun?
InformationsquelleAutor petr | 2010-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
A ist keine Einheit mit allem, was im Körper Regeln. Die Art prolog arbeitet wird über Vereinheitlichung von Begriffen. Sie können nicht "zurückkehren" wie in prozeduralen Sprachen als solche. Zum Beispiel, was wollen Sie den Wert Einer zu sein, wenn die Rekursion zu einem Ende kommt? Ich habe keine Ahnung, was dein code tut, so lassen Sie mich ein Beispiel aus meinem eigenen.
Hier ist eine Summe, die Prozedur, die die Summe der Werte in einer Liste und mit "return N", die Summe der Werte in der Liste. Zum aufrufen dieser Prozedur können Sie dies tun:
Und Prolog antwortet:
Beachten Sie die ansammeln Verfahren ist mit Einem als Akkumulator als die Rekursion geht. Das heißt, Einer hält die laufende Summe und N ist die Letzte Antwort, die es gibt. Während die Rekursion N ist nicht vereinigt mit jeder realen Wert.
In der letzten Stufe der Rekursion, das heißt, wenn die Liste leer ist, wird der Wert von A ist eins mit N, Wirkung Rückkehr N.
Lassen Sie uns tun, eine Spur zu hinterlassen.
Nun, beachten Sie den Punkt in der Spur, wo ich markiert
//A unifies with _G417 (internal variable name), B with _G418 and N with 0.
. An diesem Punkt ist Ihre externe variable und _G417 ist Ihre interne A. Wenn dieser Aufruf erfolgreich, die es letztlich ändert prolog berichtet nur die externe variable Werte. Intern _G417 ist nie eins mit alles andere. Ich denke, das problem ist ein Verständnis, wie die Vereinigung Modell der Prolog funktioniert.Ich weiß nicht, wie zu zwingen, das Prädikat zu kündigen, an dem Punkt, wo Wert A zugeordnet ist. Ich habe versucht, schneidet aber keinen Erfolg.
Siehe mein edit oben.
Vincent hat Recht. Für eine weniger laut zu Debuggen, zu versuchen test(A, B, N):- write(triple(A,B,N)), N1 is N + 1, test(N1, B, N1). als die Letzte Klausel.
InformationsquelleAutor Vincent Ramdhanie
Ich nicht meine prolog-compiler hier aber haben Sie versucht, etwas entlang der Linien von:
Wie wär das dann? (Ich werde damit dieser code funktioniert in 2h mal wenn ich wieder Zuhause bin)
Der obige code scheint zu laufen gut, ich habe es gerade ausprobiert. Können Sie mir ein Beispiel, ein Beispiel für die Eingabe/Ausgabe?
Es sieht aus, dass Ihre Lösung funktioniert. Ich muss jetzt gehen, damit ich werde es testen morgen. Aber ich bin verwirrt. Warum wird der Prolog gibt true zurück, wenn es nur eine einzige Ein, und warum ist es Wert, wenn es zwei, Wie in der ersten Prädikat?
Es scheint nur zu mir, dass die variable Ergebnis ist überflüssig.
InformationsquelleAutor rui