Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактикум(1-5)_ПЗ в ИС_2011 .doc
Скачиваний:
27
Добавлен:
19.11.2019
Размер:
1.56 Mб
Скачать

Задание 1. Генеалогическое дерево

Для определения фактов базы знаний необходимо составить генеалогическое дерево и изобразить его на бумаге в виде семантической сети. Пример генеалогического дерева приведен на рис.1.1. Личности, объединяемые генеалогическим деревом, могут быть как реальными (Иван Грозный, Петр I, Николай II, Пушкин А.С., и т.п.), так и виртуальными (родословные гномов и т.п. персонажей). Для проверки правильности составления всех правил родственных отношений дерево должно содержать не менее четырех уровней или, говоря языком предметной области, на дереве должны быть прадедушки (прабабушки) и правнуки (правнучки). Для упрощения задания не рекомендуется (но не возбраняется) вводить в генеалогическое дерево личностей порождающих циклические связи, являющимися, например, одновременно «супругой» и «двоюродной сестрой».

Задание 2. Представление правил

Используя исходные предикаты (в соответствии с вариантом) написать правила для установления родственных связей, таких как:

  • отец, мать, сестра, брат, сын, дочь;

  • двоюродная сестра (кузина), двоюродный брат (кузен), дядя, тетя, племянник, племянница;

  • дедушка, бабушка, прадедушка, прабабушка, внук, внучка, правнук, правнучка.

Дополнительно (для желающих - задания повышенной трудности):

кровные (общий предок), сводные брат и сестра, шурин, деверь, золовка, тесть, теща, зять, невестка.

Для каждого родственного отношения первоначально необходимо записать правило на естественном языке (в виде продукции). Например:

ЕСЛИ есть такой X который является отцом Z

И Z является отцом ИЛИ матерью Y

ТОГДА X является дедом Y.

Затем переписать это же правило на языке Пролог:

grandfather (X,Y) :- father (X,Z), father (Z,Y).

grandfather (X,Y) :- father (X,Z), mother (Z,Y).

Задание 3. Программа на Прологе

Перевести генеалогическое дерево в базу фактов, в соответствии с предикатами, заданными в варианте.

Описать все правила родственных отношений.

Сформулировать запросы для проверки работы программы

Требования к оформлению

Преподавателю на проверку сдается файл Microsoft Word, содержащий следующую информацию:

  1. Титульный лист

  2. Генеалогическое дерево

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

  4. Листинг разработанной базы знаний на языке Пролог

  5. Примеры запросов к базе знаний и ее ответов

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 2.

Структура программы на Прологе. Стандартные предикаты

Структура Пролог-программы

Использование в Пролог-программах только двух секций, т.е. predicates и clauses, является достаточным только для простейших программ, которые не используют описание данных и их структур, не работают с динамическими базами данных. Рассмотрим более подробно назначение каждой из секций программы.

В секции domains объявляются любые нестандартные домены, используемые для аргументов предикатов. Домены в Прологе являются аналогами типов в других языках. Основными стандартными доменами Пролога являются:

char - символ, заключенный в одиночные кавычки (например, 'а');

integer – целое число;

real – вещественное число;

string - последовательность символов, заключенных в двойные кавычки (например, "нажмите ввод");

symbol - либо набор латинских букв, цифр и символов подчеркивания, в котором первый символ - прописная буква (например, n_fax ) ; либо последовательность символов, содержащая пробелы или начинающаяся со строчной буквы, заключенная в кавычки (например, "Список СУБД").

file - символическое имя файла, которое начинается с прописной буквы.

Кроме стандартных доменов пользователь может использовать свои.

Для этого в области объявления доменов можно использовать следующие форматы:

а) ИмяТипаПеременной = СтандартныйДомен.

domains

fio = symbol

year, height = integer

б) ИмяСписка = ИмяТипаПеременной*, где ИмяСписка - область, состоящая из списков элементов типа ИмяТипаПеременной, которая может быть определена пользователем или иметь стандартный тип.

domains

number = integer*

letter = char*

в) ИмяСтруктуры = functor1(d11,…,d1n); functor2(d21,..., d2n) ; ... functorm(dm1,...,dmq) , где ИмяСтруктуры - область, которая состоит из составных объектов, описываемых указанием функтора и областей для всех компонентов. Например,

auto = car(symbol,integer) ,

packing = box(integer, integer, integer)

+ [Error: Reference source not found, стр10]

г) file = name1; name2 ; ... namen используется, когда пользователю необходимо ссылаться на файлы по их символическим именам.

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

domains

name , firm , type = symbol

freq , vol = integer

device = processor(name,freq); disk(firm,vol); monitor(type)

computer = device*

В этом описании домен computer является списком элементов типа device, то есть каждый элемент этого списка может иметь структуру типа либо processor, либо disk, либо monitor, содержащих одну или две компоненты, каждая из которых имеет стандартный символьный или целый тип.

Все структурированные объекты можно представить графически в виде деревьев. Корнем дерева является функтор, а ветвями — компоненты. Если компонент представляет собой структуру, он становится поддеревом этого дерева, которое соответствует всему структурированному объекту.

В секции predicates объявляются предикаты и типы (домены) аргументов этих предикатов. Имена предикатов должны начинаться со строчной латинской буквы, за которой следует последовательность букв, цифр и символов подчеркивания (до 250 знаков). В именах предикатов нельзя использовать символы пробела, минуса, звездочки, обратной (и прямой) черты. Объявление предикатов имеет форму:

predicates

predicateName1 (domen11, domen12,..., domen1m)

predicateNamen (domenn1, domenn2,..., domennk)

Здесь domenij - либо стандартные домены, либо домены, объявленные в секции domains. Объявление домена аргумента и описание типа аргумента - суть одно и то же. Количество доменов (аргументов) предиката определяют арность (размерность) предиката. Предикат может не иметь аргументов и указываться только именем. Обычно выбирается такое имя предиката, чтобы оно отражало определенный вид взаимосвязи между аргументами предиката.

Если предикат один, то он называется однозначным (derministic), а если в базе знаний может быть несколько экземпляров данного предиката, то такой предикат называется неоднозначным (non-derministic), и это необходимо указать в описании предиката.

Пример описания предикатов:

predicates

nondeterm student (string, real)

start /* это однозначный предикат;

determ можно не писать */

nondeterm good_student (string)

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

predicates

nondeterm add(integer,integer,integer)

nondeterm add(real,real,real)

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

В секции clauses размещаются факты и правила, с которыми будет работать - Пролог, пытаясь разрешить цель программы.

Пример фактов, определяющих отношение, заданное предикатом student, может иметь вид:

clauses

student ("Петров", 4.5).

student ("Сидоров",3.75).

Правила содержат утверждения, истинность которых зависит от некоторых условий (подцелей), образующих тело правила. В Прологе правила представляются в виде

Заголовок :- Подцель1 , Подцель2 , ... , ПодцельN .

где обозначение :- читается как "если", а Заголовок имеет такую же форму, как и факт. Тело правила - это список подцелей, разделенных запятыми. Запятая понимается как конъюнкция и читается как "и". Пример записи правила

good_student(Name) :- student(Name , В) , В > 4.

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