- •Приложение 4-5
- •IV. Версии языка пролог СиПролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда для разработки программ
- •Отладчик
- •Отладочные команды
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения языка
- •Квинтус Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Система программирования на Прологе фирмы Сайлоджик Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Пролог-2 Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •Эрити Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Расширения
- •Унсв Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Директивы
- •Среда разработки программ
- •Отладчик
- •Компилятор
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Турбо Пролог Поставщик
- •Синтаксис и встроенные предикаты
- •Среда разработки программ
- •Отладчик
- •Запомненные состояния
- •Интерфейс с иными языками программирования
- •Расширения
- •V. Ответы к упражнениям Ответы к упражнениям
- •Глава 2
- •Глава 3
- •Глава 5
- •Глава 6
- •Глава 7
Расширения
В Турбо Пролог включены расширения, обеспечивающие экранно-ориентированный ввод-вывод, управление цветом, окнами и звуком, и средства для работы с графопостроителем "черепашка".
Разное
Если во время компиляции в программе отсутствует директива компилятора "trace", то компилятор осуществит оптимизацию остаточной рекурсии в тех рекурсивных процедурах, которые являются детерминированными при вызове рекурсивной подцели.
Из-за принятой в Турбо Прологе строгой типизации ни один из предикатов метауровня ("один раз", найти_или_спросить", "послать", и т.д.) не будет работать так, как это описывалось в книге. Посмотрим, как на Турбо Прологе можно было бы реализовать простейший пример предикатов метауровня - предикат "один_раз" (см. раз д. 3.2). Обычный текст предиката "один_раз" таков:
один_раз (Р) : -
Р, '. .
Прежде всего отметим, что компилятор Турбо Пролога не допускает употребления переменной в качестве подцели. Далее заметим, что все возможные аргументы предиката "один_раз" должны быть указаны в объявлении этого предиката. Пусть программа содержит предикаты "зна-ет/2" и "работает/2". Предположим, что нам нужно, чтобы "один_раз" можно было использовать при выполнении программы совместно с каждым из этих предикатов. Нижеследующая программа соответствует этим требованиям:
domains
лицо = symbol
смена = symbol
запрос = знает (лицо ,лицо) ; работает (лицо, смена)
predicates
знает (лицо, лицо)
работает (лицо, смена)
один_раз (запрос)
clauses
работает (билл, дневная).
работает (нэнси, дневная).
знает (X,Y) :-
работает (X,S),
работает (Y,S),
X<>Y.
один_раз (работает (А, В) ) : —
работает (А, В),! .
один_раз (знает (С, Д)) :-
знает (С, Д), ! .
Должно быть ясно, что данную реализацию предиката "один_раз" нельзя использовать в других целях. Быть может, окажется возможным написать какой-то препроцессор для Турбо Пролога, который будет автоматически преобразовывать общее определение метаязыкового предиката (вроде предиката "один_раз") в совокупность фраз, ориентированных на решение конкретной задачи.
Подход к программированию на языке Пролог, излагаемый в данной книге, требует, чтобы существовала возможность расширения обрабатывающей структуры Пролога за счет написания процедур общего назначения (см. разд. 6.1 и 7.5). Вообще говоря, при работе с Турбо Прологом невозможно пользоваться таким подходом.
V. Ответы к упражнениям Ответы к упражнениям
Гл ав а 1
3.
группа (генри, компиляторы).
группа (нэнси, компиляторы).
группа (сюзан, сети).
знает (ЛицоА, ЛицоБ) : -
группа (ЛицоА, Группа),
группа (ЛицоБ, Группа).
4. Отношение "знает" симметрично и имеет вид один-к-одному. С социальной точки зрения отношение "знает" к тому же и нерефлексивно. Приведенная выше программа, однако, является рефлексивной. Ее можно превратить в нерефлексивную путем добавления еще одной подцели, в которой употребляется встроенный предикат "\ ==" (об этом предикате будет рассказано в гл. 3):
знает (ЛицоА, ЛицоБ) : -
группа (ЛицоА, Группа),
группа (ЛицоБ, Группа),
ЛицоА \ = = ЛицоБ.
5. Вот еще один пример транзитивного отношения:
% Элемент Изделие
входит_в (конденсатор, дисковод).
входит_в(дисковод, компьютер).
входит_в (компьютер, вычислительная_система).
% Изготовитель Изделие
изготавливает (sprague, конденсатор).
изготавливает (atasi, дисковод).
изготавливает (convergent, компьютер).
изготавливает ('AT&T', вычислительная_система).
% Поставщик Пользователь Изделие
поставляет (sprague, atasi, конденсатор).
поставляет (atasi, convergent, дисковод).
поставляет (convergent, 'AT&T', компьютер).
использует_изделия_от (Пользователь, Поставщик, Изделие) :—
поставляет (Поставщик, Пользователь, Изделие).
использует_изделия_от (Пользователь, Поставщик1, Изделие) : —
поставляет (Поставщик2, Пользователь, _),
использует—изделия—от (Поставщик2, Поставщик1, Изделие).
6. Правило "конкурент" должно быть симметричным и является таковым. Однако, как и приведенное выше правило "знает", оно должно быть нерефлексивным. Его можно превратить в нерефлексивное правило точно таким же образом, как это было сделано с правилом "знает".