First commit

This commit is contained in:
Yorick Barbanneau 2023-03-01 21:40:15 +01:00
commit b7a1213f91
29 changed files with 1312 additions and 0 deletions

16
Alt/Ctrl.alt Normal file
View file

@ -0,0 +1,16 @@
node Ctrl
/* Controller observations
*/
flow rate : [0,2][3];
level : [0,nbSensors];
/* The 27 commands of the controller
* d for dec, i for inc and n for nop
*/
event ddd, ddi, ddn, did, dii, din, dnd, dni, dnn,
idd, idi, idn, iid, iii, iin, ind, ini, inn,
ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn;
trans true |- ddd, ddi, ddn, did, dii, din, dnd, dni, dnn,
idd, idi, idn, iid, iii, iin, ind, ini, inn,
ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn
-> ;
edon

49
Alt/CtrlVV.alt Normal file
View file

@ -0,0 +1,49 @@
node CtrlVV
/* Virtual valves to simulate real valves in order to discover failures
*/
sub V : ValveVirtual[3];
/* Controller observations
*/
flow rate : [0,2][3];
level : [0,nbSensors];
assert V[0].rateReal = rate[0];
V[1].rateReal = rate[1];
V[2].rateReal = rate[2];
/* The 27 commands of the controller
* d for dec, i for inc and n for nop
*/
event ddd, ddi, ddn, did, dii, din, dnd, dni, dnn,
idd, idi, idn, iid, iii, iin, ind, ini, inn,
ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn;
trans true |- ddd, ddi, ddn, did, dii, din, dnd, dni, dnn,
idd, idi, idn, iid, iii, iin, ind, ini, inn,
ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn
-> ;
sync <ddd, V[0].dec, V[1].dec, V[2].dec>;
<ddi, V[0].dec, V[1].dec, V[2].inc>;
<ddn, V[0].dec, V[1].dec>;
<did, V[0].dec, V[1].inc, V[2].dec>;
<dii, V[0].dec, V[1].inc, V[2].inc>;
<din, V[0].dec, V[1].inc>;
<dnd, V[0].dec, V[2].dec>;
<dni, V[0].dec, V[2].inc>;
<dnn, V[0].dec>;
<idd, V[0].inc, V[1].dec, V[2].dec>;
<idi, V[0].inc, V[1].dec, V[2].inc>;
<idn, V[0].inc, V[1].dec>;
<iid, V[0].inc, V[1].inc, V[2].dec>;
<iii, V[0].inc, V[1].inc, V[2].inc>;
<iin, V[0].inc, V[1].inc>;
<ind, V[0].inc, V[2].dec>;
<ini, V[0].inc, V[2].inc>;
<inn, V[0].inc>;
<ndd, V[1].dec, V[2].dec>;
<ndi, V[1].dec, V[2].inc>;
<ndn, V[1].dec>;
<nid, V[1].inc, V[2].dec>;
<nii, V[1].inc, V[2].inc>;
<nin, V[1].inc>;
<nnd, V[2].dec>;
<nni, V[2].inc>;
<nnn>;
edon

25
Alt/GNUmakefile Normal file
View file

@ -0,0 +1,25 @@
TARGET = tank.alt
SOURCE_ALT = Parameters.alt\
Valve.alt\
ValveVirtual.alt\
Tank.alt\
System.alt\
DIFF_ALT =
all: $(TARGET) $(DIFF_ALT)
clean:
rm -f *~
cleandir : clean
rm -f $(TARGET) $(DIFF_ALT) test.alt
$(TARGET) : $(SOURCE_ALT)
rm -f $(TARGET)
for d in $(SOURCE_ALT); do \
cat $$d >> $(TARGET);\
done
$(DIFF_ALT) : $(SOURCE_ALT)

9
Alt/Parameters.alt Normal file
View file

@ -0,0 +1,9 @@
/* nbSensors : the number of sensors
* nbSensors must be greater or equal to 4
*/
const nbSensors = 4;
/* nbFailures : the maximum number if failures (0, 1, 2 or 3)
* nbFailures is use to limit the reachables configurations
*/
const nbFailures = NbPannes;

47
Alt/System.alt Normal file
View file

@ -0,0 +1,47 @@
node SystemNbPannesFNomDuControleur
sub V : Valve[3];
T : Tank;
C : NomDuControleur;
assert T.input = (V[0].rate + V[1].rate);
T.output = V[2].rate;
/* les observations du controleurs */
C.rate[0] = V[0].rate;
C.rate[1] = V[1].rate;
C.rate[2] = V[2].rate;
C.level = T.level;
/* to limit the number of failures */
nbFailures >= (V[0].stucked + V[1].stucked + V[2].stucked);
state ctrl : bool;
init ctrl := true;
event env, cmd;
trans ctrl |- cmd -> ctrl := false;
~ctrl |- env -> ctrl := true;
sync <env, T.time>;
<C.ddd, cmd, V[0].dec, V[1].dec, V[2].dec>;
<C.ddi, cmd, V[0].dec, V[1].dec, V[2].inc>;
<C.ddn, cmd, V[0].dec, V[1].dec>;
<C.did, cmd, V[0].dec, V[1].inc, V[2].dec>;
<C.dii, cmd, V[0].dec, V[1].inc, V[2].inc>;
<C.din, cmd, V[0].dec, V[1].inc>;
<C.dnd, cmd, V[0].dec, V[2].dec>;
<C.dni, cmd, V[0].dec, V[2].inc>;
<C.dnn, cmd, V[0].dec>;
<C.idd, cmd, V[0].inc, V[1].dec, V[2].dec>;
<C.idi, cmd, V[0].inc, V[1].dec, V[2].inc>;
<C.idn, cmd, V[0].inc, V[1].dec>;
<C.iid, cmd, V[0].inc, V[1].inc, V[2].dec>;
<C.iii, cmd, V[0].inc, V[1].inc, V[2].inc>;
<C.iin, cmd, V[0].inc, V[1].inc>;
<C.ind, cmd, V[0].inc, V[2].dec>;
<C.ini, cmd, V[0].inc, V[2].inc>;
<C.inn, cmd, V[0].inc>;
<C.ndd, cmd, V[1].dec, V[2].dec>;
<C.ndi, cmd, V[1].dec, V[2].inc>;
<C.ndn, cmd, V[1].dec>;
<C.nid, cmd, V[1].inc, V[2].dec>;
<C.nii, cmd, V[1].inc, V[2].inc>;
<C.nin, cmd, V[1].inc>;
<C.nnd, cmd, V[2].dec>;
<C.nni, cmd, V[2].inc>;
<C.nnn, cmd>;
edon

16
Alt/Tank.alt Normal file
View file

@ -0,0 +1,16 @@
node Tank
state level : [0,nbSensors] : public;
init level := nbSensors/2;
flow input : [0,4];
output : [0,2];
event time;
trans input>output |- time -> level := level + 1;
input<output |- time -> level := level - 1;
input=output & input=0 |- time -> ;
input=output & input>0 |- time -> level := level - 1;
input=output & input>0 |- time -> ;
input=output & input>0 |- time -> level := level + 1;
/* To avoid deadlocks */
input>output & level=nbSensors |- time -> ;
input<output & level=0 |- time -> ;
edon

15
Alt/Valve.alt Normal file
View file

@ -0,0 +1,15 @@
node Valve
state rate : [0,2] : public;
stucked : [0,1] : public;
init rate := 0;
stucked := 0;
event dec, inc;
trans stucked=0 |- dec -> rate := rate - 1;
stucked=0 |- inc -> rate := rate + 1;
stucked=0 & rate=0 |- dec -> ;
stucked=0 & rate=2 |- inc -> ;
/* a problem may appear */
stucked=0 |- dec, inc -> stucked := 1;
/* After the failure, the valve is stuck */
stucked=1 |- dec, inc -> ;
edon

16
Alt/ValveVirtual.alt Normal file
View file

@ -0,0 +1,16 @@
/* A virtual valse is use by the controller :
* - to simulate a perfect valve
* - to stop the use of a valve when it is stuck
*/
node ValveVirtual
state rate : [0,2] : public;
/* information given via the controller
* rate different from rateReal means that this valve is stuck.
* so there is no need to use it any more
*/
flow rateReal : [0,2];
init rate := 0;
event dec, inc;
trans rate=rateReal |- dec -> rate := rate - 1;
rate=rateReal |- inc -> rate := rate + 1;
edon

9
Controleurs/GNUmakefile Normal file
View file

@ -0,0 +1,9 @@
TARGET =
all: $(TARGET)
clean:
rm -f *.dvi *.log *.aux *.toc *.bbl *.blg *~ *.core
cleandir: clean
rm -f $(TARGET) Ctrl*alt

View file

@ -0,0 +1,9 @@
TARGET =
all: $(TARGET)
clean:
rm -f *.dvi *.log *.aux *.toc *.bbl *.blg *~ *.core
cleandir: clean
rm -f $(TARGET) Ctrl*alt

View file

@ -0,0 +1,10 @@
event
/*
* les priorites dependent des actions sur la vanne aval
* inc > nop > dec
*/
{ddi, dii, dni, idi, iii, ini, ndi, nii, nni} >
{ddn, din, dnn, idn, iin, inn, ndn, nin, nnn};
{ddn, din, dnn, idn, iin, inn, ndn, nin, nnn} >
{ddd, did, dnd, idd, iid, ind, ndd, nid, nnd};
edon

View file

@ -0,0 +1,10 @@
event
/*
* les priorites dependent des actions sur la vanne aval
* inc > nop > dec
*/
{ddi, dii, dni, idi, iii, ini, ndi, nii, nni} >
{ddn, din, dnn, idn, iin, inn, ndn, nin, nnn};
{ddn, din, dnn, idn, iin, inn, ndn, nin, nnn} >
{ddd, did, dnd, idd, iid, ind, ndd, nid, nnd};
edon

68
Ctrl_System.alt Normal file
View file

@ -0,0 +1,68 @@
/*
* This node is the result of the projection of the node 'System'
* on its subnode 'Ctrl'.
*/
node Ctrl_System
flow
r : [0, 2][3];
l : [0, 4];
event
nnn;
nni;
nnd;
nin;
nii;
nid;
ndn;
ndi;
ndd;
inn;
ini;
ind;
iin;
iii;
iid;
idn;
idi;
idd;
dnn;
dni;
dnd;
din;
dii;
did;
ddn;
ddi;
ddd;
/* Existential transitions */
trans
(0<=r[2] and r[2]<=1 and r[0]=0 or (0<=r[2] and r[2]<=1 and 0<=r[1] and r[1]<=1 or r[1]=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and 0<=r[0] and r[0]<=1 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=2) and l=3 |- 'ddd' -> ;
(r[2]=0 and 0<=r[0] and r[0]<=1 or (r[2]=0 and 0<=r[1] and r[1]<=1 or r[2]=1 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and 0<=r[0] and r[0]<=1 or 1<=r[2] and r[2]<=2 and 0<=r[1] and r[1]<=1 and r[0]=2) and l=3 |- 'ddi' -> ;
(r[2]=0 and r[0]=0 or (r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=1 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or r[2]=1 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and 0<=r[0] and r[0]<=1 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=2) and l=3 |- 'ddn' -> ;
((0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=0 or r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (r[1]=0 or r[2]=2 and 1<=r[1] and r[1]<=2) and l=2 or (r[1]=0 or r[2]=2 and r[1]=1) and 0<=r[0] and r[0]<=1 and l=3 |- 'did' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and 1<=r[1] and r[1]<=2) and r[0]=0 or (r[2]=0 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and r[1]=1) and 0<=r[0] and r[0]<=1 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=2) and l=3 |- 'dii' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and 1<=r[1] and r[1]<=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (r[1]=0 or 1<=r[2] and r[2]<=2 and 1<=r[1] and r[1]<=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and 0<=r[0] and r[0]<=1 or r[2]=2 and r[1]=0 and r[0]=2) and l=3 |- 'din' -> ;
((0<=r[2] and r[2]<=1 and 0<=r[1] and r[1]<=1 or r[1]=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and 0<=r[0] and r[0]<=1 or r[2]=2 and r[1]=0 and r[0]=2) and l=3 |- 'dnd' -> ;
((r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=0 or (r[2]=0 and 0<=r[1] and r[1]<=1 or r[1]=2) and r[0]=1 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and r[1]=1) and 0<=r[0] and r[0]<=1 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=2) and l=3 |- 'dni' -> ;
((r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=0 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or r[1]=2) and r[0]=1 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and 0<=r[0] and r[0]<=1 or r[2]=2 and r[1]=0 and r[0]=2) and l=3 |- 'dnn' -> ;
((0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=0 or r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (r[0]=0 or r[2]=2 and 1<=r[0] and r[0]<=2) and l=2 or (0<=r[1] and r[1]<=1 and r[0]=0 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=1) and l=3 |- 'idd' -> ;
((r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=0 or 1<=r[2] and r[2]<=2 and 0<=r[1] and r[1]<=1 and r[0]=1) and l=3 |- 'idi' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and 1<=r[1] and r[1]<=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (r[0]=0 or 1<=r[2] and r[2]<=2 and 1<=r[0] and r[0]<=2) and l=2 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and r[0]=0 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=1) and l=3 |- 'idn' -> ;
(0<=r[0] and r[0]<=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((r[1]=0 or r[2]=2 and 1<=r[1] and r[1]<=2) and r[0]=0 or r[2]=2 and r[1]=0 and 1<=r[0] and r[0]<=2) and l=2 or r[1]=0 and r[0]=0 and l=3 |- 'iid' -> ;
((0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=0 or r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (r[0]=0 or r[1]=0 and 1<=r[0] and r[0]<=2) and l=2 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and r[1]=1) and r[0]=0 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=1) and l=3 |- 'iii' -> ;
((0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=0 or r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and 1<=r[1] and r[1]<=2) and r[0]=0 or 1<=r[2] and r[2]<=2 and r[1]=0 and 1<=r[0] and r[0]<=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and r[0]=0 or r[2]=2 and r[1]=0 and r[0]=1) and l=3 |- 'iin' -> ;
((0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=0 or r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and r[0]=0 or r[2]=2 and 0<=r[1] and r[1]<=1 and 1<=r[0] and r[0]<=2) and l=2 or (r[1]=0 and r[0]=0 or r[2]=2 and r[1]=0 and r[0]=1) and l=3 |- 'ind' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or r[1]=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (r[0]=0 or 0<=r[1] and r[1]<=1 and 1<=r[0] and r[0]<=2) and l=2 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and r[1]=1) and r[0]=0 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=1) and l=3 |- 'ini' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or r[1]=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=0 or 1<=r[2] and r[2]<=2 and 0<=r[1] and r[1]<=1 and 1<=r[0] and r[0]<=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and r[0]=0 or r[2]=2 and r[1]=0 and r[0]=1) and l=3 |- 'inn' -> ;
(0<=r[2] and r[2]<=1 and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (0<=r[0] and r[0]<=1 or r[2]=2 and r[0]=2) and l=2 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and r[0]=0 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=1) and l=3 |- 'ndd' -> ;
(r[2]=0 and r[0]=0 or (r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or l=2 or ((0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=0 or 1<=r[2] and r[2]<=2 and 0<=r[1] and r[1]<=1 and r[0]=1) and l=3 |- 'ndi' -> ;
(r[2]=0 and r[0]=0 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (0<=r[0] and r[0]<=1 or 1<=r[2] and r[2]<=2 and r[0]=2) and l=2 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and r[0]=0 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=1) and l=3 |- 'ndn' -> ;
((0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=0 or r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((r[1]=0 or r[2]=2 and 1<=r[1] and r[1]<=2) and 0<=r[0] and r[0]<=1 or r[2]=2 and r[1]=0 and r[0]=2) and l=2 or (r[1]=0 or r[2]=2 and r[1]=1) and r[0]=0 and l=3 |- 'nid' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and 1<=r[1] and r[1]<=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (0<=r[0] and r[0]<=1 or r[1]=0 and r[0]=2) and l=2 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and r[1]=1) and r[0]=0 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=1) and l=3 |- 'nii' -> ;
((r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and 1<=r[1] and r[1]<=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and 1<=r[1] and r[1]<=2) and 0<=r[0] and r[0]<=1 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and r[0]=0 or r[2]=2 and r[1]=0 and r[0]=1) and l=3 |- 'nin' -> ;
((0<=r[2] and r[2]<=1 and 0<=r[1] and r[1]<=1 or r[1]=2) and r[0]=0 or (0<=r[2] and r[2]<=1 and r[1]=0 or 1<=r[1] and r[1]<=2) and r[0]=1 or (0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((0<=r[1] and r[1]<=1 or r[2]=2 and r[1]=2) and 0<=r[0] and r[0]<=1 or r[2]=2 and 0<=r[1] and r[1]<=1 and r[0]=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and r[0]=0 or r[2]=2 and r[1]=0 and r[0]=1) and l=3 |- 'nnd' -> ;
((r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=0 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or r[1]=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or (0<=r[0] and r[0]<=1 or 0<=r[1] and r[1]<=1 and r[0]=2) and l=2 or ((r[1]=0 or 1<=r[2] and r[2]<=2 and r[1]=1) and r[0]=0 or 1<=r[2] and r[2]<=2 and r[1]=0 and r[0]=1) and l=3 |- 'nni' -> ;
((r[2]=0 and 0<=r[1] and r[1]<=1 or 0<=r[2] and r[2]<=1 and r[1]=2) and r[0]=0 or (r[2]=0 and r[1]=0 or 0<=r[2] and r[2]<=1 and r[1]=1 or r[1]=2) and r[0]=1 or (0<=r[2] and r[2]<=1 and r[1]=0 or r[1]=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2) and l=1 or ((0<=r[1] and r[1]<=1 or 1<=r[2] and r[2]<=2 and r[1]=2) and 0<=r[0] and r[0]<=1 or 1<=r[2] and r[2]<=2 and 0<=r[1] and r[1]<=1 and r[0]=2) and l=2 or ((r[1]=0 or r[2]=2 and r[1]=1) and r[0]=0 or r[2]=2 and r[1]=0 and r[0]=1) and l=3 |- 'nnn' -> ;
/* Universal transitions */
/* no transition */
edon

68
Ctrl_SystemPerfect.alt Normal file
View file

@ -0,0 +1,68 @@
/*
* This node is the result of the projection of the node 'SystemPerfect'
* on its subnode 'Ctrl'.
*/
node Ctrl_SystemPerfect
flow
r : [0, 2][3];
l : [0, 4];
event
nnn;
nni;
nnd;
nin;
nii;
nid;
ndn;
ndi;
ndd;
inn;
ini;
ind;
iin;
iii;
iid;
idn;
idi;
idd;
dnn;
dni;
dnd;
din;
dii;
did;
ddn;
ddi;
ddd;
/* Existential transitions */
trans
((1<=l and l<=3 and 0<=r[2] and r[2]<=1 or 2<=l and l<=3 and r[2]=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=2) and 0<=r[0] and r[0]<=1 or ((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or (l=2 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=2 |- 'ddd' -> ;
(2<=l and l<=3 and 0<=r[1] and r[1]<=1 or (l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=2) and 0<=r[0] and r[0]<=1 or ((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or l=2 and r[1]=2) and r[0]=2 |- 'ddi' -> ;
((1<=l and l<=3 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=2) and 0<=r[0] and r[0]<=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and 0<=r[1] and r[1]<=1 or (l=2 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and r[1]=2) and r[0]=2 |- 'ddn' -> ;
((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 1<=r[1] and r[1]<=2) and 0<=r[0] and r[0]<=1 or (1<=l and l<=2 and r[1]=0 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=1 or (l=1 and r[2]=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=2 |- 'did' -> ;
((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and 1<=r[1] and r[1]<=2) and 0<=r[0] and r[0]<=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or (l=2 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=2 |- 'dii' -> ;
((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and 1<=r[1] and r[1]<=2) and 0<=r[0] and r[0]<=1 or ((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'din' -> ;
((1<=l and l<=3 and 0<=r[2] and r[2]<=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=1 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and 0<=r[0] and r[0]<=1 or ((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or (l=1 and r[2]=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=2 |- 'dnd' -> ;
(2<=l and l<=3 and r[1]=0 or (l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=1 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and 0<=r[0] and r[0]<=1 or ((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or (l=2 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=2 |- 'dni' -> ;
((1<=l and l<=3 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=1 or (l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and r[1]=2) and 0<=r[0] and r[0]<=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=1 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'dnn' -> ;
((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or 1<=l and l<=2 and r[1]=2) and r[0]=0 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[0]=1 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or (l=1 and r[2]=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=2 |- 'idd' -> ;
((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=0 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or 1<=l and l<=2 and r[1]=2) and r[0]=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or (l=2 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=2 |- 'idi' -> ;
((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=2) and r[0]=0 or ((l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=1 or ((l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'idn' -> ;
(1<=l and l<=2 and r[1]=0 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 1<=r[1] and r[1]<=2) and r[0]=0 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=0 or l=1 and 1<=r[1] and r[1]<=2) and r[0]=1 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=0 or l=1 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'iid' -> ;
((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or 1<=l and l<=2 and 1<=r[1] and r[1]<=2) and r[0]=0 or (1<=l and l<=2 and r[1]=0 or l=1 and 1<=r[1] and r[1]<=2) and r[0]=1 or (1<=l and l<=2 and r[1]=0 or l=1 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'iii' -> ;
((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and 1<=r[1] and r[1]<=2) and r[0]=0 or ((l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or l=1 and 1<=r[1] and r[1]<=2) and r[0]=1 or ((l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or l=1 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'iin' -> ;
((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=0 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or l=1 and r[1]=2) and r[0]=1 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'ind' -> ;
((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or 1<=l and l<=2 and r[1]=2) and r[0]=0 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or l=1 and r[1]=2) and r[0]=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'ini' -> ;
((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=1 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=0 or ((l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or l=1 and r[1]=2) and r[0]=1 or ((l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'inn' -> ;
((1<=l and l<=3 and 0<=r[2] and r[2]<=1 or 2<=l and l<=3 and r[2]=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=2) and r[0]=0 or ((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or 1<=l and l<=2 and r[1]=2) and r[0]=1 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or (l=1 and r[2]=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=2 |- 'ndd' -> ;
(2<=l and l<=3 and 0<=r[1] and r[1]<=1 or (l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=0 or ((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or (l=2 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=2 |- 'ndi' -> ;
((1<=l and l<=3 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=2) and r[0]=0 or ((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and 0<=r[1] and r[1]<=1 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=2) and r[0]=1 or ((l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'ndn' -> ;
((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 1<=r[1] and r[1]<=2) and r[0]=0 or (1<=l and l<=2 and r[1]=0 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 1<=r[1] and r[1]<=2) and r[0]=1 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=0 or l=1 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'nid' -> ;
((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and 1<=r[1] and r[1]<=2) and r[0]=0 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or 1<=l and l<=2 and 1<=r[1] and r[1]<=2) and r[0]=1 or (1<=l and l<=2 and r[1]=0 or l=1 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'nii' -> ;
((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and 1<=r[1] and r[1]<=2) and r[0]=0 or ((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and 1<=r[1] and r[1]<=2) and r[0]=1 or ((l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or l=1 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'nin' -> ;
((1<=l and l<=3 and 0<=r[2] and r[2]<=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=1 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=0 or ((1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or (l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and r[1]=2) and r[0]=1 or ((l=1 and 0<=r[2] and r[2]<=1 or 1<=l and l<=2 and r[2]=2) and 0<=r[1] and r[1]<=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'nnd' -> ;
(2<=l and l<=3 and r[1]=0 or (l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=1 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=0 or ((l=2 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or 1<=l and l<=2 and r[1]=2) and r[0]=1 or ((1<=l and l<=2 and r[2]=0 or l=2 and 1<=r[2] and r[2]<=2) and r[1]=0 or 1<=l and l<=2 and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'nni' -> ;
((1<=l and l<=3 and r[2]=0 or 2<=l and l<=3 and 1<=r[2] and r[2]<=2) and r[1]=0 or (1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=1 or (l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and r[1]=2) and r[0]=0 or ((1<=l and l<=2 and r[2]=0 or l=2 and r[2]=1 or 2<=l and l<=3 and r[2]=2) and r[1]=0 or (1<=l and l<=2 and 0<=r[2] and r[2]<=1 or l=2 and r[2]=2) and r[1]=1 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=2) and r[0]=1 or ((l=1 and r[2]=0 or 1<=l and l<=2 and r[2]=1 or l=2 and r[2]=2) and r[1]=0 or (l=1 and r[2]=0 or 1<=l and l<=2 and 1<=r[2] and r[2]<=2) and r[1]=1 or l=1 and 1<=r[2] and r[2]<=2 and r[1]=2) and r[0]=2 |- 'nnn' -> ;
/* Universal transitions */
/* no transition */
edon

198
GNUmakefile Normal file
View file

@ -0,0 +1,198 @@
USER = $(shell whoami)
TEX = pdflatex
MODEL = tank
SOURCE_ALT = Alt/*.alt
SOURCE_SPEC = Spec/*.spe
ARCHIVE_SUJET = FD-2022-2023-M1-CC-sujet.tgz
ARCHIVE_RAPPORT = FD-2022-2023-M1-CC-rapport-$(USER).tgz
ARCHIVE_CORRIGE = FD-2022-2023-M1-CC-corrige.tgz
TARGET_SUJET = sujet.pdf\
$(ARCHIVE_SUJET)\
TARGET_RAPPORT = rapport-$(USER).pdf\
$(ARCHIVE_RAPPORT)\
TARGET_CORRIGE = corrige.pdf\
$(ARCHIVE_CORRIGE)\
TARGET = $(TARGET_SUJET)\
$(TARGET_RAPPORT)\
$(TARGET_CORRIGE)\
SOURCE_TEX = $(MODEL).tex\
sujet.tex\
rapport.tex\
corrige.tex\
SUBDIRS = Alt Spec
SUBDIRS2 = Res Controleurs Graphs LaTeX
SUBDIRS3 = ControleursOpt
SUBDIRS4 = Optimisations
SOURCE_SUJET = $(SUBDIRS)\
Controleurs/GNUmakefile\
ControleursOpt/GNUmakefile\
ControleursOpt/Optimisation.alt\
ControleursOpt/Optimisation-2.alt\
Graphs/GNUmakefile\
LaTeX/GNUmakefile\
Res/GNUmakefile\
$(MODEL).tex\
sujet.tex\
sujet.pdf\
TODO\
rapport.tex\
GNUmakefile\
SOURCE_RAPPORT = $(SUBDIRS)\
$(SUBDIRS2)\
$(SUBDIRS3)\
$(MODEL).tex\
rapport.tex\
rapport-$(USER).pdf\
GNUmakefile\
SOURCE_CORRIGE = $(SUBDIRS)\
$(SUBDIRS4)\
Controleurs/GNUmakefile\
Graphs/GNUmakefile\
LaTeX/GNUmakefile\
Res/GNUmakefile\
$(MODEL).tex\
TODO\
ControleursOpt/GNUmakefile\
ControleursOpt/Optimisation.alt\
corrige.tex\
corrige.pdf\
GNUmakefile\
# pour iterer sur le nombre de pannes
PANNES = 0 1 2 3
# pour iterer sur les controleurs generes
ITERATIONS = 1 2 3 4 5
# contient le controleur original
CONTROLEURS_INIT = Ctrl CtrlVV
# La liste des controleurs que l'on souhaite optimiser est genere automatiquement par la detection de la stabilite
all: sources $(MODEL).time $(TARGET)
clean:
for d in $(SUBDIRS); do \
$(MAKE) -C $$d $@ || exit 1;\
done
for d in $(SUBDIRS2); do \
$(MAKE) -C $$d $@ || exit 1;\
done
rm -f *.dvi *.eps *.log *.aux *.toc *.bbl *.blg *.out *.snm *.nav *~ *.core
cleandir: clean
for d in $(SUBDIRS); do \
$(MAKE) -C $$d $@ || exit 1;\
done
for d in $(SUBDIRS2); do \
$(MAKE) -C $$d $@ || exit 1;\
done
for d in $(SUBDIRS3); do \
$(MAKE) -C $$d $@ || exit 1;\
done
rm -f *.dot *.prop *.res *.results *.validate
rm -f $(TARGET) $(MODEL).time
sources :
for d in $(SUBDIRS); do \
$(MAKE) -C $$d all || exit 1;\
done
$(MODEL).time: $(SOURCE_ALT) $(SOURCE_SPEC)
for c in $(CONTROLEURS_INIT); do \
for p in $(PANNES); do \
cat Alt/Parameters.alt > Alt/tank.alt;\
cat Alt/Valve.alt >> Alt/tank.alt;\
cat Alt/ValveVirtual.alt >> Alt/tank.alt;\
cat Alt/Tank.alt >> Alt/tank.alt;\
cat 'Alt/'$$c'.alt' >> Alt/tank.alt;\
cat Alt/System.alt >> Alt/tank.alt;\
sed -e 's:NbPannes:'$$p':' -e 's:NomDuControleur:'$$c':' Alt/tank.alt > Alt/test.alt;\
sed -e 's:CtrlInitial:'$$c':' -e 's:NbPannes:'$$p':' -e 's:NumIter:1I:' -e 's:NomDuControleur:'$$c':' Spec/System.spe > Spec/test.spe;\
arc -b Alt/test.alt Spec/test.spe 2>> $(MODEL).time;\
echo '\small{\lstinputlisting{Res/System'$$p'F'$$c'.res}}' > 'LaTeX/System'$$p'F'$$c'.tex';\
for d in $(ITERATIONS); do \
cat Alt/Parameters.alt > Alt/tank.alt;\
cat Alt/Valve.alt >> Alt/tank.alt;\
cat Alt/ValveVirtual.alt >> Alt/tank.alt;\
cat Alt/Tank.alt >> Alt/tank.alt;\
cat 'Controleurs/'$$c$$p'F'$$d'I.alt' >> Alt/tank.alt;\
cat Alt/System.alt >> Alt/tank.alt;\
nd=$$(expr $$d + 1);\
pd=$$(expr $$d - 1);\
sed -e 's:NbPannes:'$$p':' -e 's:NomDuControleur:'$$c$$p'F'$$d'I:' Alt/tank.alt > Alt/test.alt;\
sed -e 's:CtrlInitial:'$$c':' -e 's:NbPannes:'$$p':' -e 's:NumIter:'$$nd'I:' -e 's:NomDuControleur:'$$c$$p'F'$$d'I:' Spec/System.spe > Spec/test.spe;\
arc -b Alt/test.alt Spec/test.spe 2>> $(MODEL).time;\
echo '\lstinputlisting{Res/System'$$p'F'$$c$$p'F'$$d'I.res}' >> 'LaTeX/System'$$p'F'$$c'.tex';\
if [ $$d -eq 1 ] ; \
then diff -I "Properties for node" 'Res/System'$$p'F'$$c$$p'F'$$d'I.res' 'Res/System'$$p'F'$$c'.res';\
else diff -I "Properties for node" 'Res/System'$$p'F'$$c$$p'F'$$d'I.res' 'Res/System'$$p'F'$$c$$p'F'$$pd'I.res';\
fi;\
if [ $$? -eq 0 ] ;\
then \
sed -e 's:'$$c$$p'F'$$d'I:'$$c$$p'F'$$d'I_Opt:' -e 's:edon::' 'Controleurs/'$$c$$p'F'$$d'I.alt' > 'ControleursOpt/'$$c$$p'F'$$d'I_Opt.alt';\
cat ControleursOpt/Optimisation.alt >> 'ControleursOpt/'$$c$$p'F'$$d'I_Opt.alt';\
cat Alt/Parameters.alt > Alt/tank.alt;\
cat Alt/Valve.alt >> Alt/tank.alt;\
cat Alt/ValveVirtual.alt >> Alt/tank.alt;\
cat Alt/Tank.alt >> Alt/tank.alt;\
cat 'ControleursOpt/'$$c$$p'F'$$d'I_Opt.alt' >> Alt/tank.alt;\
cat Alt/System.alt >> Alt/tank.alt;\
nd=$$(expr $$d + 1);\
pd=$$(expr $$d - 1);\
sed -e 's:NbPannes:'$$p':' -e 's:NomDuControleur:'$$c$$p'F'$$d'I_Opt:' Alt/tank.alt > Alt/test.alt;\
sed -e 's:CtrlInitial:'$$c':' -e 's:NbPannes:'$$p':' -e 's:NumIter:'$$nd'I_Opt:' -e 's:NomDuControleur:'$$c$$p'F'$$d'I_Opt:' Spec/System.spe > Spec/test.spe;\
sed -e 's:CtrlInitial:'$$c':' -e 's:NbPannes:'$$p':' -e 's:NumIter:'$$nd'I_Opt:' -e 's:NomDuControleur:'$$c$$p'F'$$d'I_Opt:' Spec/Graphs.spe >> Spec/test.spe;\
arc -b Alt/test.alt Spec/test.spe 2>> $(MODEL).time;\
echo '\fbox{\small{\lstinputlisting{Res/System'$$p'F'$$c$$p'F'$$d'I_opt.res}}}' > 'LaTeX/System'$$p'F'$$c'_opt.tex';\
break ;\
fi;\
done;\
done;\
done;
for d in $(SUBDIRS2); do \
$(MAKE) -C $$d || exit 1;\
done
uname -mps > $(MODEL).time
sujet.pdf: sujet.tex tank.tex
rapport.pdf: rapport.tex $(MODEL).time
rapport-$(USER).pdf: rapport.pdf
ln -f rapport.pdf rapport-$(USER).pdf
corrige.pdf: corrige.tex $(MODEL).time
$(ARCHIVE_SUJET): $(SOURCE_SUJET)
tar -czf $(ARCHIVE_SUJET) $(SOURCE_SUJET)
$(ARCHIVE_RAPPORT): $(SOURCE_RAPPORT)
tar -czf $(ARCHIVE_RAPPORT) $(SOURCE_RAPPORT)
$(ARCHIVE_CORRIGE): $(SOURCE_CORRIGE)
tar -czf $(ARCHIVE_CORRIGE) $(SOURCE_CORRIGE)
.SUFFIXES: .pdf .tex
.tex.pdf:
$(TEX) $*.tex && $(TEX) $*.tex

16
Graphs/GNUmakefile Normal file
View file

@ -0,0 +1,16 @@
SRC = $(wildcard *.dot)
TARGET = $(SRC:.dot=.pdf)
all: $(TARGET)
clean:
rm -f *~ *.core
cleandir: clean
rm -f $(TARGET) $(SRC)
.SUFFIXES: .dot .pdf
.dot.pdf: $*.dot
dot -Tpdf $*.dot -o $*.pdf

9
LaTeX/GNUmakefile Normal file
View file

@ -0,0 +1,9 @@
TARGET =
all: $(TARGET)
clean:
rm -f *.dvi *.log *.aux *.toc *.bbl *.blg *~ *.core
cleandir: clean
rm -f $(TARGET) *.tex

13
Res/GNUmakefile Normal file
View file

@ -0,0 +1,13 @@
TARGET =
ITER1 = 1 2 3
ITER2 = 4 5 6
all: $(TARGET)
clean:
rm -f *.dvi *.log *.aux *.toc *.bbl *.blg *~ *.core
cleandir: clean
rm -f $(TARGET) *.res

23
Spec/GNUmakefile Normal file
View file

@ -0,0 +1,23 @@
TARGET = tank.spe
SOURCE_SPE = System.spe
DIFF_SPE =
all: $(TARGET) $(DIFF_SPE)
clean:
rm -f *~
cleandir : clean
rm -f $(TARGET) $(DIFF_SPE) test.spe
$(TARGET) : $(SOURCE_SPE)
rm -f $(TARGET)
for d in $(SOURCE_SPE); do \
cat $$d >> $(TARGET);\
done
$(DIFF_SPE) : $(SOURCE_SPE)

8
Spec/Graphs.spe Normal file
View file

@ -0,0 +1,8 @@
with Valve, ValveVirtual do
dot(any_s, any_t - self_epsilon) > 'Graphs/$NODENAME.dot';
modes() > 'Graphs/$NODENAME-modes.dot';
quot() > 'Graphs/$NODENAME-quot.dot';
done
with SystemNbPannesFNomDuControleur do
dot(any_s, any_t - self_epsilon) > 'Graphs/$NODENAME.dot';
done

40
Spec/System-2.spe Normal file
View file

@ -0,0 +1,40 @@
with SystemNbPannesFNomDuControleur do
deadlock := any_s - src(any_t - self_epsilon);
notResettable := any_s -coreach(initial,any_t);
/* output */
out0 := any_s & [V[2].rate=0];
out1 := any_s & [V[2].rate=1];
out2 := any_s & [V[2].rate=2];
dec21 := any_t & label V[2].dec & rsrc(out2);
dec10 := any_t & label V[2].dec & rsrc(out1);
/* Niveaux critiques et Situations redoutees */
NC := any_s & [T.level=0 | T.level=nbSensors];
SR := deadlock | NC;
EPerdu := any_s - SR;
CGagne := any_s - SR;
/* systeme d'equation au point fixe
* CGagnant = CGagne & src(CCoupGagnant)
* CCoupGagnant = CCoup & rtgt(EPerdant)
* EPerdant = EPerdu & (src(ECoupPerdant) - src(ECoupNonPerdant))
* ECoupPerdant = ECoup & rtgt(CGgagnant)
* ECoupNonPerdant = ECoup & rtgt(any_s - CGagnant)
*/
CCoup := any_t & label cmd;
ECoup := any_t & label env;
CCoupGagnant -= CCoup & rtgt(EPerdu & (src(ECoup & rtgt(CGagne & src(CCoupGagnant))) - src(ECoup & rtgt(any_s - (CGagne & src(CCoupGagnant))))));
/* Controller projection */
/* Syntax and semantic of the "project" command
* param 1 : les configurations projetees
* param 2 : les transitions projetees
* - arg1 : projection existentielle
* - arg2 : projection universelle
* param 3 : nom du noeud AltaRica genere
* param 4 : simplification ou non des expressions booleennes
* param 5 (optionel) : noeud de la hierarchie servant a la projection
*/
/* Universal projection is use */
project(any_s, (empty_t,CCoupGagnant), 'CtrlInitialNbPannesFNumIter', true,C)
> 'Controleurs/CtrlInitialNbPannesFNumIter.alt';
/* record results */
show(any_s, any_t, deadlock, NC, SR , out0, out1, out2, dec21, dec10, CCoupGagnant) > 'Res/$NODENAME.res';
done

40
Spec/System.spe Normal file
View file

@ -0,0 +1,40 @@
with SystemNbPannesFNomDuControleur do
deadlock := any_s - src(any_t - self_epsilon);
notResettable := any_s -coreach(initial,any_t);
/* output */
out0 := any_s & [V[2].rate=0];
out1 := any_s & [V[2].rate=1];
out2 := any_s & [V[2].rate=2];
dec21 := any_t & label V[2].dec & rsrc(out2);
dec10 := any_t & label V[2].dec & rsrc(out1);
/* Niveaux critiques et Situations redoutees */
NC := any_s & [T.level=0 | T.level=nbSensors];
SR := deadlock | NC;
EPerdu := any_s - SR;
CGagne := any_s - SR;
/* systeme d'equation au point fixe
* CGagnant = CGagne & src(CCoupGagnant)
* CCoupGagnant = CCoup & rtgt(EPerdant)
* EPerdant = EPerdu & (src(ECoupPerdant) - src(ECoupNonPerdant))
* ECoupPerdant = ECoup & rtgt(CGgagnant)
* ECoupNonPerdant = ECoup & rtgt(any_s - CGagnant)
*/
CCoup := any_t & label cmd;
ECoup := any_t & label env;
CCoupGagnant -= CCoup & rtgt(EPerdu & (src(ECoup & rtgt(CGagne & src(CCoupGagnant))) - src(ECoup & rtgt(any_s - (CGagne & src(CCoupGagnant))))));
/* Controller projection */
/* Syntax and semantic of the "project" command
* param 1 : les configurations projetees
* param 2 : les transitions projetees
* - arg1 : projection existentielle
* - arg2 : projection universelle
* param 3 : nom du noeud AltaRica genere
* param 4 : simplification ou non des expressions booleennes
* param 5 (optionel) : noeud de la hierarchie servant a la projection
*/
/* Universal projection is use */
project(any_s, (empty_t,CCoupGagnant), 'CtrlInitialNbPannesFNumIter', true,C)
> 'Controleurs/CtrlInitialNbPannesFNumIter.alt';
/* record results */
show(any_s, any_t, deadlock, NC, SR , out0, out1, out2, dec21, dec10, CCoupGagnant) > 'Res/$NODENAME.res';
done

29
TODO Normal file
View file

@ -0,0 +1,29 @@
L'archive du sujet contient :
0/ Les sources latex du cahier des charges, du sujet et d'un squelette de rapport.
1/ Le pdf du sujet du projet.
2/ Ce ficher TODO
3/ Des sources AltaRica dans le répertoire Alt
4/ Un fichier System.spe de spécification pour le calcul des controleurs dans le répertoire Spec
Pour votre étude, vous pouvez utiliser au choix les commandes :
$> make
$> altarica-studio <liste de fichiers>
$> arc -b <liste de fichiers>
L'option "-b" signifie "-batch" et vous redonne "la main" aussitôt les calculs terminés.
Si vous utiliser "make" (ce qui est conseillé) les controleurs générés et les résultats seront mis dans les répertoires :
- Controleurs : pour les fichiers AltaRica générés.
- ControleursOpt : pour les fichiers AltaRica générés et optimisés.
- Res : pour les propriétés.
et des fichiers suivants seront générés.
- rapport.pdf
- rapport"login".pdf
- FD-2022-2023-M1-CC-rapport.tgz
Pour le rapport, vous devez compléter le fichier "rapport.tex", les questions sont indiquées en commentaires.
Le fichier à transmettre par mail est le suivant : FD-2022-2023-M1-CC-rapport.tgz

92
projet.alt Normal file
View file

@ -0,0 +1,92 @@
// node vanne
// state debit : [0,2];
// init debit := 0;
// event inc, dec;
// trans
// debit < 2 |- inc -> debit := debit + 1;
// debit > 0 |- dec -> debit := debit - 1;
// edon
node Vanne
state debit : [0,2];
state panne : bool;
init debit := 0;
init panne := false;
event inc, dec, estEnPanne, estRepare;
trans
~panne |- inc -> debit := debit + 1;
~panne |- dec -> debit := debit - 1;
// La panne est une transition comme les autres
// elle intervien de maniere non deterministe
// comme le Zabbix
~panne |- inc -> panne := true;
~panne |- dec -> panne := true;
panne |- inc -> ;
panne |- dec -> ;
debit = 0 |- dec ->;
debit = 2 |- inc ->;
edon
node Cuve
state niveau : [0,4];
flow
amont: [0,4];
aval: [0,2];
init niveau := 2;
event time;
trans
// On modelise exactement ce qui est dit dans l'énoncé
amont > aval |- time -> niveau := niveau + 1;
amont < aval |- time -> niveau := niveau - 1;
amont = aval & amont = 0 |- time ->;
amont = aval & amont = 0 |- time -> niveau := niveau + 1;
amont = aval & amont = 0 |- time -> niveau := niveau - 1;
amont = aval & amont = 0 |- time ->;
edon
node Controlleur
edon
node Systeme
sub
// Valves amont
Am: Vanne[2];
//Valve Aval
Av: Vanne;
C: Cuve;
Ctrl: Controlleur;
assert
C.amont = (Am[0].debit + Am[1].debit);
C.aval = Av.debit;
sync
// d decremente, i incrémente, n nop
<ddd, V[0].dec, V[1].dec, V[2].dec>;
<ddi, V[0].dec, V[1].dec, V[2].inc>;
<did, V[0].dec, V[1].inc, V[2].dec>;
<idd, V[0].inc, V[1].dec, V[2].dec>;
<iid, V[0].inc, V[1].inc, V[2].dec>;
<dii, V[0].dec, V[1].inc, V[2].inc>;
<idi, V[0].inc, V[1].dec, V[2].inc>;
<iii, V[0].inc, V[1].inc, V[2].inc>;
<nii, V[1].inc, V[2].inc>;
<ini, V[0].inc, V[2].inc>;
<iin, V[0].inc, V[1].inc>;
<nni, V[2].inc>;
<nin, V[1].inc>;
<inn, V[0].inc>;
<ddn, V[0].dec, V[1].dec>;
<dnd, V[0].dec, V[2].dec>;
<ndd, V[1].dec, V[2].dec>;
<nnd, V[2].dec>;
<nnn,>
edon

162
rapport.tex Normal file
View file

@ -0,0 +1,162 @@
\documentclass[a4paper]{book}
\usepackage{fullpage}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{latexsym}
\usepackage{fancyhdr}
\usepackage{makeidx}
\usepackage{graphics}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{moreverb}
\usepackage{listings}
\newcommand{\altarica}{{\sc AltaRica}}
\begin{document}
\title{Master 1, Conceptions Formelles\\
Projet du module \altarica\\
Synthèse (assistée) d'un contrôleur du niveau d'une cuve}
\date{}
\author{Nom1 \and Nom2 \and Nom3}
\maketitle
\chapter{Le sujet}
\input{tank}
\chapter{Le rapport}
Le rapport est sur 20 points.
\section{Processus}
\subsection{Rôle du fichier {\tt GNUmakefile} (1.5 points)}
% A COMPLETER en expliquant les enchainements des calculs effectués.
\subsection{Rôle de la constante {\tt nbFailures} et de l'assertion associée (0.5 point)}
% A COMPLETER en expliquant le rôle de la constante.
\section{Résultats avec le contrôleur initial {\tt Ctrl}}
\subsection{Calcul d'un contrôleur}
\subsubsection{Avec 0 défaillance (0.5 point)}
\input{LaTeX/System0FCtrl.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsubsection{Avec 1 défaillance (0.5 point)}
\input{LaTeX/System1FCtrl.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsubsection{Avec 2 défaillances (0.5 point)}
\input{LaTeX/System2FCtrl.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsubsection{Avec 3 défaillances (0.5 point)}
\input{LaTeX/System3FCtrl.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsection{Bilan avec le contrôleur initial (1 point)}
% A COMPLETER
\section{Construction d'un contrôleur initial plus performant}
\subsection{Rôle du composant {\tt ValveVirtual}(2 points)}
\includegraphics[height=.2\textheight,width=.5\textwidth]{Graphs/Valve-modes.pdf}
\includegraphics[height=.2\textheight,width=.5\textwidth]{Graphs/ValveVirtual-modes.pdf}
% A COMPLETER en expliquant sa sémantique et son rôle.
\subsection{Rôle du composant {\tt CtrlVV} (4 points)}
% A COMPLETER en expliquant les mécanismes mis en oeuvre, leurs rôles et les avantages de ce contrôleur par rapport au précédent CtrlVV.
\section{Résultats avec le contrôleur {\tt CtrlVV}}
\subsection{Calcul d'un contrôleur}
\subsubsection{Avec 0 défaillance (0.5 point)}
\input{LaTeX/System0FCtrlVV.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsubsection{Avec 1 défaillance (0.5 point)}
\input{LaTeX/System1FCtrlVV.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsubsection{Avec 2 défaillances (0.5 point)}
\input{LaTeX/System2FCtrlVV.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsubsection{Avec 3 défaillances (0.5 point)}
\input{LaTeX/System3FCtrlVV.tex}
\paragraph{Interprétation des résultats}
% A COMPLETER
\subsection{Bilan avec le contrôleur CtrlVV (1 point)}
% A COMPLETER
\section{Une première optimisation des contrôleurs pour améliorer le débit aval}
\subsection{Une optimisation basée sur les priorités (1 point)}
\small{\lstinputlisting{ControleursOpt/Optimisation.alt}}
% A COMPLETER en expliquant en quoi consiste l'optimisation mise en place.
\subsection{Calcul des contrôleurs optimisés avec {\tt CtrlVV}}
\paragraph{Avec 0 défaillance}\ \\
\input{LaTeX/System0FCtrlVV_opt.tex}
\paragraph{Avec 1 défaillance}\ \\
\input{LaTeX/System1FCtrlVV_opt.tex}
\paragraph{Avec 2 défaillances}\ \\
\input{LaTeX/System2FCtrlVV_opt.tex}
\paragraph{Avec 3 défaillances}\ \\
\input{LaTeX/System3FCtrlVV_opt.tex}
\subsection{Bilan avec la première optimisation du contrôleur CtrlVV (1 point)}
% A COMPLETER
\section{Une deuxième optimisation (3 points)}
Il est possible d'obtenir de meilleurs résultats que les précédents par au moins deux façons.
\begin{enumerate}
\item En utilisant un meilleur ordre pour les priorités entre événements.
\item En introduisant cet objectif dans le système de calcul de point fixe des actions du contrôleur.
\end{enumerate}
Vous devez proposer une des deux optimisations conduisant à une solution dans laquelle le débit de la vanne aval est le moins souvent possible décrémenter, voire jamais. Pour cela, vous pouvez~:
\begin{itemize}
\item Meilleur ordre sur les événements.
\begin{enumerate}
\item Modifier le fichier \texttt{ControleursOpt/Optimisation.alt}.
\item Faites \texttt{make}.
\item Quand vos résultats sont satisfaisants, notez les, puis copiez votre fichier dans \texttt{ControleursOpt/Optimisation-2.alt}.
\item Remettez le fichier \texttt{ControleursOpt/Optimisation.alt} d'origine.
\item Faites \texttt{make}.
\end{enumerate}
\item Meilleur système d'équations au point fixe.
\begin{enumerate}
\item Modifier le fichier \texttt{Spec/System.spe}.
\item Faites \texttt{make}.
\item Quand vos résultats sont satisfaisants, notez les, puis copiez votre fichier dans \texttt{Spec/System-2.spe}.
\item Remettez le fichier \texttt{Spec/System.spe} d'origine.
\item Faites \texttt{make}.
\end{enumerate}
\end{itemize}
\paragraph{Le nouvel ordre}\ \\
\small{\lstinputlisting{ControleursOpt/Optimisation-2.alt}
% A COMPLETER en décrivant les résultats obtenus
\paragraph{Le nouveau système d'équations}\ \\
\small{\lstinputlisting[texcl]{Spec/System-2.spe}}
% A COMPLETER en décrivant les résultats obtenus
\section{Conclusion sur la synthèse de contrôleur (1 point)}
% A COMPLETER
\end{document}

39
sujet.tex Normal file
View file

@ -0,0 +1,39 @@
\documentclass[a4paper]{article}
\usepackage{fullpage}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{latexsym}
\usepackage[?]{amsmath}
\usepackage{fancyhdr}
\usepackage{makeidx}
\usepackage{moreverb}
\newcommand{\altarica}{{\sc AltaRica}}
\begin{document}
\title{Master 1, Conceptions Formelles\\
Projet du module \altarica\\
Synthèse (assistée) d'un contrôleur du niveau d'une cuve}
\date{Lundi 30 janvier 2023}
\author{Alain Griffault}
\maketitle
\input{tank}
\section{Conditions générales}
\begin{itemize}
\item Vous pouvez utiliser les fichiers sources de l'archive {\tt FD-2022-2023-M1-CC-sujet.tgz}.
\item {\bf Groupes de deux étudiants conseillés, de trois étudiants maximum acceptés.}
\item Le rapport est constitué de l'archive {\tt FD-2022-2023-M1-CC-rapport.tgz} généré par la commande {\tt make}. Il sera envoyé par mail à Alain.Griffault@u-bordeaux.fr
\item Date limite de remise du travail : {\bf vendredi 3 mars 20223}.
\end{itemize}
\end{document}

158
tank.alt Normal file
View file

@ -0,0 +1,158 @@
node ValvePerfect
state rate : [0,2] : public;
init rate := 0;
event dec, inc;
trans true |- dec -> rate := rate - 1;
true |- inc -> rate := rate + 1;
rate = 0 |- dec -> ;
rate = 2 |- inc -> ;
edon
node Valve
state rate : [0,2] : public;
stucked : bool;
init rate := 0;
stucked := false;
event dec, inc;
trans ~stucked |- dec -> rate := rate - 1;
~stucked |- inc -> rate := rate + 1;
~stucked |- dec -> stucked := true;
~stucked |- inc -> stucked := true;
stucked |- dec -> ;
stucked |- inc -> ;
rate = 0 |- dec -> ;
rate = 2 |- inc -> ;
edon
node Tank
state level : [0,4] : public;
init level := 2;
flow amont : [0,4];
aval : [0,2];
event time;
trans amont > aval |- time -> level := level + 1;
amont < aval |- time -> level := level - 1;
amont = aval & amont = 0 |- time -> ;
amont = aval & amont > 0 |- time -> level := level + 1;
amont = aval & amont > 0 |- time -> level := level - 1;
amont = aval & amont > 0 |- time -> ;
level = 4 & (amont > aval) |- time -> ;
level = 0 & (amont < aval) |- time -> ;
edon
node Ctrl
// les observations du controleur
flow r : [0,2][3];
l : [0,4];
event ddd, ddi, ddn, did, dii, din, dnd, dni, dnn,
idd, idi, idn, iid, iii, iin, ind, ini, inn,
ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn;
trans
true |-
ddd, ddi, ddn, did, dii, din, dnd, dni, dnn,
idd, idi, idn, iid, iii, iin, ind, ini, inn,
ndd, ndi, ndn, nid, nii, nin, nnd, nni, nnn
-> ;
edon
node SystemPerfect
sub V : ValvePerfect[3];
T : Tank;
//C : Ctrl;
C : Ctrl_SystemPerfect;
state ctrl : bool;
init ctrl := true;
// d pour dec, i pour inc, n pour nop
event action;
time;
trans
ctrl |- action -> ctrl := false;
~ctrl |- time -> ctrl := true;
assert
T.amont = (V[0].rate + V[1].rate);
T.aval = V[2].rate;
// liens avec le controleur
C.r[0] = V[0].rate;
C.r[1] = V[1].rate;
C.r[2] = V[2].rate;
C.l = T.level;
sync <action, C.ddd, V[0].dec, V[1].dec, V[2].dec>;
<action, C.ddi, V[0].dec, V[1].dec, V[2].inc>;
<action, C.ddn, V[0].dec, V[1].dec>;
<action, C.did, V[0].dec, V[1].inc, V[2].dec>;
<action, C.dii, V[0].dec, V[1].inc, V[2].inc>;
<action, C.din, V[0].dec, V[1].inc>;
<action, C.dnd, V[0].dec, V[2].dec>;
<action, C.dni, V[0].dec, V[2].inc>;
<action, C.dnn, V[0].dec>;
<action, C.idd, V[0].inc, V[1].dec, V[2].dec>;
<action, C.idi, V[0].inc, V[1].dec, V[2].inc>;
<action, C.idn, V[0].inc, V[1].dec>;
<action, C.iid, V[0].inc, V[1].inc, V[2].dec>;
<action, C.iii, V[0].inc, V[1].inc, V[2].inc>;
<action, C.iin, V[0].inc, V[1].inc>;
<action, C.ind, V[0].inc, V[2].dec>;
<action, C.ini, V[0].inc, V[2].inc>;
<action, C.inn, V[0].inc>;
<action, C.ndd, V[1].dec, V[2].dec>;
<action, C.ndi, V[1].dec, V[2].inc>;
<action, C.ndn, V[1].dec>;
<action, C.nid, V[1].inc, V[2].dec>;
<action, C.nii, V[1].inc, V[2].inc>;
<action, C.nin, V[1].inc>;
<action, C.nnd, V[2].dec>;
<action, C.nni, V[2].inc>;
<action, C.nnn>;
<time, T.time>;
edon
node System
sub V : Valve[3];
T : Tank;
//C : Ctrl;
C : Ctrl_System;
state ctrl : bool;
init ctrl := true;
// d pour dec, i pour inc, n pour nop
event action;
time;
trans
ctrl |- action -> ctrl := false;
~ctrl |- time -> ctrl := true;
assert
T.amont = (V[0].rate + V[1].rate);
T.aval = V[2].rate;
// liens avec le controleur
C.r[0] = V[0].rate;
C.r[1] = V[1].rate;
C.r[2] = V[2].rate;
C.l = T.level;
sync <action, C.ddd, V[0].dec, V[1].dec, V[2].dec>;
<action, C.ddi, V[0].dec, V[1].dec, V[2].inc>;
<action, C.ddn, V[0].dec, V[1].dec>;
<action, C.did, V[0].dec, V[1].inc, V[2].dec>;
<action, C.dii, V[0].dec, V[1].inc, V[2].inc>;
<action, C.din, V[0].dec, V[1].inc>;
<action, C.dnd, V[0].dec, V[2].dec>;
<action, C.dni, V[0].dec, V[2].inc>;
<action, C.dnn, V[0].dec>;
<action, C.idd, V[0].inc, V[1].dec, V[2].dec>;
<action, C.idi, V[0].inc, V[1].dec, V[2].inc>;
<action, C.idn, V[0].inc, V[1].dec>;
<action, C.iid, V[0].inc, V[1].inc, V[2].dec>;
<action, C.iii, V[0].inc, V[1].inc, V[2].inc>;
<action, C.iin, V[0].inc, V[1].inc>;
<action, C.ind, V[0].inc, V[2].dec>;
<action, C.ini, V[0].inc, V[2].inc>;
<action, C.inn, V[0].inc>;
<action, C.ndd, V[1].dec, V[2].dec>;
<action, C.ndi, V[1].dec, V[2].inc>;
<action, C.ndn, V[1].dec>;
<action, C.nid, V[1].inc, V[2].dec>;
<action, C.nii, V[1].inc, V[2].inc>;
<action, C.nin, V[1].inc>;
<action, C.nnd, V[2].dec>;
<action, C.nni, V[2].inc>;
<action, C.nnn>;
<time, T.time>;
edon

28
tank.spe Normal file
View file

@ -0,0 +1,28 @@
with SystemPerfect, System do
// propriétés universelles
deadlock := any_s - src(any_t - self_epsilon);
notResettable := any_s - coreach(initial, any_t);
// Systèmes réactifs
control := any_t & label action;
uncontrol := any_t & label time;
SR := any_s & ([T.level=0] | [T.level=4] | deadlock);
LossCtrl := src(control) & SR;
WinCtrl := src(control) - SR;
LossEnv := src(uncontrol) - SR;
WinEnv := src(uncontrol) & SR;
/* Classical equations for
* - winning strategy (| for lfp and to reach winning states)
* - controller synthesis (& for gfp and to avoid loosing states)
Winning = Win |& src(WinningStep);
WinningStep = Step & rtgt(Loosing);
Loosing = Loss |& (src(LoosingStep) - src(NotLoosingStep));
LoosingStep = Step & rtgt(Winning);
NonLoosingStep = Step - rtgt(Winning);
*/
WinningCtrl -=
control &
rtgt(LossEnv &
(src(uncontrol & rtgt(WinCtrl & src(WinningCtrl))) -
src(uncontrol - rtgt(WinCtrl & src(WinningCtrl)))));
project(any_s, (WinningCtrl|uncontrol,empty_t), 'Ctrl_$NODENAME', true,C) > 'Ctrl_$NODENAME.alt';
done

90
tank.tex Normal file
View file

@ -0,0 +1,90 @@
\section{Cahier des charges}
Le système que l'on souhaite concevoir est composé~:
\begin{itemize}
\item d'un réservoir contenant {\bf toujours} suffisamment d'eau pour alimenter l'exploitation,
\item d'une cuve,
\item de deux canalisations parfaites amont reliant le réservoir à la cuve, et permettant d'amener l'eau à la cuve,
\item d'une canalisation parfaite aval permettant de vider l'eau de la cuve,
\item chaque canalisation est équipée d'une vanne commandable, afin de réguler l'alimentation et la vidange de la cuve,
\item d'un contrôleur.
\end{itemize}
\subsection{Détails techniques}
\subsubsection{La vanne}
Les vannes sont toutes de même type, elles possèdent trois niveaux de débits correspondant à trois diamètres d'ouverture~: 0 correspond à la vanne fermée, 1 au diamètre intermédiaire et 2 à la vanne complètement ouverte. Les vannes sont commandables par les deux instructions {\tt inc} et {\tt dec} qui respectivement augmente et diminue l'ouverture. Malheureusement, la vanne est sujet à défaillance sur sollicitation, auquel cas le système de commande devient inopérant, la vanne est désormais pour toujours avec la même ouverture.
\subsubsection{La Cuve}
Elle est munie de $nbSensors$ capteurs (au moins quatre) situés à $nbSensors$ hauteurs qui permettent de délimiter $nbSensors+1$ zones. La zone 0 est comprise entre le niveau 0 et le niveau du capteur le plus bas; la zone 1 est comprise entre ce premier capteur et le second, et ainsi de suite.
Elle possède en amont un orifice pour la remplir limité à un débit de 4, et en aval un orifice pour la vider limité à un débit de 2.
\subsubsection{Le contrôleur}
Il commande les vannes avec les objectifs suivants ordonnés par importance~:
\begin{enumerate}
\item Le système ne doit pas se bloquer, et le niveau de la cuve ne doit jamais atteindre les zones 0 ou $nbSensors$.
\item Le débit de la vanne aval doit être le plus important possible.
\end{enumerate}
On fera également l'hypothèse que les commandes ne prennent pas de temps, et qu'entre deux pannes et/ou cycle {\em temporel}, le contrôleur à toujours le temps de donner au moins un ordre. Réciproquement, on fera l'hypothèse que le système à toujours le temps de réagir entre deux commandes.
\subsubsection{Les débits}
Les règles suivantes résument l'évolution du niveau de l'eau dans la cuve~:
\begin{itemize}
\item Si $(amont > aval)$ alors au temps suivant, le niveau aura augmenté d'une unité.
\item Si $(amont < aval)$ alors au temps suivant, le niveau aura baissé d'une unité.
\item Si $(amont = aval = 0)$ alors au temps suivant, le niveau n'aura pas changé.
\item Si $(amont = aval > 0)$ alors au temps suivant, le niveau pourra~:
\begin{itemize}
\item avoir augmenté d'une unité,
\item avoir baissé d'une unité,
\item être resté le même.
\end{itemize}
\end{itemize}
\section{L'étude}
\subsection{Rappel méthodologique}
Comme indiqué en cours, le calcul par point fixe du contrôleur est exact, mais l'opération de projection effectuée ensuite peut perdre de l'information et générer un contrôleur qui n'est pas satisfaisant. Plus précisemment, le contrôleur \altarica\ généré~:
\begin{itemize}
\item ne garanti pas la non accessibilité des \emph{Situations Redoutées}.
\item ne garanti pas l'absence de \emph{nouvelles situations de blocages}.
\end{itemize}
Dans le cas ou il existe toujours \emph{des situations de blocages ou redoutées}, vous pouvez au choix~:
\begin{enumerate}
\item Corriger manuellement le contrôleur calculé (sans doute très difficile).
\item Itérer le processus du calcul du contrôleur jusqu'à stabilisation du résultat obtenu.
\begin{itemize}
\item Si le contrôleur obtenu est sans blocage et sans situation redoutée, il est alors correct.
\item Si le contrôleur obtenu contient toujours des blocages ou des situations redoutées, c'est que le contrôleur initial n'est pas assez performant, mais rien ne garanti que l'on soit capable de fournir ce premier contrôleur suffisemment performant.
\end{itemize}
\end{enumerate}
{\bf Remarque} : Pour vos calculs, vous pouvez utiliser au choix les commandes~:
\begin{itemize}
\item {\tt altarica-studio xxx.alt xxx.spe}
\item {\tt arc -b xxx.alt xxx.spe}
\item {\tt make} pour utiliser le fichier GNUmakefile fourni.
\end{itemize}
\subsection{Le travail a réaliser}
L'étude consiste à étudier le système suivant trois paramètres~:
\begin{enumerate}
\item $nbFailures$~: une constante qui est une borne pour le nombre de vannes pouvant tomber en panne.
\item Le contrôleur initial qui peut être soit {\tt Ctrl}, soit {\tt CtrlVV}.
\item Une éventuelle optimisation pour améliorer le débit aval.
\end{enumerate}
Les questions auxquelles vous devez répondre sont dans le fichier {\tt fichier rapport.tex}. Elles correspondent aux interrogations suivantes~:
\begin{enumerate}
\item Est-il possible de contrôler en évitant les blocages et les situations critiques ?
\item Si oui, donnez quelques caractéristiques de ce contrôleur, si non, expliquez pourquoi.
\item Est-il possible de contrôler en optimisant le débit aval et en évitant les blocages et les situations critiques ?
\item Si oui, donnez quelques caractéristiques de ce contrôleur, si non, expliquez pourquoi.
\end{enumerate}
Vous écrirez vos réponses dans ce même fichier.