• Nenhum resultado encontrado

5.5 Auto-Aplica¸c˜ ao e Gera¸c˜ ao de Compiladores

6.2.1 Termina¸c˜ ao da BTA

Primeiramente, vamos procurar demonstrar que o algoritmo de BTA sempre termina.

A fun¸c˜aoprogToNir´a nos ajudar nessa demonstra¸c˜ao. Essa fun¸c˜ao ´e definida na Figura 6.1, onde N ´e o conjunto dos n´umeros naturais. A fun¸c˜ao progToN associa n´umeros naturais a elementos sint´aticos usados para representar uma regra ASM. Uma propriedade interes-sante dessa fun¸c˜ao ´e q ue o n´umero associado a um elemento sint´atico ´e maior que a soma dos n´umeros associados aos seus componentes.

O corpo do algoritmo de BTA ´e exibido na Figura 5.3. O primeiro conjunto de regras, na parte esquerda da Figura 5.3, ser´a executado se o conjunto BSET for n˜ao vazio. O segundo conjunto de regras, na parte direita da mesma figura, s´o ser´a executado quando BSET for vazio e o valor da fun¸c˜ao change for true. Na Se¸c˜ao 5.3, foi estabelecido que o valor inicial de BSET´e {init,prog}, onde init representa a regra de inicializa¸c˜ao e prog

representa a regra de transi¸c˜ao da especifica¸c˜ao de entrada. Assim, no primeiro passo da execu¸c˜ao, o primeiro conjunto de regras ser´a disparado.

Antes de mostrar que o algoritmo de BTA sempre p´ara, vamos mostrar que, em um n´umero finito de passos, o conjuntoBSETse tornar´a vazio. Isso dever´a acontecer n˜ao apenas a partir do primeiro passo da execu¸c˜ao, mas a partir de qualquer estado onde BSET seja n˜ao vazio.

Seja SumBSET a seguinte fun¸c˜ao, onde t∈ TERM, f FNAME: SumBSET : 2(RULE+TERM) →N SumBSET ({x1, . . . , xk})

k j=1

progToN (xj)

O conjunto BSET, como definido na Se¸c˜ao 5.3, cont´em elementos que representam regras e termos ASM. A fun¸c˜ao SumBSET representa o somat´orio de progToN aplicado a cada elemento de um conjunto como BSET. Obviamente, SumBSET(ø) = 0.

Suponha que o conjunto BSET seja n˜ao vazio. Ent˜ao o primeiro conjunto de regras da Figura 5.3 ´e executado. Um elemento x ´e eliminado de BSET e processado pela macro ProcessBTA, exibida nas Figuras 5.4, 5.5 e 5.6. Suponha que BSET seja o novo valor de BSET, no passo seguinte. Vamos analisar cada caso separadamente:

Se x = block(r1, . . . , rk), ent˜ao k novas regras ASM s˜ao inseridas em BSET. Nesse caso, SumBSET(BSET) = SumBSET(BSET)1.

Se x = cond(c, r1, r2), ent˜ao c, r1 e r2 s˜ao inseridos em BSET. Novamente, SumB-SET(BSET) =SumBSET(BSET)1.

Sex=update(t1, t2), ent˜ao dois termos s˜ao inseridos emBSET. Mais uma vez, SumB-SET(BSET) =SumBSET(BSET)1.

Finalmente, se x = term (f,t1, . . . , tk), k novos termos s˜ao inseridos em BSET.

Ent˜aoSumBSET(BSET) = SumBSET(BSET)1, como nos demais casos.

O valor inicial de BSET ´e {init,prog}, q ue ´e o mesmo valor que essa fun¸c˜ao assume quando o segundo conjunto de regras da Figura 5.3 ´e executado. Nesse caso, SumB-SET(BSET) = progToN(init)+ progToN(prog). Pela an´alise descrita acima, podemos observar o seguinte: a cada passo da execu¸c˜ao, se o conjunto BSET ´e n˜ao vazio, o valor de SumBSET aplicado ao mesmo ´e essencialmente decrescente. Quando o valor deSumBSET

´e zero, isso significa que o conjunto se tornou vazio.

Theorem 3 Suponha que Sk seja um estado de uma execu¸c˜ao do algoritmo de BTA da Se¸c˜ao 5.3. Se a guarda da regra exibida no lado esquerdo da Figura 5.3 ´e satisfeita no estado Sk, ent˜ao essa guarda ser´a falsa em um n´umero finito de passos ap´os Sk.

Prova: Vamos supor que o algoritmo de BTA seja executado com um estado inicial S0 onde BSET ´e{init,prog}, e que em um determinado passo a guarda da regra exibida no lado esquerdo da Figura 5.3 ´e satisfeita. O valor m´aximo que SumBSET(BSET) pode

atingir ´e progToN(init)+ progToN(prog), um n´umero finito. De acordo com a an´alise conduzida acima, o valor deSumBSET(BSET) ´e necessariamente decrescente a cada passo da execu¸c˜ao, assim eventualmente ser´a zero, significando que BSETtornou-se um conjunto vazio. Logo, a guarda eventualmente n˜ao ser´a satisfeita.

Observe uma importante diferen¸ca entre as demonstra¸c˜oes dos Teoremas 1 e 3. O primeiro trata de uma fun¸c˜ao definida recursivamente, assim a demonstra¸c˜ao de termina¸c˜ao se baseia nas chamadas recursivas. O segundo est´a associado a uma especifica¸c˜ao ASM, assim foi necess´ario estabelecer uma propriedade sobre o estado geral e mostrar que um valor decrescente ´e sempre gerado, para todos os casos poss´ıveis da regra ASM.

O Teorema 3 vai nos auxiliar na demonstra¸c˜ao da termina¸c˜ao do algoritmo de BTA.

Vamos supor que o n´umero de nomes de fun¸c˜oes do alfabeto Υin da especifica¸c˜ao seja finito. Na realidade, vamos precisar apenas de uma suposi¸c˜ao mais fraca: o n´umero de nomes de fun¸c˜oes referenciadas nas regras de inicializa¸c˜ao e transi¸c˜ao deve ser finito. E essa suposi¸c˜ao ´e desnecess´aria, pois ´e uma conseq¨uˆencia do tamanho finito das regras de inicializa¸c˜ao e transi¸c˜ao, uma vez que os nomes de fun¸c˜oes s˜ao objetos sint´aticos que fazem parte das regras.

Theorem 4 . Uma execu¸c˜ao do algoritmo de BTA descrito pelas Figuras 5.3, 5.4, 5.5 e 5.6 sempre termina em um n´umero finito de passos.

Prova: Vamos supor que o algoritmo de BTA seja executado com um estado inicial S0 onde BSET ´e {init,prog}. O algoritmo se resume a dois conjuntos de regras. O primeiro conjunto de regras ´e executado se o conjunto BSET´e n˜ao vazio. O segundo, executado se BSET ´e vazio e change ´e true, torna BSET n˜ao vazio e altera o valor de change para false.

Como mostramos que o Teorema 3 ´e v´alido, basta mostrar ent˜ao que a fun¸c˜ao change recebe o valor true apenas um n´umero finito de vezes. Isso ´e verificado pelos argumentos a seguir:

A fun¸c˜aochange ´e inicializada com o valor false.

Os ´unicos pontos em que change ´e alterada para true s˜ao encontrados nas Figuras 5.5 e 5.6.

Essa altera¸c˜ao s´o ´e executada quando existe um nome de fun¸c˜ao f ao qual bta val associa o valorBTAPOS. A classifica¸c˜ao do nome de fun¸c˜ao f ´e alterado para BTA-NEG.

De acordo com nossas suposi¸c˜oes, existe um n´umero finito de nomes de fun¸c˜oes refereciadas na especifica¸c˜ao. Assim, obviamente existe um n´umero finito de nomes de fun¸c˜oes inicialmente classificados como BTAPOS.

Em nenhum ponto do algoritmo a classifica¸c˜ao de um nome de fun¸c˜ao ´e alterada para BTAPOS.

A guarda “bta val(f) = BTAPOS” s´o ser´a satisfeita um n´umero finito de vezes, logo a fun¸c˜ao change s´o pode receber o valortrue um n´umero finito de vezes.

O primeiro conjunto de regras ´e sempre executado seq¨uencialmente em um n´umero finito de passos. Essa seq¨uˆencia pode alterar o valor de change para true, permitindo uma posterior execu¸c˜ao do segundo conjunto de regras. Mas isso tamb´em s´o acontece um n´umero finito de vezes, como mostramos acima. Logo o algoritmo ir´a sempre terminar em um n´umero finito de passos.

Os teoremas desta se¸c˜ao nos mostram que o comportamento do algortimo de BTA da Se¸c˜ao 5.3 ´e bem simples e previs´ıvel. Os ´unicos tipos de estados que ocorrem durante uma execu¸c˜ao desse algortimo s˜ao seq¨uˆencias de estado Sp, . . . , Sq, q > p, em q ue BSET

={init,prog} em Sp, e BSET = ø em Sq. No estado inicial, temosBSET ={init,prog}. Quando o conjunto BSET se torna vazio, a fun¸c˜ao change ´e testada e uma nova seq¨uˆencia Sp, . . . , Sq pode ser gerada, sucessivamente. Quando change for false no estado Sq, a execu¸c˜ao termina.