Автор: Пользователь скрыл имя, 29 Марта 2011 в 05:49, лабораторная работа
Цель работы: - знакомство с организацией баз данных как совокупности фактов;
- получение навыков организации явных и неявных баз данных;
- изучение способов построения универсальных запросов к базам;
- знакомство с представлением знаний в виде правил и процедур.
одного эксперта, имеющего свои знания этой проблемы, а вторая - от эксперта, имеющего
иные знания этой же проблемы. Объединяя в Пролог - программе два знания одной и той
же проблемы, получим систему, которая задает больше каждого отдельного эксперта.
Понятие коллеги, удовлетворяющее обеим точкам зрения, может быть описано
отношением вида:
ПОЛНЫЙ_КОЛЛЕГА (ЛИЦ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(
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("Сидоров","Петров",
unite("Петров",tom, project("New system",ibm)
unite("Козлов","Сидоров",
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. Результаты выполнения индивидуального задания.
Информация о работе Пролог - программы как простейшие базы данных и знаний