我试图找出为什么这段代码实际上运作良好。 我不了解那里发生了什么,Counter1如何与0结合,然后与1结合,等等。 Counter变量实际上似乎对我更有意义,但另一个......
以下两个规则定义谓词numberOfElements / 2,它计算给定列表的元素数量。
numberOfElements([], 0).
numberOfElements([_|Tail], Counter):-
numberOfElements(Tail,Counter1),
Counter is Counter1 + 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
统一为零。
现在在第三次通话中执行Counter1
,Counter is Counter1 + 1
为零,因此Counter1
变为1。
但在第三次通话中,Counter
在第二次通话中与Counter
统一;所以它在第二次通话中执行Counter1
。 Counter is Counter1 + 1
与1统一,因此Counter1
变为2。
但是Counter
,在第二个调用中,与第一个中的Counter
统一;所以它在第一次通话中被执行Counter1
。 Counter is Counter1 + 1
与2统一,因此Counter1
变为3。
请注意,第一次通话中的Counter
与原始Counter
统一,因此C
与3统一。
我尝试总结如下
C