2010-11-04 20 views
5

मान लें मैं निम्नलिखित नियम है:एसडब्ल्यूआई-प्रोलॉग एक ही नियम के लिए एक उद्धृत और अनिश्चित स्ट्रिंग (बिना रिक्त स्थान) को एकीकृत करता है?

unify('test', 'this is a test'). 
run :- write('Enter something: '), 
     read(X), 
     unify(X, Y), 
     write('The answer is '), write(Y). 

और फिर मैं इसे चलाने के इस प्रकार है:

?- ['unify.pl']. 
% unify.pl compiled 0.00 sec, -48 bytes 
true. 

?- run. 
Enter something: test. 
The answer is this is a test 
true. 

?- run. 
Enter something: 'test'. 
The answer is this is a test 
true. 

SWI-Prolog क्यों एकजुट करता है दोनों test और 'test'unify('test', 'this is a test'). के लिए? एसओ पर एक प्रोलॉग सवाल का जवाब देते हुए मैं इस पर आया। जबकि मैं व्यक्ति के प्रश्न का उत्तर देने में सक्षम था, मैं इस विशेष व्यवहार की व्याख्या नहीं कर सका, और मैं सोच रहा था कि कोई और कर सकता है या नहीं।

उत्तर

5

SWI-PROLOG में परमाणुओं, एकल उद्धरण का उपयोग कर निरूपित किया जा सकता है जैसे, 'This is an atom', एकल उद्धरण आवश्यक नहीं हैं जब SWI-PROLOG पार्सर वर्णों का एक क्रम से एक परमाणु की पहचान कर सकते हैं, आम तौर पर एक लोअरकेस वर्णमाला के साथ शुरू चरित्र, जैसे test। अगर अनुक्रम में व्हाइटस्पेस (या कुछ अन्य पात्र) शामिल हैं, तो आपको परमाणु को सही तरीके से इंगित करने के लिए एकल कोट्स की आवश्यकता होगी। अल्फान्यूमेरिक वर्ण और अंडरस्कोर _ जैसे कुछ विराम चिह्न वर्ण ठीक हैं, उदाहरण के लिए, test5_6

यदि सिंगल कोट्स के बिना चरित्र अनुक्रम किसी अन्य चीज़ से शुरू करना था, जैसे 6k, पार्सर इसे number के रूप में पेश करेगा; यदि यह Test जैसे अपरकेस वर्णमाला वर्ण थे, तो पार्सर इसे एक चर के रूप में मानेंगे।

+0

आह, यह SWI-Prolog-विशिष्ट व्यवहार है? –

+0

@ विविन पालीथ: शायद, कम से कम एसडब्ल्यूआई-पोलॉग के साथ, हालांकि यह अन्य पोलॉग कार्यान्वयन के समान लगता है, मैंने भी देखा है। लेकिन फिर भी, हाँ, यह कुछ ऐसा है जो एसडब्ल्यूआई-पोलॉग पार्सर विशेष रूप से करेगा, शायद अगर आपको केवल अपने सभी परमाणुओं को सिंगल-कोट करने से बचाने के लिए :-) – sharky

4

यह एसडब्ल्यूआई विशिष्ट व्यवहार नहीं है - यह मानक द्वारा आवश्यक है। इसे देखने का एक आसान तरीका है। आप इसका उपयोग के लिए भी कर सकते हैं किसी भी अन्य शब्द जिसका वाक्यविन्यास स्पष्ट नहीं है। उच्चस्तरीय पर किसी भी प्रकार:

 
?- X = 'test'. 
X = test. 

?- X = 'this is a test'. 
X = 'this is a test'. 

जवाब हमेशा वैध Prolog पाठ है - यह,, SICStus SWI लेकिन YAP, जीएनयू, बी की तरह कई अन्य Prolog प्रणालियों के लिए भी करने के लिए विशिष्ट है।

एक और तरीका यह देखने के लिए उपयोग करने के लिए write_canonical/1:

 
?- write_canonical('this is a test'). 
'this is a test' 
true. 

?- write_canonical([a,b,(c,d),{e,f}]). 
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[])))) 
+0

बहुत जानकारीपूर्ण। धन्यवाद! –