2011-01-18 7 views
5

मैं एक ऑपरेटर "++>" को इस तरह से परिभाषित करना चाहता हूं ताकि "ए ++> बी" टाइप करने से [ए, बी] की सूची बन जाएगी।सूची बनाने के लिए प्रोलॉग में ऑपरेटर को आप कैसे परिभाषित करते हैं?

मैंने निम्नलिखित कोड लिखा है, लेकिन यह काम नहीं करता है।

++>(X,Y) :- 
[X,Y]. 

:- op(500,xfy,++>). 
+2

वहाँ वास्तव में दो मुद्दों यहाँ, ऑपरेटर को परिभाषित "++>" एक इन्फ़िक्स संकेतन के रूप में कर रहे हैं, और यह व्यवस्था करते हुए कि "ए ++> बी" अभिव्यक्ति "ए, बी] शब्द के रूप में" मूल्यांकन "की जाएगी। इसका पहला भाग काफी मानक प्रोलॉग है जैसा कि आपको ** op/3 ** के उल्लेख से पता चल रहा है। नए ऑपरेटर को शामिल करने वाले "मूल्यांकन" करने के लिए मशीनरी को जगह लेना मुश्किल है। अंकगणितीय कार्यों के लिए एसडब्ल्यूआई-प्रोलॉग का एक निर्देश है जो **/2 ** उपयोगकर्ता द्वारा परिभाषित कार्यों के साथ काम करने की अनुमति देता है, लेकिन आपका अंकगणितीय कार्य नहीं है। मैं आपको एक नया भविष्यवाणी ** iz/2 ** परिभाषित करने के तरीके को दिखा सकता हूं जो ++> शर्तों का मूल्यांकन करेगा। – hardmath

+0

मुझे एसडब्ल्यूआई-प्रोलॉग के 'अंकगणित_फंक्शन/1' निर्देश के लिए खुदाई करने का अवसर मिला, और मुझे लगता है कि यह [बहिष्कृत, शायद गिरा दिया गया है] (http://www.swi-prolog.org/pldoc/man?predicate= arithmetic_function/1)। – hardmath

उत्तर

0
:- op(500,xfy,++>). 
++>(X,Y,[X,Y]). 

और यह

?- ++>(1,2,X). 
X = [1, 2]. 

वास्तव में, Prolog उन्मुख नहीं है गणना की तरह इस्तेमाल करते हैं, तो ऑपरेटरों सिर्फ शब्दों के लिए समानार्थी शब्द है। आप एक शब्द \ 3 चाहते हैं, जहां एक तत्व दो अन्य की सूची है। तो, आप उस मामले में 2-स्थित ऑपरेटर का उपयोग नहीं कर सकते हैं। बीटीडब्ल्यू, आप इस स्थिति में का उपयोग नहीं कर सकते हैं, क्योंकि यह केवल अंकगणितीय मामलों में उपयोग किया जाता है।

+1

आपके उदाहरण में ऑपरेटर घोषित करने में कोई उपयोग नहीं है। आपने 2 तर्क ऑपरेटर (++>/2) घोषित किया है लेकिन एक 3 तर्कों को परिभाषित किया है (++>/3) – gusbro

+1

ठीक है, तो चलो कुछ 3place ऑपरेटर घोषित करें –

0

आप के लिए यह काम करता है:

++>((X,Y),Z) :-Z= [X,Y]. 

:- op(500,xfy,++>). 
0

[a,b,c]'.'(a,'.'(b,'.'(c)))) के लिए बस वाक्यात्मक चीनी है। तो आप अपने ऑपरेटर सिर्फ एक ही परिभाषित करने और एक रूपांतरण विधेय लिख सकते हैं:

:- op(500,xfy,'++>'). 

convert('++>'(A,B),[A|R]) :- 
    convert(B,R). 
convert(Any,[Any]). 

उदाहरण:

| ?- X = 1++>2++>3, convert(X,Y).          
X = 1++>2++>3 
Y = [1,2,3] ? 
yes 
संबंधित मुद्दे