PDA

Просмотр полной версии : Фибоначчи, пролог и так далее...



Яр
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), не прибегая к чисто императивной составляющей?

СПАСИБО :).

Пилигрим
24.09.2006, 19:06
Есть выражение:
Fn-1 <= A <= Fn+2
Скорее Fn < A <= Fn+1
нули с начала убрать, числа фиббоначи начинаются с 1: 1, 1, 2, 3, 5


F: 1, 1, 2, 3, 5, 8, 13...
N: 1, 2, 3, 4, 5, 6, 7

Ну а код должен выглядеть где-то так


domains
n = integer
r = real
predicates
fibb(n,r)
fuk(n,r)
fuk(n,r,n)
clauses
fibb(1,1):-!.
fibb(2,1):-!.
fibb(N,Res) :-
N1=N-1, fibb(N1,F1),
N2=N-2, fibb(N2,F2),
Res=F1+F2 .
fuk(E,N):- fuk(E, N, 1).
fuk(E, N, Cur):-
fibb(Cur, Fib),
Fib >= E,
N=Cur-1.
fuk(E, N, Cur ):-
New=Cur+1,
fuk(E, N, New).
goal
fuk(6, N),
write(N).
Почему именно так..хз... я Пролог сдал был еще прошлой сессией, но моск помнит что писать надо в таком духе. Главное что работает

Яр
24.09.2006, 19:45
Пилигрим, большое спасибо за подсказку! :)


Про числа Фибоначчи - в разных источниках по разному пишут: с 0 или сразу с 1 :).

А вариант с функциональной реализацией на OCaml'е уже сам разобрался :).

Яр
24.09.2006, 20:03
Вот Сalm-версия, если кому интересно ).


let a = 6.;;

let rec fibb n = if (n=1) or (n=0) then 1 else fibb(n-1) + fibb(n-2);;

let rec steps left right n =
if ( (left <= a) && (a <= right)) = false then
steps (float_of_int(fibb n)) (float_of_int(fibb (n+1))) (n+1)
else
n;;

let main () =
print_int(steps 1. 1. 1);
exit 0;;
main ();;

Fireball
28.09.2006, 08:45
А где у нас Пролог учат?

firejump
28.09.2006, 13:01
А где у нас Пролог учат?
Наверное Политех

Пилигрим
30.09.2006, 21:40
Наверное Политех
МехМат

AmonRa
02.10.2006, 08:07
На ФАВТе точно учат. Только уже ничего не помню, помню, что мне нравилось :)

Fireball
02.10.2006, 15:36
На ФАВТе точно учат. Только уже ничего не помню, помню, что мне нравилось :)
Это радует, надеюсь ко мне на АМ достучится :)

AmonRa
02.10.2006, 16:28
Fireball (https://forumodua.com/member.php?u=11380), не сомневайся. На АМ он будет...
P.S. АМ-982

iFog
09.10.2006, 17:32
А где у нас Пролог учат?

У меня в Холодильнике был семестр.

Falcon
17.10.2006, 15:03
На ФАВТе точно учат. Только уже ничего не помню, помню, что мне нравилось :)
Теперь, наверное, не учат. Теперь на фавте даже паскаль не учат(заменили на Java). Хотя может еще и будет за оставшееся время...

andriyBog
17.10.2006, 16:57
Теперь, наверное, не учат. Теперь на фавте даже паскаль не учат(заменили на Java). Хотя может еще и будет за оставшееся время...

Этож очень хорошо в ногу со временем идут, кому нужны эти Пролог, Паскаль
Сейчас даже С++ программёрам приходится переходить на Java

Ull9
17.10.2006, 17:06
Это пожалуй религиозный спор будет.
Я вот например скажу что с++ еще долго будет. На нем столько кода уже написано!!
Вообщем работы много. Переучиватся несоветую.

firejump
17.10.2006, 20:45
Это пожалуй религиозный спор будет.
Я вот например скажу что с++ еще долго будет. На нем столько кода уже написано!!
Вообщем работы много. Переучиватся несоветую.
Согласен не будем вести религиозные споры. Профессионалу работы всегда хватит с головой.