?- permutation([A,B,C],Z).
Z = [A, B, C] ;
Z = [A, C, B] ;
Z = [B, A, C] ;
Z = [B, C, A] ;
Z = [C, A, B] ;
Z = [C, B, A] ;
false.
说得通。我可以处理 的排列,[A,B,C]
并且该排列包含与 中相同的元素[A,B,C]
,因此我对这些元素所做的一切都将适用于我的原始列表。
现在:
?- findall(X, permutation([A,B,C], X), Z).
Z = [[_G1577, _G1580, _G1583], [_G1565, _G1568, _G1571], [_G1553, _G1556, _G1559], [_G1541, _G1544, _G1547], [_G1529, _G1532, _G1535], [_G1517, _G1520, _G1523]].
为什么??为什么findall/3
给我包含完全不相关变量的列表,而不是A,B,C
?中的列表Z
甚至没有相互关联,所以我得到的结果实际上只是 6 个长度为 3 的随机列表,这完全不是我查询的。
通过这种行为,我们会得到如下荒谬的结果:
?- findall(X, permutation([A,B,C],X), Z), A = 1.
A = 1,
Z = [[_G1669, _G1672, _G1675], [_G1657, _G1660, _G1663], [_G1645, _G1648, _G1651], [_G1633, _G1636, _G1639], [_G1621, _G1624, _G1627], [_G1609, _G1612, _G1615]].
从逻辑的角度来看,这没有任何意义。
我知道这findall/3
不是一个真正的关系,纯逻辑谓词,但我不明白这如何证明这里显示的行为是合理的。
因此,我的问题是:
为什么为谓词选择这种行为?
是否存在这种行为实际上比我想要的行为更可取的常见情况?
如何实现具有
findall/3
我想要的行为的版本?