5

मैं प्रोलॉग सीख रहा हूं, और एक अभ्यास के रूप में, मैं एक साधारण डेटाबेस के साथ प्रयोग कर रहा हूं जो दिए गए नंबर तक सभी संख्याओं की गणना करता है (यानी 0 = 0, 1 = 1, 2 = 3, 3 = 6 , 4 = 10, ...)। काफी आसान:क्या इसे प्रोलॉग में पूंछ-रिकर्सिव बनाया जा सकता है?

counting_sum(0, 0). 
counting_sum(Num, Sum) :- Num > 0, PrevNum is Num - 1, 
    counting_sum(PrevNum, PrevSum), Sum is Num + PrevSum. 

कि एक ढेर अतिप्रवाह साथ counting_sum(150000, X). के आसपास कहीं ऊपर चल रही है। मैं समझता हूँ कि Prolog पूंछ प्रत्यावर्तन कर सकते हैं, लेकिन अगर मैं शासन के अंत के लिए पुनरावर्ती कॉल ले जाते हैं, मैं

error(instantiation_error,(is)/2) 

जो मुझे लगता है मैं PrevSum उपयोग नहीं कर सकते से पहले यह counting_sum(PrevNum, PrevSum) के साथ एकीकृत किया गया है कह रहा है कि मिल । क्या यह सही है, और क्या यह पूंछ-पुनरावर्ती बनाने का कोई तरीका है? मैं जीएनयू प्रोलॉग 1.3.1 का उपयोग कर रहा हूं अगर इससे कोई फर्क पड़ता है।

पीएस मैं अभी भी शब्दावली पर अशक्त हूँ। अगर मैं गलत तरीके से शब्दों का इस्तेमाल करता हूं तो मुझे बताएं। इस तरह

+1

आप इन्स्टेन्शियशन त्रुटि के कारण के बारे में सही कर रहे हैं। –

उत्तर

8

कोशिश कुछ (एक संचायक का उपयोग करें):

counting_sum(Count, Sum):- 
    counting_sum(Count, 0, Sum). 

counting_sum(0, Sum, Sum). 
counting_sum(Num, PrevSum, Sum):- Num > 0, PrevNum is Num - 1, 
    NextSum is PrevSum + Num, 
    counting_sum(PrevNum, NextSum, Sum). 
+1

धन्यवाद। मैं accumulators का सामना नहीं किया था। यह [एक उपयोगी मुहावरे जैसा दिखता है] (http://www.lix.polytechnique.fr/~liberti/public/computing/prog/prolog/prolog-tutorial.html#iteration)। एक संचयक को पढ़ने और समझने के बाद, मैं एक का उपयोग करके एक नया कार्यान्वयन लिखने में सक्षम था और फिर इसे अपने कोड के विरुद्ध जांचता हूं। मैं एक ही चीज़ के साथ आया था। समस्या: मुझे अभी भी 'counting_sum (350000, X) पर एक स्टैक ओवरफ़्लो मिलता है। कोई विचार यह क्यों है? –

+1

यह अजीब बात है। मैंने '3500000' (दस बार आपकी आकृति) के साथ एसडब्ल्यूआई के साथ प्रदान किए गए कोड की कोशिश की और यह आसानी से इसे संभालती है। – gusbro

+2

मैं अनुमान लगा रहा हूं, लेकिन जीएनयू प्रोलॉग व्याख्या मोड में पूंछ अनुकूलन नहीं कर सकता है (लेकिन एसडब्ल्यूआई प्रोलॉग करता है)। @RyanStewart: यह पुष्टि करने के बारे में कि आपने संकलित gprolog निष्पादन योग्य, या केवल दुभाषिया का उपयोग किया है या नहीं? – hardmath

संबंधित मुद्दे