Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IIS / Лекции / ЛР 2 3 - Prolog задание 2.doc
Скачиваний:
42
Добавлен:
31.03.2015
Размер:
92.16 Кб
Скачать
  1. Явные и неявные базы данных. Правила логического вывода

Рассмотренная выше база данных о местах работы служащих является явной БД, так как она составлена из фактов, аргументы которых константы. Работая даже с такой простой БД, у человека хватает интеллекта установить между имеющимися данными, и совсем иные отношения, кроме работы служащего в конкретном отделе.

Так человеку хватает знаний на то, чтобы назвать двух служащих коллегами, если они работают в одном и том же отделе. Вместе с тем, работая с БД work(...) , для определения коллег Петрова пользователю системы необходимо:

  • определить номер отдела (N), в котором работает Петров:

  • найти всех сотрудников, работающих в отделе с номером N;

  • исключить из полученного списка самого Петрова;

  • сформировать все сочетания Петрова с лицами из полученного списка.

Таким образом у пользователя появляется возможность свои представления о понятии коллега сформировать в виде составного запроса к явной БД и получить ответ на интересующий его вопрос. И такая ситуация будет повторяться при каждом использовании понятия коллега при формировании запросов, таких как "Являются ли Петров и Павлов коллегами?", "Кто коллега Петрова и Сидорова?" и т.д. Ясно, что такая процедура длительна, требует от пользователя системы должной квалификации по составлению составных запросов.

Вместе с тем зги несложные познания по преобразованию отношений и своп представления о понятии коллега пользователь может передать" Пролог-программе, описав свои знания набором декларативных правил.

Для этого можно ввести новое отношение КОЛЛЕГА (СЛУЖАЩИЙ1 , СЛУЖАЩИЙ2), определив его как пару разных служащих, работающих в одном и том же отделе. Новое отношение следует описать в секции predicates двуместным предикатом со структурой, аналогичной отношению КОЛЛЕГА(...).

Аргументы предиката должны принимать значения из области символьных данных. А сам предикат в секции clauses определяется на основании логического правила вывода:

Любые два служащих Служащий1 и Служащий2 являются коллегами

ЕСЛИ существует такой отдел N_отд , что работает Служащий1 в отделе N_omд

И работает Служащий2 в отделе N_omд

И служащие Служащий1 и Служащий2 различны.

Выполнив все необходимые действия по модификации исходной программы, мы получим программу, которая содержит не только факты, но и знания, в виде правил манипулирования этими фактами. Это позволяет к правилам применять все возможные типы запросов, что и к фактам.

Если нас интересуют все коллеги служащего Петрова, то запрос надо задать в виде:

Goal: colleague ("Петров", Who),

а если интересуют общие коллеги и Петрова и Иванова, то запрос будет иметь вид:

Goal: colleague ("Петров",Х), colleague ("Иванов",Х)

и система найдет только один ответ о служащем по фамилии Сидоров, так как именно он работает в одном отделе с Петровым и Ивановым.

/* Программа 5 */

domains

name = string office = integer

predicates

work( name , office )

clauses

colleague(Manl,Man2) :- work(Man1,X) work(Man2,X), Маn1<>Маn2. work( "Петров" , 101 ). work( "Павлов" , 211 ). work( "Сидоров" , 101 ). work( "Иванов" , 101 ).

Из изложенного следует, что если БД work(...) - это явная база данных, так как составлена из фактов, аргументы которых константы, то база colleague(...) - это неявная база данных, поскольку правило для ее формирования определено с использованием переменных, значения которых зависят от подцелей этого правила. С точки зрения пользователя, формирующего запрос, не имеет значения, является база явной или неявной.