Prolog列表匹配疑问:为何[[A],B,C]=[[a,b,c],[d,e,f],1]返回false?
为什么Prolog中
[[A],B,C] = [[a,b,c],[d,e,f],1]返回false? 刚学Prolog的时候遇到这种合一匹配的问题太正常啦,核心原因在于Prolog的合一(unification)要求两边的结构完全对应,包括列表的长度和嵌套层级。咱们拆开来一步步看:
- 先看等式两边的最外层结构:都是包含3个元素的列表,这部分是匹配的。
- 重点看第一个元素的结构:
- 左边第一个元素是
[A]:这是一个长度为1的列表,里面只有一个变量A。 - 右边第一个元素是
[a,b,c]:这是一个长度为3的列表,里面有三个原子a、b、c。
- 左边第一个元素是
在Prolog里,长度不同的列表是无法合一的——你没法让一个装1个元素的列表和装3个元素的列表匹配,就像你没法把一个装1个苹果的盒子和装3个苹果的盒子当成同一个东西一样。所以第一个元素匹配失败,整个表达式就返回false了。
如果想让这个匹配成功,你需要调整左边的结构,让它和右边的结构完全对应。比如把左边改成[[A,B,C], D, E],再执行匹配:
?- [[A,B,C], D, E] = [[a,b,c],[d,e,f],1]. A = a, B = b, C = c, D = [d,e,f], E = 1.
这样就会成功,因为两边每个位置的列表长度和结构都完全对应了。
再举个小例子,如果右边的第一个元素是长度1的列表,比如[[x], [d,e,f],1],那原来的表达式就能匹配成功:
?- [[A],B,C] = [[x],[d,e,f],1]. A = x, B = [d,e,f], C = 1.
内容的提问来源于stack exchange,提问作者Michał Kruk
相关产品推荐
相关产品推荐

