In generale, @m09's answer è fondamentalmente ragione circa l'importanza della coda ricorsione.
Per il grande N
, il calcolo del prodotto ha vinto in modo diverso! Pensa "albero binario", non "elenco lineare" ...
Proviamo entrambi i modi e confrontiamo i tempi di esecuzione. In primo luogo, di @ M09 factorial/2
:
?- time((factorial(100000,_),false)).
% 200,004 inferences, 1.606 CPU in 1.606 seconds (100% CPU, 124513 Lips)
false.
Avanti, lo facciamo albero in stile — utilizzando meta-predicatereduce/3
insieme lambda expressions:
?- time((numlist(1,100000,Xs),reduce(\X^Y^XY^(XY is X*Y),Xs,_),false)).
% 1,300,042 inferences, 0.264 CPU in 0.264 seconds (100% CPU, 4922402 Lips)
false.
scorso, definiamo e l'uso dedicato predicato ausiliario x_y_product/3
:
x_y_product(X, Y, XY) :- XY is X*Y.
Cosa si ottiene? Facciamo il al cronometro!
?- time((numlist(1,100000,Xs),reduce(x_y_product,Xs,_),false)).
% 500,050 inferences, 0.094 CPU in 0.094 seconds (100% CPU, 5325635 Lips)
false.
La traccia aiuta sempre! – CyberShot
Spero che tu intenda 'factorial (0) => 1' :) – AbcAeffchen
Che dire' factorial (-1) '? Con la definizione di cui sopra, la query '? - fact1 (-1, _).' Fallisce giustamente; 'factorial', così com'è, no. – repeat