Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л-10_13.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
193.54 Кб
Скачать

Числа Фибоначчи:

Пример для версий Visual Prolog 7.2

В этом примере определяются два новых предиката — бинарный fibonacci(N,F) для вычисления N-ого числа Фибоначчи и loop(N) для его вывода на печать. Единожды вычисленные числа не сохраняются для позднейшего использования, поэтому эта реализация неэффективна.

Следует отметить отличие реализаций предикатов от примера для факториала: формулы, описывающие начальные условия, задаются для произвольного значения переменной, но вычисляются до конца только в том случае, если первое правило (N<3 или N=1, соответственно) оценивается как истинное. Кроме того, каждый предикат записан как одна формула, использующая конъюнкцию и дизъюнкцию, а не как набор отдельных формул, использующих только конъюнкцию.

% main.cl

class main

open core

predicates

classInfo : core::classInfo.

fibonacci : (integer N, integer F) procedure (i,o).

loop : (integer N) procedure (i).

predicates

run : core::runnable.

end class main

% main.pro

implement main

open core

constants

className = "main".

classVersion = "".

clauses

classInfo(className, classVersion).

fibonacci(N,F) :-

N < 3, !, F = 1;

fibonacci(N-1,F1), fibonacci(N-2,F2), F = F1 + F2.

loop(N) :-

( N = 1, !, fibonacci(1,F);

loop(N-1), fibonacci(N,F) ),

stdio::write(F, ", ").

clauses

run():-

console::init(),

loop(16),

stdio::write("..."),

programControl::sleep(1000),

succeed().

end implement main

goal

mainExe::run(main::run).

Hello, World!:

Пример для версий B-Prolog 7.4-3, Poplog 15.5 (Prolog), gprolog 1.3.0, swipl 5.6.x

Этот пример не требует загрузки фактов или правил. Запрос выполняется в интерактивном режиме, и его результат выглядит следующим образом:

Hello, World! yes

Первая строка является собственно выводом предиката write, вторая — результат оценивания запроса.

Следует отметить, что замена одинарных кавычек на двойные выводит строку как массив ASCII-кодов отдельных символов:

| ?- write("Hello, World!"). [72,101,108,108,111,44,32,87,111,114,108,100,33]

yes

write('Hello, World!'), nl.

Числа Фибоначчи:

Пример для версий Poplog 15.5 (Prolog)

Простая рекурсивная реализация слишком неэффективна с точки зрения памяти, чтобы успешно выполняться в Poplog, поэтому этот пример демонстрирует более сложную технику — рекурсию с запоминанием. Дополнительный предикат memo(Goal) определяется так, что в первый раз, когда оценивается Goal, результат оценки добавляется в базу фактов, и при следующем запросе не переоценивается, а используется как известный факт.

После этого предикат fib(N,F) определяется рекурсивно, но каждый вызов fib “обернут” в предикат memo, поэтому для каждого значения N fib(N,F) оценивается только один раз. При таком подходе печать вычисленных чисел может производиться сразу после их вычисления, без дополнительного цикла.

% fibonacci.pl

:- dynamic(stored/1).

memo(Goal) :-

stored(Goal) -> true;

Goal, assertz(stored(Goal)).

fib(1,1) :- !, write('1, ').

fib(2,1) :- !, write('1, ').

fib(N,F) :-

N1 is N-1, memo(fib(N1,F1)),

N2 is N-2, memo(fib(N2,F2)),

F is F1 + F2,

write(F), write(', ').

% interactive

[-fibonacci].

fib(16,X), write('...'), nl.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]