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

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

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

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

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

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

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

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

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

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

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

иные знания этой же проблемы. Объединяя в Пролог - программе два знания одной и  той 

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

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

отношением вида:

 

ПОЛНЫЙ_КОЛЛЕГА (ЛИЦ01 , ЛИЦ02 , ПРЕДМЕТ ОБЩЕЙ_ДЕЯTEJIЬHOCTИ), 

которое  на  Прологе  будет  описано  предикатом all_colleague, структура  которого

будет  полностью  аналогична структуре  предиката unite, а  определить его можно в  виде

процедуры, содержащей три декларации предиката all_colleague. 

 

predicates 

all_colleague( name , name, object ) clauses

all_colleague(X,Y,Z) :- colleague(X,Y), Z=labour.

all_colleague(X,Y,Z) :- unite(X,Y,Z).

all_colleague(X,Y.Z) :- unite(Y,X,Z). 

 

С  декларативной  точки  зрения  это  описание  процедуры  полный_коллега  можно 

прочитать так.

 

Для любых двух лиц X и Y и любой общей деятельности Z

X и Y являются  коллегами по общей деятельности Z

ЕСЛИ 

X и Y являются  сослуживцами 

И

общая их деятельность Z - это труд

ИЛИ

X объединяет  с Y общая деятельность Z

ИЛИ

Y объединяет  с X общая деятельность Z

 

Последнее правило  устраняет асимметрию отношения unite no отношению к лицам,

объединенным  общей  деятельностью.  Действительно,  если  Козлов  является  коллегой

Сидорова по работе, то, очевидно, что и Сидоров  является коллегой Козлова по работе. 

 

Задание 2.

1.  Измените  программу,  добавив  в  нее   описание  предиката all_colleague и

процедуру для  его определения.

2.  Определите  состав явных и неявных баз,  используемых в данной программе  и 

опишите их структуру.

3.  Введите   запрос "Кто  является  коллегой  Тома?".  Третье  правило   процедуры 

заключите в /*...*/ и повторите запрос. Объясните, почему разные ответы.

4.  В  чем   заключается  разница  в   выполнении  запросов unite("Petrov",Who,X) и 

all_colleague("Petrov ",Who,Х). Введите еще ряд произвольных  запросов.

5.  Определите, кто является коллегой Козлова и кто - коллега Сидорова.

6.  Все вопросы,  запросы и результаты вывода  привести в отчете по работе. 

 

2.6. Целостность  и непротиворечивость баз данных  и знаний 

При  выполнении  п.5  задания 2 определено,  что  у  Козлова  только один  коллега  -

Сидоров, связанный  с  ним совместным трудом. Вместе с  тем у Сидорова кроме  Козлова 

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

Но  из  этих  двух  посылок  и  наших  представлений  о  понятии  коллеги  любому

человек ясно, что  Козлов  работает в том же отделе, что и  Сидоров. А если это так, то и

имеет он  более  одного  коллеги,  в  отличие  от  ответа  системы.  Т.е.  у  системы  не хватает 

интеллекта на такой вывод.

А  на  запрос work("Kozlov",office) система  вообще  даст  отрицательный  ответ.

Налицо  противоречивость  данных.  Частично  исправить  ситуацию  можно,  если

доопределить  предикат work в виде  

work(Man1,N) :- unite(Man1,Man2,labour), work(Man2,N).

 

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

более точные ответы. Однако в базе work() отсутствуют данные о Козлове в виде фактов,

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

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

первом  приближении - это  уже  прообраз  базы  знаний.  Текст  программы 4 со  всеми 

добавлениями, введенными по ходу работы, имеет вид: 

 

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

domains 

name,firm = symbol

office = integer

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

predicates 

work( name , office )

colleague( name , name )

unite( name , name ,object )

all_colleague( name , name , object )

clauses 

colleague(Man1,Man2) :- work(Man1,X), work( Man2,Y), Man1<>Man2. 

all_colleague(X,Y,Z):- colleague(X,Y), Z=labour.

all_colleague(X,Y,Z) :- unit(X,Y,Z).

all_colleague(X,Y,Z) :- unit(Y,X,Z).

 

unite(tom,bill,labour).

unite("Сидоров","Петров",hobby(sport)).

unite("Петров",tom, project("New system",ibm)

unite("Козлов","Сидоров",labour)

 

work( "Петров" , 101 ).

work( "Павлов" , 211 ).

work( "Сидоров" , 101 ).

work( "Иванов" , 101 ).

work(Man1,N) :- unite(Man1,Man2,labour),

work( Man2,N). 

 

Содержание отчета по работе

Отчет по работе должен содержать:

1. Текст программы с набором фактов, который применяется при запросах.

2. Запросы, сформированные  самостоятельно при изучении  п.2.1 и п.2.2 работы, а 

также результаты их выполнения. 

3. Результаты  выполнения задания 1 и 2 работы. 

4. Результаты  выполнения индивидуального задания. 

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