- •IV. Версии языка пролог СиПролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда для разработки программ
- •Отладчик
- •Отладочные команды
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения языка
- •Квинтус Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Система программирования на Прологе фирмы Сайлоджик Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Пролог-2 Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Эрити Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Расширения
- •Унсв Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Турбо Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •V. Ответы к упражнениям Ответы к упражнениям
- •Глава 2
- •Глава 3
- •Глава 5
- •Глава 6
- •Глава 7
Директивы
В SKW различаются предикаты программы и предикаты данных. Фразы предикатов программы нельзя добавлять и удалять. Все фразы, загруженные при помощи встроенного предиката "load", по умолчанию являются предикатами программы. Если фразы предиката должны изменяться динамически, то этот предикат следует объявить как "data" (данные). К примеру, нижеследующая директива превратит предикат "текущая сумма/1" в предикат данных:
: -data текущая _сумма/1.
Для обеспечения оптимизации во время компиляции можно при помощи директивы "mode" объявить для аргументов предиката направленность (входной или выходной аргумент) и тип. С помощью директивы "mode" можно также объявить предикат как детерминированный. На» пример, в приводимом ниже правиле "итог" первый аргумент всегда должен быть составным термом, а второй (выходной) аргумент — целым числом:
% +
итог (клиент ( _, Тариф, Дни), Сумма) : -
Сумма is Тариф * Дни.
Следующая директива "mode" сообщает компилятору о роде аргументов предиката "итог":
:—mode итог (+compound, —integer).
Если предикат "итог" должен быть детерминированным (т.е. быть успешным только один раз), то можно информировать об этом компилятор, поставив в директиве "mode" перед именем предиката знак плюс:
:-mode +итог(+compound,-integer).
Директива "mode", описывающая предикат, должна находиться в том же исходном файле, где определяется этот предикат. Она не повлияет на исходный файл, если файл будет просматриваться интерпретатором, а не компилироваться.
Существует и ряд других директив, информирующих компилятор о свойствах предиката. Эта информация используется при оптимизации программы. "Незаписывающий" ("writeless") предикат не содержит обращений к предикатам "assert" и "retract". В "неупорядоченном" ("orderless") предикате не имеет значения порядок следования фраз. Все аргументы предиката, обладающие свойством "без режима" ("modeless") , являются двунаправленными. Во фразах "несокращенного" ("cut-less") предиката отсутствуют предикаты "сократить". Фразы предиката "без ввода-вывода" ("ioless") не содержат предикатов ввода-вывода.
Среда разработки программ
Встроенный предикат "load" ("загрузить") аналогичен предикату "consult" ("просмотреть"). Отличие состоит в том, что предикат "load" может загружать как объектные (т.е. откомпилированные), так и исходные файлы, и откажется загружать фразы, принадлежащие к уже загруженной процедуре. Предикат "reload" ("повторно загрузить") аналогичен предикату "reconsult" ("повторно просмотреть") : для каждой процедуры из файла он отыскивает в текущей программе и удаляет фразы этой процедуры, а затем переносит эту процедуру из файла в программу.
Систему SKW можно запускать как самостоятельный процесс. В этом случае цикл разработки программ будет очень похож на цикл разработки в СиПрологе. Предположим, что программист загрузил исходный файл "a.pl", а затем обнаружил в нем ошибку. Тогда он может воспользоваться нижеследующим составным запросом, чтобы запустить текстовый редактор "поверх" Пролог-процесса, а после окончания сеанса редактирования перезагрузить исправленный файл:
| ?—shell("vi a.pl"), reload ('а. р1').
Систему SKW можно также запустить как подпроцесс под управлением редактора EMACS. В этом случае вся выходная информация, полученная во время сеанса работы с Прологом, заносится в буфер EMACS. Редактор EMACS был доработан, чтобы обеспечивать возможность проведения сеансов работы с Прологом.
Система SKW предоставляет программисту возможность определять ее поведение в случае, когда она встретит неизвестный предикат. По умолчанию при запросе к неизвестному предикату будет включен отладчик.
