Prolog中的管道操作员返回一个或多个原子头和一个尾部列表。

?- [a,b,c] = [a,b|[c]].
true.

可以在单个匹配中嵌套多个管道与此类似:

?- [a,b,c] = [a|[b|[c]]].
true.

陈述是什么 [a|b|c] 推断A,B和C?

编辑

到目前为止,我只能推断出来的是:

?- [a,b,c] = [a|b|c].
false.

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

Edit2
显然,我对Prolog不太熟悉,一个简单的作业回答了我的问题...

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

到底发生了什么 (b'|'c)?

有帮助吗?

解决方案

由于我是您的讲师,所以这是我的答案。
(哦,我可以确认这不是作业,这与练习考试有关)。

语法 [a|b|c] 实际上,似乎不是标准的序言,有些实施方式对其进行了不同的解释。 (如果我知道这一点,我可能没有使用过。)

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

但是有了SWI Prolog(可能是其他人):

?- [a|b|c] = [a|[b|c]].
false.

(b '|' c) 实际上是使用 '|' 而不是 '.' 作为清单。所以,第二 | 根本不被解释为构建清单的一部分。

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

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

'|' 这似乎是另一个二进制操作员,就像 '.'.

代替 [a|b|c] 序言的标准是使用 [a,b|c].

(我只决定使用 [a|b|c] 在编程范例中,因为它与符号更直接相关 a::b::c 从f#,我们只看到了一眼序言。我想将来我会与 [a|[b|c]] 然后给 [a,b|c] 作为缩写。)

其他提示

这不是一个陈述,这是一个术语,它根本没有任何意义 a, b 或者 c. 。它只是构造了一个不正确的列表。

详细说明: [|] 语法实际上是句法糖 .() 操作员。列表是通过内部构建的 '.'(a,[]), ,但是由于这变得非常乏味,因此立即打字,您可以写作 [a] 反而。所以 . 操作员应该列出一件事和一个列表,然后征收更长的列表,但是由于没有打字,因此没有人阻止您将其应用于两个原子或任何其他东西。结果是某些列表操作成功而其他列表操作失败的结构。这有时很有用(想想二进制树),但不像列表那样常见,因此没有特殊的读语法。

(也发生了同样的事情 cons LISP的操作员;如果您的Google“不正确列表”,您有可能获得有关LISP的更多结果,但原理完全相同。)

在ISO-Prolog中, [a|b|c] 是无效的语法。与此同时,也在SWI内。看来您使用了一个旧版本。一些序言系统给出了一些解释。 las,他们都以非常精确的方式来解释该术语的方式有所不同。有些 [(a'|'b)|c] 或者 [a|(b'|'c)] 或者 [a|(b;c)] ...好吧,你明白了。

与此有关 ('|')/2.

ISO/IEC 13211-1:1995/COR.2:2012, ,技术叉状2,出版于2012-02-15酒吧的使用 | 由于Infix运算符现在已精确定义。在此之前, | 必须引用。这里 是它的草稿.

现在, '|' 可以定义为infix操作员,但只有优先级高于1000。以这种方式,否则是模棱两可的情况 [a|b|c] 保持语法无效,但使用 | 对于DCG和CHR是有效的。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top