В листинге 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 /dec j 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 I Rest], 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).