Я читал рекурсивную функцию в прологе, которая возвращает сумму всех элементов в списке, как показано ниже:Как рекурсивные функции работают в Prolog?
sum([ ], 0).
sum([Elem | Tail], S):- sum(Tail, S1),
S is S1 + Elem.
Я не могу понять две проблемы:
1: В левой части ": -" у нас есть Цель. Это означает, что все вычисления будут выполнены в правой части «: -», а затем мы можем использовать Цель как обычная функция. Это означает, что мы приводим наши аргументы и переменные, чтобы результат был нанесен на них, а правильная сторона отвечает за вычисление.
Но в этом коде Цель, сама вычисляет голову и хвост. Я имею в виду в моем уме код должен быть, как это (однако он не работает!):
sum(Tail, S1):-sum([Elem | Tail], S),........
Поскольку цель должна дать аргументы и правая сторона отвечает за вычисление.
2: Я не могу понять, как этот код работает шаг за шагом. может ли кто-нибудь дать мне очень простой пример, например, как он вычисляет сумму [1,2,3]?
Ваше описание, * ... цель должна давать аргументы, а правая сторона отвечает за вычисление. * Дает понять, что вы думаете о предикатах Пролога *, как если бы они были * функциями * в императивном языка, но это не так. В Prolog предикат * определяет правила с одним или несколькими предложениями предиката *, а то, что вы вызываете * цель *, - это * head * предложения, которое Prolog пытается * сопоставить *, пытаясь объединить между * запросом * и глава * главы *. Если унификация будет достигнута, тогда правило будет соответствовать, и Prolog проведет правило (предложение * body *). – lurker