2011-11-25 109 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