【问题标题】:What is the difference between ' and " in Prolog?Prolog中的'和'有什么区别?
【发布时间】:2011-11-25 04:01:17
【问题描述】:

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

【问题讨论】:

  • 在 SWI-Prolog 7 及更高版本中,两者的工作方式和含义相同。有人肯定会指出,这不是符合 ISO-Prolog 的行为。请不要接受当前接受的答案,因为它不正确。
  • @Boris: set_prolog_flag(double_quotes, atom) 两个查询与 IF/Prolog 中默认示例的查询相同。即使是 SWI7 can do better,尽管作为一个整体 SWI7 并不符合要求。

标签: prolog double-quotes dcg iso-prolog


【解决方案1】:

单引号的项目总是原子。

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


atom — 使用此值"a" = a。如今,这很少使用。但是你会发现写有["abc.pl"] 的 Prolog 书籍。


codes — 字符代码列表。这通常是默认值,但它会导致非常难以理解的答案,例如

?- set_prolog_flag(double_quotes,codes). 真的。 ?- 短语((“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 — 单字符原子列表。 See this 了解更多信息。

?- set_prolog_flag(double_quotes,chars). 真的。 ?- 短语((“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 = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!]。

这种表示法给出了更易读的答案,并且是ScryerTrealla 中的默认值,它们使用双引号表示法更紧凑地显示它们,以打印任何单字符原子列表。对于SICStusSWI,可以使用以下库进行模拟。

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

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

【讨论】:

  • 感谢您扩展上述答案。
  • @astay13 这个答案是正确的,而另一个不是。它不会在另一个答案上“扩展”。
【解决方案2】:

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

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

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

【讨论】:

  • Prolog 中的 Atoms 用单引号括起来。
  • 也许是一个次要的限定:原子通常只是写下来。只有当它们被误认为是其他东西(例如变量)时,才将它们括在单引号中。您可以选择在每种情况下都这样做,只是没有意义。
  • 这个答案充其量是误导。可悲的是,这是公认的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2010-10-02
  • 2011-12-12
  • 2010-09-16
相关资源
最近更新 更多