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

2. Основные конструкции языка prolog Примеры:

Hello, World!:

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

Visual Prolog создает проекты автоматически. Для запуска примера следует создать новый проект, выбрав “Console” в качестве UI Strategy, перейти к редактированию файла main.pro и заменить его содержимое приведенным кодом.

implement main

open core

constants

className = "main".

classVersion = "".

clauses

classInfo(className, classVersion).

clauses

run():-

console::init(),

stdio::write("Hello, World!"),

programControl::sleep(1000),

succeed().

end implement main

goal

mainExe::run(main::run).

Факториал:

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

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

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

В main.pro находится собственно определение нового предиката. Для каждого его вызова есть два возможных соответствия — с нулевым или произвольным первым аргументом. Visual Prolog перебирает формулы в порядке их появления в коде, так что если первый аргумент равен нулю, проверка начинается с первой формулы factorial(0,F). Первое правило формулы — !, так называемое отсечение, использование которого предотвращает откат ко второй формуле и таким образом обеспечивает наличие ровно одного решения предиката. После этого переменная F, содержащая решение предиката, устанавливается в 1 и выводится на печать. Вторая формула factorial(N,F) рекурсивно вычисляет F1 как факториал N-1, устанавливает решение предиката равным N*F1 и выводит его на печать. Наконец, stdio::nl печатает новую строку.

При выполнении основной программы предикат factorial выполняется ровно один раз, для N=12. С каждым вызовом рекурсии N уменьшается на единицу, пока не становится равным нулю. После этого значения факториалов возвращаются и выводятся на печать в порядке возрастания. Программа обрабатывает только факториалы до 12!, т.к. попытка вычисления 13! вызывает ошибку переполнения целочисленного типа.

% main.cl

class main

open core

predicates

classInfo : core::classInfo.

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

predicates

run : core::runnable.

end class main

% main.pro

implement main

open core

constants

className = "main".

classVersion = "".

clauses

classInfo(className, classVersion).

factorial(0,F) :-

!,

F = 1,

stdio::write("0! = 1"),

stdio::nl.

factorial(N,F) :-

factorial(N-1,F1),

F = N*F1,

stdio::write(N, "! = ", F),

stdio::nl.

clauses

run():-

console::init(),

factorial(12,F),

programControl::sleep(1000),

succeed().

end implement main

goal

mainExe::run(main::run).

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