比较序言中的列表

时间:2019-06-09 10:58:07

标签: list variables prolog

我刚刚开始学习序言,但我不明白为什么这会返回false。我试图找到解决方案,但没有找到。谁能告诉我为什么这个返回假?

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

2 个答案:

答案 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][_,_|_]

第二个概括坚持认为两个列表的尾部都不同(而不是像第一个概括那样坚持认为它们是[][_|_])。

第三和第四只是更一般的看法。