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

时间:2014-04-01 19:58:37

标签: 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," ,").

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

4 个答案:

答案 0 :(得分:6)

实例化错误是由于在确定FF1的值之前尝试计算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," ,").

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

你应该小心输出。上面的程序会多次打印出相同的值:例如,计算fib(F,3)它将调用fib(F1,2)fib(F2,1),而fib(F1,2)将调用fib(F11,1)和{ {1}}导致以下输出fib(F12,1)。这真的是你需要的吗?

答案 1 :(得分:2)

在实例化F is F1+F2F1后,您可能需要F2。以下是您的代码与适用的代码的完全匹配。现在,我确定它正是你想要的(此外,它失败了大的N值,大的在这里非常小)。

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,
    format('~w, ',[F]).

我使用的是format而不是write,我不确定write/2是否符合预期。

答案 2 :(得分:1)

fab1(1,1).
fab1(2,1).
fab1(N,T):-
    N>2,
    N1 is N-1,
    N2 is N-2,
    fab1(N1,T1),
    fab1(N2,T2),
    T is (T1+T2),

答案 3 :(得分:0)

结构域

N,N1,N2,Ans=integer

谓词

test(integer,integer)
findfibo(integer,integer)
go

条款

go:-
    write("Enter number"),nl,
    readint(N),
    test(1,N).
go.
test(0,N).
test(X,N):-
    X<=N,
    findfibo(X,Ans),
    write(Ans," ,"),
    X1=X+1,
    test(X1,N).



findfibo(1,1).
findfibo(2,1).
findfibo(N,Ans):-
    N>1,
    N1=N-1,
    N2=N1-1,
    findfibo(N1,Ans1),
    findfibo(N2,Ans2),
    Ans=Ans1+Ans2.

示例输出 目标:走吧      输入数字      10      1,1,2,3,5,8,13,21,34,45,55,是