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

Факториал:

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

Этот пример состоит из двух частей — первую часть кода следует сохранить в файле fact.pl, расположенном в рабочем каталоге Poplog, а вторую — ввести вручную в интерактивном режиме.

[-fact]. загружает базу фактов и правил из этого файла в текущую сессию Poplog (и выводит сообщение fact reconsulted, чтобы обозначить успешность загрузки). Запрос fact(16,X). пытается найти значение X, при котором этот предикат будет оценен как истинный. Вывод, требующийся в примере, будет побочным эффектом оценивания запроса, а основным результатом будет X = 20922789888000 ?. Это означает, что если вы недовольны такой привязкой переменных, вы можете отказаться от нее (введя ; ), и будет продолжен поиск лучшей привязки.

% fact.pl

fact(X, F) :-

( X=0, F=1;

Y is X-1, fact(Y, Z), F is X*Z),

write(X), write('! = '), write(F), nl.

% interactive

[-fact].

fact(16,X).

Квадратное уравнение:

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

Для запуска создайте новый проект с UI Strategy “Console” и замените содержимое файлов main.cl и main.pro приведенным кодом.

В main.cl добавлена одна строка q : () procedure().. Ключевое слово procedure описывает поведение предиката, указывая, что его вычисление всегда будет успешным и будет найдено ровно одно решение, так что откаты не понадобятся.

В main.pro находится собственно определение нового предиката. Предикат q не принимает аргументов, поскольку читает необходимые данные из stdio. Условное оценивание (конструкцияif-then-else) работает точно так же, как в других языках. Единственным отличием является знак отсечения ! перед then. Это означает, что как только условие if выполняется, откат уже не потребуется.

Хитрость этого примера в том, что невозможно сразу вычислить дискриминант, как в других языках. Тип данных по умолчанию для переменной D в присвоении D = B*B-4*A*C -uReal, который может хранить только неотрицательные числа.

% main.cl

class main

open core

predicates

classInfo : core::classInfo.

q : () procedure().

predicates

run : core::runnable.

end class main

% main.pro

implement main

open core

constants

className = "main".

classVersion = "".

clauses

classInfo(className, classVersion).

q() :-

stdio::write("A = "),

A = stdio::read(),

if (A = 0), ! then

stdio::write("Not a quadratic equation."), stdio::nl

else

stdio::write("B = "),

B = stdio::read(),

stdio::write("C = "),

C = stdio::read(),

if (B*B = 4*A*C), ! then

stdio::writef("x = %f", -B/2.0/A)

elseif (B*B > 4*A*C), ! then

D = B*B-4*A*C,

stdio::writef("x1 = %f\n", (-B+math::sqrt(D))/2.0/A),

stdio::writef("x2 = %f", (-B-math::sqrt(D))/2.0/A)

else

D = -B*B+4*A*C,

stdio::writef("x1 = (%f, %f)\n", -B/2.0/A, math::sqrt(D)/2.0/A),

stdio::writef("x2 = (%f, %f)", -B/2.0/A, -math::sqrt(D)/2.0/A)

end if

end if.

clauses

run():-

console::init(),

q(),

succeed().

end implement main

goal

mainExe::run(main::run).

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