Dies kann einfach mit Hilfsvariablen gelöst werden.
Betrachten wir zum Beispiel:
f(1, 1).
f(X, Y) :-
Y #= 5*X + X^2 + T1,
T2 #= X - 1,
f(T2, T1).
Dies ist eine straight-forward Übersetzung der Regeln, die Sie geben, mit Hilfsvariablen T1
und T2
, die für die Teilausdrücke f stehen (X-1) und X-1 bzw.. Wie @BallpointBen richtig feststellt, reicht es nicht aus, die Terme selbst zu verwenden, da sich diese Terme von ihrer arithmetischen Auswertung unterscheiden. Insbesondere -(2,1)
ist nicht die ganze Zahl 1
, aber 2 - 1 #= 1
tut halten!
Je nach Prolog-System, können Sie zur Zeit noch ned, um eine Bibliothek importieren(#=)/2
das Prädikat zu verwenden, dieGleichheit von integer expressesions zum Ausdruck bringt.
Ihr Beispiel Abfrage jetzt ergibt bereits eine Lösung:
?- f(4, X).
X = 75 .
Beachten Sie, dass das Prädikat nicht nicht universell in diesem Fall beenden:
?- f(4, X), false.
nontermination
Wir können es leicht machen, so mit einem zusätzlichen Bedingung:
f(1, 1).
f(X, Y) :-
X #> 1,
Y #= 5*X + X^2 + T1,
T2 #= X - 1,
f(T2, T1).
Nr w haben wir:
?- f(4, X).
X = 75 ;
false.
beachten Sie, dass wir dies als eine echte Beziehung, auch im allgemeinsten Fall verwenden können: Arithmetik
?- f(X, Y).
X = Y, Y = 1 ;
X = 2,
Y = 15 ;
X = 3,
Y = 39 ;
X = 4,
Y = 75 ;
etc.
Versionen basierend auf niedrigerer Ebene typischerweise nur Abdeckung eine sehr begrenzte Teilmenge von Instanzen solcher Abfragen. Ich empfehle daher, dass Sie (#=)/2
statt(is)/2
verwenden. Gerade für Anfänger ist die Verwendung von (is)/2
zu schwer zu verstehen. Nehmen Sie die vielen verwandten Fragen unter instantiation-error als Beweis, und siehe clpfd für deklarative Lösungen.
Dank @BallpointBen aber es gibt mir aus globalen Stapelspeicherfehler, wenn ich diese Lösung versuche. Ich denke auch, dass mein Basisfall falsch war und änderte ihn in "f (1, Y): - Y ist 1." um die Anforderung von f (1) = 1 zu erfüllen. – mdo123
Tatsächlich kann Prolog "Y = 1" von sich aus ableiten. – BallpointBen
aber was ist mit dem Speicherfehler, irgendwelche Ideen, wie man das @BallpointBen korrigieren? Oder irgendwelche Quellen, die ich lesen kann, können Sie empfehlen zu verstehen? – mdo123