सामान्य शब्दों में, @m09's answer मूल रूप से पूंछ-प्रत्यावर्तन के महत्व के बारे में सही है।
बड़े N
के लिए, उत्पाद की गणना अलग-अलग जीतती है! "बाइनरी पेड़" सोचें, न कि "रैखिक सूची" ...
चलिए दोनों तरीकों का प्रयास करें और रनटाइम की तुलना करें। सबसे पहले, @ m09 के factorial/2
:
?- 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.
अंतिम, चलो निर्दिष्ट कर सकते हैं और समर्पित उपयोग सहायक विधेय x_y_product/3
:
?- time((factorial(100000,_),false)).
% 200,004 inferences, 1.606 CPU in 1.606 seconds (100% CPU, 124513 Lips)
false.
इसके बाद, हम यह पेड़ शैली — meta-predicatereduce/3
एक साथ उपयोग lambda expressions के साथ क्या
x_y_product(X, Y, XY) :- XY is X*Y.
क्या हासिल करना है? चलो स्टॉपवॉच से पूछें!
?- 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.
ट्रेसिंग हमेशा मदद करता है! – CyberShot
मुझे आशा है कि आपका मतलब है 'फैक्टोरियल (0) => 1' :) – AbcAeffchen
' फैक्टोरियल (-1) 'के बारे में क्या? उपर्युक्त परिभाषा के साथ, क्वेरी '? - तथ्य 1 (-1, _)। 'ठीक से विफल रहता है; 'फैक्टोरियल', जैसा कि है, नहीं है। – repeat