2011-11-25 10 views
39

मैं प्रोलॉग के लिए नया हूं और देखा है कि 'और "अलग-अलग व्यवहार देते हैं, लेकिन क्यों उत्सुक हैं। विशेष रूप से, फ़ाइल लोड करते समय, ?- ['test1.pl']. काम करता है, जबकि ?- ["test1.pl"]. नहीं करता है।प्रोलॉग में 'और' के बीच क्या अंतर है?

+1

और बाद में, दोनों काम करते हैं और एक ही मतलब है:

 ?- use_module(library(double_quotes)). true. ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). Satz = "Ja tvoi sluga!" ; Satz = "Ja tvoi rabotnik!". ?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). Satz = "Я твой слуга!" ; Satz = "Я твой работник!". 

आप एक पुस्तकालय के रूप में स्थापित करने double_quotes.pl कठिनाइयों है, तो बस इसे अपने अन्य Prolog फ़ाइलों की निर्देशिका में डाल दिया है और कहते हैं। जैसा कि कोई निश्चित रूप से इंगित करेगा, यह आईएसओ-प्रोलॉग अनुपालन व्यवहार नहीं है। और कृपया, वर्तमान में स्वीकृत उत्तर को स्वीकार न करें क्योंकि यह गलत है। –

+4

@ बोरीस: 'set_prolog_flag (double_quotes, परमाणु) के साथ' दोनों प्रश्न समान हैं जैसे कि IF/Prolog में डिफ़ॉल्ट रूप से उदाहरण दिया गया है। यहां तक ​​कि एसडब्ल्यूआई 7 [बेहतर कर सकता है] (http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO#strings_less_non_conforming), हालांकि पूरे एसडब्ल्यूआई के अनुरूप नहीं है। – false

उत्तर

32

सिंगल उद्धृत आइटम हमेशा परमाणु होते हैं। यह मान "a" = a साथ


atom — :

दोहरे उद्धरण चिह्नों का अर्थ Prolog झंडा double_quotes पर निर्भर करता है। आजकल, इसका शायद ही कभी उपयोग किया जाता है। लेकिन आपको प्रोलॉग किताबें मिलेंगी जहां ["abc.pl"] लिखा गया है।


codes — चरित्र कोड की एक सूची। यह अक्सर डिफ़ॉल्ट है, लेकिन यह, भी बदतर तरह

 
?- set_prolog_flag(double_quotes,codes). 
true. 

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). 
Satz = [74,97,32,116,118,111,105,32,115,108,117,103,97,33] ; 
Satz = [74,97,32,116,118,111,105,32,114,97,98,111,116,110,105,107,33]. 

बहुत अपठनीय जवाब की ओर जाता है अगर आप ASCII परे वर्णों का उपयोग:

 
?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). 
Satz = [1071,32,1090,1074,1086,1081,32,1089,1083,1091,1075,1072,33] ; 
Satz = [1071,32,1090,1074,1086,1081,32,1088,1072,1073,1086,1090,1085,1080,1082,33]. 

chars — एक की एक सूची - परमाणु। इसके बारे में अधिक जानकारी के लिए See this

 
?- set_prolog_flag(double_quotes,chars). 
true. 

?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). 
Satz = ['J',a,' ',t,v,o,i,' ',s,l,u,g,a,!] ; 
Satz = ['J',a,' ',t,v,o,i,' ',r,a,b,o,t,n,i,k,!]. 

?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). 
Satz = ['Я',' ',т,в,о,й,' ',с,л,у,г,а,!] ; 
Satz = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]. 

यह नोटेशन अधिक पठनीय उत्तर देता है। यह एक और चार परमाणुओं की किसी भी सूची को मुद्रित करने के लिए डबल कोट नोटेशन का उपयोग किया जा सकता है क्योंकि यह और अधिक कॉम्पैक्टली रूप से प्रदर्शित किया जा सकता है। SICStus और SWI के लिए library(double_quotes) है। SWI-Prolog 7 में use_module(double_quotes).

+1

उपरोक्त उत्तर पर विस्तार के लिए धन्यवाद। – astay13

+7

@ astay13 यह उत्तर सही है, जबकि दूसरा नहीं है। यह दूसरे जवाब पर "विस्तार" नहीं करता है। –

12

प्रोलॉग में स्ट्रिंग्स एकल उद्धरणों में लिखे गए हैं। डबल कोट्स में लिखी गई शर्तें तुरंत चरित्र कोड की सूची में परिवर्तित हो जाती हैं।

?- write('sdf'). 
sdf 
true. 

?- write("sdf"). 
[115, 100, 102] 
true. 
+1

[संबंधित प्रश्न] (http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN

+10

* प्रोलॉग में परमाणु * एकल उद्धरण के भीतर संलग्न हैं। – Thilo

+15

शायद एक मामूली योग्यता: परमाणु आमतौर पर लिखे जाते हैं। केवल अगर वे अन्यथा किसी और चीज के लिए गलत हो जाएंगे (जैसे उदाहरण के लिए एक चर) क्या आप उन्हें सिंगल कोट्स में संलग्न करते हैं। आप वैकल्पिक रूप से इसे हर मामले में कर सकते हैं, केवल यह व्यर्थ है। – mat

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