我刚开始学习Prolog,但我不明白为什么它会返回false。我试图找到解决方案,但没有成功。能否有人告诉我为什么会返回false?
[[A],B,C]=[[a,b,c],[d,e,f],1].
[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.
这里有另一种回答为什么您的查询失败,使用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]
和[_,_|_]
。第二个泛化坚持两个列表的尾巴只是不同的(而不是像第一个泛化所述的那样坚持它们是[]
和[_|_]
)。第三和第四个则是更加通用的观点。"最初的回答"
[[a,b,c], [d,e,f],1]
进行匹配。此外,第一个列表应该只包含一个元素(由于[A]
),但它包含了三个元素。 - Willem Van Onsem