Help_frame(Frame,Slot,Value)

Req(_,Slot,Value).

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

Help_frame(Frame,_,_):-

Retractall(req(_,_,_)),

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(_,[]).

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|_]):-!.

member(X,[_|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).

ifthen(Cond,Act):-call(Cond),!,call(Act).

Ifthen(_,_).

ifthenelse(Cond,Act1,_):-call(Cond),!,call(Act1).

Ifthenelse(_,_,Act2):-call(Act2).

ЗАДАНИЕ 5.3

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

5.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 образовано из начальных букв f inansial a dvisor.)

Фреймы могут хранить не только фактографическую информацию, как 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',=).


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



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