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