2011-11-25 62 views
39

我是Prolog的新手,注意到'和'給出了不同的行爲,但是爲什麼好奇。具體來說,加載文件時,?- ['test1.pl'].工作,而?- ["test1.pl"].不。Prolog中的'和「有什麼區別?

+1

在SWI-Prolog的7,後來,工作和含義相同。正如有人肯定指出的那樣,這不符合ISO-Prolog標準的行爲。請不要接受當前接受的答案,因爲它不正確。 – 2015-09-08 13:10:45

+4

@Boris:帶'set_prolog_flag(double_quotes,atom)'這兩個查詢都與IF/Prolog中默認示例相同。即使SWI7 [可以做得更好](http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO#strings_less_non_conforming),儘管整體上SWI7並不符合。 – false

回答

32

單引號的項目總是原子。

雙引號的含義取決於Prolog的標誌double_quotes


​​ — 這個值"a" = a。如今,這很少使用。但是你會發現編寫["abc.pl"]的Prolog書籍。


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 —一個列表-char原子。 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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]. 

這個表示法給出了更多可讀的答案。它可以更加緊湊地顯示,因爲雙引號符號可以用於打印任何單字符原子的列表。 SICStusSWIlibrary(double_quotes)

 
?- 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文件的目錄,並說:use_module(double_quotes).

+1

感謝您對上述答案進行擴展。 – astay13

+7

@ astay13這個答案是正確的,而另一個不是。它不會「擴大」其他答案。 – 2015-07-15 12:07:08

12

Prolog中的字符串用單引號引起來。術語用雙引號立即轉換爲字符代碼列表。

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

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

[相關問題](http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN

+10

* Prolog中的Atoms *用單引號引起來。 – Thilo

+15

也許是次要的資格:原子通常只是寫下來。只有當他們會被誤認爲別的東西(比如變量)時,你纔會用單引號括起來。你可以選擇在任何情況下做到這一點,只是沒有意義。 – mat