+ определяется как (инфиксный) оператор.
Если в вашем коде есть вхождение A+B
, оно переводится в +(A,B)
, но никогда не оценивается.
Термин +(1,1)
- это просто еще один термин, такой как foo(a,b)
, и он не интерпретируется каким-либо особым образом (т. Е. Вообще выполняет сложение).Например, вы можете использовать термин x/y
для представления пар чисел, таких как координаты шахматной доски, и передавать термин x/y
без вычисления числового результата математического выражения 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
для вычисления сложения:
len([], 0).
len([H|T], N1) :-
len(T, N), N1 is N+1.