#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)
тоже собирается выдать ошибку. Сначала вы должны действительно сузить круг своих проблем самостоятельно и показать, как вы запускаете этот код.