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

Расширения

В Турбо Пролог включены расширения, обеспечивающие экранно-ориентированный ввод-вывод, управление цветом, окнами и звуком, и средства для работы с графопостроителем "черепашка".

Разное

Если во время компиляции в программе отсутствует директива ком­пилятора "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. Правило "конкурент" должно быть симметричным и является таковым. Однако, как и приведенное выше правило "знает", оно должно быть нерефлексивным. Его можно превратить в нерефлексивное правило точно таким же образом, как это было сделано с правилом "знает".

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