2010-10-13 5 views
6

पुनरावृत्ति का उपयोग करके 1 से 10 तक संख्याओं को मुद्रित करने के लिए प्रोलॉग में प्रोग्राम को आप कैसे कोड करेंगे?पुनरावृत्ति का उपयोग करके 1 से 10 तक संख्याओं को मुद्रित करने के लिए प्रोलॉग में प्रोग्राम को आप कैसे कोड करेंगे?

मैंने निम्नलिखित की कोशिश की है लेकिन यह काम नहीं करता है, क्या आप मुझे बता सकते हैं क्यों?

print_numbers(10) :- write(10). 

print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X). 

उत्तर

0

एक गंभीरता से लंबे समय के बाद से मैं किसी भी prolog लिखा गया है, लेकिन मैं शायद सिर्फ थोड़ा अलग तरह से काम करते हैं चाहते हैं। ऐसा कुछ, हालांकि मैं इसे माँ पर परीक्षण नहीं कर सकता।

print_increasing_numbers(From, To):- From > To, !, write('ERROR: From > To'). 

print_increasing_numbers(To, To):- !, write(To). 

print_increasing_numbers(From, To):- write(From), 
            nl, 
            Next is From + 1, 
            print_increasing_numbers(Next, To). 

यहाँ एक महत्वपूर्ण अंतर !, या कटौती ऑपरेशन है, जो उलटे पांव लौटने से बंद हो जाता है है। यदि आप इसे शामिल नहीं करते हैं तो आपको पहले खंड के साथ समाधान मिलेगा जब X 10 है, लेकिन यदि आप दूसरे समाधान के लिए पूछते हैं तो यह दूसरे खंड के साथ बैकट्रैक और मिलान करेगा। इसके परिणामस्वरूप आप चाहते हैं कि संख्याओं की एक बड़ी सूची होगी।

+0

Mmmmmm, मुझे लगता है कि कोशिश की और यह काम नहीं करता, यह प्रिंट " त्रुटि:>/2: तर्क पर्याप्त अपवाद instantiated नहीं कर रहे हैं: (7) print_increasing_numbers (_G272 + 1, _G305)? क्रिप्प " – dasen

+0

-1 आपके कोड का परीक्षण नहीं करने के लिए और" एक्स + 1 " – Kaarel

+0

@ केरल का मूल्यांकन नहीं करने के लिए धन्यवाद: धन्यवाद। प्रोलॉग के व्यवहार के उस पहलू के बारे में भूल गया था। उस फिक्स के साथ, और एक्स और वाई का नाम बदलकर याद करने के लिए, यह ठीक चला गया। – torak

9

आपका कोड काम करने के बहुत करीब है। समस्या यह है कि जब आप तुरंत चालू हो जाते हैं, तो आप X का पुन: उपयोग नहीं कर सकते हैं, इसे बदला नहीं जा सकता है (अधिक जानकारी के लिए here देखें)। अंत करने के लिए

print_numbers(10) :- write(10), !. 
print_numbers(X) :- write(X), nl, Next is X + 1, print_numbers(Next). 

कटौती को जोड़ने से यदि आप और अधिक परिणाम देखना चाहते हैं पूछ से दुभाषिया पाएगा (!): एक नया वेरिएबल, इस तरह का प्रयोग करें।

?- print_numbers(1). 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Yes 
?- 
+0

बस इसे जोड़ना चाहते हैं। यदि आप बैकट्रैक करते हैं तो आप एक वैरिएबल का पुन: उपयोग कर सकते हैं। तो यदि आपके पास एक प्रारंभिक मूल्य है और आप इसे मूल्य प्राप्त करने के लिए प्रारंभ करते हैं और बैकट्रैक प्राप्त करते हैं, तो यह अनियमित के मूल रूप में जाएगा और फिर यह एक और उत्तर की कोशिश करते समय फिर से शुरू किया जाएगा। जैसे कि आपने परीक्षण किया था (1)। परीक्षण (2)। परीक्षण (3)। और आप परीक्षण (एक्स) में टाइप करते हैं। कंसोल के लिए यह आपको बैकट्रैकिंग के कारण 1,2 और 3 देगा। – Matt

0
print_from_1_to_10 :- 
     print_from_X_to_10(1). 

print_from_X_to_10(X) :- 
     (
       X > 10 
     -> 
       fail 
     ; 
       writeln(X), 
       NewX is X + 1, 
       print_from_X_to_10(NewX) 
     ). 
संबंधित मुद्दे

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