Run:- write('Я не знаю такого животного'),nl,clr

Clr:-abolish(bd_positive/2),abolish(bd_negative/2).

Ask(X,Y):-write(X),write(Y),write('? '),read(Rep),nl,

Remember(X,Y,Rep).

Remember(X,Y,yes):-asserta((bd_positive(X,Y))).

Remember(X,Y,no):-asserta((bd_negative(X,Y))),fail.

positive(X,Y):-bd_positive(X,Y),!.

positive(X,Y):-not(negative(X,Y)),!,ask(X,Y).

Negative(X,Y):-bd_negative(X,Y).

Animal_is('гепаpд'):-it_is('млекопитающее'),

It_is('хищник'),

Positive('имеет ','рыжекоричневый_цвет'),

positive('имеет ','темные_пятна'),!.

Animal_is('тигр'):-it_is('млекопитающее'),

It_is('хищник'),

Positive('имеет ','рыжекоричневый_цвет'),

positive('имеет ','черные_полосы'),!.

Animal_is('жираф'):-it_is('копытное'),

Positive('имеет ','длинные_ноги'),

Positive('имеет ','длинную_шею'),

positive('имеет ','темные_пятна'),!.

Animal_is('зебра'):-it_is('копытное'),

positive('имеет ','черные_полосы'),!.

Animal_is('страус'):-it_is('птица'),

Positive('не_умеет ','летать'),

Positive('имеет ','длинные_ноги'),

Positive('имеет ','длинную_шею'),

positive('имеет ','черно-белый_цвет'),!.

Animal_is('пингвин'):-it_is('птица'),

Positive('не_умеет ','летать'),

Positive('умеет ','плавать'),

positive('имеет ','черно-белый_цвет'),!.

animal_is('альбатрос'):-it_is('птица'),it_is('хищник'),!.

Animal_is('воробей'):-it_is('птица').

it_is('млекопитающее'):-positive('имеет ','шеpсть');

positive('может ','давать_молоко'),!.

It_is('птица'):-positive('имеет ','перья'),

Positive('может ','откладывать_яйца'),

!.

it_is('хищник'):-positive('может ','есть_мясо');

(positive('имеет ','острые_зубы'),

Positive('имеет ','когти'),

positive('имеет ','вперед_смотрящие_глаза'));

(positive('имеет ','мощный_клюв')),!.

it_is('копытное'):-it_is('млекопитающее'),(positive('имеет ','копыта'); positive('может ','жевать_жвачку')),!.

ЗАДАНИЕ 5.1

Запустить приведенную программу и задать несколько вопросов для определения животного. При ответах на вопросы программы следует отвечать yes/no. После ответа необходимо ставить точку.

ЗАДАНИЕ 5.2

Выбрать произвольную предметную область и реализовать для неё продукционную систему на языке пролог.

ФРЕЙМЫ

ЦЕЛЬ: знакомство с фреймовой системой представления знаний.

Характеристику объекта можно пред­ставить тройкой (Объект,атрибут_j,значение_j).

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

Объект(атрибут_j,значение_j), j=1,...,m

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

Каждая пара (атрибут, значение) является слотом. Нетрудно заметить, что фрейм содержит различные (наиболее важные) слоты, характеризующие данный объект. Кроме того фрейм содержит как информационные, так и процедурные элементы (демоны), которые обеспечивают преобразование информации внутри фрейма и связи его с другими фреймами. Элементы фрейма – слоты могут быть пустыми и заполняться в процессе активизации фрейма в соответствии с определенными условиями. Таким образом, фреймы представляют собой декларативно–процедурные структуры, т.е. совокупность описаний и (возможно) связанных с ними процедур-демонов, доступ к которым выполняется прямо из фрейма.

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

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

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

Различают: фрейм-образец (прототип) и фрейм-экземпляр (пример).

·Фрейм-прототип (протофрейм) содержит знания, общие для всех частных случаев, т.е. примеров.

·Фрейм-пример (фрейм-экземпляр) содержит знания, отличающие частные случай от общего.

Фрейм представляется в следующем виде:

F=(<I>,< r1 f1 >,< r2 f2>,…,< rn fn>),

где I – имя фрейма, ri -имя слота, fi - значение слота (i = 1,…,n). В качестве имен фреймов могут выступать имена объектов, событий, процессов и т.п. Слотами выступают характерные свойства или атрибуты описываемых объектов с именем I. В качестве значений слотов могут выступать:

·имена других фреймов,

·имена процедур,

·конкретные значения слотов.

1. Имя фрейма – уникальный идентификатор. Для каждого фрейма определен слот ISA– родительский данного фрейма, и слот дочерних фреймов, задаваемых списком имен (указателей). В список слотов включается ряд слотов, необходимых для организации интерфейса с пользователем, для организации внутрисистемных процессов и т.п. В их число входят, например, слоты для определения имени пользователя, даты определения, даты изменения текста, комментарии и т.п.

2. Имя слота также служит уникальным идентификатором, т.е. уникальным именем во фрейме, к которому он принадлежит. Могут вводится специальные идентификаторы, отождествляемые с отношениями ISA, PART OF, причина-следствие и другими. В качестве слота может выступать слот «условие», а его значением может быть продукционное правило. Таким образом реализуется возможность использования продукций для организации вывода.

Основными процессами обработки фреймовых структур являются:

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

2. активизация фрейма,

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

Другой, чрезвычайно перспективный подход создания межфреймовых связей и представления совокупности фреймов в виде сети состоит в представлении перечисленных связей ISA, PART OF, A KIND OF в виде фреймов. Семантика этих связей конкретизирует отношение и может быть детерминирована синтаксисом, а слот конкретизирует адресность связи.

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

mammal VELUE DEFAULT
birth live  
skin   fur
legs    

monkey VELUE DEFAULT   rabbit VELUE DEFAULT
ako live     ako mammel  
tail   curly   ears   long
legs       moves jump  
        tail short  

gorilla VELUE DEFAULT
ako monkey mammel
character   harm
age    

Рис 5.2.

Во фрейме mammal стандартные атрибуты животных: наружный покров (skin) - мех (fur) и живородящий (live). Они наследуются фреймами monkey и rabbit и не имеют таких спецификаций в этих фреймах. Слоты могут иметь значения по умолчанию, которые определены в структуре фрейма; эти значения могут быть изменены в подфреймах. Так, все млекопитающие имеют по умолчанию четыре ноги, но у обезьян их только две.

Структура данных, определенная как фрейм, включает в себя имя предиката frame с четырьмя аргументами: первый – имя фрейма, второй – фрейм-родитель, третий – фpейм-pодитель по умолчанию и последний – список слотов. Формат структуры данных фрейма:

frame(name,[ako_val],[ako_def],

[slot_name1,

[facet_val1],

[facet_def1],

Slot_name2,

[facet_val2],

[facet_def2],

..., ]).

где: slot_name(j) – имя слота,.

facet_val(j) – значение грани VALUE,.

facet_def(j) – значение грани DEFAULT,.

ako_val – имя фpейма-pодителя,.

ako_def – имя фpейма-pодителя по умолчанию.

Напpимеp, фрейм monkey описывается так:

frame(monkey,[mammal],[],[tail,[],[curly],legs,[2],[] ]).

Замечание: все записанные в базу данных предикаты могут быть выведены с помощью предиката

Listing(frame).

Доступ к данным в системе фреймов может быть осуществлен тремя основными предикатами:

get_frame - получить данные о фрейме.

add_frame – добавить или модифицировать фрейм.

del_frame – удалить фрейм или атрибут фрейма.

Для удобства пользователя, эти операции будут применены к структурам, которые очень похожи на записи в базе данных: фрейм ассоциируется с записью базы данных, а слоты в фрейме – с полями в записи.

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

формат предикатов:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: