bazyZnanii2003 (Лабораторные работы по Прологу (задания уточнять у преподавателя)), страница 2
Описание файла
Файл "bazyZnanii2003" внутри архива находится в папке "Лабораторные работы по Прологу (задания уточнять у преподавателя)". Документ из архива "Лабораторные работы по Прологу (задания уточнять у преподавателя)", который расположен в категории "". Всё это находится в предмете "системы искусственного интеллекта" из 7 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "системы искусственного интеллекта" в общих файлах.
Онлайн просмотр документа "bazyZnanii2003"
Текст 2 страницы из документа "bazyZnanii2003"
2. Имя слота также служит уникальным идентификатором, т.е. уникальным именем во фрейме, к которому он принадлежит. Могут вводится специальные идентификаторы, отождествляемые с отношениями ISA, PART OF, причина-следствие и другими. В качестве слота может выступать слот «условие», а его значением может быть продукционное правило. Таким образом реализуется возможность использования продукций для организации вывода.
Основными процессами обработки фреймовых структур являются:
1. создание нового экземпляра фрейма,
2. активизация фрейма,
3. формализация вывода путем последовательного поиска и активизации сети фреймов до нахождения наиболее соответствующего и построения на его основе экземпляра фрейма.
Другой, чрезвычайно перспективный подход создания межфреймовых связей и представления совокупности фреймов в виде сети состоит в представлении перечисленных связей ISA, PART OF, A KIND OF в виде фреймов. Семантика этих связей конкретизирует отношение и может быть детерминирована синтаксисом, а слот конкретизирует адресность связи.
Пример иерархической фреймовой структуры, в которой иллюстрируется наследование свойств фреймов показано на рис. 2.2. Этот пример позволит понять представление фреймовых струтур в Прологе и организацию инструментальных средств обработки фреймов. Таким образом, можно сформировать библиотеку полезных средств работы с фреймами.
mammal | VELUE | DEFAULT |
birth | live | |
skin | fur | |
legs | 4 |
monkey | VELUE | DEFAULT | rabbit | VELUE | DEFAULT | |
ako | live | ako | mammel | |||
tail | curly | ears | long | |||
legs | 2 | moves | jump | |||
tail | short |
gorilla | VELUE | DEFAULT |
ako | monky | mammel |
character | harm | |
age | 8 |
Рис.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» в состоянии «подсказать».
-
Будет ли расти, убывать или останется неизменной процентная ставка прибыли в течение 12-месячного периода.
-
Будет ли увеличиваться или уменьшаться годовой доход за тот же период.
-
Будут ли расходы больше или меньше бюджета.
-
Насколько велик риск пользователя.
Фрейм содержит слоты interest, revenues, expenses, risk, term и investment (рис. 3.).
Результаты обработки информации передаются в помеченные звездочкой слоты. Остальные слоты заполняются пользователем.