在序言中, [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) 没有被 ] 括起来。 但这似乎不是理解这一点的好方法。
这是一个非常有趣的问题!
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]
没有区别,因为这就是它的真实情况。
我知道这并不是立即直观的,但至少它是自洽的。希望这有帮助。