这是长度函数:
len([], 0).
len([H|T], N + 1) :-
len(T, N).
当我查询
时?- len([3,4,5], X).
为什么我得到X = 0 + 1 + 1 + 1
而不是X = 3
?
答案 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