Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

Редактирование программ на прологе

В большинстве Пролог-систем есть встроенный редактор, позво­ляющий пользователю вносить изменения в программу во время се­анса работы с Прологом. Если такой возможности нет, необходимо выйти из среды Пролога, отредактировать программу и снова вер­нуться в Пролог-систему. Обычно для редактирования файла в Про­логе используется предикат

edit(F),

где F - имя файла.

После того как файл отредактирован, он автоматически повторно вводится в базу данных Пролога для поддержания ее в актуальном состоянии.

Распечатка предикатов

Для того чтобы проверить, какие утверждения входят в програм­му, можно воспользоваться следующими предикатами:

listing

Предикат выводит все утверждения, содержащиеся в базе данных Пролога, в стандартный выходной поток.

listing(C)

Если С - атом, то в стандартном выходном потоке печатаются все процедуры с функтором С. Если С - терм, имеющий функтор F арно­сти А, то печатаются только процедуры с функтором F и арностью А.

В результате выполнения предиката

listing(фред/2)

будет напечатан список всех утверждений, головой которых яв­ляется функтор 'фред', а арность равна двум.

Глава 10 Модули. Пример разработки системы

Создавая систему, мы стремимся скорее завершить работу над ней и в то же время обеспечить достаточную надежность системы и удобство работы с ней пользователя. Достижению этих целей способ­ствует использование модулей, которые поддерживаются в большин­стве реализации Пролога. В первом разделе главы рассматриваются основные идеи применения модулей, общие для разных реализации. Затем следует пример разработки системы, демонстрирующий идеи и понятия, введенные в предшествующих главах.

10.1. Модули

Модуль состоит из последовательности фактов, правил и управ­ляющих команд - директив. Начало модуля Х обозначается module(X), а конец - endmodule(X). Говорят, что процедура в моду­ле Х видима из другого модуля Y, если допускается ее использование в пределах Y. Мы можем контролировать видимость процедуры, экс­портируя ее из модуля.

С каждой экспортируемой процедурой связан список атрибутов. Он содержит атрибут omni, определяющий, что процедура видима из всех модулей, или атрибут visa, ограничивающий видимость проце­дуры: она будет видима только из тех модулей, которые ее импорти­руют. В списке допускается и атрибут sacred, запрещающий измене­ние процедуры из других модулей.

Предикат visa(A,P) экспортирует список процедур Р со списком атрибутов А. а предикат impoct(M,P) импортирует список процедур Р из модуля М.

Пример 10.1.1

Приведем описание модуля, внутри которого определяется про­цедура прямой_факт.

:- module(факт).

:- visa([visa], [факториал]).

факториал(N,V) :- прямой_факт(0,1,N,V),!.

прямой_факт(N,V,N,V).

прямой _факт(NS,VS,N,V) :-

NS1 is NS+ 1,

VS1 is VS*NS1,

прямой _факт(NS1,VS1,N,V).

:- endmodule(факт).

На запрос

?- факториал(5,М).

будет получен ответ

нет

Тогда как при запросе

?- import(факт,[факториал]).

?- факториал(5,М).

будет вычислено значение

М=120

Ответом на запрос

?- прямой факт (0,1,5,Х).

будет

нет

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