Я нахожусь в процессе изучения Пролога.
У меня есть этот рекурсивный предикат:
add (0, Y, Y).
add (succ (X),Y, succ (Z)): -
add (X, Y, Z).
Хорошо, опытные программисты на Прологе, вероятно, поймут, что делает этот предикат.На первый взгляд это не так сложно понять;если в качестве первого и второго аргумента указаны две цифры, он вернет результат сложения их в качестве третьего аргумента.Звучит просто?Действительно.
Но у меня есть серьезная проблема с пониманием того, как это на самом деле работает.Я перечитывал описание этого предиката много раз, но пока не понимаю, как он на самом деле работает.И именно поэтому я прошу помощи.
Запрашивая это:
add(succ(succ(succ(0))), succ(succ(0)), R).
Пролог создаст экземпляр и, таким образом, вернет R
как succ(succ(succ(succ(succ(0)))))
.Хорошо.Это должно быть правильно.Однако я понятия не имею, почему это так.
Что у меня есть проблемы с пониманием, так это как и почему Пролог удаляет самый внешний функтор succ
из исходного запроса,Опять же, поскольку он рекурсивный, он передает результаты в качестве аргументов самому себе и, таким образом, удаляет самый внешний функтор succ
, пока цель не будет объединена.Я понимаю, как работает succ(Z)
и аргумент R
, но, по-видимому, я не могу понять, как он на самом деле удаляет самый внешний функтор succ
, как уже упоминалось.Мне кажется, что добавляет succ
вместо удаления, из-за succ(X)
в определении предиката.
Любая помощь очень ценится ,Заранее спасибо!