- •Глава 1 факты и правила
- •1.1. Использование языка пролог
- •Вызов транслятора языка Пролог
- •Синтаксис различных версий Пролога
- •1. 2. Факты Части Пролог-программы
- •Форма записи фактов в Прологе
- •Ввод программы
- •3. Запросы к базе данных Составление запроса
- •Запросы с константами
- •Запросы с переменными
- •Выполнение запроса
- •Составные запросы
- •Переменная _
- •1. 4. Прав ила
- •Форма записи правила: Заголовок:— Тело
- •Правило, при определении которого используются переменные
- •Пример: база данных "путешествие"
- •Косвенные отношения
- •1. 5. Процедуры Декларативная и процедурная семантика
- •Версия программы "можно_путешествовать", состоящая из двух правил
- •Запросы к предикату "можно_путешествовать2"
- •Соединитель "или"
- •Версия предиката "можно_путешествовать", в которой употребляется соединитель;
- •1. 6. Рекурсивные процедуры Определение понятия рекурсии
- •"Предок"
- •Состав рекурсивной процедуры
- •Рекурсивная версия процедуры "можно_путешествовать"
- •Порядок выполнения запроса к процедуре "можно_путешествовать4"
- •1. 7. Типы отношений Характеристики отношений
- •Ограничения вида один-к-одному
- •Ограничения вида один-к-многим
- •Ограничения вида многие-к-одному
- •Ограничения вида многие-к-многим
- •Симметрия
- •Асимметрия
- •Рефлексивность и нерефлексивность
- •Транзитивность
- •Анализ общеупотребительных отношений
- •Библиографические заметки
- •Упражнения
Косвенные отношения
Правило "можно_путешествовать", приводимое далее, устанавливает косвенную связь между двумя городами. Такое косвенное отношение будет соблюдаться в том случае, если возможно путешествие из одного города в другой через третий - промежуточный — город.
можно_путешествовать (ГородА, ГородВ):—
путешествие (_, ГородА, ГородБ, _),
путешествие (_, ГородБ, ГородВ, _).
Изображение отношений
Отношение "можно_путешествовать" для случая городов Нью-Йорк и Портленд можно представить графически, если изобразить каждый аргумент в виде точки, а каждый предикат - в виде стрелки, соединяющей точки. Это показано на рис. 1. 1.
1. 5. Процедуры Декларативная и процедурная семантика
Смысл фразы языка Пролог может быть понят либо с позиций декларативного подхода, либо с позиций процедурного подхода. До сих пор в данной главе обсуждался только декларативный смысл фраз. Декларативный смысл подчеркивает статическое существование отношений. Порядок следования подцелей в правиле не влияет на декларативный смысл этого правила.
Процедурная семантика
При процедурной трактовке Пролог-программы подчеркивается последовательность шагов, которые выполняет интерпретатор при обработке запроса. Таким образом, приобретает значение порядок следования подцелей в правиле. Множество фраз, имеющих одно и то же имя и одинаковое количество аргументов, можно рассматривать как процедуру, при этом запрос (или подцель правила) является вызовом процедуры. Когда интерпретатор обрабатывает запрос к процедуре, то он анализирует фразы, образующие процедуру, в том порядке, как они в ней представлены.
Два смысловых значения правила "можно_путешествовать"
Рассмотрим снова правило "можно_путешествовать", приведенное выше. Декларативная трактовка данного правила может быть такой:
Будет возможным совершить путешествие между
городами « ГородА» и « ГородВ», если
можно добраться из города «ГородА»
в промежуточный пункт « ГородБ»
и
можно добраться из города « ГородБ» в « ГородВ».
Процедурная трактовка этого же правила будет иной:
Для того чтобы найти способ, которым
можно добраться из города «ГородА» в «ГородВ»,
вначале
нужно найти способ передвижения из
города « ГородА» в промежуточный «ГородБ»,
затем
нужно найти способ передвижения из
города «ГородБ» в «ГородВ».
Версия программы "можно_путешествовать", состоящая из двух правил
Можно предложить новую версию программы "можно_путешествовать", состоящую из двух правил. Фраза (1) гласит, что отношение "можно_путешествовать2" будет соблюдаться в том случае, если существует фраза "путешествие", устанавливающая прямую транспортную связь между двумя нужными городами. Фраза (2) совпадает с приведенным ранее правилом "можно_путешествовать".
можно_путешествовать2 (ГородА, ГородВ):— % (1)
путешествие (_, ГородА, ГородВ, _).
можно_путешествовать2 (ГородА, ГородВ):— % (2)
путешествие (_, ГородА, ГородБ, _),
путешествие (_, ГородБ, ГородВ, _).
Считается, что между этими двумя правилами неявно присутствует соединитель "или". С декларативных позиций оба эти правила можно прочесть так:
Путешествие из города «ГородА» в «ГородВ» будет
возможным, если либо
1) существует прямая транспортная связь между этими городами, либо
2) можно совершить путешествие из городе «ГородА» в некоторый промежуточный пункт « ГородБ», а затем добраться из города « ГородБ» в «ГородВ».
Процедурная трактовка данных правил будет иной:
Для того чтобы найти способ добраться из города «ГородА» в «ГородВ», необходимо либо
1) найти прямую транспортную связь между городами, либо
2) найти вид транспорта, связывающий «ГородА» с промежуточным
пунктом « ГородВ», а затем
найти транспортную связь между городами «ГородБ» и «ГородВ».