Informal Introduction
Le module implemente un ensemble d'objets du type.
Dans le texte qui suit 's' denote le nom d'un objet dans le module,
'sp' denote une valeur du typeet 'x' denote le nom d'un objet du type .
INIT(s,T) initialise l'ensemble T a l'ensemble vide.
AJOUTER(s, T, sp) ajoute sp a l'ensemble T.
PROCHAIN(s, T, x) selectionne une valeur dans l'ensemble T et la retourne dans
l'objet x.
ENLEVER(s,T) enleve l'element selectionne.
Le premier argument de chaque programme d'acces represente le code d'erreur
retourne par ce programme.
(0) CHARACTERISTICS
-type specified: espace
-features: non-deterministic, non-parameterized
(1) SYNTAX
ACCESS-PROGRAMS
Arg#1 | Arg#2 | Arg#3 | INIT | status:O | espace:O | | AJOUTER | status:O | espace:VO | spec:V | PROCHAIN | status:O | espace:VO | spec:R | ENLEVER | status:O | espace:VO | | |
---|
(2) CANONICAL TRACES
canonical(T) n,m:<int>; a:<spec>; spc[1]..spc[n]:<spec> [T = [AJOUTER(*1, *, spc[i])]i=1..n.[PROCHAIN(*1, *, *2 a)]i=1..m m 1 i,j:<int>i < j [spc[i] < spc[j]] i:<int> [m = 1 1 i i n spc[i] = a ]]AUXILIARY FUNCTIONS
membre: <spec> × <espace> <bool>
membre(sp, esp) = n,m:<int>; a:<spec>; spc[1]..spc[n]:<spec> [esp = [AJOUTER(*1, *, spc[i])]i=1..n.[PROCHAIN(*1, *, *2 sp)]i=1..m k:<int> [1 k k n sp = spc[k] ]]
sel: <espace> <spec>
sel(esp) (selection(esp)) = sp where sp:<spec>; T1:<espace> [esp = T1.PROCHAIN(*1, *, *2 sp) ]
selection: <espace> <bool>
selection(esp) = count("PROCHAIN", esp) = 1
(3) SEMANTICS
ACCESS-PROGRAMSLegality(INIT(s, e)) = %legal%
INIT(s , e) = status::LEGAL(*)
INIT(s, e ) = _
Legality(AJOUTER(s, (n, T), sp)) = %legal%
AJOUTER(s , (n, T), sp) = status::LEGAL(*)
AJOUTER(s, (n, T) , sp) =
Condition | Value |
---|---|
membre(sp, T) | T |
¬membre(sp, T) | T1.AJOUTER(*1, *, sp).T2 where T1,T2:<espace> [T = T1.T2 canonical(T1.AJOUTER(*1, *, sp).T2)] |
Legality(PROCHAIN(s, (n, T), x)) =
Condition | Value |
---|---|
T = _ | %trace_vide% |
T _ | %legal% |
PROCHAIN(s , (n, T), x) =
Condition | Value |
---|---|
T = _ | status::TRACE_VIDE(*) |
T _ | status::LEGAL(*) |
PROCHAIN(s, (n, T) , x sp) =
Condition | Value |
---|---|
selection(T) | T |
¬selection(T) | T.PROCHAIN(*1, *, *2 sp) |
PROCHAIN(s, (n, T), x sp) |
Condition | Value |
---|---|
¬selection(T) | membre(sp, T) |
selection(T) | sp = sel(T) |
Legality(ENLEVER(s, (n, T))) =
Condition | Value |
---|---|
T = _ | %trace_vide% |
T _ ¬selection(T) | %pas_selection% |
T _ selection(T) | %legal% |
ENLEVER(s , (n, T)) =
Condition | Value |
---|---|
T = _ | status::TRACE_VIDE(*) |
T _ selection(T) | status::LEGAL(*) |
T _ ¬selection(T) | status::PAS_SELECTION(*) |
ENLEVER(s, (n, T) ) = T1.T2 where T1,T2:<espace>; sp:<spec> [T = T1.AJOUTER(*1, *, sp).T2.PROCHAIN(*1, *, *2 sp) ]