• Nenhum resultado encontrado

6.3 Algoritmo do Jogo de Refinamento

7.1.3 Uma Solu¸c˜ ao Algor´ıtmica para o Reparo de Refinamento

O Algoritmo 10 realiza, de forma determin´ıstica, o algoritmo mostrado na Proposi¸c˜ao 7.1.9 com os seguintes passos: (i) gerar um conjunto X de todas as poss´ıveis mudan¸cas primitivas que podem ser aplicadas sobre o modelo N em quest˜ao (linha 3); (ii) gerar o conjunto das partes de X, PpXq (linha 4); e (iii) para cada elemento Xide PpXq, verificar

se M ¨ XipNq (linhas 5-7). N˜ao h´a “inteligˆencia” neste algoritmo porque ele tenta todas

as poss´ıveis combina¸c˜oes de mudan¸cas primitivas v´alidas. O termo v´alida se refere `a mudan¸cas que podem ser aplicadas em conjunto (por exemplo, n˜ao ´e poss´ıvel remover uma transi¸c˜ao e posteriormente alterar sua a¸c˜ao). Por isto, chamamos este algoritmo de reparo de refinamento exaustivo (RRE).

Algoritmo 10: RRE

Data: KMTS M e N tal que M ª N Result: R tN1—M ¨ N1 e XpNq  N1}

1 begin 2 R ÐÝ H

3 mudancasP rimitivasP ossiveisÐÝ geraMudancasP rimitivaspNq 4 combinacoesM udancasP ossiveisÐÝ PpmudancasP rimitivasP ossiveisq 5 for X P combinacoesMudancasP ossiveis do

6 if M ¨ XpNq then

7 R ÐÝ R Y tXpNqu

Para testar a aplicabilidade desta solu¸c˜ao, o Algoritmo 10 (RRE) foi implementado. Durante os testes, dois problemas foram detectados. O primeiro problema ´e relativo a performance do algoritmo. As etapas de gera¸c˜ao das poss´ıveis mudan¸cas primitivas e de verificar se dois modelos s˜ao refinamento um do outro possuem complexidade polinomial, todavia gerar o conjunto de partes de um conjunto ´e um problema de complexidade exponencial em rela¸c˜ao ao tamanho do conjunto de entrada (SUCIU; PAREDAENS, 1994).

Como pode ser visto na Figura 7.1, considerando dois modelos M e N tal que M ª N, o tempo de execu¸c˜ao do algoritmo cresce exponencialmente em rela¸c˜ao `a quantidade de mudan¸cas primitivas que podem ser aplicadas em N (em rela¸c˜ao ao tamanho do conjunto mudancasPrimitivasPossiveis). Este comportamento ´e explicado porque o conjunto de combina¸c˜oes ´e exponencial (2|mudancasP rimitivasP ossiveis|). A quantidade de mudan¸cas pri- mitivas que podem ser aplicadas em um modelo qualquer segue a express˜ao definida na Proposi¸c˜ao 7.1.3 e ´e poss´ıvel observar que ela cresce rapidamente em rela¸c˜ao ao tamanho do modelo. Tomando como exemplo os modelos M e N da Figura 7.2, existem 212 4096

7.1 O PROBLEMA DO REPARO DE REFINAMENTO 103

Figura 7.1 Gr´afico do tempo de execu¸c˜ao (em milissegundos) do Algoritmo 10 em rela¸c˜ao n´umero de mudan¸cas primitivas aplic´aveis

Figura 7.2 Dois Modelos M e N tal que M ª N e duas sa´ıdas do algoritmo RRE

especifica¸c˜ao, o que ´e um n´umero elevado para um modelo relativamente simples e sem proposi¸c˜oes.

Este desempenho (por mais que possa ser melhorado por estruturas de dados es- pec´ıficas) torna a aplica¸c˜ao deste m´etodo custosa em rela¸c˜ao ao tempo de execu¸c˜ao, o que pode ser invi´avel em termos pr´aticos.

O outro problema encontrado neste algoritmo ´e o tipo de solu¸c˜oes que ele gera. Supo- nha que o modelo a ser reparado seja N e a especifica¸c˜ao seja M, este algoritmo retorna como solu¸c˜ao um conjunto R de modelos que s˜ao criados a partir de modifica¸c˜oes de N. Todavia, o conjunto solu¸c˜ao pode possuir modelos que s˜ao refinamentos entre si, o que aumenta consideravelmente o tamanho do conjunto solu¸c˜ao e indicar ao usu´ario o melhor reparo pode se tornar um problema diante de tantos modelos.

Al´em disto, crit´erios puramente estruturais, como os utilizados no algoritmo, podem resultar na escolha de modelos que s˜ao refinamentos da especifica¸c˜ao, todavia modificam radicalmente o modelo N. Um exemplo de caso de mudan¸ca radical ´e mostrado na Figura 7.2.

Neste exemplo, o modelo N n˜ao ´e refinamento do modelo M porque a a¸c˜ao que liga os estados m1 e m2 e a a¸c˜ao que liga os estados n1 e n2 s˜ao diferentes. Uma mudan¸ca

104 REPARO DE REFINAMENTO

Figura 7.3 Jogo de refinamento entre os modelos M e N da Figura 7.1

modelo M. Todavia, al´em desta solu¸c˜ao (representada na figura por N1), o algoritmo tamb´em gera como poss´ıvel solu¸c˜ao a remo¸c˜ao da aresta que liga os estados n0 e n1

(representada na figura por N2). Apesar da solu¸c˜ao ser um refinamento de M (pela defini¸c˜ao de refinamento), podemos observar que o modelo N2 deixa de refinar uma parte de M (estados m1 e m2). Apesar de formalmente corretas em rela¸c˜ao ao refinamento,

solu¸c˜oes deste tipo podem n˜ao ser desej´aveis no contexto de desenvolvimento de software porque representam a perda de uma parte do comportamento obrigat´orio. Na presente proposta chamamos estas solu¸c˜oes de solu¸c˜oes n˜ao-locais.

Este tipo de solu¸c˜ao pode ser ´util para algumas aplica¸c˜oes, todavia, nos concentramos aqui em propor solu¸c˜oes locais, isto ´e, solu¸c˜oes direcionadas `a causa da n˜ao existˆencia de refinamento entre os modelos. Para definir objetivamente o crit´erio de uma solu¸c˜ao local e n˜ao-local, utilizamos o jogo de refinamento para definir quais s˜ao as causas locais da n˜ao existˆencia da rela¸c˜ao de refinamento entre os modelos.

A Figura 7.3 mostra o jogo de refinamento entre os modelos M e N da Figura 7.1. Neste jogo o spoiler ganha porque o duplicator n˜ao pode se mover a partir dos estados D1 e D2. O estado (ou v´ertice ou configura¸c˜ao) onde o duplicator n˜ao pode se mover ´e chamado de testemunha de falha. Por exemplo, o estado D1 do jogo ´e uma testemunha de falha. As testemunhas de falhas contˆem as informa¸c˜oes necess´arias para detectar o motivo de n˜ao existir uma rela¸c˜ao de refinamento entre os modelos. ´E poss´ıvel definir um algoritmo que se baseia no jogo de refinamento para encontrar as causas da n˜ao existˆencia da rela¸c˜ao de refinamento entre dois modelos e reparar estas causas.

Desta forma, definimos que uma solu¸c˜ao local para o problema do refinamento ´e baseada na informa¸c˜ao obtida a partir dos v´ertices que s˜ao testemunhas de falha. A se¸c˜ao seguinte analisa informa¸c˜oes obtidas das testemunhas de falhas e define meios de reparar o modelo baseando-se nestas informa¸c˜oes.