Program to generate fibonacci series in GNU Prolog is giving an instantiation error

fibonacci, instantiation-error, prolog

Solution

Instantiation error is caused by the attempt to calculate `F` before the values of `F1` and `F2` have been determined. The simplest solution would to move `F is F1+F2` after the recursive calls such that your program becomes

fib(0,0).
fib(1,1).
fib(F,N) :- 
    N>1,
    N1 is N-1,
    N2 is N-2,
    fib(F1,N1),
    fib(F2,N2),
    F is F1+F2,
    write(F," ,").

(thanks to @mbratch for reminding) `write` has only one argument, i.e., `write(F," ,").` should be `write(F), write(" ,").`

You should be however careful with the output. The program above would print out the same value multiple times: e.g., to calculate `fib(F,3)` it will invoke `fib(F1,2)` and `fib(F2,1)` while `fib(F1,2)` will invoke `fib(F11,1)` and `fib(F12,1)` resulting in the following output `1, 1, 2, 1, 3`. Is this really what you need?

Problem

This is my code:- ``` fib(0,0). fib(1,1). fib(F,N) :- N>1, N1 is N-1, N2 is N-2, F is F1+F2, fib(F1,N1), fib(F2,N2), write(F," ,"). ``` On consulting in GNU Prolog, I am getting: ``` | ?- consult('C:/GNU-Prolog/bin/fib.pl'). compiling C:/GNU-Prolog/bin/fib.pl for byte code... C:/GNU-Prolog/bin/fib.pl compiled, 3 lines read - 1253 bytes written, 15 ms yes | ?- fib(F,2). uncaught exception: error(instantiation_error,(is)/2) ```

Original source