Prevent backtracking after first solution to Fibonacci pair

前端 未结 3 1712
感情败类
感情败类 2021-01-01 00:47

The term fib(N,F) is true when F is the Nth Fibonacci number.

The following Prolog code is generally working for me:



        
3条回答
  •  [愿得一人]
    2021-01-01 01:40

    I played a bit with another definition, I wrote in standard arithmetic and translated to CLP(FD) on purpose for this question.

    My plain Prolog definition was

    fibo(1, 1,0).
    fibo(2, 2,1).
    fibo(N, F,A) :- N > 2, M is N -1, fibo(M, A,B), F is A+B.
    

    Once translated, since it take too long in reverse mode (or doesn't terminate, don't know), I tried to add more constraints (and moving them around) to see where a 'backward' computation terminates:

    fibo(1, 1,0).
    fibo(2, 2,1).
    fibo(N, F,A) :-
      N #> 2,
      M #= N -1,
      M #>= 0,  % added
      A #>= 0,  % added
      B #< A,   % added - this is key
      F #= A+B,
      fibo(M, A,B). % moved - this is key
    

    After adding B #< A and moving the recursion at last call, now it works.

    ?- time(fibo(U,377,Y)).
    % 77,005 inferences, 0.032 CPU in 0.033 seconds (99% CPU, 2371149 Lips)
    U = 13,
    Y = 233 ;
    % 37,389 inferences, 0.023 CPU in 0.023 seconds (100% CPU, 1651757 Lips)
    false.
    

    edit To account for 0 based sequences, add a fact

    fibo(0,0,_).
    

    Maybe this explain the role of the last argument: it's an accumulator.

提交回复
热议问题