我刚接触Prolog,注意到单引号和双引号的行为不同,但是很好奇为什么会这样。具体来说,在加载文件时,?- ['test1.pl'].
可以正常工作,而?- ["test1.pl"].
则不能。
我刚接触Prolog,注意到单引号和双引号的行为不同,但是很好奇为什么会这样。具体来说,在加载文件时,?- ['test1.pl'].
可以正常工作,而?- ["test1.pl"].
则不能。
原子
—
具有这个值 "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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!].这种表示法提供了更易读的答案,并且是Scryer、Tau、Trealla和Ichiban的默认设置。 Scryer和Trealla使用双引号表示法来更紧凑地显示任何一个字符原子的列表。对于SICStus和SWI,可以使用以下库来模拟这种表示法。
如果您在安装double_quotes.pl
作为库时遇到困难,只需将其放入其他Prolog文件的目录中,并执行:use_module(double_quotes)
Prolog中的字符串使用单引号编写。使用双引号编写的术语会立即转换为一个字符代码列表。
?- write('sdf').
sdf
true.
?- write("sdf").
[115, 100, 102]
true.
set_prolog_flag(double_quotes, atom)
,两个查询操作与IF/Prolog中的默认示例相同。即使是SWI7也可以做得更好,尽管整体而言,SWI7并不符合规范。 - false