Prolog中单引号和双引号有什么区别?

57

我刚接触Prolog,注意到单引号和双引号的行为不同,但是很好奇为什么会这样。具体来说,在加载文件时,?- ['test1.pl'].可以正常工作,而?- ["test1.pl"].则不能。


1
在 SWI-Prolog 7 及其后续版本中,这两个单词的意思是相同的。正如某些人指出的那样,这不符合 ISO-Prolog 的规范行为。请取消接受当前已接受的答案,因为它是不正确的。 - user1812457
4
@Boris:使用set_prolog_flag(double_quotes, atom),两个查询操作与IF/Prolog中的默认示例相同。即使是SWI7也可以做得更好,尽管整体而言,SWI7并不符合规范。 - false
2个回答

51
单引号括起来的项始终是原子。
双引号的含义取决于Prolog标志“double_quotes”。

原子 — 具有这个值 "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 = [25105,26159,20320,768,20307,30340,65281] ; Satz = [25105,26159,20320,768,54557,24037,65292,25105,20320,19968,20844,65281].

chars — 一个由单个字符组成的列表。点击这里了解更多相关信息。

?- set_prolog_flag(double_quotes,chars).
   成功。
?- 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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!].
这种表示法提供了更易读的答案,并且是ScryerTauTreallaIchiban的默认设置。 Scryer和Trealla使用双引号表示法来更紧凑地显示任何一个字符原子的列表。对于SICStusSWI,可以使用以下库来模拟这种表示法。
?- use_module(library(double_quotes)). 成功。 ?- 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
8
@astay13这个回答是正确的,而另一个则不是。它并没有对另一个答案进行“拓展”。 - user1812457

10

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

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

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

1
相关问题 - CamilleLDN
13
Prolog中的Atoms(原子)需要用单引号括起来。 - Thilo
18
或许需要稍微说明一下:原子通常只是写下来即可。只有当它们可能被误认为其他内容(例如变量)时,你才将它们用单引号括起来。你可以选择在每种情况下都这样做,但这是没有意义的。 - mat
6
这个回答充其量是误导性的。遗憾的是,它被接受作为回答。 - user1812457

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接