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