Пролог - программы как простейшие базы данных и знаний

Автор: Пользователь скрыл имя, 29 Марта 2011 в 05:49, лабораторная работа

Описание работы

Цель работы: - знакомство с организацией баз данных как совокупности фактов;

- получение навыков организации явных и неявных баз данных;

- изучение способов построения универсальных запросов к базам;

- знакомство с представлением знаний в виде правил и процедур.

Работа содержит 1 файл

Самостоятельная работа 2.doc

— 84.00 Кб (Скачать)

она составлена из фактов, аргументы которых константы. Работая с  такой простой БД, у 

человека  хватает  интеллекта  установить  между  имеющимися  данными,  и  совсем  иные

отношения, кроме  работы служащего в конкретном отделе.

Так человеку хватает  знаний на то, чтобы назвать двух служащих коллегами, если

они  работают  в  одном  и  том  же  отделе.  Вместе  с  тем,  работая  с  БД work(...) , для 

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

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

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

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

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

Таким  образом  у  пользователя  появляется  возможность  свои  представления  о 

понятии коллега  сформировать в виде составного запроса  к явной БД и получить ответ  на

интересующий  его  вопрос.  И  такая  ситуация  будет  повторяться при каждом

использовании  понятия  коллега  при  формировании  запросов,  таких  как "Являются  ли

Петров и Павлов коллегами?", "Кто коллега Петрова  и Сидорова?" и т.д. Ясно, что  такая 

процедура  длительна,  требует  от  пользователя  системы  должной  квалификации  по

составлению составных  запросов.

Вместе  с  тем  эти  несложные  познания  по  преобразованию  отношений  и  свои

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

описав свои знания набором декларативных правил.

Для  этого  можно  ввести  новое  отношение  КОЛЛЕГА ( СЛУЖАЩИЙ1 ,

СЛУЖАЩИЙ2), определив  его как пару разных служащих, работающих в одном и том же

отделе. Новое  отношение следует описать в  секции predicates двуместным предикатом со

структурой, аналогичной  отношению КОЛЛЕГА(...). Аргументы  предиката  должны  принимать  значения  из  области  символьных

данных. А сам  предикат в секции clauses определяется на основании логического правила 

вывода:

 

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

ЕСЛИ 

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

И

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

И

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

 

Выполнив  все  необходимые  действия  по  модификации  исходной  программы,

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

манипулирования  этими  фактами.  Это  позволяет  к  правилам применять  все  возможные 

типы запросов, что и к фактам. 

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

 

Goal: colleague ("Petrov", Who), 

 

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

 

Goal: colleague ("Petrov",Х), colleague ("Ivanov",Х) 

 

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

именно он работает в одном отделе с Петровым и  Ивановым. 

 

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

domains 

name = string

office = integer 

predicates 

work( name , office ) 

clauses 

colleague(Manl,Man2) :- work(Man1,X)

work(Man2,X), 

Маn1<>Маn2. 

work( "Petrov" , 101 ). 

work( "Pavlov" , 211 ). 

work( "Sidorov" , 101 ).

work( "Ivanov" , 101 ). 

 

Из  изложенного  следует,  что  если  БД work(...) - это  явная  база  данных,  так  как

составлена из  фактов, аргументы  которых  константы,  то  база colleague(...) - это неявная 

база  данных,  поскольку  правило  для  ее  формирования  определено  с  использованием

переменных,  значения  которых  зависят  от  подцелей  этого  правила.  С  точки  зрения

пользователя,  формирующего  запрос,  не  имеет  значения,  является  база  явной  или 

неявной. 

2.4. Использование  структур в качестве доменов  отношений 

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

другие  объекты.  Причем  сложные  объекты  рассматриваются  и  обрабатываются  так  же,

как и простые. Это упрощает составление программ и организацию баз данных. Ранее  была  сформирована  неявная  база  данных  о  коллегах  на  основе

представлений  о  понятии  коллега.  При  этом,  формулируя  правила  для  представления

этого  понятия,  задано  ограничение  представлением  о  коллегах,  как  о  людях,  которых 

объединяет совместный труд, т.е. как о сослуживцах.

Более  точно  определить  понятие  коллеги  можно,  как  пару  лиц,  объединенных

единой  целью,  интересом,  предметом  деятельности  и  т.д.  При  такой  формулировке

понятия коллеги  можно для его реализации сформировать отношение 

 

ОБЬЕДИНЯЕТ ( ЛИЦ01 , ЛИЦ02 , ПРЕДМЕТ )

 

или в синтаксисе языка Турбо-Пролога 

 

unite( name , name, object)

 

Тогда можно  называть людей коллегами, если:

- объединяет  Тома и Билла работа 

- объединяет  Сидорова и Петрова общее хобби,  которым является спорт  

- объединяет  Петрова и Тома проект по новым системам для IBM

- объединяет  Козлова и Сидорова совместная  трудовая деятельность 

Представление  первого  предложения  в  виде  факта  на  Прологе,  который  будет 

иметь вид 

 

unite( tom , bill, labour )

 

Но если второе предложение записать в аналогичной форме, т.е. 

 

unite( "Sidorov" , "Petrov", sport ) ,

 

то  оно  не  будет  соответствовать  действительности,  так  как  из  него  совсем  не

следует,  что  спорт  является общим  увлечением  двух  лиц,  т.е.  является  их хобби.  Более

того  оно  ложно,  так  как  из  него  можно  заключить,  что  Петров  и  Сидоров 

профессиональные  спортсмены, объединенные общими спортивными  делами. Не верным

будет и решение  в качестве третьего аргумента указать 

 

unite("Sidorov" , "Petrov", "hobby sport" ) ,

 

так  как hobby является некоторым  свойством объекта  совместной деятельности, а 

sport является  конкретным  значением  этого   свойства.  Т.е. hobby - это  атрибут   объекта 

object, а sport - конкретный  экземпляр этого атрибута. При  таком подходе единственный

вариант записи второго предложения будет 

 

unite( " Sidorov " , " Petrov ", hobby(sport) ) ,

 

где hobby(sport) - это  составной  терм  или  структура  Турбо-Пролога.  Тогда  по

аналогии можно  записать пролог - факты для второго и третьего предложений 

 

unite( " Petrov ", tom , project("New system",ibm) ) ,

unite( "Kozlov"," Sidorov " , labour ) , 

 

Таким  образом  можно  сделать  вывод  о  том,  что  во  введенном  для  определения 

понятия  коллеги  отношении unite первые  два  домена  являются  простыми  объектами,  а

третий - это  сложный объект, атрибуты которого сами являются объектами. Описание данного  отношения на Прологе в виде предиката  и определение областей

изменения его  аргументов будет иметь вид: 

 

domains

name.firm = symbol

object = labour ; hobby(name) ; project(name,firm) 

predicates 

unite( name , name, object ) 

 

где  символ ";" (точка  с  запятой)  эквивалентен  логической  операции "ИЛИ"  и  в 

данном  описании  использован  для  того,  чтобы  показать,  что  домен object может  иметь

одну из возможных  структур, описанных для него в  области domains.

 

Задание 1.

1. Откорректируйте   программу 4, включив  в  нее   описание  предиката unite и 

определив его  для четырех фраз, приведенных  в данном разделе.

2. Сформируйте  запросы, соответствующие вопросам:

- "Кого объединяет  совместный труд ?",

- "Есть ли  пара любителей шахмат ?",

- "Кто является  коллегой Тома ?"

- "Для кого  и с кем Петров выполняет  проект ?"

- "Кто является  коллегами Тома ?".

3. Сформулируйте   самостоятельно  еще три составных  запроса к базе и введите   в 

программу.

4. Все вопросы,  соответствующие им запросы и  результаты вывода представить   в 

отчете по работе.

 

2.5. Процедуры  как элемент представления знаний 

Смысл  предложений  Пролог - программ  может  быть  понят  либо  с  позиций

декларативного  подхода,  либо  с  позиций  процедурного  подхода.  Декларативный  смысл 

подчеркивает  статическое  существование  отношений.  Порядок  следования  подцелей  в 

правиле не влияет на декларативный смысл этого правила.

При процедурной  трактовке программы подчеркивается последовательность шагов,

которые  выполняются  при  обработке  запроса.  В  этом  случае,  приобретает  значение

порядок следования подцелей в правиле.

Множество  предложений,  имеющих  одно  и  то  же  имя  предиката  с  одинаковым

количеством  аргументов,  называют  процедурой.  Когда  обрабатывается  запрос  к 

процедуре, то он анализирует фразы, образующие процедуру, в том порядке, как они в  ней 

представлены.  Считается,  что  между  правилами  процедуры  неявно  присутствует

соединитель '"или".

В  предыдущих  разделах  сформировано  два  подхода  к  представлению  знаний  о 

понятии коллега. С одной стороны коллегами  являются сослуживцы, т.е. любая пара лиц,

которые работают вместе, с другой - любая пара лиц, которая объединена объектом общей 

деятельности. Теперь необходимо объединить два знания о  понятии коллега в одно.

Например, одна из формулировок какого-либо понятия (коллега) была получена от

Информация о работе Пролог - программы как простейшие базы данных и знаний