num
为什么返回?- append([], [X1], [a,b]).
而不是
no
自
X1 = a,b
返回? - append([], [a,b], [a,b])
吗?
答案 0 :(得分:3)
要了解Prolog程序,您有两种选择:
您是处理器
只要您看到失败的目标,就可以通过概括该目标(通过用变量替换某些术语)来缩小目标失败的原因。您完全不需要了解的确切定义。尝试一下就足够了。对于您的查询
?- append([], [X1], [a,b]).
false.
我们有三个论点。也许第一个是罪魁祸首?因此,我将其替换为新变量:
?- append(Xs, [X1], [a,b]).
Xs = [a],
X1 = b ;
false.
钉了!改变第一个论点将导致成功。但是第二个论点呢?
?- append([], Ys, [a,b]).
Ys = [a, b].
同样也是罪魁祸首。现在是第三个:
?- append([], [X1], Zs).
Zs = [X1].
判决:所有三种有罪。也就是说,责怪其中之一就足够了。您可以选择哪一个。
每当遇到失败的目标时,请执行此操作。它将帮助您获得使Prolog成为特殊语言的关系视图。
如果我们愿意的话。通常,考虑最大的失败概括。就是说,归纳仍然会失败,但是每一步都将导致成功。在您的示例中,这是:
?- append([], [X1], [a,b]). % original query
false.
?- append([], [_], [_,_|_]). % maximal failing generalization
false.
由此您可以得出一些结论:
列表的元素无关。
只有三个列表的长度是相关的
第三个列表必须是两个或更多个元素。
答案 1 :(得分:1)
请参阅:append/3
append(?List1, ?List2, ?List1AndList2)
List1AndList2
是List1
和List2
的串联
所以
?- append([], [X1], [a,b]).
[]
是空列表,而[X1]
是具有变量X1
的列表
如果您这样运行查询
?- append([],[X1],A).
你得到
A = [X1].
这意味着A
是[]
和[X1]
的串联。
在您的查询中,它询问[]
和[X1]
的串联是错误的[a,b]
还是no
。
第二次查询
? - append([], [a,b], [a,b])
询问[]
和[a,b]
的串联是正确的[a,b]
还是yes
。