Пролог: Как написать предикат, который вычисляет интеграл?

#parameters #prolog #predicate #integral

Вопрос:

Я хочу написать преддиактное интегрирование(A, B, N, F, R), A-нижняя граница, B-верхняя граница, N-количество интервалов, F-функция, R-результат. Это псевдокод, который я хочу использовать для моделирования моего преддиакта:

 R = 0;
D = (B − A)/N;
R = F(A)   F(B);
I = 1;
while I =< N do
K = A   I ∗ D;
if I % 2 == 0; then
R = R   2 ∗ F(K);
else
R = R   4 ∗ F(K);
end if
I = I   1;
end while
R = R   D/3;
return R;
 

Функция для интеграла является: f(X, Y) :- Y is 1/(1 (X^2)).

До сих пор это то, что у меня есть:

 int(A, B, 0, I, D, F, R).
int(A, B, N, I, D, F, R) :- (I mod 2) == 0, K is ((I*D)   A),
                            call(F, K, X), R is R   2*X, 
                            I is I  1,
                            int(A, B, N, I, D, F, R).
int(A, B, s(N), 1, F, R) :- (I mod 2) == 1, K is ((I*D)   A),
                            call(F, K, X), R is R   4*X, 
                            I is I  1,
                            int(A, B, N, I, D, F, R).
integrate(A, B, N, F, R) :- R1 is 0, D is ((B-A)/N),
                            call(F, A, X), call(F, B, Y), R1 is X   Y,
                            int(A, B, N, 1, D, F, R1), R is R1   D/3.
 

Это приводит меня к ошибке: аргументы недостаточно инстанцированы. Я не хочу изменять параметры integrate(). Каков был бы правильный способ использования вызова в этом случае? Решение было бы оценено по достоинству!

Комментарии:

1. Вы выяснили, что дает вам ошибку? Может быть, вы сможете немного сузить круг и показать, как вы им управляете? В нынешнем виде это: (I mod 2) == 1 всегда будет терпеть неудачу. Вы , вероятно, хотели написать I mod 2 =:= 1 , что делает что-то другое. Вероятно, вы можете сами посмотреть это в документах используемой вами реализации пролога. Короче говоря, ==/2 это «эквивалентность» и =:=/2 арифметическое сравнение.

2. Хм, еще одно: D is ((B-A)/N) тоже собирается выдать ошибку. Сначала вы должны действительно сузить круг своих проблем самостоятельно и показать, как вы запускаете этот код.