Prolog 列表:逗号和 | 的组合

问题描述 投票:0回答:1

在序言中, [a,b,c] = [a,b,c | []]

但是,我对 [a, b, c | 的头部] 感到困惑[]] 是? 如果 [a, b, c] = [a, b, c | []] 为什么事实并非如此: [a,b,c] = [a,b,c | []] = [[a,b,c | []] | []]] = ...(所以我在头部末尾添加了另一个空列表,因为它们是用逗号分隔的元素,就像 [a, b, c] 的情况一样,我们还添加了一个空列表)

所以我看到一个逗号:通过 | 组合所有元素运算符,并在末尾添加一个空列表。 “a, b, c”([a, b, c | []] 的头部)将变成 [a, b, c | []] 等等。

但是我的解释有问题,因为我刚才说的是错误的。

如果我没记错的话,|具有比逗号运算符更高的优先级。所以 [A, B|C] = [A|[B|C]]。但为什么事实并非如此 [A, B|C] = [A|[[B|C]|[]]]。

我可以记住正确的定义如下:通过 | 组合元素,并在末尾添加一个空列表 仅当逗号的最后一个操作数被 ] 括起来时。 那么: [a, b, c] = [a, b, c | []],如果我得到 [a,b,c | []],即使我在这里有逗号,我也不会添加一个空列表,因为最后一个元素 (c) 没有被 ] 括起来。 但这似乎不是理解这一点的好方法。

list prolog declarative cons
1个回答
0
投票

这是一个非常有趣的问题!

Prolog 将列表建模为二进制表达式,其中第一个元素通过

[|]
1-to-rest 连接运算符与列表的其余部分连接。

空列表是文字。

根据定义,非空列表以与空列表文字的串联结尾。

考虑这个查询:

EmptyList = [],
SingleElementList = [e],
TwoElementList = [a, b],
EmptyList =.. EmptyListStructure,
SingleElementList =.. SingleElementListStructure,
TwoElementList =.. TwoElementListStructure.

Prolog 回应:

EmptyList = [],
EmptyListStructure = [[]],
SingleElementList = [e],
SingleElementListStructure = ['[|]', e, []],
TwoElementList = [a, b],
TwoElementListStructure = ['[|]', a, [b]]

运算符“[|]”不可交换、不可结合且不可幂等。所以你提到的表达

[[a, b, c | []] | []]
[[a,b,c]]
而不是
[a,b,c]

至少SWI-prolog实际上允许你直接使用

'[|]'
运算符, 所以你可以构造一个两个元素列表作为

TwoElementList = '[|]'(a, '[|]'(b, [])).

结果将与

[a, b]
没有区别,因为这就是它的真实情况。

我知道这并不是立即直观的,但至少它是自洽的。希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.