Фибоначчи, пролог и так далее...
Есть выражение:
F[SIZE="1"]n-1[/SIZE] <= A <= F[SIZE="1"]n+2[/SIZE]
, где Fn - число Фибоначчи с номером n,
A - какое-то заданное число.
Необходимо найти n.
Например, при A=5, получаем n=3 (или 4):
[FONT="Courier New"]F: 0, 1, 1, 2, [B]3[/B], [B]5[/B], 8, 13...
N: 0, 1, 2, [B]3[/B], 4, 5, 6, 7[/FONT]
Необходимо реализовать данный алгоритм на прологе.
Но я что-то сообразить не могу, пролог плохо знаю ).
[CODE]domains
n = integer
r = real
predicates
fibb(n,n)
fuk(n,n)
clauses
fibb(0,0).
fibb(1,1).
fibb(2,1).
fibb(N,Res) :- N>2,
N1=N-1, fibb(N1,F1),
N2=N-2, fibb(N2,F2),
Res=F1+F2 .
fuk(Exp,N) :-
N1 = N+1, fibb(N1,A),
N2 = N+2, fibb(N2,B),
A <= Exp, Exp <= B.
goal
fuk(5, N).[/CODE]
Говорит: [B]Free variable in expression[/B],
Задавая явно
goal fuk(5, 4) получаем yes
goal fuk(5,131) получаем no,
что и следовало ожидать.
Это ясно, что проблема со свободной N, но вот как это исправить, чтоб получилось красиво? :). Не соображу схожу шотто.. Или можно вообще как-то по-другому переписать выражение это, чтоб всё получилось (просто я запарился уже немного).
И второй вопрос: как реализовать этот же алгоритм функциональным языком программирования (в частности, OCaml), не прибегая к чисто императивной составляющей?
СПАСИБО :).