Frage

Warum funktionierts:

   power(_,0,1) :- !.
   power(X,Y,Z) :-
      Y1 is Y - 1,
      power(X,Y1,Z1),
      Z is X * Z1.

Und das gibt einen Stapelüberlauf Ausnahme?

power(_,0,1) :- !.
power(X,Y,Z) :-
  power(X,Y - 1,Z1),
  Z is X * Z1.
War es hilfreich?

Lösung

Da arithmetische Operationen sind nur auf Klauseln durch den is Betreiber durchgeführt. In Ihrem ersten Beispiel wird Y1 auf das Ergebnis gebunden zur Berechnung des Y - 1. In dem später das System versucht, die Klausel Leistung (X, Y1, Z1) zu beweisen, die eint mit Macht (X ‚Y‘, Z ') die Bindung X' = X, Y '= Y - 1, Z' = dann Z. Diese recurses wieder, so Y '' = Y - 1 -. 1, usw. für die Unendlichkeit, nie tatsächlich die Berechnung durchgeführt wird

Prolog ist in erster Linie nur Vereinheitlichung von Begriffen - Berechnung in dem „gemeinsamen“ Sinne hat, für ausdrücklich gefragt werden.

Andere Tipps

Beide Definitionen nicht richtig funktionieren.

Betrachten

?- pow(1, 1, 2).

, die für beide Definitionen Schleifen, weil die zweite Klausel unabhängig von dem zweiten Argument angewendet werden kann. Der Schnitt in der ersten Klausel kann nicht rückgängig gemacht werden. Die zweite Klausel muss ein Ziel Y > 0 vor dem rekursiven Ziel. (is)/2 verwendet, ist immer noch eine gute Idee tatsächliche Lösungen zu erhalten.

Die beste (für Anfänger) ist mit und zu vermeiden insgesamt .

Siehe z.B .: Prolog-Prädikat - Endlosschleife

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top