Программа качественного машинного моделирования
В листинге 20.2 представлена программа качественного машинного моделирования, которая позволяет эксплуатироаать модели QDE в соответствии с подходом, описанным в предыдущем разделе. Подробные сведения об этой реализации приведены ниже.
Листинг 20.2. Программа машинного моделирования, предназначенная для решения качественных дифференциальных уравнений. В этой программе используются обычные предикаты обработки списков member/2 И сопс/3
% Интерпретатор качественных дифференциальных уравнений
:- ор( 100, xfx, ..>. :- ор( 500, xfx, :].
% landmarks! Domain, [ Landl, Land2, ... ]
% Landl, Land2 и т.д. - отметки для области определения Domain; они входят
* в состав определения качественной модели, заданного пользователем
% correspond! Constraint):
% переменная Constraint задает соответствующие значения
% для ограничения некоторого типа
correspond! sum! Doml:zero, Dom2:zero, Dom3:zeroM.
correspond! sum( Doml:L, Don\2 : zero, Doml:L)) !~
qmag I Doml:L), L \ = = zero, not [L = _••_)• % L - это ненулевая отметка
i в области определения Doml
correspond! sum( Doml:zero, Dom2:L, Dom2:U) :-
qmag I Doro2:L), L \ = zero, not [L = _.._) . % L - это ненулевая отметка
% в области определения Dom2
correspond; sum( VI, V2, V3)) :-
correspond! VI, V2, V3) . i Определяемые пользователем соответствующие значения
% Ниже приведено пустое определение отношения correspond/З, которое
% предназначено лишь для предотвращения возникновения ошибки "Неопределенный
* предикат" в некоторых версиях системы Prolog
Correspond! dumny, dummy, dummy) .
% gmag! Domain:QualMagnitude) фпад[ Domain;Qm) :-
landmarks! Domain, Lands) ,
gmag ( Lands, QnO .
gmag( Lands, L) :-
member) L, Lands) ,
L \== minf, L \== inf. % Конечная отметка
Глава 20. Качественные рассуждения
qmag( Lands, L1..L2) :- * Интервал
concl _, [L1,L2 I _ ] , Lands). l Две смежные отметки
% relative_qmag{ Domainl:QM, Domain2:Landmark, Sign):
% переменная Sign - это знак разности между переменными QM и Landmark;
\ если QH < Landmark, го Sign - neg и т.д.
relative_qraag( Domain:Ma..Mb, Domain:Land, Sign) :- !, landmarks[ Domain, Lands),
( compare_lands( Ma, Land, Lands, neg). Sign » neg, ! ;
Sign - pos ) .
rrlative_qmag( Domain:Ml, Domain:M2, Sign) :-landmarks! Domain, Lands) , compare_lands( Ml, M2, Lands, Sign), !.
% qdir( Qdir, Sign) :
% переменная Qdir - это качественное значение направления изменения
% со знаком Sign
qdir[ dec, neg) . gdir( std, zero) . qdir( inc, pos) .
в Законы качественного суммирования
% qsum( Ql, Q2, Q3] :
% Q3 = Ql + Q2 , качественная операция суммирования
% в области определения [pos,zero,neg]
qsum( pos, pos, pos) .
qsum; pos, zero, pos) .
qsumi pos, neg, pos) .
gsuml pos, neg, zero),
qsuml pos, neg, neg) .
qsum( zero, pos, pos) .
qsum< zero, zero, zero) .
qsum( zero, neg, neg) .
qsumj neg, pos, pos) .
gsum{ neg, pos, zero).
qsum( neg, pos, neg) .
qsuml neg, zero, neg) .
qsum< neg, neg, neg) .
% qdirsuml Dl, D2 , D3) :
% качественная операция суммирования обозначений направления изменения
qdirsumt Dl, D2 , D3I :-
qdir[ Dl, Ql) , qdiri D2, Q2) , qdiri D3, Q3) , qsuraf Ql, Q2 , Q3) .
% sum( QV1, QV2, QV3) :
i QVl - QV2 + QV3, качественная операция суммирования качественных значений % в форме Domain:Qmag/Dir. При вызове этого предиката предполагается, что % области определения всех трех параметров конкретизированы
sum! D1:QM1/Dirl, D2;QM2/Dir2, D3:QM3/Dir3) :-
qdirsumf Dirl, Dir2, Dir3), % Направления изменений: Dill + Dir2 = Dir3 qraag( D1:QM1), qmag ( D2:QM2) , qmag ( D3:QM3) ,
% QM1+QM2-QM3 должны Сыть согласованы со всеми соответствующими значениями: not (
Часть II. Применение языка Prolog в области искусственного интеллекта
correspond sum[ D1:V1, D2:V2, D3:V3)),* VI + V2 = V3 relative_qmag( D1;QM1, D1:V1, Signl), relative_qmag( D2:QM2, D2:V2, Sign2}, relative_qmag( D3:QM3,D3:V3, Sign3}, not qsuml Signl,Sign2, Sign3) ).
% inplus (X, Y} :
* переменная Y - монотонно возрастающая функция от- X
raplus( D1:QM1/Dir, D2:QM2/Dir) :- % Равные направления изменения qmag{ D1:QM1) , qmagf D2:QM2) ,
$ переменные QM1, QM2 согласованы со всеми соответствующими значениями $ от D1 до D2 : not ( correspond; D1:V1, D2:V2)r
relative_qmag( D1:QM1, D1:V1, Signl),
relative_qmag( D2:QM2, D2:V2 , Sign2),
Signl \== Sign2 ) .
% derivf Van , Var2) :
% производная по времени переменной varl качественно равна Var2
deriv{ Doml:Qmagl/Dirl,Dom2:Qmag2/Dir2 ) :-qriir( Dirl, Signl) , qmag( Dom2:Qmag2) ,
relative_qmag( Dom2:Qmag2, Dom2:zero, Sign2), % 3ign2 - знак переменной Qmag2 Signl = Sign2.
I transitionf Domain:Qmagl/Dirl, Domain:Craag2/Dir2) :
% предикат, который определяет переход переменных из одного состояния
* в другое в "последовательные" моменты времени
transition! Dom:LI..L2/std, Dom:LI..L2/Dir2) :-qdir( Dir2, AnySign) .
transition! Dom:Ll,.L2/inc, Don:Li..L2/inc).
transition! Dom:LI..L2/inc, Dora:LI.,L2/std) .
transition,- Dom:LI..L2/inc, Dom:L2/inc) :-L2 \== inf.
transition! Dom: LI . . L2/inc, Dom:Ij2/std} :-L2 \== inf.
transition! Dora:LI..L2/dec, Dora:LI..L2/dec; .
transition! Dem:LI,.L2/dec, Dom:LI..L2/std).
transition! Dom:LI.,L2/dec, Dom:LI/decj LI \== minf.
transition,- Dom:Ll..L2/dec, Dom:Ll/std) :-LI \== minf,
transition! Dem:Ll/std, Dom:Ll/std) :-
LI \« A..B. % Переменная LI ке относится к интервалу
transition,- Dom:Ll/std, Dom:LI..L2/inc) :-qmag< Dom:LI..L2) .
transition! Dom;Ll/std, Dom:LO..Li/dec) :-qmag( Dom:L0..LI} .
transition,- Dom:Ll/inc, Dom:LI..L2/inc) :-qpag( Dom:LI..L2) .
Глава 20. Качественные рассуждения
transition! Dom:Ll/dec, Dom:LO..Ll/dec) :-qmag ( Dom;LQ-.LI}.
t system_trans( Statel, State2):
% переход системы из одного состояния в другое; состояние системы - это
% список значений переменный
system_trans ( [] , [ ] ) .
system_trarts< [Vail I Valsl], [Val2 I Vals2]} :-transition! Vail, Val2), system_transl Valsl, Vals2) .
% legal_trans( Statel, State2):
§ переход иэ одного состояния в другое, допустимый в соответствии с моделью
legal^trans( Statel, State2) : -system_ti:ans ! Statel, Scate2 ) ,
Statel \== State2, % Следующее состояние, качественно отличное от предыдущего legalstate{ State2J. % СОСТОЯНИЕ, допустимое в соответствии с моделью
* simulate! SystemStates, MaxLength) :
% переменная SystemStates представляет собой последовательность состояний
i моделируемой системы, не превышающую по длине MaxLength
simulate{ [State], MaxLength) :-
( MaxLength = 1 % Достигнута максимальная длина
not legaltrans{ State, _) % Отсутствует допустимое следующее состояние
1 , ! •
simulate! [Statel,State2 ( Rest], MaxLength) :-MaxLength > 1, NewMaxL is MaxLength - 1, legaltransl Statel, State2), simulate) [State2 IRest], NewMaxL).
% simulate! InitialState, QualBehaviour, MaxLength)
simulate! InitialState, [InitialState I Rest], MaxLength) :-
Iegal3tate( InitialState), % Проверка соответствия модели системы
simulate! [InitialState i Rest], MaxLength).
I compare_lands ( XI, X.2, List, Sign) :
I если переменная XI предшествует переменной Х2 в списке List, то Sign = neg;
% если Х2 предшествует XI, то Sign ™ pos; в ином случае Sign — zero
coTTipare_lands [ XI, Х2 , [First I Rest) , Sign] :-XI = X2 , ! , Sign - zero
XI = First, ! , Sign = neg
X2 = First, ! , Sign = pos
cc;r.pare_lands ( XI, X2, Rest, Sign) .