Prolog 中的 ' 和 " 有什么区别?

问题描述 投票:0回答:2

我是 Prolog 新手,注意到 ' 和 " 给出了不同的行为,但很好奇为什么。具体来说,在加载文件时,

?- ['test1.pl'].
可以工作,而
?- ["test1.pl"].
则不能。

prolog double-quotes dcg iso-prolog
2个回答
50
投票

单引号项始终是原子。

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

double_quotes
:


atom
— 具有这个值
"a" = a
。如今,这种方法已经很少使用了。但你会发现 Prolog 书籍中写有
["abc.pl"]


codes
— 字符代码列表。在较旧的系统中,这通常是默认值,但它会导致非常不可读的答案,例如

?- set_prolog_flag(双引号,代码)。
   真的。
?- 短语((“Ja tvoi”,(“sluga”|“rabotnik”),“!”),Satz)。
   萨兹 = [74,97,32,116,118,111,105,32,115,108,117,103,97,33]
;萨兹 = [74,97,32,116,118,111,105,32,114,97,98,111,116,110,105,107,33]。

更糟糕的是,如果您使用 ASCII 之外的字符:

?- 短语((“Я твой”,(“слуга”|“работник”),“!”),Satz)。
   萨兹 = [1071,32,1090,1074,1086,1081,32,1089,1083,1091,1075,1072,33]
;萨兹 = [1071,32,1090,1074,1086,1081,32,1088,1072,1073,1086,1090,1085,1080,1082,33]。

chars
— 单字符原子列表。 请参阅此了解更多信息。

?- set_prolog_flag(双引号,字符)。
   真的。
?- 短语((“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,!]。
?- 短语((“Я твой”,(“слуга”|“работник”),“!”),Satz)。
   Satz = ['Я',' ',т,в,о,й,' ',с,л,у,г,а,!]
; Satz = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]。

此符号提供了更具可读性的答案,并且是 Scryer 中的默认符号, Tau特雷拉, 和 一番。 Scryer 和 Trealla 使用双引号表示法更紧凑地显示它们,用于打印任何单字符原子列表。对于 SICStusSWI,可以使用以下库进行模拟。

?- use_module(库(双引号))。
   真的。
?- 短语((“Ja tvoi”,(“sluga”|“rabotnik”),“!”),Satz)。
   Satz =“Ja tvoi sluga!”
; Satz =“Ja tvoi rabotnik!”。
?- 短语((“Я твой”,(“слуга”|“работник”),“!”),Satz)。
   Satz =“Я твой слуга!”
; Satz =“Я твой работник!”。

如果您在将

double_quotes.pl
安装为库时遇到困难,只需将其放入其他 Prolog 文件的目录中并说:
use_module(double_quotes).


10
投票

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

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

?- write("sdf").
[115, 100, 102]
true.
© www.soinside.com 2019 - 2024. All rights reserved.