Espace_de_recherche Module Interface Specification

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 type et '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

-foreign types: spec, status

(1) SYNTAX

ACCESS-PROGRAMS

Program Name
Arg#1Arg#2Arg#3
INITstatus:Oespace:O  
AJOUTERstatus:Oespace:VOspec:V
PROCHAINstatus:Oespace:VOspec:R
ENLEVERstatus:Oespace: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-PROGRAMS

Legality(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) =

ConditionValue
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)) =

ConditionValue
T = _ %trace_vide%
T _%legal%

PROCHAIN(s , (n, T), x) =

ConditionValue
T = _ status::TRACE_VIDE(*)
T _status::LEGAL(*)

PROCHAIN(s, (n, T) , x sp) =

ConditionValue
selection(T)T
¬selection(T)T.PROCHAIN(*1, *, *2 sp)

PROCHAIN(s, (n, T), x sp) |

ConditionValue
¬selection(T)membre(sp, T)
selection(T)sp = sel(T)

Legality(ENLEVER(s, (n, T))) =

ConditionValue
T = _ %trace_vide%
T _ ¬selection(T)%pas_selection%
T _ selection(T)%legal%

ENLEVER(s , (n, T)) =

ConditionValue
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) ]