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

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

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

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

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

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

unite( name , name, object)

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

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

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

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

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

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

unite( tom , bill, labour )

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

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

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

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

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

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

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

unite( "Петров", tom , project("New system",ibm) ) , unite( "Козлов","Сидоров" , labour ) ,

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

Описание данного отношения на Прологе в виде предиката и определение областей изменения его аргументов будет иметь вид:

domains

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

predicates

unite( name , name, object )

где символ ";" (точка с запятой) эквивалентен логической операции "ИЛИ" и в данном описании использован для того, чтобы показать, что домен object может иметь одну из возможных структур, описанных для него в области domains.

       Задача 1.

  1. Откорректируйте программу 5, включив в нее описание предиката unite и определив его для четырех фраз, приведенных в данном разделе.

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

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

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

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

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

- "Кто является коллегами Тома ?" ( если есть сложности, то вспомните о логической операции дизъюнкции и ее использовании в Прологе).

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

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