我刚刚开始学习序言,但我不明白为什么这会返回false。我试图找到解决方案,但没有找到。谁能告诉我为什么这个返回假?
[[A],B,C]=[[a,b,c],[d,e,f],1].
答案 0 :(得分: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]
表示 singleton 列表。
您可能希望将其与[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.
答案 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]
和[_,_|_]
。
第二个概括坚持认为两个列表的尾部都不同(而不是像第一个概括那样坚持认为它们是[]
和[_|_]
)。
第三和第四只是更一般的看法。