Это можно легко решить, используя вспомогательные переменные .
Для примера рассмотрим:
f(1, 1).
f(X, Y) :-
Y #= 5*X + X^2 + T1,
T2 #= X - 1,
f(T2, T1).
Это прямолинейный перевод правил, которые вы даете, используя вспомогательные переменные T1
и T2
, которые стоят за частичные выражения F (X-1) и X-1, соответственно. Поскольку @BallpointBen правильно отмечает, недостаточно использовать сами термины, поскольку эти термины отличаются от их арифметики оценка. В частности, -(2,1)
является не целое число 1
, но 2 - 1 #= 1
удержание!
В зависимости от системы Prolog, вы можете определяется в настоящее время по-прежнему импортировать библиотеку использовать предикат (#=)/2
, выражающий равенство из целочисленных expressesions.
Ваш пример запроса уже сейчас дает решение:
?- f(4, X).
X = 75 .
Обратите внимание, что предикат делает не прекращать универсально в этом случае:
?- f(4, X), false.
nontermination
Мы можем легко сделать так, с дополнительным ограничение:
f(1, 1).
f(X, Y) :-
X #> 1,
Y #= 5*X + X^2 + T1,
T2 #= X - 1,
f(T2, T1).
Нет ж мы имеем:
?- f(4, X).
X = 75 ;
false.
Обратите внимание, что мы можем использовать это в качестве истинного отношения, а также в наиболее общем случае:
?- f(X, Y).
X = Y, Y = 1 ;
X = 2,
Y = 15 ;
X = 3,
Y = 39 ;
X = 4,
Y = 75 ;
etc.
версии основаны на более низком уровне арифметики обычно только крышка очень ограниченное подмножество экземпляров таких запросов. Поэтому я рекомендую вам использовать (#=)/2
вместо от (is)/2
. Специально для новичков, использование (is)/2
слишком сложно понять. Возьмите много связанных вопросов, поданных под номером instantiation-error в качестве доказательств, и см. clpfd для декларативных решений.
Спасибо @BallpointBen, но он дает мне ошибку глобального хранения памяти, когда я пытаюсь это решение. Я также думаю, что мой базовый случай был неправильным и изменил его на «f (1, Y): - Y равно 1.» для удовлетворения требования f (1) = 1. – mdo123
Собственно, Prolog может вывести 'Y = 1' на свой собственный. – BallpointBen
, но как насчет ошибки из памяти, любые идеи по исправлению этого @BallpointBen? Или любые источники, которые я могу прочитать, вы можете порекомендовать, чтобы понять? – mdo123