为什么Prolog长度函数以1 + 1 + ...形式返回总和?

时间:2018-05-13 08:34:30

标签: prolog

这是长度函数:

len([], 0).

len([H|T], N + 1) :-
    len(T, N).

当我查询

?- len([3,4,5], X).

为什么我得到X = 0 + 1 + 1 + 1而不是X = 3

1 个答案:

答案 0 :(得分:0)

+被定义为(中缀)运算符。

如果代码中出现A+B,则会转换为+(A,B),但永远不会对其进行评估。

术语+(1,1)只是另一个术语,如foo(a,b),并且不以任何特殊方式解释(即执行任何添加)。例如,您可以使用术语x/y来表示数字对,例如棋盘的坐标,并传递术语x/y,而无需计算数学表达式的数值结果{{1} }。

您可以在prolog提示符中使用x/y来验证+的真实性质:

display/1

为了计算算术评估,您可以使用?- display(1+1). +(1,1) true. ?- display(1+2*3-4). -(+(1,*(2,3)),4) true.

is/2

并且,由于?- X is 1+1. X = 2. 是二进制术语1+1,因此也适用:

+(1,1)

由于?- X is +(1,1). X = 2. 也是一个中缀运算符,即is/2扩展为A is B,这也有效:

is(A,B)

要修复代码,您需要创建一个新变量?- is(X, +(1,1)). X = 2. ,并使用N1来计算添加内容:

N1 is N+1