Правило, при определении которого используются переменные

Если в приведенном выше определении правила "знает" вместо констант употребить переменные, то это правило станет пригодным для того, чтобы можно было установить, что любые два человека знают друг друга, если они работают в одну и ту же смену:

знает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» обеспечивает перевозки

между городами «ГородА» и «ГородБ».

Запросы к правилу "конкурент"

Нижеследующие запросы дают иллюстрацию того, как можно воспользоваться правилом "конкурент":

|? - конкурент (пиплз, К).

К=амтрак

|? - конкурент (амтрак, ндж_транзит).

нет

Какие результаты можно ожидать от выполнения запроса, приведенного ниже?

|?— конкурент (К, Л).

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие