用SICStus Prolog推广Fibonacci序列

时间:2010-05-09 18:34:36

标签: prolog fibonacci sicstus-prolog clpfd

我正在尝试找到一个关于广义Fibonacci序列(GFS)的查询的解决方案。查询是:是否有任何GFS有885作为他们的第12个数字?最初的2个数字可能会被限制在1到10之间。

我已经找到了解决方案,以从(1,1)开始的序列中找到第N个数字,其中我明确定义了初始数字。以下是我对此的看法:

fib(1, 1).
fib(2, 1).

fib(N, X) :-
    N #> 1,
    Nmin1 #= N - 1,
    Nmin2 #= N - 2,
    fib(Nmin1, Xmin1),
    fib(Nmin2, Xmin2),
    X #= Xmin1 + Xmin2.

对于上面提到的查询,我认为以下方法可以解决这个问题,我重复使用fib方法而不明确定义初始数字,因为现在需要动态完成:

fib(N, X) :-
    N #> 1,
    Nmin1 #= N - 1,
    Nmin2 #= N - 2,
    fib(Nmin1, Xmin1),
    fib(Nmin2, Xmin2),
    X #= Xmin1 + Xmin2.

fib2 :-
    X1 in 1..10,
    X2 in 1..10,
    fib(1, X1),
    fib(2, X2),
    fib(12, 885).

......但这似乎不起作用。

这种方式不可能定义初始数字,还是我做了一些非常错误的事情?我不是要求解决方案,但任何可以帮助我解决这个问题的建议都将非常感激。

6 个答案:

答案 0 :(得分:6)

在SWI-Prolog下:

:- use_module(library(clpfd)).

fib(A,B,N,X):-
    N #> 0,
    N0 #= N-1,
    C #= A+B,
    fib(B,C,N0,X).
fib(A,B,0,A).

task(A,B):-
    A in 1..10,
    B in 1..10,
    fib(A,B,11,885).

答案 1 :(得分:2)

定义谓词gfs(X0,X1,N,F),其中X0和X1是基本情况0和1的值。

答案 2 :(得分:1)

可能不是严格意义上的解决方案,但我将永远分享它。可能唯一的收获就是表明,这既不需要计算机也不需要计算器来解决。如果你知道这个技巧可以在熊市上完成。

如果F_n是普通Fibo序列的第n个项,从F_1 = F_2 = 1开始,那么广义序列的第n个项将是G_n = F_ {n-2} * a + F_ {N-1} * b。 定义F _ { - 1} = 1,F_0 = 0

(的确,通过归纳

  • G_1 = F _ { - 1} * a + F_0 * b = 1 * a + 0 * b = a
  • G_2 = F_0 * a + F_1 * b = 0 * a + 1 * b = b
  • G_ {n + 1} = F_ {n-1} a + F_n b =(F_ {n-3} + F_ {n-2})a +(F_ {n- 2} + F_ {n-1})* b = G_n + G_ {n-1}

因此G_12 = F_10 * a + F_11 * b = 55a + 89b。

现在,您可以使用计算机搜索等式55a + 89b = 885的解法

OR

做数学:

补遗mod 11(explanation):

55a + 89b = 0 + 88b + b = b; 885 = 880 + 5 = 80 * 11 + 5 = 5

因此b = 5 mod 11,但由于1 <= b <= 10,b确实是5.89 * 5 = 445和885-445 = 440.现在,除以55得到a = 8。

答案 3 :(得分:0)

我说你做的事情非常糟糕...... 当您致电fib(1, X1)时,变量X1是函数fib将返回的数字,在这种情况下,它将为1,因为基本情况为fib(1, 1).

答案 4 :(得分:0)

没有基本情况,fib / 2没有解决方案;无论你怎么称呼它在fib2。 注意:如果使用递归,则至少需要一个基本情况。

答案 5 :(得分:0)

考虑fib(N,F1,F2),这样您就可以使用简单fib(Nmin1, Xmin1)替换fib(Nmin2, Xmin2)fib(Nmin2, Xmin2, Xmin1)