在 Prolog 中用 Euler 方法求解方程
solving of equations by the Euler method in Prolog
我写了这个使用欧拉方法求解方程的迷你伪代码:
// y'= x^2 - 5y
int n = 10; // count of steps
double h = 0.5; // step
double x = 0;
double y = 1;
for (int i = 0; i < n; i++) {
y += h * (x * x - 5 * y);
x += h;
}
write << y; //result
现在我正在尝试用 Prolog 语言编写这个
loop2(N,H,X,Y) :-
N > 0,
write(Y), nl,
Y is Y + H * (X * X - 5 * Y),
X is X + H,
S is N - 1,
loop2(S, H, X, Y).
这里我在一张纸上解决了这个例子,应该得到62.5
但是在序言中我的输出=
?- loop2(10, 0.5, 0, 1).
1
false.
X is X + H
变为 0 is 0 + 0.5
但事实并非如此,因此就 Prolog 而言,案例已关闭,它发现您的逻辑代码是 false
,并向您报告。你之前确实告诉过 writeln(Y)
,所以你在尝试时仍然看到 1
。
您需要像使用 S is N - 1
一样为计算结果使用新的变量名称,例如Xnext is X + H
.
你塑造倒计时的方式,S
最终会变成 0
,然后 N > 0
会是假的,然后整个事情就会失败。您可能可以在它最终失败之前使用它来 write
值,但是结束递归的更正常的方法是让
loop2(0,_,_,_).
loop2(N,H,X,Y) :-
...
表示当调用loop2
时,先找到最上面的,如果第一个位置为0,则成功。这样就结束了递归,整个事情就成功了。
我写了这个使用欧拉方法求解方程的迷你伪代码:
// y'= x^2 - 5y
int n = 10; // count of steps
double h = 0.5; // step
double x = 0;
double y = 1;
for (int i = 0; i < n; i++) {
y += h * (x * x - 5 * y);
x += h;
}
write << y; //result
现在我正在尝试用 Prolog 语言编写这个
loop2(N,H,X,Y) :-
N > 0,
write(Y), nl,
Y is Y + H * (X * X - 5 * Y),
X is X + H,
S is N - 1,
loop2(S, H, X, Y).
这里我在一张纸上解决了这个例子,应该得到62.5
但是在序言中我的输出=
?- loop2(10, 0.5, 0, 1).
1
false.
X is X + H
变为 0 is 0 + 0.5
但事实并非如此,因此就 Prolog 而言,案例已关闭,它发现您的逻辑代码是 false
,并向您报告。你之前确实告诉过 writeln(Y)
,所以你在尝试时仍然看到 1
。
您需要像使用 S is N - 1
一样为计算结果使用新的变量名称,例如Xnext is X + H
.
你塑造倒计时的方式,S
最终会变成 0
,然后 N > 0
会是假的,然后整个事情就会失败。您可能可以在它最终失败之前使用它来 write
值,但是结束递归的更正常的方法是让
loop2(0,_,_,_).
loop2(N,H,X,Y) :-
...
表示当调用loop2
时,先找到最上面的,如果第一个位置为0,则成功。这样就结束了递归,整个事情就成功了。