Сделай Сам Свою Работу на 5

ПРЕДСТАВЛЕНИЕ ЗНАНИЙ С ПОМОЩЬЮ ПРОДУКЦИОННЫХ СИСТЕМ





 

Цель – знакомство с продукционной системой представления знаний.

 

СИСТЕМА ПРОДУКЦИЙ образуется множеством правил продукций. Эти правила формулируют определенные действия при выполнении некоторых заданных условий. В самом простом виде правила продукций близки по смыслу импликации "если-то", поэтому для правил продукций можно принять обозначение

A ® B,

где A - условия применимости, а B - заключение или действие, которое имеет место при истинности A.

Рассмотрим пример продукционной экспертной системы, предназначенной для различения животных. Ниже представлен граф И/ИЛИ для правил вывода этой системы.

 

 

run:-animal_is(X),!,nl,write($Я думаю, что это $),write(X),nl,clr.

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('имеет ','копыта');

it_is('млекопитающее'),

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

 

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



 

ЛАБОРАТОРНАЯ РАБОТА №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 в виде фреймов. Семантика этих связей конкретизирует отношение и может быть детерминирована синтаксисом, а слот конкретизирует адресность связи.

Пример иерархической фреймовой структуры, в которой иллюстрируется наследование свойств фреймов показано на рис. 2.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 monky mammel
character   harm
age  

Рис.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 – удалить фрейм или атрибут фрейма.

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

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

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

get_frame(Frame,Slot,Value),

где: Frame – имя фрейма,.

Slot – имя слота, .

Value – требуемое значение..

Замечание: каждый из аргументов может быть переменной или термом.

Напpимеp, возможен следующий запрос:

?- get_frame(rabbit, X, Y).

Система выдаст все атрибуты фрейма rabbit, и все, наследуемые им от mammal.

add_frame(...), где:

а) аргументы, такие же как и у предиката frame/4,если вводится новый фрейм,

б) если добавляются или изменяются слоты в уже имеющемся фрейме, то первые три аргумента те же, а в последнем – могут стоять параметры только одного слота.

Важное замечание к пункту б):

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

Примеры:

· ввод нового фрейма cat.

?- add(cat,[mammal],[],[painting,[],[gray],skin,[],[fluffy_fur]]).

· изменение слота age существующего фрейма gorilla

?- add(gorilla,[monkey],[mammal],[age,[],[4]]).

/****Удаление фрейма ****/

del_frame(Name, SlotName),

где Name – имя фрейма, .

SlotName – а) имя удаляемого слота, заключенное в скобки: [ ] (удаляется слот).

б) пустой список: [], если удаляется весь фрейм.

Пример:

?- del_frame(rabbit,[]). % удаление фрейма rabbit.

?- del_frame(monkey,[legs]) % удаление слота legs из фрейма monkey.

Создание базы

old:-

assertz(frame(mammal,[],[],[birth,[live],[],skin,[],[fur],

legs,[],[4]])),

assertz(frame(monkey,[mammal],[],[tail,[],[curly],

legs,[2],[]])),

assertz(frame(gorilla,[monkey],[mammal],[character,[],[harm],

age,[8],[]])),

assertz(frame(rabbit,[mammal],[],[ears,[],[long],

moves,[jump],[],tail,[short],[]])).

% new : Удаление из БД предикатов frame/4

new:-

abolish(frame/4).

% add_frame: Добавление нового фрейма в БД с проверкой наличия в базе

add_frame(Name,Val,Def,[SlotName|Rest]):-

not frame(Name,Val,Def,_),

assertz(frame(Name,Val,Def,[SlotName|Rest])),

!.

 

% add_frame : Добавление нового слота в фрейм

% или изменение старого

add_frame(Name,Val,Def,[SlotName|Rest]):-

frame(Name,Val,Def,Slots),

add_item(SlotName,[],Sl),

ifthen(

member(SlotName,Slots),

del_frame(Name,Sl)

),

add([SlotName|Rest],Slots,SLnew),

retract(frame(Name,_,_,_)),

assertz(frame(Name,Val,Def,SLnew)).

 

% del_frame : Удаление фрейма из БД

% a) - Такого фрейма в БД нет

del_frame(Name, Slot):-

not frame(Name,_,_,_),

write('Такого фрейма в системе нет'),

!.

% б) - второй аргумент - [] -пустой список =>

% => удаляется весь фрейм

del_frame(Name, Slot):-

Slot == [],

retract(frame(Name,_,_,_)),!.

% в) - Второй аргумент(имя слота) не пуст =>

% => удаляется слот

del_frame(Name, Slot):-

frame(Name,Val,Def,SlotList),

Sl =.. Slot,

del3( [Sl,_,_], SlotList, Lnew),

retract(frame(Name,_,_,_)),

assertz(frame(Name,Val,Def,Lnew)).

% get_frame : Получить значение из фрейма

% a) имя фрейма – переменная

get_frame(Frame,Slot,Value):-

abolish(req/3),

var(Frame),

frame(Frame,_,_,_),

help_frame(Frame,Slot,Value),

req(_,Slot,Value).

% б) имя фрейма – терм

%

get_frame(Frame,Slot,Value):-

help_frame(Frame,Slot,Value),

req(_,Slot,Value).

/*** help_frame : вспомогательный предикат; реализован***/

% отдельно лишь в силу технической

% особенности Пролога

help_frame(Frame,Slot,Value):-

abolish(req/3),

nonvar(Frame),

frame(Frame,_,_,DataList),

prep_req(Frame,DataList),

legacy(Frame).

/************************************/

% legacy : реализация алгоритма наследования.

% legacy(имя_фpейма) возвращает имя фpейма-pодителя

legacy(no).

legacy(Frame):-

prep_frame(Frame,Value),

ifthenelse(

Value \== no,

body(Value),

!

).

% prep_frame: вспомогательный предикат, возвращает имя

% фpейма-pодителя

% prep_frame(+имя_фpейма, -имя_фpейма-pодителя)

%

prep_frame(Frame,Value):-

frame(Frame,Val,Def,_),

ifthenelse(

Val \== [],

Value =.. Val,

ifthenelse(

Def \== [],

Value =.. Def,

Value =.. [no]

)

).

% body : вспомогательный предикат

body(Value):-

frame(Value,_,_,DataList),

prep_req(Value,DataList),

legacy(Value).

 

% prep_req : Подготовка записей для фрейма:

% вспом.пpедикат, результат действия -

% запись в БД предикатов req/3.

% req(имя_фpейма, имя_слота, значение),

 

prep_req(F,[]).

prep_req(F,[S1,V1,D1|Rest]):-

ifthen(

not req(_,S1,_),

ifthenelse(

V1 \== [],

assertz(req(F,S1,V1)),

ifthen(

D1 \== [],

assertz(req(F,S1,D1))

)

)

),

prep_req(F,Rest).

% member : проверка принадлежности элемента списку:

% member(элемент, список).

member(X,[X|L]):-!.

member(X,[Y|L]):-member(X,L).

% Конкатенация списков :

% add : add(список1, список2, список1+список2)

add([],L,L).

add([X|L1],L2,[X|L3]):-

add(L1,L2,L3).

% Добавление элемента к списку :

% add_item : add_item(элемент,список,элемент+список)

add_item(X,L,[X|L]).

% del3 : Удаление трехэлементного подсписка из списка

% del3(+тpехэл.подсписок, +исх.список, -получ.список)

%

del3([X1,X2,X3], [X1,X2,X3|Rest], Rest ).

del3( [X1,X2,X3], [Y1,Y2,Y3|Rest], [Y1,Y2,Y3|Rest1] ):-

del3( [X1,X2,X3], Rest, Rest1).

 

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


 

ЛАБОРАТОРНАЯ РАБОТА №3

Экспертная система, основанная на фреймовом представлении знаний

Цель – знакомство с фреймовой системой представления знаний.

 

Рассмотрим фрейм-ориентированную систему, которая играет роль советчика в финансовых инвестициях. Этот советчик «Advisor» в состоянии «подсказать».

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

2. Будет ли увеличиваться или уменьшаться годовой доход за тот же период.

3. Будут ли расходы больше или меньше бюджета.

4. Насколько велик риск пользователя.

Фрейм содержит слоты interest, revenues, expenses, risk, term и investment (рис. 3.).

Результаты обработки информации передаются в помеченные звездочкой слоты. Остальные слоты заполняются пользователем.

В Prolog’е фрейм может быть определен как структура, содержащая список слотов. Каждый слот имеет имя и значение, разделенные двоеточием. Обращаются к паре Name:Value как единому аргументу, но разные части аргумента могут быть доступны по необходимости.

fa_frame([interest:Interest,

revenues:Revenues,

expenses:Expenses,

risk:Risk,

term:Term,

investment:Investment]).

(Имя предиката fa_frame образовано из начальных букв finansial advisor.)

Фреймы могут хранить не только фактографическую информацию, как fa_frame, но и информацию о внутренних процедурах–демонах. Демоны могут, например, формулировать вопрос или определять список допустимых значений, которые возможны в слоте. Система использует эту дополнительную информацию, чтобы задать соответствующий вопрос об обновлении информации в слоте или проверке необходимости передачи пользователем информации в конкретный слот. Одна из процедурных связей позволяет задать вопрос в момент ожидания нового значения для слота. Например, когда системе необходимо заполнить значением слот interest, будет задан вопрос: «Какова ожидаемая ставка прибыли в следующем году?» При вводе ответа система проверит на допустимость введенных значений из заданного списка (+, -, unchanged).

Следующие структуры valdef содержат продукционную связь определения допустимых значений для конкретного слота. Например, определение expenses устанавливает два состоятельных значения для этого слота. Знак плюс означает, что расходы превысят бюджет на 10%; знак минус – расходы не превысят бюджет на 10%.

valdef(expenses, 'Exceed budget (by more than 10%)',+).

valdef(expenses, 'Ниже уровня бюджета на 10%',–).

valdef(expenses, 'Не изменится', =).

 

valdef(revenues, 'Превысят ожидания (более 10%)', +).

valdef(revenues, 'Небольшое снижение (более 10%)', –).

valdef(revenues, 'Ia eciaiyony', =).

valdef(interest, 'Рanoao',up).

valdef(interest, 'Не изменится',unchanged).

valdef(interest, 'Снизится',down).

 

valdef(risk,'Низкий',low).

valdef(risk,'средне-низкий',medium-low).

valdef(risk,'средне-высокий',medium-high).

valdef(risk,'высокий',high).

valdef(investment,'Правительственные', gov).

valdef(investment, 'Банков свободной зоны или евродоллары',offshore).

valdef(investment,'Беспроцентные залоговые ценные бумаги',unrated).

valdef(investment,'Облигации банков или корпораций',obligs).

 

valdef(term,'Короткий (1–3 мес)',short).

valdef(term,'Nредний (3–6 мес)',medium).

valdef(term,'Aeeiiue (6–12 мес)',long).

Структура question содержит вопросы, которые ассоциированы с каждым слотом в фрейме.

question(interest,'Какую ставку дохода ожидаете в следующем году?').

question(expenses,'Насколько могут реальные расходы отличаться (отклоняться) от ожидаемых?').

question(revenues,'Насколько могут отличаться (отклоняться) реальные доходы от ожидаемых?')

question(interest,'Каков допустимый риск?').

Сроки капитальных вложений (investment) определяются из значений interest, revenues и expenses. Каждое из следующих правил определяет сроки вложений, которые соответствуют конкретной комбинации вклада, годового дохода и расходов. Правила записаны для фреймов, которые в целом их содержат. Например, рекомендуемый срок вклада – short, если interest down (низкий), если revenue (годовой доход) «–» (минус) и expenses (расходы) “+” или “=”.

 

rule(term:short, [interest:[down], revenues:[–], expenses:[+,=]]).

rule(term:medium, [interest:[down], revenues:[–], expenses:[–]]).

rule(term:medium, [interest:[down], revenues:[=], expenses:[+]]).

rule(term:long, [interest:[down], revenues:[=], expenses:[–,=]]).

rule(term:long, [interest:[down], revenues:[+], expenses:[+,=,–]]).

rule(term:short, [interest:[up], revenues:[+,=,–], expenses:[+,=,–]]).

rule(term:medium, [interest:[unchanged], revenues:[=], expenses:[=,–]]).

rule(term:short, [interest:[unchanged], revenues:[=], expenses:[+]]).

rule(term:long, [interest:[unchanged], revenues:[+], expenses:[=,–]]).

rule(term:medium, [interest:[unchanged], revenues:[+], expenses:[+]]).

 

Слот investment определяется значениями слотов risk и term. Таким образом, если risk – low и term – medium or long, то рекомендуемое вложение –gov. Это правило имеет вид:

 

rule(investment: gov, [risk:[low], term:[medium,long]]).

rule(investment:obligs, [risk:[low], term:[short]]).

rule(investment:obligs, [risk:[low-medium],term:[medium,long]]).

rule(investment:offshore, [risk:[low-medium],term:[short]]).

rule(investment:offshore, [risk:[medium-high],term:[short,medium,long]]).

rule(investment:unrated, [risk:[high],term:[short,medium,long]]).

В системе fa_frame определяется текущее множество условий, которые должны анализироваться.

Структуры valdef и question определяют связанные процедуры для фрейма. Наконец, правила для определения рекомендуемых вложений также представляются фреймами.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.