l`énoncé du TME3 - Master informatique

Transcription

l`énoncé du TME3 - Master informatique
UPMC Master d'Informatique M1/STL/CPS
1
Travaux sur Machine Encadrés No3
Conception par Contrats
Frédéric Peschanski
2 février 2016
Exercice : Projet les à priorité
On souhaite dans cet exercice traduire en conception par contrat la spécication de les à
priorité proposée en annexe (page suivante).
Pour cela on souhaite implémenter :
une interface java FilesPrio<T> et le contrat (en commentaires) correspondant à la spécication proposée,
une implementation du contrat FilesPrioContract<T> dans le cadre du design pattern
décorateur,
deux implémentations diérentes FilesPrioImpl<T> et FilesPrioImplBug<T>, la seconde
étant une version erronée de la première (soyez imaginatifs pour les bugs), ainsi que
des exemples d'utilisation dans FilesPrioMain, avec ou sans vérication en ligne du contrat.
Remarque 1 : le contrat décrit dans l'interface et implémenté ensuite devra respecter au mieux
les spécications.
Remarque 2 : on pourra dans les annotations sémantiques (commentaires dans l'interface)
utiliser des quanticateurs \forall, \exists, etc. ainsi que des constructions ad-hoc que l'on expliquera proprement. L'implémentation du contrat devra être la plus systématique possible (même
type d'annotation = même algorithme de vérication).
Remarque 3 : on pourra aner ou modier les spécications si nécessaires
Le projet devra être construit avec un chier de construction build.xml pour ant proposant :
une cible clean pour nettoyer le projet,
une cible compile pour compiler les sources,
une cible run pour exécuter les exemples,
et une cible dist pour générer l'archive.
Important : la soumission se fera dans un chier jar gzippé portant le nom TME3-CPS-NOM1NOM2.jar.gz. Ce jar devra être exploitable en dehors de tout environnement de développement.
UPMC Master d'Informatique M1/STL/CPS
2
Annexe : Spécications
service : FilesPrio<T>
observators :
size : [FilesPrio] → int
empty : [FilesPrio] → boolean
activePrios : [FilesPrio] → Set<int>
isActivePrio : [FilesPrio] × int → boolean
maxPrio : [FilesPrio] → int
sizePrio : [FilesPrio] × int → int
getPrio : [FilesPrio] × int → T
getPrio(P,i)
sizePrio(P,i)> 0
get : [FilesPrio] → T
get(P)
size(P)> 0
getElem : [FilesPrio] × int × int → T
getElem(P,i,k)
i ∈ activePrios(P) ∧ 0 < k ≤sizePrio(P,i)
:
init : → [FilesPrio]
:
putPrio : [FilesPrio] × int × T → [FilesPrio]
putPrio(P,i,e)
i≥ 0 ∧ e6= null
put : [FilesPrio] × T → [FilesPrio]
put(P,e)
e6= null
removePrio : [FilesPrio] × int → [FilesPrio]
removePrio(P,i)
sizePrio(P,i)> 0
remove : [FilesPrio] → [FilesPrio]
remove(P)
size(P,i)> 0
:
[invariants]
pre
require
pre
require
pre
Constructors
require
Operators
pre
require
pre
require
pre
require
pre
Observations
require
min
size(P) =
P
min
i∈activePrios(P)
sizePrio(P,i)
empty(P) = size(P)= 0
min
isActivePrio(P,i) = i ∈ activePrios(P)
min
def
maxPrio(P) = max(activePrios(P)) avec max(E) = x ∈ E ∪ {0}
t.q.
∀y ∈ E, x ≥ y
min
getPrio(P,i) = getElem(P,i,1)
min
get(P) = getPrio(P,maxPrio(P))
∀i ∈ activePrios(P), sizePrio(P,i)> 0
∀i 6∈ activePrios(P), sizePrio(P,i)= 0
∀i ∈ activePrios(P), ∀k ∈ [1..sizePrio(P,i)], getElem(P,i,k)6= null
[init]
size(init())=0
[putPrio]
isActivePrio(P,i) =⇒ activePrios(putPrio(P,i,e)) = activePrios(P)
¬isActivePrio(P,i) =⇒ activePrios(putPrio(P,i,e)) = activePrios(P) ∪{i}
sizePrio(putPrio(P,i,e),i) = sizePrio(P,i) + 1
∀j ∈ activePrios(P)\{i}, sizePrio(putPrio(P,i,e),j) = sizePrio(P,j)
getPrio(putPrio(P,i,e),i) = e
∀k ∈ [2..sizePrio(P,i)+1], getElem(putPrio(P,i,e),i,k) = getElem(P,i,k-1)
∀j ∈ activePrios(P)\{i}, ∀k ∈ [1..sizePrio(P,j)], getElem(putPrio(P,i,e),j,k) = getElem(P,j,k)
[put]
def
put(P,e) = putPrio(P,e,maxPrio(P))
[removePrio]
sizePrio(P,i)>1 =⇒ activePrios(removePrio(P,i)) = activePrios(P)
sizePrio(P,i)=1 =⇒ activePrios(removePrio(P,i)) = activePrios(P) \{i}
sizePrio(removePrio(P,i),i) = sizePrio(P,i) - 1
∀j ∈ activePrios(P)\{i}, sizePrio(removePrio(P,i),j) = sizePrio(P,j)
∀k ∈ [1..sizePrio(P,i)-1], getElem(removePrio(P,i),i,k) = getElem(P,i,k)
∀i ∈ activePrios(P)\{i}, ∀k ∈ [1..sizePrio(P,j)], getElem(removePrio(P,i),j,k) = getElem(P,j,k)
[remove]
def
remove(P) = removePrio(P,maxPrio(P))