Prolog:减少参数中的变量

The*_*111 2 prolog fibonacci

我是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)

Owe*_*wen 5

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