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