在Prolog中比较列表

3
我刚开始学习Prolog,但我不明白为什么它会返回false。我试图找到解决方案,但没有成功。能否有人告诉我为什么会返回false?
[[A],B,C]=[[a,b,c],[d,e,f],1].

因为你的目标是将一个由三个元素组成的列表与列表[[a,b,c], [d,e,f],1]进行匹配。此外,第一个列表应该只包含一个元素(由于[A]),但它包含了三个元素。 - Willem Van Onsem
好的,我现在明白了。非常感谢! - Michał Kruk
2个回答

2
简短回答: [A] 是一个单元素列表,但对应的元素 [a,b,c] 有三个元素。
您的目标是将 [[A], B, C][[a,b,c], [d,e,f], 1] 匹配。这意味着您想要将一个有三个元素的列表与 [[a,b,c], [d,e,f], 1] 进行匹配。此外,这意味着您希望匹配 [A] = [a,b,c]B = [d,e,f]C = 1。然而,[A] 无法与 [a,b,c] 匹配,因为 [A] 表示一个单元素列表。
您可能希望改用 [A,B,C] 进行匹配。
?- [[A],B,C]=[[a,b,c],[d,e,f],1].
false.

?- [A,B,C]=[[a,b,c],[d,e,f],1].
A = [a, b, c],
B = [d, e, f],
C = 1.

如果你想匹配一个非空列表,并且要求第一个元素为A,你可以使用[A|_]来进行匹配:

最初的回答:

?- [[A|_],B,C]=[[a,b,c],[d,e,f],1].
A = a,
B = [d, e, f],
C = 1.

2

这里有另一种回答为什么您的查询失败,使用library(diadem):

?- [[A],B,C]=[[a,b,c],[d,e,f],1].
   false.
?- [[A],B,C]=[[a,b,c],[d,e,f],1].?X.
   X = ([[A]|_]=[[_,_|_]|_])                        /* 1 */
;  X = (dif(A100,B100),[[A|A100]|_]=[[_|B100]|_])   /* 2 */
;  X = (dif(A100,B100),[A100|_]=[B100|_])           /* 3 */
;  X = (dif(A100,B100),A100=B100)                   /* 4 */
;  ... .

这里系统生成的是最常见的失败泛化。第一个泛化去除所有无关部分,剩下的是[A][_,_|_]。第二个泛化坚持两个列表的尾巴只是不同的(而不是像第一个泛化所述的那样坚持它们是[][_|_])。第三和第四个则是更加通用的观点。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接