Ответ в теме: Вывод числа Фибоначчи меньше заданного

      Комментарии к записи Ответ в теме: Вывод числа Фибоначчи меньше заданного отключены
#1815

Долго не мог понять как вообще работает Ваша функция. Заметил, что первые 2 строки:

fib(0,1,1,1). /* pervoe chislo Fibonacchy ravno 1*/
fib(0,2,1,1). /* vtoroe chislo Fibonacchy ravno 1*/

вообще не нужны (и в них явно ошибка, потому что номер числа — это первый аргумент, что не соответствует комментариям).

Ваша функция ничего не возвращала, а лишь выводила на экран. Поэтому нельзя просто так взять и получить с ее помощью нужно число.

Кроме того, в функции есть неиспользуемый первый аргумент (который номер числа).

Если переписать ее так:

fib(Fib, _, Max, Fib):-
Fib >= Max, !.
fib(Fib1, Fib2, Max, Res):-
Fib3 is Fib1 + Fib2,
fib(Fib2, Fib3, Max, Res).
fibless(Max):-
fib(1, 1, Max, Res), write(Res).

Первые 2 аргумента функции — предыдущие числа Фибоначчи, с их помощью можно рассчитать следующее число.
Первый аргумент больше предела — возвращаем его в качестве результата (записываем в четвертый аргумент).
Так мы получим число, следующее за Max. Если нужно предыдущее — то можно сделать так:

fib(F1, F2, Max, Res):-
F3 is F1 + F2,
(F3 >= Max, !, Res = F2;fib(F2, F3, Max, Res)).
fibless(Max):-
fib(1, 1, Max, Res), write(Res).

Тут проверка того, что достигнут предел выполняется сразу после того, как рассчитано новое число Фибоначчи.

Для Turbo Prolog и Visual Prolog (на котором вы пишите) выглядеть должно примерно так:

fib(F1, F2, Max, F2):-
F3 = F1 + F2,
F3 >= Max, !.
fib(F1, F2, Max, Res):-
F3 = F1 + F2,
fib(F2, F3, Max, Res).
fibless(Max):-
fib(1, 1, Max, Res), write(Res).