'有什么区别?和"在Prolog?

时间:2011-11-25 04:01:18

标签: prolog double-quotes dcg iso-prolog

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

2 个答案:

答案 0 :(得分:36)

单引号项始终是原子。

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


atom - 使用此值"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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!].

这种表示法给出了更易读的答案。它可以更紧凑地显示,因为双引号表示法可用于打印任何一个char原子列表。 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 :(得分:13)

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

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

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