где: 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),
Ifthen(
Member(SlotName,Slots),
Del_frame(Name,SlotName)
),
Frame(Name,Val,Def,DSlots),
add([SlotName|Rest],DSlots,SLnew),
Retract(frame(Name,_,_,_)),
Assertz(frame(Name,Val,Def,SLnew)).
% del_frame: Удаление фрейма из БД
% a) - Такого фрейма в БД нет
Del_frame(Name, _):-
Not(frame(Name,_,_,_)),
Write('Такого фрейма в системе нет'),
!.
% б) - второй аргумент - [] -пустой список => удаляется весь фрейм
Del_frame(Name, Slot):-
Slot == [],
retract(frame(Name,_,_,_)),!.
% в) - Второй аргумент(имя слота) не пуст => удаляется слот
Del_frame(Name, Slot):-
Frame(Name,Val,Def,SlotList),
del3([Slot,_,_], SlotList, Lnew),
Retract(frame(Name,_,_,_)),
Assert(frame(Name,Val,Def,Lnew)).
% get_frame: Получить значение из фрейма
% a) имя фрейма – переменная
Get_frame(Frame,Slot,Value):-
Retractall(req(_,_,_)),
Var(Frame),
Frame(Frame,_,_,_),
Help_frame(Frame,Slot,Value),
Req(_,Slot,Value).
% б) имя фрейма – терм
Get_frame(Frame,Slot,Value):-