为什么is / 2谓词将变量统一为零?

时间:2016-12-20 20:18:09

标签: prolog

我试图找出为什么这段代码实际上运作良好。 我不了解那里发生了什么,Counter1如何与0结合,然后与1结合,等等。 Counter变量实际上似乎对我更有意义,但另一个......

以下两个规则定义谓词numberOfElements / 2,它计算给定列表的元素数量。

numberOfElements([], 0).
numberOfElements([_|Tail], Counter):-
    numberOfElements(Tail,Counter1),
    Counter is Counter1 + 1 .

1 个答案:

答案 0 :(得分:1)

我尝试用一​​个例子来解释。

假设您致电numberOfElements([a, b, c], C)

唯一适用的条款是第二个,因此请丢弃列表的头部(a),将Tail[b, c]统一,将变量C与变量统一Counter

然后numberOfElemens/2使用Tail(与[b, c]统一)和新变量Counter1调用自己。

现在唯一适用的条款是(再次)第二条,因此丢弃列表的头部(b),用Tail统一[c]和变量{{1} (第一次调用)(变量Counter1(第二次调用)。

然后Counter再次使用numberOfElemens/2(与Tail统一)和新变量[c]调用自身。

现在唯一适用的条款是(第三次)第二个条款,因此丢弃列表的头部(Counter1),用c统一Tail(空列表) )和变量[](第二次调用)和变量Counter1(第三次调用)。

然后Counter再次使用numberOfElemens/2(与空列表统一)和新变量Tail调用自身。

这次唯一适用的条款是第一个(列表为空),因此第三个调用的Counter1统一为零。

现在在第三次通话中执行Counter1Counter is Counter1 + 1为零,因此Counter1变为1。

但在第三次通话中,Counter在第二次通话中与Counter统一;所以它在第二次通话中执行Counter1Counter is Counter1 + 1与1统一,因此Counter1变为2。

但是Counter,在第二个调用中,与第一个中的Counter统一;所以它在第一次通话中被执行Counter1Counter is Counter1 + 1与2统一,因此Counter1变为3。

请注意,第一次通话中的Counter与原始Counter统一,因此C与3统一。

我尝试总结如下

C