在 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,则成功。这样就结束了递归,整个事情就成功了。