При чтении SICP я столкнулся с логическим программированием, глава 4.4. Затем я начал изучать язык программирования Prolog и пытался понять некоторые простые назначения в Prolog. Я обнаружил, что у Пролога, похоже, есть проблемы с численными расчетами.
Ниже приведено вычисление факториала в стандартном прологе:
f(0, 1).
f(A, B) :- A > 0, C is A-1, f(C, D), B is A*D.
Я обнаружил, что мне нужно ввести две вспомогательные переменные (C
и D
), новый синтаксис (is
) и что проблема не обратима (т.е. f(5,X)
работает как ожидаемый, но f(X,120)
нет).
Наивно, я ожидаю, что по крайней мере C is A-1, f(C, D)
выше может быть заменено на f(A-1,D)
, но даже это не работает.
Мой вопрос: Зачем мне делать лишний "материал" в числовых вычислениях, но не в других запросах?
Я понимаю (и SICP совершенно ясно об этом), что в целом информации о том, "что делать", недостаточно, чтобы ответить на вопрос "как это сделать". Таким образом, декларативное знание (по крайней мере, некоторых) математических задач недостаточно для решения этих проблем. Но это вызывает следующий вопрос: как этот лишний "материал" в Prolog помогает мне ограничивать формулировку только теми проблемами, где "что делать" достаточно, чтобы ответить "как это сделать"?