Prolog中'和'有什么区别?

ast*_*y13 41 prolog double-quotes dcg iso-prolog

我是Prolog的新手并注意到'和'给出了不同的行为,但我很好奇为什么.具体来说,加载文件时,?- ['test1.pl'].工作,而?- ["test1.pl"].不是.

fal*_*lse 36

单引号项总是原子.

双引号的含义取决于Prolog标志double_quotes:


atom- 有这个值"a" = a.如今,这很少使用.但是你会发现Prolog的书写在哪里["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 - 一个char原子列表.有关它的更多信息,请参阅此处

?- 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 = ['?',' ',?,?,?,?,' ',?,?,?,?,?,?,?,?,!].

这种表示法给出了更可读的答案.它可以更紧凑地显示,因为双引号表示法可用于打印任何一个char原子列表.有library(double_quotes)SICStusSWI.

?- 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).

  • @ astay13这个答案是正确的,而另一个则不是.它没有"扩展"另一个答案. (7认同)

小智 13

Prolog中的字符串用单引号编写.用双引号编写的术语会立即转换为字符代码列表.

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

?- write("sdf").
[115, 100, 102]
true.
Run Code Online (Sandbox Code Playgroud)

  • 也许是一个小资格:原子通常只是写下来.只有当他们否则会被误认为是其他东西(比如变量)时,你才将它们用单引号括起来.你可以选择在每种情况下都这样做,只有它没有意义. (15认同)
  • *Prolog中的原子*用单引号括起来. (10认同)
  • 这个答案充其量是误导性的.可悲的是,这是公认的答案. (5认同)