- •Лабораторная работа № 5 Программирование интеллектуальных систем на языке Пролог Пролог-программы как простейшие базы данных и знаний
- •Введение
- •Запросы к базе данных
- •2.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(...) - это неявная база данных, поскольку правило для ее формирования определено с использованием переменных, значения которых зависят от подцелей этого правила. С точки зрения пользователя, формирующего запрос, не имеет значения, является база явной или неявной.