Скачиваний:
20
Добавлен:
01.05.2014
Размер:
287.74 Кб
Скачать

Директивы

В SKW различаются предикаты программы и предикаты данных. Фра­зы предикатов программы нельзя добавлять и удалять. Все фразы, за­груженные при помощи встроенного предиката "load", по умолчанию являются предикатами программы. Если фразы предиката должны из­меняться динамически, то этот предикат следует объявить как "data" (данные). К примеру, нижеследующая директива превратит предикат "текущая сумма/1" в предикат данных:

: -data текущая _сумма/1.

Для обеспечения оптимизации во время компиляции можно при по­мощи директивы "mode" объявить для аргументов предиката направлен­ность (входной или выходной аргумент) и тип. С помощью директивы "mode" можно также объявить предикат как детерминированный. На» пример, в приводимом ниже правиле "итог" первый аргумент всегда дол­жен быть составным термом, а второй (выходной) аргумент — целым числом:

% +

итог (клиент ( _, Тариф, Дни), Сумма) : -

Сумма is Тариф * Дни.

Следующая директива "mode" сообщает компилятору о роде аргументов предиката "итог":

:—mode итог (+compound, —integer).

Если предикат "итог" должен быть детерминированным (т.е. быть успеш­ным только один раз), то можно информировать об этом компилятор, поставив в директиве "mode" перед именем предиката знак плюс:

:-mode +итог(+compound,-integer).

Директива "mode", описывающая предикат, должна находиться в том же исходном файле, где определяется этот предикат. Она не повлияет на ис­ходный файл, если файл будет просматриваться интерпретатором, а не компилироваться.

Существует и ряд других директив, информирующих компилятор о свойствах предиката. Эта информация используется при оптимизации программы. "Незаписывающий" ("writeless") предикат не содержит обращений к предикатам "assert" и "retract". В "неупорядоченном" ("orderless") предикате не имеет значения порядок следования фраз. Все аргументы предиката, обладающие свойством "без режима" ("mode­less") , являются двунаправленными. Во фразах "несокращенного" ("cut-less") предиката отсутствуют предикаты "сократить". Фразы предиката "без ввода-вывода" ("ioless") не содержат предикатов ввода-вывода.

Среда разработки программ

Встроенный предикат "load" ("загрузить") аналогичен предикату "consult" ("просмотреть"). Отличие состоит в том, что предикат "load" может загружать как объектные (т.е. откомпилированные), так и исход­ные файлы, и откажется загружать фразы, принадлежащие к уже загружен­ной процедуре. Предикат "reload" ("повторно загрузить") аналогичен предикату "reconsult" ("повторно просмотреть") : для каждой процедуры из файла он отыскивает в текущей программе и удаляет фразы этой про­цедуры, а затем переносит эту процедуру из файла в программу.

Систему SKW можно запускать как самостоятельный процесс. В этом случае цикл разработки программ будет очень похож на цикл разработки в СиПрологе. Предположим, что программист загрузил исходный файл "a.pl", а затем обнаружил в нем ошибку. Тогда он может воспользоваться нижеследующим составным запросом, чтобы запустить текстовый редак­тор "поверх" Пролог-процесса, а после окончания сеанса редактирования перезагрузить исправленный файл:

| ?—shell("vi a.pl"), reload ('а. р1').

Систему SKW можно также запустить как подпроцесс под управле­нием редактора EMACS. В этом случае вся выходная информация, полу­ченная во время сеанса работы с Прологом, заносится в буфер EMACS. Редактор EMACS был доработан, чтобы обеспечивать возможность про­ведения сеансов работы с Прологом.

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

Соседние файлы в папке Гл.6,7,Прилож.,Допол