这是长度函数:
len([], 0).
len([H|T], N + 1) :-
len(T, N).
当我查询时
?- len([3,4,5], X).
为什么我得到X = 0 + 1 + 1 + 1
而不是X = 3
?
+ 定义为(中缀(运算符。
当你的代码中出现A+B
时,它会被转换为+(A,B)
,但永远不会被计算。
术语+(1,1)
只是另一个术语,就像foo(a,b)
一样,并且没有以任何特殊的方式解释(即执行任何加法(。例如,您可以使用术语x/y
来表示数字对,例如棋盘的坐标,并将术语传递x/y
,而无需计算数学表达式x/y
的数值结果。
您可以通过在 prolog 提示中使用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
来计算加法:
len([], 0).
len([H|T], N1) :-
len(T, N), N1 is N+1.