在SWI-Prolog中[a | b | c]评价什么?

Amb*_*ose 9 pipe prolog cons iso-prolog

prolog中的管道运算符返回一个或多个原子头和尾部列表.

?- [a,b,c] = [a,b|[c]].
true.
Run Code Online (Sandbox Code Playgroud)

在单个匹配中嵌套多个管道可以这样做:

?- [a,b,c] = [a|[b|[c]]].
true.
Run Code Online (Sandbox Code Playgroud)

该声明[a|b|c]对a,b和c的推断是什么?

编辑

到目前为止,我所能推断的是:

?- [a,b,c] = [a|b|c].
false.
Run Code Online (Sandbox Code Playgroud)

我对找到答案的任何技术更感兴趣,而不是回答这个边缘无用的问题.

EDIT2
我显然不太熟悉prolog,一个简单的任务回答了我的问题......

?- R = [a|b|c].
R = [a| (b'|'c)].
Run Code Online (Sandbox Code Playgroud)

究竟发生了(b'|'c)什么?

RD1*_*RD1 10

既然我是你的讲师我,这是我的答案.
(哦,我可以确认这不是作业,它与练习考试有关).

语法[a|b|c]实际上似乎不是标准的Prolog,有些实现不同地解释它.(如果我知道这个我可能没用过它.)

有人将其解释为[a|[b|c]].(按照我的意图.)

但是使用SWI Prolog(可能还有其他人):

?- [a|b|c] = [a|[b|c]].
false.
Run Code Online (Sandbox Code Playgroud)

(b '|' c)使用实际上是构建'|',而不是'.'作为一个列表会.因此,第二个|并不被解释为构成列表的一部分.

为了确认这一点,以下成功:

   ?- X=(b|c), [a|b|c] = [a|X].
   X = (b'|'c) .

'|'这里似乎是一个对条款的另一个二进制运算符只是想'.'.

而不是[a|b|c]Prolog 中的标准是使用[a,b|c].

(我只决定[a|b|c]在编程范式中使用,因为它更直接地与a::b::cF#的符号相关,我们只看到了Prolog的一小部分.未来我想我会联想到[a|[b|c]]然后给出[a,b|c]一个缩写.)


Kil*_*oth 5

它不是一个声明,它是一个术语,它并不意味着任何关于a,bc.它只是构造了一个不正确的列表.

详细说明:[|]语法实际上是.()运算符的语法糖.列表是通过内部构造的'.'(a,[]),但由于立即输入变得非常繁琐,因此您可以改为编写[a].所以.操作符应该取一个东西和一个列表然后构造一个更长的列表,但由于没有键入,没有人阻止你将它应用于两个原子或任何其他一对事物.结果是一些列表操作成功而其他列表操作失败的结构.这有时很有用(想想二叉树),但不像列表那么常见,因此没有特殊的读取语法.

(与consLisp中的运算符发生的情况大致相同;如果你谷歌"不正确的列表",你可能会得到更多关于Lisp的结果,但原理是完全相同的.)


fal*_*lse 5

在ISO-Prolog中,[a|b|c]语法无效.同时也在SWI内.看来你使用的是旧版本.一些Prolog系统给了这个术语一些解释.唉,他们都非常精确地解释了这个词.有的[(a'|'b)|c][a|(b'|'c)][a|(b;c)]......好吧,你得到它.

与此相关的是使用条形作为中缀操作符('|')/2.

根据ISO/IEC 13211-1:1995/Cor.2:2012,技术勘误2,发布于2012-02-15,|现在可以精确定义使用条形作为中缀运算符.在此之前,|不得不引用.这是它的草案.

现在,'|'可以定义为中缀运算符,但只有优先级高于1000.在这种情况下,其他模糊的情况[a|b|c]仍然在语法上无效,但|对DCG和CHR的使用是有效的.

如果你想通过尝试来学习语法,最好是使用writeq/1write_canonical/1.

符合ISO-Prolog语法的最符合系统的是GNU Prolog.