Яр
24.09.2006, 16:33
Есть выражение:
Fn-1 <= A <= Fn+2
, где Fn - число Фибоначчи с номером n,
A - какое-то заданное число.
Необходимо найти n.
Например, при A=5, получаем n=3 (или 4):
F: 0, 1, 1, 2, 3, 5, 8, 13...
N: 0, 1, 2, 3, 4, 5, 6, 7
Необходимо реализовать данный алгоритм на прологе.
Но я что-то сообразить не могу, пролог плохо знаю ).
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).
Говорит: Free variable in expression,
Задавая явно
goal fuk(5, 4) получаем yes
goal fuk(5,131) получаем no,
что и следовало ожидать.
Это ясно, что проблема со свободной N, но вот как это исправить, чтоб получилось красиво? :). Не соображу схожу шотто.. Или можно вообще как-то по-другому переписать выражение это, чтоб всё получилось (просто я запарился уже немного).
И второй вопрос: как реализовать этот же алгоритм функциональным языком программирования (в частности, OCaml), не прибегая к чисто императивной составляющей?
СПАСИБО :).
Fn-1 <= A <= Fn+2
, где Fn - число Фибоначчи с номером n,
A - какое-то заданное число.
Необходимо найти n.
Например, при A=5, получаем n=3 (или 4):
F: 0, 1, 1, 2, 3, 5, 8, 13...
N: 0, 1, 2, 3, 4, 5, 6, 7
Необходимо реализовать данный алгоритм на прологе.
Но я что-то сообразить не могу, пролог плохо знаю ).
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).
Говорит: Free variable in expression,
Задавая явно
goal fuk(5, 4) получаем yes
goal fuk(5,131) получаем no,
что и следовало ожидать.
Это ясно, что проблема со свободной N, но вот как это исправить, чтоб получилось красиво? :). Не соображу схожу шотто.. Или можно вообще как-то по-другому переписать выражение это, чтоб всё получилось (просто я запарился уже немного).
И второй вопрос: как реализовать этот же алгоритм функциональным языком программирования (в частности, OCaml), не прибегая к чисто императивной составляющей?
СПАСИБО :).