我是Prolog的新手,负责Fibonnaci谓词fib(N,F),其中N是序列中的数字,F是值.我想出的不起作用,但我找到的解决方案似乎与我相同......我无法理解其中的区别.
我的版本:
/* MY VERSION, DOES NOT WORK */
fib( 0, 0).
fib( 1, 1).
fib(N,F) :-
N > 1,
fib(N-1,F1),
fib(N-2,F2),
plus(F1,F2,F).
Run Code Online (Sandbox Code Playgroud)
工作版本:
/* FOUND SOLUTION, DOES WORK */
fib( 0, 0).
fib( 1, 1).
fib(N,F) :-
N > 1,
N1 is N-1,
N2 is N-2,
fib(N1,F1),
fib(N2,F2),
plus(F1,F2,F).
Run Code Online (Sandbox Code Playgroud)
显然这个问题与我使用"N-1"和"N-2"作为参数有关,而不是先将这些值分配给新变量.但是我没有得到它...因为在其他递归的Prolog代码中,我已经成功完成了(在参数槽中减少了一个变量).这有意义吗?
谢谢!
下面是"N-1"确实有效的例子.
line( N, _, _) :-
N =:= 0.
line( N, M, Char) :-
N > 0,
N mod M =\= 1,
write( Char), write( ' '),
line( N-1, M, Char).
line( N, M, Char) :-
N > 0,
N mod M =:= 1,
write( Char), write( '\n'),
line( N-1, M, Char).
square( N, Char) :-
N > 0,
line( N*N, N, Char).
Run Code Online (Sandbox Code Playgroud)
新版的fib/2也可以使用!
/* NEW VERSION, CHANGED TRIVIAL CASES TO EVALUATE N */
fib( N, 0) :-
N =:= 0.
fib( N, 1).
N =:= 1.
fib(N,F) :-
N > 1,
fib(N-1,F1),
fib(N-2,F2),
plus(F1,F2,F).
Run Code Online (Sandbox Code Playgroud)
在prolog中,
1 - 2
Run Code Online (Sandbox Code Playgroud)
实际上没有做任何算术(我知道,对吧?),它创建了一个结构:
-(1, 2)
Run Code Online (Sandbox Code Playgroud)
并且is是一个评估该结构的谓词:
is(X, -(1, 2))
Run Code Online (Sandbox Code Playgroud)
将统一X与-1.
显然<,>(和那些喜欢它)就像is他们评估表达一样.
这意味着你的fib谓词和line谓词之间的区别就在于此
fib(0, 0).
Run Code Online (Sandbox Code Playgroud)
正在使用统一,即测试术语本身是否相等:
foo(0).
?- foo(1 - 1).
false
Run Code Online (Sandbox Code Playgroud)
而测试就像=:=测试数字相等:
foo(X) :- X =:= 0.
?- foo(1 - 1).
yes
Run Code Online (Sandbox Code Playgroud)