前言,了解附录/ 3

时间:2018-12-17 00:35:31

标签: prolog append

num

为什么返回?- append([], [X1], [a,b]). 而不是

no

X1 = a,b

返回? - append([], [a,b], [a,b]) 吗?

2 个答案:

答案 0 :(得分:3)

要了解Prolog程序,您有两种选择:

  • 在其他编程语言中,通过模拟处理器的运动来思考程序。除非您的名字叫Ryzen或换句话说,这将导致您很快的精神崩溃。
  

您是处理器

  • 让Prolog进行思考,并使用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. 列表的元素无关。

  2. 只有三个列表的长度是相关的

  3. 第三个列表必须是两个或更多个元素。

答案 1 :(得分:1)

请参阅:append/3

append(?List1, ?List2, ?List1AndList2)

List1AndList2List1List2的串联


所以

?- 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