用于对序言列表中的项目进行计数的变量之间的差异

Difference between variables used to count items in a prolog list

我不明白为什么这个块执行计数:

lengthTest([],0).
lengthTest([_ | X], R) :- lengthTest(X, R1), 
    R is R1 + 1.

和后面的没有,它returns只是false.

lengthTest([],0).
lengthTest([_ | X], R) :- lengthTest(X, R), 
    R is R + 1.

谁能解释一下幕后发生的事情?我正在使用 swi-prolog

谢谢

R is R + 1无法满足; R 没有使该陈述成立的值。

首先,在您的第二个版本的第二条规则中,R 的候选值是什么?

只有一个候选:R = 0来自事实。好啊,为什么不。现在让我们用这些知识阅读递归规则:

lengthTest([_ | X], 0/*R*/) :-  lengthTest(X, 0/*R*/), 
    0/*R*/ is 0/*R*/ + 1.

沿着箭头:-的方向从右到左阅读该规则(这是一个 asciified ←):

lengthTest(X, 0/*R*/): Provided X is a list with length 0 (why not) and 0/*R*/ is 0/*R*/ + 1 is true (let's ignore that for a moment)

then it follows that

the list with one more element has length 0.

换句话说,所有列表的长度都为 0。这对您来说有意义吗?也许(我在开玩笑)。

但是不管这个奇怪的结论如何,我暂时忽略的0/*R*/ is 0/*R*/ + 1呢?

?- 0/*R*/ is 0/*R*/ + 1.
false.

所以这个永远不成立,因此永远无法得出结论。

顺便说一句,你声称这个定义 »returns 只是 false« 这是不正确的,因为它成功如下:

?- lengthTest([], 0).
true.