a | b | c]在SWI-Prolog中评估什么?
-
24-10-2019 - |
题
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/1
和 write_canonical/1
.
最符合的系统WRT ISO-Prolog语法是GNU Prolog。