2011-01-29 7 views
7

मैं prolog निम्नलिखित स्निपेट है:यह आदेश prolog में एक स्टैक ओवरफ़्लो क्यों बनाता है?

num(0). 
num(X) :- num(X1), X is X1 + 1. 

fact(0,1) :-!. 
fact(X,Y) :- X1 is X-1, fact(X1,Y1), !, Y is Y1 * X. 

fact(X) :- num(Y), fact(Y,X). 

किसी कृपया समझा क्यों निम्न आदेश एक ढेर अतिप्रवाह कारण हैं? अग्रिम में धन्यवाद।

fact(6). 

उत्तर

2

पहले, नियम

num(0). 
    num(X) :- num(X1), X is X1 + 1. 

विधेय num(Y) को देख तुरंत Y = 0 के लिए मान्य होगा।

इस प्रकार नियम

fact(X) :- num(Y), fact(Y,X). 

fact(X) :- fact(0,X). 

कि fact(0,1) के लिए एक मैच मिलेगा के रूप में सरल किया जा सकता। X = 6 के लिए, इसके बजाय क्या होता है, क्योंकि कोई नियम fact(0,6) के लिए भविष्यवाणी को परिभाषित नहीं करता है, fact(-1,V1) के साथ एक खोज शुरू की जाती है, fact(-2,V2) आदि के साथ ... जब तक कोई मिलान fact(-value, Var) के लिए नहीं होता है, जहां स्थानीय परिणाम वारा मिलेगा।

ऐसा नहीं हो सकता है, और एक अनंत लूप पूरे स्टैक का उपभोग करता है, जब तक कोई त्रुटि ट्रिगर नहीं होती है।

+3

भी समाप्त हो जाता है का उपयोग करने पर विचार करें शायद आप रूकी के लिए बाहर ले जाना चाहिए '** तथ्य के लिए 2 खंड के शरीर के लिए एक्स> 0' जोड़कर है कि समस्या आप का विश्लेषण किया रोका जा सकता है/2 **। – hardmath

2

कारण है कि fact(6) समाप्त नहीं करता निम्नलिखित में पाया जा सकता:

 
?- fact(6). 

num(0) :- false. 
num(X) :- 
    num(X1), false, 
    X is X1 + 1. 

fact(X) :- 
    num(Y), false, 
    fact(Y,X). 

क्योंकि इस टुकड़ा समाप्त नहीं करता है, यह भी अपने मूल कार्यक्रम समाप्त नहीं करता। ध्यान दें कि गैर-समाप्ति fact/2 की परिभाषा से स्वतंत्र है! सबसे अच्छा, आपका प्रोग्राम सफल हो सकता है, लेकिन यह कभी भी (अंतहीन) असफल नहीं होगा।

another definition of fact/2, जिसके लिए fact(N, 6).