MODULE main
DOMAINNAME saturation_balancing
PROBLEMNAME satbal_pb
PROBLEMDOMAIN saturation_balancing
IVAR
action: {inc1,inc2,inc3,dec1,dec2,dec3,nop};
VAR
desired:0..6;
pow1:0..2;
pow2:0..2;
pow3:0..2;
INIT
(pow1=0) & (pow2=0) & (pow3=0) & desired=0
DEFINE
prec_inc1:=(!(pow1 = 2));
prec_inc2:=(!(pow2 = 2));
prec_inc3:=(!(pow3 = 2));
prec_dec1:=(!(pow1 = 0));
prec_dec2:=(!(pow2 = 0));
prec_dec3:=(!(pow3 = 0));
prec_nop:=TRUE;
TRANS
( ((action=inc1 & prec_inc1)
->
((next(pow1)=(pow1 + 1) &
next(desired)=desired &
next(pow2)=pow2 &
next(pow3)=pow3)))
&
(action=inc1 & !prec_inc1 -> FALSE) )
TRANS
( ((action=inc2 & prec_inc2)
->
((next(pow2)=(pow2 + 1) &
next(desired)=desired &
next(pow1)=pow1 &
next(pow3)=pow3)))
&
(action=inc2 & !prec_inc2 -> FALSE) )
TRANS
( ((action=inc3 & prec_inc3)
->
((next(pow3)=(pow3 + 1) &
next(desired)=desired &
next(pow1)=pow1 &
next(pow2)=pow2)))
&
(action=inc3 & !prec_inc3 -> FALSE) )
TRANS
( ((action=dec1 & prec_dec1)
->
((next(pow1)=(pow1 - 1) &
next(desired)=desired &
next(pow2)=pow2 &
next(pow3)=pow3)))
&
(action=dec1 & !prec_dec1 -> FALSE) )
TRANS
( ((action=dec2 & prec_dec2)
->
((next(pow2)=(pow2 - 1) &
next(desired)=desired &
next(pow1)=pow1 &
next(pow3)=pow3)))
&
(action=dec2 & !prec_dec2 -> FALSE) )
TRANS
( ((action=dec3 & prec_dec3)
->
((next(pow3)=(pow3 - 1) &
next(desired)=desired &
next(pow1)=pow1 &
next(pow2)=pow2)))
&
(action=dec3 & !prec_dec3 -> FALSE) )
TRANS
( ((action=nop & prec_nop)
->
((next(desired)=desired &
next(pow1)=pow1 &
next(pow2)=pow2 &
next(pow3)=pow3)))
&
(action=nop & !prec_nop -> FALSE) )
FULL_OBS_CTL_GOAL
AF (6 = (pow1 + pow2 + pow3)) &
AG (!(pow1 > (pow1 + 1))) &
AG (!(pow1 > (pow2 + 1))) &
AG (!(pow1 > (pow3 + 1))) &
AG (!(pow2 > (pow1 + 1))) &
AG (!(pow2 > (pow2 + 1))) &
AG (!(pow2 > (pow3 + 1))) &
AG (!(pow3 > (pow1 + 1))) &
AG (!(pow3 > (pow2 + 1))) &
AG (!(pow3 > (pow3 + 1)))
Other encoding styles are possible, e.g. describing the evolution
of each variable using the ASSIGN and CASE constructs.
For this example, this leads to a more compact representation (and to faster plan construction):
MODULE main
DOMAINNAME saturation_balancing
PROBLEMNAME satbal_pb
PROBLEMDOMAIN saturation_balancing
IVAR
action: {inc1,inc2,inc3,dec1,dec2,dec3,nop};
VAR
desired:0..6;
pow1:0..2;
pow2:0..2;
pow3:0..2;
INIT
(pow1=0) & (pow2=0) & (pow3=0) & desired=0
DEFINE
prec_inc1:=(!(pow1 = 2));
prec_inc2:=(!(pow2 = 2));
prec_inc3:=(!(pow3 = 2));
prec_dec1:=(!(pow1 = 0));
prec_dec2:=(!(pow2 = 0));
prec_dec3:=(!(pow3 = 0));
prec_nop:=TRUE;
ASSIGN next(pow1) :=
case
(action = inc1) & prec_inc1 : pow1 + 1;
(action = dec1) & prec_dec1 : pow1 - 1;
1 : pow1;
esac;
ASSIGN next(pow2) :=
case
(action = inc2) & prec_inc2 : pow2 + 1;
(action = dec2) & prec_dec2 : pow2 - 1;
1 : pow2;
esac;
ASSIGN next(pow3) :=
case
(action = inc3) & prec_inc3 : pow3 + 1;
(action = dec3) & prec_dec3 : pow3 - 1;
1 : pow3;
esac;
FULL_OBS_CTL_GOAL
AF (6 = (pow1 + pow2 + pow3)) &
AG (!(pow1 > (pow1 + 1))) &
AG (!(pow1 > (pow2 + 1))) &
AG (!(pow1 > (pow3 + 1))) &
AG (!(pow2 > (pow1 + 1))) &
AG (!(pow2 > (pow2 + 1))) &
AG (!(pow2 > (pow3 + 1))) &
AG (!(pow3 > (pow1 + 1))) &
AG (!(pow3 > (pow2 + 1))) &
AG (!(pow3 > (pow3 + 1)))