5

这是我的代码:-

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

4 回答 4

8

实例化错误是由于在确定和F的值之前尝试计算而引起的。最简单的解决方案是在递归调用之后移动,以便您的程序变为F1F2F 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)whilefib(F1,2)会调用fib(F11,1)fib(F12,1)产生以下输出1, 1, 2, 1, 3。这真的是你需要的吗?

于 2014-04-01T20:14:01.837 回答
2

F is F1+F2在实例化F1and之后,您可能需要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是否符合您的期望。

于 2014-04-01T20:17:09.697 回答
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),
于 2017-05-02T12:51:27.163 回答
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,Yes

于 2017-08-29T21:59:41.917 回答