Prolog ';及;在序言中?

Prolog ';及;在序言中?,prolog,double-quotes,dcg,iso-prolog,Prolog,Double Quotes,Dcg,Iso Prolog,我不熟悉Prolog,并注意到“和”给出了不同的行为,但我很好奇为什么。具体来说,当加载文件时,?-['test1.pl'].起作用,而?-[“test1.pl”].不可用。Prolog中的字符串用单引号括起来。用双引号括起来的术语会立即转换为字符代码列表 ?- write('sdf'). sdf true. ?- write("sdf"). [115, 100, 102] true. 单引号项目始终是原子 双引号的含义取决于序言标志double\u quotes: atom- 有了这个值

我不熟悉Prolog,并注意到“和”给出了不同的行为,但我很好奇为什么。具体来说,当加载文件时,
?-['test1.pl'].
起作用,而
?-[“test1.pl”].
不可用。

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

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

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

单引号项目始终是原子

双引号的含义取决于序言标志
double\u quotes


atom
- 有了这个值,
“a”=a
。现在很少使用这个值。但是你会发现写有
[“abc.pl”]
的序言书


代码
- 字符代码列表。这通常是默认值,但会导致无法读取的答案,如

?- 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]. 这种表示法提供了更可读的答案,并且是默认的,它使用双引号表示法更紧凑地显示这些答案,以便打印任何一个字符原子的列表

?- use_module(library(double_quotes)). true. ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). Satz = "Ja tvoi sluga!" ; Satz = "Ja tvoi rabotnik!". ?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). Satz = "Я твой слуга!" ; Satz = "Я твой работник!". ?使用_模块(库(双_引号))。 对。 -短语((“Ja tvoi”,“sluga”|“rabotnik”),“!”,Satz)。 Satz=“Ja tvoi sluga!" ; Satz=“Ja tvoi rabotnik!". -短语(“ЯЯЯаааааааааааааааа。 ; Satz=“ЯЯаааааааааааа!".
如果在将
double\u quotes.pl
安装为库时遇到困难,只需将其放入其他Prolog文件的目录中,并说:
use\u module(double\u quotes)(

序言中的原子用单引号括起来。可能有一个小限制:原子通常只是写下来。除非它们被误认为是其他东西(例如变量)你是否用单引号将它们括起来。你可以选择在任何情况下都这样做,但这是毫无意义的。这个答案充其量是误导性的。遗憾的是,这是公认的答案。感谢你对上述答案进行扩展。@astay13这个答案是正确的,而另一个答案不是。它不会“扩展”另一个答案是,在SWI Prolog 7和更高版本中,两者都起作用,意思相同。有人肯定会指出,这不是符合ISO Prolog的行为。请取消接受当前接受的答案,因为它不正确。@Boris:with
set\u prolog\u flag(双引号,atom)
这两个查询与IF/prolog中默认的示例相同。即使是SWI7,但作为一个整体,SWI7也不符合要求。 ?- 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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]. ?- use_module(library(double_quotes)). true. ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). Satz = "Ja tvoi sluga!" ; Satz = "Ja tvoi rabotnik!". ?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). Satz = "Я твой слуга!" ; Satz = "Я твой работник!".