Я читаю книгу «Искусство пролога», и я нашел упражнение, которое гласит: «Определите сумму отношений (ListOfIntegers, Sum), которая выполняется, если Sum является суммой ListOfIntegers, без использования любой вспомогательный предикат».Я пришел с этим решением:Сумма списка в прологе
sum([],Sum).
sum([0|Xs], Sum):-sum(Xs, Sum).
sum([s(X)|Xs], Sum):-sum([X|Xs],s(Sum)).
Который не работает точно так, как я хотел бы, чтобы это.
?- sum([s(s(0)),s(0),s(s(s(0)))],X).
true ;
false.
Я ожидал, что X будет
s(s(s(s(s(s(0))))))
Я думал, что проблема в том, что я должен «инициализировать» Сумма к 0 в первом «итерации», но это было бы очень процедурной и, к сожалению, Я не очень ухожу в прологе, чтобы сделать эту работу. Любые идеи или предложения?
Я никогда не думал, что смогу решить мою проблему таким образом ... Спасибо! – kaiseroskilo
Это не первый вопрос Пролога, который вдохновил его на другой язык. Я думаю, что Эрланг недавно испортил программистов Пролога, или это отражает определенное мышление. В Эрланге можно обойтись без Peano: sum ([]) -> 0; sum ([X | Y]) -> X + sum (Y). И левое декларативное чтение размыто, а «->» логически запутано. –
Пролог II имел '->' вместо ': -', это было около 1980 года. Целью было подчеркнуть аспект перезаписи. Erlang около 1987. – false