这是我的代码: -
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)
答案 0 :(得分: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," ,").
(感谢@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+F2
和F1
后,您可能需要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,是