2017-12-09 16 views
1

Ich versuche, ein Schwanz-rekursive Prädikat in Prolog zu schreiben: product(A,B), was wahr ist, wenn B das Produkt der Zahlen in der Liste A ist. Hier ist der Code, den ich bisher geschrieben habe:Produkt von Zahlen mit tail-rekursive Prädikat in Prolog

product(A, B) :- product(A, 1, B). 
product(0, B, B) :- !. 
product(A, X, B) :- Z is A - 1, Y is X * A, product(Z, Y, B). 

Der Code funktioniert ohne eine Liste. Ich bin ziemlich neu in Prolog-Listen, also möchte ich fragen, was der beste Weg ist, dies zu tun. Die Abfrage sollte wie folgt sein:

?- product([1,2,3], B). 
B = 6. 

Antwort

1

Sie etwas wie das

product(In, Out) :- 
    % We call the predicate product/3, initialize with 1 
    product(In, 1, Out). 

% when the list is empty with have the result 
product([], Out, Out). 

% we compute the first element of the list 
product([H|T], Cur, Out) :- 
    Next is Cur * H, 
    % we carry on with the rest 
    product(T, Next, Out). 

EDIT Produkt nicht Schwanz rekursive schreiben kann.

product1([], 1). 

product1([H|T],Out) :- 
    product1(T, Next), 
    Out is Next * H. 
+0

THX viel! Ist es tail-rekursiv? – MBD

+0

Ja ist es. Ich bearbeite meine Antwort. Sehen Sie den Unterschied (mit trace/0) mit einem anderen Code, der nicht tail-rekursiv ist – joel76