Одесса: 6°С (вода 9°С)
Киев: 1°С
Львов: 5°С

Тема: Фибоначчи, пролог и так далее...

Ответить в теме
Показано с 1 по 15 из 15
  1. Вверх #1
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148

    Question Фибоначчи, пролог и так далее...

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

    СПАСИБО .
    ~ Motivation is what gets you started. Habit is what keeps you going.


  2. Вверх #2
    Постоялец форума Аватар для Пилигрим
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    31
    Сообщений
    1,215
    Репутация
    134
    Цитата Сообщение от Яр
    Есть выражение:
    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 в 20:13.

  3. Вверх #3
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    Пилигрим, большое спасибо за подсказку!


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

    А вариант с функциональной реализацией на OCaml'е уже сам разобрался .
    Последний раз редактировалось Яр; 24.09.2006 в 20:47.
    ~ Motivation is what gets you started. Habit is what keeps you going.

  4. Вверх #4
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    Вот С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 ();;
    ~ Motivation is what gets you started. Habit is what keeps you going.

  5. Вверх #5
    Живёт на форуме Аватар для Fireball
    Пол
    Мужской
    Адрес
    Украина->Одесса
    Возраст
    30
    Сообщений
    4,572
    Репутация
    717
    Записей в дневнике
    1
    А где у нас Пролог учат?
    Симулянт - несуществующий обьект, который прикидывается существующим

  6. Вверх #6
    Живёт на форуме Аватар для firejump
    Пол
    Мужской
    Сообщений
    3,160
    Репутация
    361
    Цитата Сообщение от Fireball
    А где у нас Пролог учат?
    Наверное Политех

  7. Вверх #7
    Постоялец форума Аватар для Пилигрим
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    31
    Сообщений
    1,215
    Репутация
    134
    Цитата Сообщение от firejump
    Наверное Политех
    МехМат

  8. Вверх #8
    Частый гость Аватар для AmonRa
    Пол
    Мужской
    Адрес
    ...есть город, который я вижу во сне...
    Сообщений
    701
    Репутация
    26
    На ФАВТе точно учат. Только уже ничего не помню, помню, что мне нравилось
    Wild White Water

  9. Вверх #9
    Живёт на форуме Аватар для Fireball
    Пол
    Мужской
    Адрес
    Украина->Одесса
    Возраст
    30
    Сообщений
    4,572
    Репутация
    717
    Записей в дневнике
    1
    Цитата Сообщение от AmonRa
    На ФАВТе точно учат. Только уже ничего не помню, помню, что мне нравилось
    Это радует, надеюсь ко мне на АМ достучится
    Симулянт - несуществующий обьект, который прикидывается существующим

  10. Вверх #10
    Частый гость Аватар для AmonRa
    Пол
    Мужской
    Адрес
    ...есть город, который я вижу во сне...
    Сообщений
    701
    Репутация
    26
    Fireball, не сомневайся. На АМ он будет...
    P.S. АМ-982
    Wild White Water

  11. Вверх #11
    Не покидает форум Аватар для iFog
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    36
    Сообщений
    5,809
    Репутация
    396
    Цитата Сообщение от Fireball
    А где у нас Пролог учат?
    У меня в Холодильнике был семестр.
    Вы хотите поставить нас в тупик своими вопросами?
    Так мы поставим Вас в тупик своими ответами!

  12. Вверх #12
    Цитата Сообщение от AmonRa
    На ФАВТе точно учат. Только уже ничего не помню, помню, что мне нравилось
    Теперь, наверное, не учат. Теперь на фавте даже паскаль не учат(заменили на Java). Хотя может еще и будет за оставшееся время...

  13. Вверх #13
    Постоялец форума Аватар для andriyBog
    Пол
    Мужской
    Адрес
    Одеса, Україна
    Возраст
    36
    Сообщений
    1,695
    Репутация
    1373
    Цитата Сообщение от Falcon
    Теперь, наверное, не учат. Теперь на фавте даже паскаль не учат(заменили на Java). Хотя может еще и будет за оставшееся время...
    Этож очень хорошо в ногу со временем идут, кому нужны эти Пролог, Паскаль
    Сейчас даже С++ программёрам приходится переходить на Java

  14. Вверх #14
    Не покидает форум Аватар для Ull9
    Пол
    Мужской
    Адрес
    Мюнхен
    Сообщений
    18,454
    Репутация
    1112
    Записей в дневнике
    1
    Это пожалуй религиозный спор будет.
    Я вот например скажу что с++ еще долго будет. На нем столько кода уже написано!!
    Вообщем работы много. Переучиватся несоветую.

  15. Вверх #15
    Живёт на форуме Аватар для firejump
    Пол
    Мужской
    Сообщений
    3,160
    Репутация
    361
    Цитата Сообщение от Ull9
    Это пожалуй религиозный спор будет.
    Я вот например скажу что с++ еще долго будет. На нем столько кода уже написано!!
    Вообщем работы много. Переучиватся несоветую.
    Согласен не будем вести религиозные споры. Профессионалу работы всегда хватит с головой.
    Viva La Barca !!! We are the champions :)


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения