更深层次的Prolog计数解释

时间:2011-11-19 03:51:40

标签: prolog

目前在Prolog中玩...我在查看计数列表规则时遇到了麻烦。我无法在任何地方找到一个好的解释。有人可以在每次递归时给我一个细分吗?

count(0, []).
count(Count, [Head|Tail]) :-
    count(TailCount, Tail),
    Count is TailCount + 1.

有一个地方说它是递归的(这对我来说是有道理的)而另一个地方则表示它不是。

2 个答案:

答案 0 :(得分:5)

它是递归的过程,但不是 tail 递归。编写尾递归过程是一种优化,它允许系统将递归转换为迭代,避免无用的堆栈用于确定性计算(就像我们所说的那样)。 在这种情况下(BTW它与内置长度/ 2相同,只是交换参数),我们可以使用累加器,并以这种方式重写过程:

count(C, L) :- count(0, C, L).

count(Total, Total, []).
count(SoFar, Count, [_Head|Tail]) :-
    Count1 is SoFar + 1,
    count(Count1, Count, Tail).

一些较早的系统需要在递归调用之前进行剪切,以使优化生效:

    ...,
    !, count(Count1, Count, Tail).

答案 1 :(得分:1)

推理规则的定义是递归的。 该程序试图计算列表中元素的数量。

count(0, []).这是一个公理,事实,这是事实,因为你这么说。在这里,您要说明每个空列表的计数为零。

count(Count, [Head|Tail]) :- count(TailCount, Tail), Count is TailCount + 1.

这是一个推理规则,如果右边部分为真,则规定:-的左边部分为真。此推理规则还使用模式匹配,wicth匹配非空列表([Head|Tail])。 具体来说,计数规则表示非空列表的Count变量是列表的Tail部分的计数加1(加1用于计算列表的Head元素)