用于对序言列表中的项目进行计数的变量之间的差异
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.
我不明白为什么这个块执行计数:
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*/)
: ProvidedX
is a list with length 0 (why not) and0/*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.