Почему функция длины Пролога возвращает сумму в форме 1 + 1 + ...? - PullRequest
0 голосов
/ 13 мая 2018

Это функция длины:

len([], 0).

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

Когда я запрашиваю

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

Почему я получаю X = 0 + 1 + 1 + 1 вместо X = 3?

1 Ответ

0 голосов
/ 13 мая 2018

+ определяется как (инфиксный) оператор.

Если в вашем коде есть вхождение 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...