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).