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

  • 本文关键字:返回 1+1+ Prolog 函数 prolog
  • 更新时间 :
  • 英文 :


这是长度函数:

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.

最新更新