Search code examples
prolog

solving of equations by the Euler method in Prolog


I wrote this mini pseudo code that solves the equation using the Euler method:

    // 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

Now I am trying to write this in Prolog language

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).

Here I solved the example on a piece of paper and should get 62.5 enter image description here

But in Prolog my Output =

?- loop2(10, 0.5, 0, 1).
1
false.

Solution

  • X is X + H becomes 0 is 0 + 0.5 and it is not, so case closed as far as Prolog is concerned, it has found your logical code is false, and reports that to you. You did tell it to writeln(Y) before that, so you still see 1 while it was trying.

    You need to use new variable names for the results of calculations like you have used S is N - 1, e.g. Xnext is X + H.


    The way you have shaped the countdown, S will eventually become 0 and then N > 0 will be false and the whole thing will fail then. You can probably get away with using this to write the values before it eventually fails, but a more normal way to end recursion is to have

    loop2(0,_,_,_).
    loop2(N,H,X,Y) :-
        ...
    

    which says that when the call to loop2 happens, the top one is found first, if the first position is 0, then it succeeds. That ends the recursion and the whole thing succeeds.