在GNU Prolog中生成fibonacci系列的程序给出了实例化错误

use*_*381 4 prolog fibonacci instantiation-error

这是我的代码: -

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," ,").
Run Code Online (Sandbox Code Playgroud)

在GNU Prolog的咨询中,我得到:

| ?- 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)
Run Code Online (Sandbox Code Playgroud)

Ale*_*nik 6

实例化错误是由试图计算引起F的值之前F1,并F2已被确定.最简单的解决方案是F is F1+F2在递归调用之后移动,以便您的程序成为

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," ,").
Run Code Online (Sandbox Code Playgroud)

(感谢@mbratch的提醒)write只有一个参数,即  write(F," ,").应该是write(F), write(" ,").

但是你应该小心输出.上面的程序会多次打印出相同的值:例如,计算fib(F,3)它将调用fib(F1,2),fib(F2,1)同时fib(F1,2)将调用fib(F11,1)并fib(F12,1)产生以下输出1, 1, 2, 1, 3.这真的是你需要的吗?