2016-07-20 9 views
5

मैं प्रोलॉग सीखना शुरू कर रहा हूं और मुझे एक प्रोग्राम चाहिए जो एक पूर्णांक P देता है A और B को P = A² + B² को पूर्णांक देता है। अगर वहाँ A और B के मूल्यों है कि इस समीकरण को संतुष्ट नहीं हैं, falseप्रोलॉग प्रोग्राम दो पूर्णांक वर्गों के योग के रूप में एक (पूर्णांक) संख्या प्राप्त करने के लिए, यह क्यों काम नहीं करता है?

किया जाना चाहिये उदाहरण के लिए: अगर P = 5, यह A = 1 और B = 2 (या A = 2 और B = 1) क्योंकि 1² + 2² = 5 देना चाहिए। क्वेरी के साथ

giveSum(P, A, B) :- integer(A), integer(B), integer(P), P is A*A + B*B. 

:

मैं सोच रहा था इस काम करना चाहिए

giveSum(5, A, B). 

हालांकि, ऐसा नहीं है। मुझे क्या करना चाहिए? मैं प्रोलॉग के लिए बहुत नया हूं इसलिए मैं अभी भी बहुत सारी गलतियों को कर रहा हूं।

अग्रिम धन्यवाद!

उत्तर

6

integer/1 एक गैर-monotonic predicate है। यह एक संबंध है जो इस मामले में आप जिस तर्क को लागू करने की उम्मीद कर सकते हैं। इस उदाहरण देना करने के लिए:

 
?- integer(I). 
false. 

कोई पूर्णांक मौजूद है, हाँ? रंग मुझे आश्चर्यचकित करने के लिए आश्चर्यचकित!

ऐसी गैर-रिलेशनल संरचनाओं के बजाय, पूर्णांक के कारण के लिए अपने प्रोलॉग सिस्टम की सीएलपी (एफडी) बाधा का उपयोग करें।

उदाहरण के लिए:

 
?- 5 #= A*A + B*B. 
A in -2..-1\/1..2, 
A^2#=_G1025, 
_G1025 in 1..4, 
_G1025+_G1052#=5, 
_G1052 in 1..4, 
B^2#=_G406, 
B in -2..-1\/1..2 

और ठोस समाधान के लिए:

 
?- 5 #= A*A + B*B, label([A,B]). 
A = -2, 
B = -1 ; 
A = -2, 
B = 1 ; 
A = -1, 
B = -2 ; 
etc. 

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

अन्य चीजें मैंने देखा:

  • use_underscores_for_readability_as_is_the_convention_in_prolog बजाय ofMixingTheCasesToMakePredicatesHardToRead
  • घोषणात्मक नामों का उपयोग करें, अनिवार्यताओं से बचें। उदाहरण के लिए, इसे give_sum क्यों कॉल करें? यह अनुमान भी सही समझ में आता है यदि योग पहले से ही दिया गया है। तो, उदाहरण के लिए, sum_of_squares/3 के बारे में क्या?
+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मेरे कुछ प्रश्न हैं। अगर आप उन्हें जवाब दे सकते हैं तो यह बहुत ही अच्छा होगा। 'गैर-मोनोटोनिक भविष्यवाणी' का अर्थ क्या है, क्या/1 या/3 का मतलब है और लेबल() फ़ंक्शन क्या करता है? इंटरनेट पर मैंने पढ़ा है "वर्र्स में प्रत्येक चर के लिए एक मान असाइन करें। लेबलिंग का मतलब है कि सीमित डोमेन चर के लिए मूल्यों को व्यवस्थित रूप से कर रहे हैं, जब तक कि वे सभी जमीन न हों।" फ़ंक्शन लेबलिंग() के लिए, लेकिन मैं वास्तव में इसे समझ नहीं पा रहा हूं। खराब अभ्यास को ध्यान में रखते हुए भी धन्यवाद, मैंने नाम बदल दिया और भविष्य में अंडरस्कोर और घोषणात्मक नामों का उपयोग करेगा। – Kevin

+1

कृपया इसके लिए अलग प्रश्न दर्ज करें। वे सभी अपने बारे में चर्चा करने योग्य हैं: 1) monotonicity की परिभाषा और 2) "लेबलिंग" क्या है? आपके प्रश्न में से केवल एक ही टिप्पणी में उत्तर देने के लिए काफी आसान है: 'f/3' एक ** अनुमानित संकेतक ** है जो 3 * तर्क * के साथ' f' नामक भविष्यवाणी को दर्शाता है। ध्यान दें कि हम हमेशा ** भविष्यवाणी ** के बारे में बात करते हैं, जो * कार्यों * से अधिक सामान्य * हैं। नामों के लिए बढ़िया! अच्छे, घोषणात्मक नाम ढूंढना और उपयोग करना जो भविष्यवाणी ** ** सामान्यता ** के लिए न्याय करते हैं, प्रोलॉग में प्रोग्रामिंग करते समय, और शायद कठिन लोगों में से एक बहुत महत्वपूर्ण पहलू है। – mat

1

दक्षता के लिए, प्रोलॉग कार्यान्वयनकर्ताओं ने कई वर्षों पहले - कुछ समझौता किया है। अब, संभावना है कि आपके Prolog उन्नत पूर्णांक अंकगणित लागू करता है, जैसे सीएलपी (एफडी) करता है। यदि यह मामला है, तो चटाई का जवाब सही है। लेकिन कुछ प्रस्ताव (शायद एक बेवकूफ आईएसओ प्रोलॉग अनुपालन प्रोसेसर), लापता लेबल/1, और (# =)/2 के बारे में शिकायत कर सकता है।तो, एक पारंपरिक Prolog समाधान: तकनीक कहा जाता है पैदा करते हैं और परीक्षण:

giveSum(P, A, B) :- 
    (integer(P) -> between(1,P,A), between(1,P,B) ; integer(A),integer(B)), 
    P is A*A + B*B. 

/3 के बीच यह एक आईएसओ निर्मित नहीं है, लेकिन यह बजाय आसान है (# =)/2 और लेबल/1 लिखने के लिए :)

वैसे भी, कृपया चटाई की सलाह का पालन करें और 'अनिवार्य' नामकरण से बचें। अक्सर संबंध का विवरण बेहतर होता है, क्योंकि प्रोलॉग यह सिर्फ यही है: एक संबंधपरक भाषा।

+2

मैं आमतौर पर डाउनवॉटिंग से बचना चाहता हूं, लेकिन ... – repeat

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