में पूर्णांक और अनंत लूप की सूची मान लीजिए कि मैं इस तरह के पूर्णांक का प्रतिनिधित्व करना चाहता हूं: integer:Sign:[FirstDigit,SecondDigit,...]
। उदाहरण के लिए, 42 को integer:positive:[4,2]
के रूप में दर्शाया जाएगा।प्रोलॉग सीएलपीएफडी
मुझे एक अनुमान की आवश्यकता है जो इस प्रतिनिधित्व के आधार पर पूर्णांक का मान उत्पन्न करता है और इसके विपरीत।
integer_value_('integer':Sign:[H],E) :-
H in 0..9,
(
Sign = 'positive',
E #= H
;
Sign = 'negative',
E #= -H
).
integer_value_('integer':Sign:[H,I|T],E) :-
H in 0..9,
length([I|T],L),
(
Sign = 'positive',
E #= F + H * 10^L
;
Sign = 'negative',
E #= F - H * 10^L
),
integer_value_('integer':Sign:[I|T],F).
यह काम करता है के रूप में उम्मीद:
यहाँ मैं के साथ आया है। हालांकि, इसमें integer:positive:[0,1]
जैसी चीजों को स्वीकार करने की दुर्भाग्यपूर्ण संपत्ति है, जो सूची की शुरुआत में अग्रणी शून्य है। यह विशेष रूप से समस्याग्रस्त है जब मैं integer_value_(I,J), label([J]).
का उपयोग कर सभी संभावित पूर्णांकों का आकलन करता हूं: अग्रणी शून्य वाले लोग भी दिखाते हैं।
मैं तो केवल सभी लेकिन पहले अंक के लिए integer_value_
उपयोग कर, और पहले एक के लिए integer_value
का उपयोग कर (ध्यान में रखते हुए कि हम केवल 0 युक्त एक सूची के साथ प्रस्तुत किया जा रहा 0 के लिए समायोजित करने के लिए की जरूरत है) करके इसे ठीक करने का प्रयास किया:
integer_value('integer':Sign:[H],E) :-
abs(E) #< 10,
abs(E) #> -1,
integer_value_('integer':Sign:[H],E).
integer_value('integer':Sign:[H,I|T],E) :-
H in 1..9,
length([I|T],L),
(
Sign = 'positive',
E #= F + H * 10^L
;
Sign = 'negative',
E #= F - H * 10^L
),
integer_value_('integer':Sign:[I|T],F).
हालांकि अब यह ठीक से व्यवहार नहीं करता है। उदाहरण के लिए, integer_value(I,-19).
I = integer:negative:[1, 9]
लौटाता है, लेकिन अगर हम एक और जवाब मांगते हैं तो Prolog उन कारणों के लिए अनंत लूप में जाता है जिन्हें मैं समझ नहीं पा रहा हूं (इसे झूठ बोलना चाहिए, या पहले से ही पता है कि कोई अन्य जवाब नहीं है)।
यह समस्या "विपरीत" क्वेरी integer_value(integer:negative:[1,9],Z).
जो Z = 19
रिटर्न और फिर झूठे, न ही यह होती है जब दोनों बहस चर रहे हैं के साथ नहीं होती है (यह संख्या ठीक से विश्लेषण करता है, कोई अग्रणी शून्य के साथ), जो मेरे लिए आश्चर्य की बात है।
कोई विचार यह है कि अनंत लूप क्या होता है, और यदि इसे ठीक करने का कोई आसान तरीका है?
+1 सीएलपी (एफडी) बाधाओं के एक बहुत ही रोचक और उचित उपयोग मामले के लिए +1! मेरे पास एकल उद्धरणों के बारे में एक छोटी टिप्पणी है: आप उन सभी परमाणुओं के लिए '' 'को छोड़ सकते हैं जिन्हें' पॉजिटिव ',' नकारात्मक ',' पूर्णांक 'आदि जैसे उद्धरणों की आवश्यकता नहीं है। आप इन सभी परमाणुओं को सीधे नीचे लिख सकते हैं , जैसे 'साइन = पॉजिटिव', 'साइन = नकारात्मक' और 'पूर्णांक: साइन: [आई | टी] '। – mat
@mat मुझे पता है, लेकिन चूंकि मैं प्रोलॉग प्रोग्रामर नहीं हूं, इसलिए मुझे इस तरह के परमाणु होने के लिए काफी बदसूरत लगता है: पी – Fatalize