1 Refinamento de Ações
Transcrição
1 Refinamento de Ações
1 Renamento de Ações Para provar que o renamento é correto, devemos provar que a ação principal do processo abstrato é renada pela ação principal do processo concreto. Intuitavamente, ao provar o renamento das ações principais, provamos que o sistema têm o seu comportamento renado. Init1 ; (µ X • ( (tick → (VerificarVolumeTanque1 ; X )) ; (DinamicaExecucao1 ; PassoExecucao1 ))) v ((PocosInit ; (µ X • RunPocos ; X )) |[{indexPocoTeste, pocos1 } | PocoSync | {modo1 , valvulaEntrada, valvulaDrenagem, dutos1 , indexTeste, alturaFluido, arqueamento, tc1 , te1 , altA1 , altB1 , altC1 , altD1 , altE1 , abertA1 , abertB1 , abertC1 , abertD1 , abertE1 , abertF1 }]| (SistemaInit ; (µ X • RunSistema ; X ))) \ PocoSync O primeiro passo do renamento é quebrar a operação composta por PocosInit e SistemaInit Init1 na sequência utilizando a lei B.6. Esta lei opera sobre um esquema S que contém duas partições disjuntas, transformando-o numa sequência de operações que atuam nestas partições. Por concisão, não iremos mostrar as obrigações de provas geradas, apesar das mesmas serem provadas trivialmente. ≡ [B.6] PocosInt ; SistemaInit ; (µ X • ( (tick → (VerificarVolumeTanque1 ; ; (DinamicaExecucao1 ; PassoExecucao1 ))) X )) No passo seguinte, devemos quebrar a recursão principal em duas recursões paralelas. Essa transformação é realizada a partir da aplicação da lei B.31. Essa lei quebra a recursão única em duas recursões, uma responsável pelo comportamento do conjunto de poços e a outra, pelo resto do sistema. v [B.31] PocosInt ; SistemaInit (µ X • RunPocos ; ; ( X) |[{indexPocoTeste, pocos1 } | PocoSync | {modo1 , valvulaEntrada, valvulaDrenagem, dutos1 , indexTeste, alturaFluido, arqueamento, tc1 , te1 , altA1 , altB1 , altC1 , altD1 , altE1 , abertA1 , abertB1 , abertC1 , abertD1 , abertE1 , abertF1 }]| (µ X • RunSistema ; X) ) \ PocoSync 1 Note que a aplicação da lei, é validadada mediante a prova do lema 2.1, dada na sessão 2. No intuito de tonar as aplicações de leis mais claras, não iremos mostrar nas futuras aplicações, os conjuntos em que cada partição atua e o canal de comunicação, k PocoSync . Ao invés, será apresentando apenas o símbolo para indicar a paralelização. O próximos passos terão o objetivo de mover as inicializações e as par- tições na ação paralela, de forma que cada inicialização opere sobre uma partição especíca. de PocoSync Além disso, primeiramente, devemos mover a ocultabilidade de forma que a mesma atue sobre toda a expressão. Como as inicializações não possuem nenhum canal, a OP gerada durante a aplicação é trivialmente descartada. v [B.20, B.22] (PocosInt ; SistemaInit (µ X • RunPocos ; ; X) k (µ X • RunSistema ; X) ) \ PocoSync Após a expansão, como último passo do renamento, devemos mover as operações de inicialização para o lado das recursões das partições. Como cada operação de inicialização opera apenas nas respectivas variáveis das partições, a lei B.24, pode ser aplicada. Esta lei é aplicada duas vezes, removendo e SistemaInit PocosInit da ação sequêncial e inserindo-as na ação paralela. ≡ [B.24] ( (PocosInit ; (µ X • RunPocos ; X )) k (SistemaInit ; (µ X • RunSistema ; X )) ) \ PocoSync O renamento é concluído com sucesso. No entanto, o lema 2.1 ainda não foi provado. Na próxima sessão, apresentamos a prova do lema, sendo esta, parte fundamental do processo de renamento. 2 Provando o lema 2.1 Partimos do termo inicial do renamento. Observando o lema 2.1, percebemos que as ações recursivas de RunPocos e RunMin aparecem nos dois lados do re- namento, assim devemos deixar a primeira expressão na forma da composição paralela dessas ações. Assim, o plano de prova consiste em provar individualmente o renamento de cada ação que foi paralelizada entre as partições de poços e o sistema, substituindo na expressão inicial, o resultado desses renamentos. 2 Lemma 2.1 (tick → (VerificarVolumeTanque1 ; (DinamicaExecucao1 ; PassoExecucao1 ))) ; ((µ X • RunPocos ; X ) k (µ X • RunSistema ; X ) ) v ((µ X • RunPocos ; X ) k (µ X • RunSistema ; X ) ) \ PocoSync Em seguida, distribuiremos as ações nas respectivas partições da composição paralela. O resultado deixará a primeira expressão como as chamadas recursivas das ações RunPocos e RunSistema . Ao mesmo tempo, iremos expandir o PocoSync sobre toda a ação. Finalizaremos a prova com a lei ocultamento de de desdobramento de recursão. No caso, iremos dobrar a recursão. Alinhamento1 vA (Alinhar |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAlinhamento ) \ PocoSync A primeira ação a ser renada é Alinhamento1 . Partiremos do schema da operação. Note que o schema faz referência ao estado de State1 . No renamento, desejamos quebrar esse conjunto de componentes, nas partições de SistemaSt . PocosSt e Assim, temos o seguinte termo: [i ? : N; ∆State1 | i ? ∈ dom pocos1 {i ?} − C pocos1 = {i ?} − C pocos10 ∧ (pocos1 (i ?)).status = PRODUZINDO 0 indexTeste1 = i ? ∧ indexPocoTeste 0 = i ? ∧ (pocos 0 (i ?)).status = TESTANDO θState1 \ (pocos, indexTeste) = θ(State1 )0 \ (pocos, indexTeste)] Utilizando Cálculo de schemas de Z que inclui transformação de predicados e normalização, dividimos as declarações do schema e seus predicados em duas partições. predicado Parar quebrar o alinhamento em ações independentes, incluímos o i ? ∈ dom dutos1 uma vez que dutos1 e pocos1 compartilham o mesmo domínio. Após essas transformações, obtemos o seguinte termo. [i ? : N; ∆PocosSt; ∆SistemaSt | i ? ∈ dom pocos1 (pocos1 (i ?)).status = PRODUZINDO indexPocoTeste 0 = i ? ∧ (pocos 0 (i ?)).status = TESTANDO {i ?} − C pocos1 = {i ?} − C pocos10 i ? ∈ dom dutos1 ∧ indexTeste10 = i ? θSistemaSt \ (indexTeste) = θ(SistemaSt)0 \ (indexTeste)] 3 A partir desse termo, podemos aplicar a lei B.5 quebrando a operação Alinhamento1 em uma sequência de duas operações: uma responsável por alterar os componentes em PocosSt e a outra, pelos componentes em SistemaSt . As OPs são facilmente descartadas uma vez que as partições alteram apenas seus próprios componentes. vA [B.5] [i ? : N; ∆SistemaSt; ΞPocosSt | i ? ∈ dom dutos1 indexTeste10 = i ? θSistemaSt \ (indexTeste) = θ(SistemaSt)0 \ (indexTeste)] ; [i ? : N; ∆PocosSt; ΞSistemaSt | i ? ∈ dom pocos1 − pocos1 = {index ?} − {index ?} C C pocos10 (pocos1 (index ?)).status = PRODUZINDO (pocos 0 (index ?)).status = TESTANDO indexPocoTeste 0 = index ?] Agora devemos introduzir o paralelismo entre as ações. alizado mediante a aplicação da lei B.8. parâmetro e a expressão index Esse passo é re- Passamos o canal indicePoco como como a nova expressão da segunda ação da com- posição paralela (TratarAlinhamento ). ≡ ( [B.8] [i ? : N; ∆SistemaSt; ΞPocosSt | i ? ∈ dom dutos1 indexTeste10 = i ? θSistemaSt \ (indexTeste) = θ(SistemaSt)0 \ (indexTeste)] ; indicePoco !i → Skip |[α(SistemaSt) | {indicePoco} | α(PocosSt)]| indicePoco ?index → [index ? : N; ∆PocosSt; ΞSistemaSt | index ? ∈ dom pocos1 − pocos1 = {index ?} − {index ?} C C pocos10 (pocos1 (index ?)).status = PRODUZINDO (pocos 0 (index ?)).status = TESTANDO indexPocoTeste 0 = index ?] ) \ {indicePoco} Aplicando as denições dos parágrafos mos o seguinte termo. A função α(S ) Alinhar e TratarAlinhamento , obteS , retorna o aplicada à um esquema conjunto de todos os nomes dos componentes do schema. ≡ ( [Denições] Alinhar |[α(SistemaSt) | {indicePoco} | α(PocosSt)]| TratarAlinhamento 4 ) \ {indicePoco} Finalmente, devemos expandir o conjunto de canais de sincronização da composição paralela. Aplicamos a Lei B.9 para adicionar os canais remanescentes do conjunto PocoSync . Como os canais não são utilizados pelas partes da com- posição paralela, a lei pode ser aplicada. Para concluir o renamento da ação, aplicamos a lei B.28. Analogamente a aplicação anterior, a OP gerada é facilmente descartada. ≡ [B.9 e B.28] ( Alinhar |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAlinhamento ) \ PocoSync Concluímos o renamento de de Alinhamento1 . Partiremos para o renamento IniciarEnchimento1 . IniciarEnchimento1 vA (Encher |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAbrirValvula ) \ PocoSync Para tal, iniciamos pegando a denição da operação e realizamos cálculos de schemas de Z semelhante ao que zemos com a operação de Alinhamento1 . O termo resultante divide seus predicados nas duas partições já conhecidas, PocosSt e SistemaSt . [∆PocosSt; ∆SistemaSt | valvulaDrenagem 0 .status = FECHADA valvulaEntrada 0 .status 6= FECHADA ∧ modo10 = ENCHIMENTO θSistemaSt \ (modo1 , valvulaEntrada, valvulaDrenagem) = θ(SistemaSt)0 \ (modo1 , valvulaEntrada, valvulaDrenagem) (pocos10 (indexPocoTeste)).valvula.status 6= FECHADA C pocos1 {indexPocoTeste} − C pocos10 = {indexPocoTeste} − indexPocoTeste 0 = indexPocoTeste] Mais uma vez iremos quebrar esta operação em uma sequência de operações que atuam sobre partições disjuntas. Utilizaremos novamente a lei B.5 para esse propósito. vA [B.5] 0 [∆SistemaSt; ΞPocosSt | valvulaDrenagem .status = FECHADA valvulaEntrada 0 .status 6= FECHADA ∧ modo10 = ENCHIMENTO 5 θSistemaSt \ (modo1 , valvulaEntrada, valvulaDrenagem) = θ(SistemaSt)0 \ (modo1 , valvulaEntrada, valvulaDrenagem)] ; [∆PocosSt; ΞSistemaSt | (pocos10 (indexPocoTeste)).valvula.status 6= FECHADA {indexPocoTeste} − C pocos10 = {indexPocoTeste} − C pocos1 indexPocoTeste 0 = indexPocoTeste] Aplicando as denições dos parágrafos Encher e IniciarEnchimentoPocos . ≡ [Denições] IniciarEnchimentoSistema Devemos introduzir o canal IniciarEnchimentoPocos ; abrirValvula na segunda parte da sequência das operações. A lei B.18 é utilizada e como as operações não utilizam canal algum, a OP gerada pela aplicação é facilmente descartada. ≡ [B.18] IniciarEnchimentoSistema (abrirValvula → IniciarEnchimentoPocos) \ {abrirValvula} ; Iremos agora, expandir o ocultamento do canal abrirValvula para toda a expressão semelhante o que zemos no renamento original. ≡ [B.20, B.22] (IniciarEnchimentoSistema ; abrirValvula → IniciarEnchimentoPocos) \ {abrirValvula} Em seguida, devemos introduzir o paralelismo sobre o canol abrirValvula . Aplicamos a lei B.25. ≡ [B.25, B.22] ( (IniciarEnchimentoSistema) ; (abrirValvula → IniciarEnchimentoPocos |[α(PocosSt) | {abrirValvula} | α(SistemaSt)]| abrirValvula → Skip) ) \ {abrirValvula} Mudaremos agora a ordem das partes da composição paralela, aplicando a propriedade da comutatuvidade. ≡ [B.7] ( (IniciarEnchimentoSistema) 6 ; (abrirValvula → Skip |[α(SistemaSt) | {abrirValvula} | α(PocosSt)]| abrirValvula → IniciarEnchimentoPocos) ) \ {abrirValvula} Finalmente aplicamos a lei B.11 para passar a operação IniciarEnchimentoSistema para dentro da composição paralela. As OPs relacionadas a funções sintáticas são facilmente descartadas, no entanto a OP relacionada a propriedade de divergência necessita de um vericador de modelos para vericação. ≡ [B.11] ( ((IniciarEnchimentoSistema) ; (abrirValvula → Skip) |[α(SistemaSt) | {abrirValvula} | α(PocosSt)]| abrirValvula → IniciarEnchimentoPocos) ) \ {abrirValvula} Analogamente ao renamento da operação Alinhamento1 , devemos expandir o conjunto de canais de sincronização da composição paralela. Mais uma vez, PocoSync TratarAbrirValvula , concluíre- aplicamos a Lei B.9 para adicionar os canais remanescentes do conjunto Encher IniciarEnchimento1 e a lei B.28. Aplicando as denições de mos o renamento de e ≡ [B.9 e B.28] ( ((IniciarEnchimentoSistema) ; (abrirValvula → Skip) |[α(SistemaSt) | PocoSync | α(PocosSt)]| abrirValvula → IniciarEnchimentoPocos) ) \ PocoSync ≡ [Denições] ( (Encher ) |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAbrirValvula) ) \ PocoSync O próximo renamento será o da operação FinalizarTeste1 . Devemos provar que essa operação é renada pela composição paralela das ações TratarFinalizar . 7 Finalizar e FinalizarTeste1 vA (Finalizar |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarFinalizar ) \ PocoSync Não iremos apresentar detalhamente esse renamento, pois ele apresenta IniciarEnchimento1 . ResumidaFinalizarTesteSistema e FinalizarPocos . Em seguida iremos inserir o canal finalize na parte referente a partição dos poços. Iremos expandir o ocultação sobre o canal finalize . Adiante, é introduzido a paralelização sobre o lado direito da sequência de operações. A operação Finalizar os mesmos passos do renamento da operação mente,iremos quebrar a operação em é incorporada a composição paralela. Finalmente, adiciona-se os canais que faltam para completar o conjunto PocoSync dentro dos canais de sincronização da composição paralela. PocoDuto . Conseguimos provar com base no Producao1 é igual a ProducaoPocos . Intuitivamente, A última ação a ser renada é a cálculo de schemas de Z que as operações de produção fazem uso apenas do conjunto de poços. As outras operações contidas na ação PassoExecucao não são alteradas, com exceção de PocoDuto, pois as mesmas referenciam apenas os elementos que fazem parte do SistemaSt . PocoDuto1 vA ( (fluidoTeste !v → (retorno ?r → PocoDutoPocos)) |[α(PocosSt) | PocoSync | α(SistemaSt)]| (fluidoTeste ?f 2 → (PocoDutoSistema ; (retorno !r 2 → Skip ))) ) \ PocoSync Partimos da denição da operação PocoDuto1 . O objetivo é quebrar em duas operações, uma sendo responsável por alterar a sequência de poços e a outra, possível de alterar a sequência de dutos e o resto do sistema. [∆State1 ; vazaoTeste, volumePacote : real ; comprimento : N | comprimento = (dutos1 (indexTeste1 )).comprimento vazaoTeste = min{(pocos1 (indexPocoTeste)).valvula.vazao, (pocos1 (indexPocoTeste)).volume} volumePacote = min{vazaoTeste, (dutos1 (indexTeste1 )).capacidade} (dutos10 (indexTeste1 )).capacidade = (dutos1 (indexTeste1 )).capacidade − volumePacote (pocos10 (indexPocoTeste)).volume = (pocos1 (indexPocoTeste)).volume − volumePacote (dutos10 (indexTeste1 )).pacotesOleo = (dutos1 (indexTeste1 )).pacotesOleo⊕ {(comprimento 7→ (volumePacote + (dutos1 (indexTeste1 )).pacotesOleo(comprimento)))} {indexPocoTeste} − C pocos1 = {indexPocoTeste} − C pocos10 {indexTeste1 } − C dutos1 = {indexTeste1 } − C dutos10 0 θState1 \ (pocos1 , dutos1 ) = θ(State1 ) \ (pocos1 , dutos1 )] Deverá haver canais de comunicação, já que os dutos necessitam acessar o valor de uido que chega neles, enquanto que os poços devem saber se houve 8 alguma retenção de uido de modo que ele não tenha entrada no correspondente duto e tenha retornado. Assim, introduzimos a idéia de uido e retorno no novo esquema a partir de uma transformação no predicado do esquema original. Ao nal desse cálculo de Z obtemos o seguinte termo. [∆PocosSt; ∆SistemaSt; f 2, r 2 : real | f 2 = (pocos1 (indexPocoTeste)).valvula.vazao r 2 = max{f ! − (dutos1 (indexTeste1 )).capacidade, 0} (pocos10 (indexPocoTeste)).volume = (pocos1 (indexPocoTeste)).volume − f 2 + r 2 {indexPocoTeste} − C pocos1 = {indexPocoTeste} − C pocos10 0 indexPocoTeste = indexPocoTeste ∃ volumePacote : real ; comp : N | volumePacote = min{f 2, (dutos1 (indexTeste1 )).capacidade} comprimento = (dutos1 (indexTeste1 )).comprimento • (dutos10 (indexTeste1 )).capacidade = (dutos1 (indexTeste1 )).capacidade − volumePacote (dutos10 (indexTeste1 )).pacotesOleo = (dutos1 (indexTeste1 )).pacotesOleo⊕ {(comprimento 7→ (volumePacote! + (dutos1 (indexTeste1 )).pacotesOleo(comprimento)))} {indexTeste1 } − C dutos1 = {indexTeste1 } − C dutos10 θSistemaSt \ (dutos1 ) = θ(SistemaSt)0 \ (dutos1 )] A partir desse schema, quebramos essa operação em duas: PocoDutoSistema , PocoDutoPocos e através da aplicação da lei B.5. Note que as operações aces- sam valores de outras partições, esses valores serão transmitidos via comunicação interna, no entanto, as mesmas só modicam os componentes pertecentes a suas respectivas partições. ≡ [B.5 e Denições] (PocoDutoSistema(f , r 2)) ; (PocoDutoPocos(f , r 2)) Mais uma vez, aplicaremos a lei B.8 para introduzir o paralelismo das ações. ≡ [B.8] ( (PocoDutoSistema(f , r 2) ; (retorno !r 2 → Skip)) |[α(SistemaSt) | {retorno} | α(PocosSt)]| (retorno !r → PocoDutoPocos(f , r )) ) \ {retorno} Iremos aplicar a propriedade da comutatividade, alterando a ordem em que as ações aparecem na composição paralela. ≡ [B.7] ( (retorno !r → PocoDutoPocos(f , r )) |[α(PocosSt) | {retorno} | α(SistemaSt)]| (PocoDutoSistema(f , r 2) ; (retorno !r 2 → Skip)) ) \ {retorno} 9 Em seguida, adicionamos mais um canal na comunicação das partes que fazem a composição paralela. O objetivo é que os poços enviem o valor do uído de teste através do canal de comunicação fluidoTeste para o duto. ≡ [B.10] ( ( fluidoTeste !f → (retorno !r → PocoDutoPocos(f , r )) |[α(PocosSt) | {retorno} ∪ {fluidoTeste} | α (SistemaSt)]| (fluidoTeste ?f 2 → (PocoDutoSistema(f 2, r 2) ; (retorno !r 2 → Skip))) ) \ {retorno} ) \ {fluidoTeste} Para terminar o renamento, fazemos às seguintes operações: Aplicamos a lei B.27 para unir os canais que estão ocultos na composição paralela; as leis B.28 e B.9 para que a comunicação presenta na composição paralela seja realizada via o conjunto de canais PocoSync; utilizamos as denições das ações TratarEnvioFluido . Finalmente, namento de PocoDuto . e EnviarFluido obtemos o seguinte termo, concluindo o re- ( (EnviarFluido) |[α(PocosSt) | PocoSync | α(SistemaSt)]| (TratarEnvioFluido) ) \ PocoSync Ao nal do renamento de PocoDuto , a operação PassoExecucao terá suas operações denidas em termos das partições, tendo o seguinte termo resultante. Mais uma vez, utilizaremos o símbolo k para ocultar os componentes da par- alelização. (ProducaoPocos ; (producao !volProd → Skip)) ; ((TanqueDreno1 ; (dreno !volDren → Skip)) ; (DutoTanque1 (TratarEnvioFluido k EnviarFluido ) \ PocoSync)) ; O objetivo consiste em alterar esse termo de forma que se torne a composição paralela das ações PassoExecucaoSistema tanto, nosso primeiro passo será trazer a operação e PassoExecucaoPocos . PorDutoTanque1 para dentro da composição paralela através da aplicação da lei B.11. ≡ [B.11] (ProducaoPocos ; ; (producao !volProd → Skip)) ((TanqueDreno1 (DutoTanque1 ; ; (dreno !volDren → Skip)) ; ( TratarEnvioFluido 10 k EnviarFluido ) \ PocoSync)) Iremos realizar uma estratégia parecida com o que zemos com na operação TanqueDreno , DuntoTanque1 realizando também a expansão do ocultamento de PocoSync . ≡ [B.11, B.20, B.22] ((ProducaoPocos ; ; (producao !volProd → Skip)) ( ((TanqueDreno1 (dreno !volDren → Skip)) ; DutoTanque1 ; ; TratarEnvioFluido k EnviarFluido ))) \ PocoSync Observe que a primeira parte da composição paralela é igual a denição da ação PassoExecucaoSistema . PassoExecucaoSistema nome Substituímos essa primeira parte pela chamada ao e em seguida aplicamos a comutatividade para in- serir a ação que falta para completarmos a denição da ação ≡ PassoExecucaoPocos [B.7] ((ProducaoPocos ; ; (producao !volProd → Skip)) ( EnviarFluido k PassoExecucaoSistema )) \ PocoSync Para concluir, devemos: aplicar novamente a lei B.11, introduzindo a parte de produção na partição de poços; aplicar comutatividade e nalmente, substituir a denição da ação pelo nome PassoExecucaoPocos ≡ [B.11 B.7] (PassoExecucaoSistema k PassoExecucaoPocos ) \ PocoSync Nesse momento, iremos substituir o que obtemos com relação ao renamento de PassoExecucao na prova do lema. Substituímos a respectiva operação, pela composição paralela das operações PassoExecucaoPocos 11 e PassoExecucaoPocos . Aplicamos também a propriedade da associatividade sobre operações em sequência. ≡ [B.16] (tick → (VerificarVolumeTanque1 )) ; DinamicaExecucao1 ; ( (PassoExecucaoSistema k PassoExecucaoPocos) \ PocoSync ) ; ( (µ X • RunPocos ; X) k (µ X • RunSistema ; X) ) PocoSync para RunPocos e RunSistema . Além disso, introduzimos Skip nas operações PassoExecucaoPocos e PassoExecucaoSistema . Aplicando as leis B.20 e B.22 expandimos o ocultamento de incluir também as chamadas recursivas de ≡ [B.20, B.22, B.26,] (tick → (VerificarVolumeTanque1 )) ; DinamicaExecucao1 PassoExecucaoSistema ; ( ; Skip k PassoExecucaoPocos ; Skip ; ( (µ X • RunPocos ; X) k (µ X • RunSistema ; X) )) \ PocoSync Agora iremos trazer PassoExecucaoSistema para dentro da partição da comRunSistema . Para isso, inicialmente iremos retirar PassoExecucaoSistema de suas composições paralelas. posição paralela que contém PassoExecucaoPocos e ≡ [B.11] (tick → (VerificarVolumeTanque1 )) ; DinamicaExecucao1 ; (PassoExecucaoSistema ; PassoExecucaoPocos ; Skip k Skip 12 ; ( (µ X • RunPocos ; X) k (µ X • RunSistema ; X) )) \ PocoSync Eliminaremos a composição paralela do Skip. Primeiramente, transformamos essa composição em Skip e depois aplicamos a lei B.26 para eliminar completamente a ação Skip. ≡ (tick → (VerificarVolumeTanque1 )) ; DinamicaExecucao1 ; (PassoExecucaoSistema ; [B.26, B.12] PassoExecucaoPocos ; ( (µ X • RunPocos ; X) k (µ X • RunSistema ; X) )) \ PocoSync Finalmente moveremos cada um dos PassosExecucao para dentro da com- posição paralela. Note que devemos aplicar comutatividade da composição paralela para inserir o PassoExecucaoSistema na partição correta. ≡ [B.11, B.7] (tick → (VerificarVolumeTanque1 )) ; DinamicaExecucao1 ; (( (PassoExecucaoPocos ; (µ X • RunPocos ; X )) k (PassoExecucaoSistema ; (µ X • RunSistema ; X )) )) \ PocoSync PassoExecucaoPocos e PassoExecucaoSistema . DinamicaExecucao1 pode ser renada pela composição paralela TratarRequisicaoPocos e DinamicaExecucaoSistema . Vamos então coletar a denição de DinamicaExecucao1 substituindo algumas ações pelo o termo resultante dos renamentos anteriores (Alinhamento1 , IniciarEnchimento1 e FinalizarTeste1 ). Concluímos o renamento das ações Na continuação da prova do lema, devemos provar que a ação 13 (hmodo1 = SEM TESTE i & indexP ?i → ( (Alinhar |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAlinhamento ) \ PocoSync)) 2 (hmodo1 = CONDICIONAMENTOi & ( (htc1 6= 0i & DecrementarTc1 ) 2 (htc1 = 0 ∧ alturaFluido = 0i & (Encher |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAbrirValvula ) \ PocoSync) 2 (htc1 = 0 ∧ alturaFluido 6= 0i & IniciarEsvaziamento1 )) ) 2 (hmodo1 = ESVAZIAMENTOi & ( (halturaFluido = 0i & (Encher |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarAbrirValvula ) \ PocoSync) 2 (halturaFluido 6= 0i & Skip)) ) 2 (hmodo1 = ENCHIMENTOi & ( (hte1 6= 0i & DecrementarTe1 ) 2 (hte1 = 0i & IniciarDecantacao1 ) ) ) 2 (hmodo = DECANTAMENTOi & Skip) 2 (fimDecant → IniciarDrenagem) 2 (hmodo1 = ABORTAGEM i & ( Finalizar |[ α(SistemaSt) | PocoSync | α(PocosSt) ]| TratarFinalizar ) \ PocoSync) 2 (hmodo1 = DRENAGEM i & ( (halturaFluido > altA1 i & AbertA1 ) 2 (halturaFluido > altB1 ∧ alturaFluido ≤ altA1 i & AbertB1 ) 2 (halturaFluido > altC1 ∧ alturaFluido ≤ altB1 i & AbertC1 ) 2 (halturaFluido > altD1 ∧ alturaFluido ≤ altC1 i & AbertD1 ) 2 (halturaFluido > altE1 ∧ alturaFluido ≤ altD1 i & AbertE1 ) 2 (halturaFluido ≤ altE1 i & AbertF1 ) 2 (sensorInterface → ((Coletar1 ; (saida !altOleo → Skip)) ; (Finalizar |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarFinalizar ) \ PocoSync)) ) ) 2 (abort → ( (Finalizar 14 |[α(SistemaSt) | PocoSync | α(PocosSt)]| TratarFinalizar ) \ PocoSync)) Dado o tamanho da ação, iremos renar partes da mesma, de forma a facilitar a compreensão do processo. Depois de ter realizado os renamentos das partes, iremos apresentar o estado atual da ação. Partiremos do renamento da seguinte ação. (hmodo1 = SEM TESTE i (Alinhar k TratarAlinhamento ) \ PocoSync)) & indexP ?i → ( O primeiro passo será expandir o ocultamento de PocoSync sobre toda a expressão. ≡ [B.3, B.26, B.20, B.22] (hmodo1 = SEM TESTE i & indexP ?i → ( (Alinhar k TratarAlinhamento ))) \ PocoSync Nesse momento, vamos introduzir a guarda e a comunicação do canal sobre a ação Alinhar indexP da composição paralela. Para tal, iremos incluir a ação primitiva Skip e organizar os termos de forma que se estabeleça uma ação que precede sequencialmente a composição paralela. ≡ [B.26, B.3, B.16] ( (hmodo1 = SEM TESTE i ; & indexP ?i → Skip) ( (Alinhar k TratarAlinhamento) ) ) \ PocoSync Para nalizar esse renamento, temos que incorporar a dada ação na composição paralela e em seguida, remover o Skip. Para eleminar o Skip, primeiro, alteramos a estrutura do prex na composição sequencial (associatividade). ≡ [B.11, B.16, B.26] ((hmodo1 = SEM TESTE i & (indexP ?i → Alinhar )) k (TratarAlinhamento) 15 ) \ PocoSync Agora, vamos apresentar o renamento do comportamento do sistema quando o mesmo está em fase de condicionamento. (hmodo1 = CONDICIONAMENTOi & ( (htc1 6= 0i & DecrementarTc1 ) 2 (htc1 = 0 ∧ alturaFluido = 0i & (Encher k TratarAbrirValvula ) \ PocoSync) 2 (htc1 = 0 ∧ alturaFluido 6= 0i & IniciarEsvaziamento1 )) ) Primeiramente, iremos distribuir a guarda que diz respeito ao modo do sistema sobre as escolhas externas. ≡ [B.4, B.2] (hmodo1 = CONDICIONAMENTO ∧ tc1 6= 0i & DecrementarTc1 ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i & (Encher k TratarAbrirValvula ) \ PocoSync) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido 6= 0i Em seguida, expandimos mais uma vez, o ocultamento de PocoSync & IniciarEsvaziamento1 ) sobre todo a expressão. ≡ [B.20, B.26, B.3, B.23] ((hmodo1 = CONDICIONAMENTO ∧ tc1 6= 0i & DecrementarTc1 ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i & (Encher k TratarAbrirValvula )) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido 6= 0i & IniciarEsvaziamento1 ) ) \ PocoSync Por m, devemos introduzir a guarda na composição paralela. Esse renamento que já foi utilizado anteriormente, consiste em introduzir o Skip, utilizar a 16 propriedade da associatividade na guarda, introduzir na paralelização e realizar o inverso dos passos iniciais para remover o Skip. ≡ [B.26, B.3, B.11, B.3, B.26] ((hmodo1 = CONDICIONAMENTO ∧ tc1 6= 0i & DecrementarTc1 ) 2 ((hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i & Encher ) k TratarAbrirValvula ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido 6= 0i & IniciarEsvaziamento1 ) ) \ PocoSync A parte da ação DinamicaExecucao responsável pelo comportamento do sis- tema na fase de esvaziamento têm no seu renamento as mesmas aplicações de leis que o renamento anterior. Para facilitar a compreensão, não iremos nos ater a repetição desses passos, apresentaremos apenas o termo resultante. ( ((hmodo1 = ESVAZIAMENTO ∧ alturaFluido = 0i & Encher ) k TratarAbrirValvula) 2 (hmodo1 = ESVAZIAMENTO ∧ alturaFluido 6= 0i & Skip) ) \ PocoSync Para renar a parte da ação DinamicaExecucao responsável pelo comporta- mento do sistema em fase de abortagem, devemos: introduzir o Skip na guarda; expandir o ocultamento de PocoSync sobre toda a expressão; aplicar a propriedade de associatividade na guarda e na operação com o Skip; Incorporar a guarda na partição do Sistema na composição paralela. ≡ [B.26, B.3, B.20, B.22, B.11, B.3, B.26] (hmodo1 = ABORTAGEM i & Finalizar k TratarFinalizar ) \ PocoSync De forma bastante semelhante ao renamento que continha a ação paralela responsável pelo alinhamento, realizamos o renamento sobre a nalização do teste na fase de drenagem. Seguimos a mesma idéia: distribuição das guardas; combinação das guardas; expansão do ocultamento de PocoSync ; introdução do Skip rearranjo das guardas; introdução na composição paralela; eleminação do Skip. 17 ( (hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altB1 ∧ alturaFluido ≤ altA1 i & AbertB1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altC1 ∧ alturaFluido ≤ altB1 i & AbertC1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altD1 ∧ alturaFluido ≤ altC1 i & AbertD1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altE1 ∧ alturaFluido ≤ altD1 i & AbertE1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido ≤ altE1 i & AbertF1 ) 2 ((lcircguardmodo1 = DRENAGEM i & sensorInterface → (Coletar1 ; (saida !altOleo → Skip)) ; Finalizar ) k TratarFinalizar ) ) \ PocoSync O renamento simples do comportamento do sistema ao receber o sinal de aborte resulta no seguinte termo. (abort → Finalizar k TratarFinalizar ) \ PocoSync) Mediante todos esses renamentos iremos expandir o hiding sobre toda a ação DinamicaExecucao através das leis B.20 e leis B.23. ≡ [B.20, B.23] ( ((hmodo1 = SEM TESTE i & (indexP ?i → Alinhar )) k (TratarAlinhamento) ) 2 ((hmodo1 = CONDICIONAMENTO ∧ tc1 6= 0i & DecrementarTc1 ) 2 ((hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i & Encher ) k TratarAbrirValvula) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido 6= 0i ) 2( ((hmodo1 = ESVAZIAMENTO ∧ alturaFluido = 0i & Encher ) k TratarAbrirValvula) 2 (hmodo1 = ESVAZIAMENTO ∧ alturaFluido 6= 0i ) 2 (hmodo1 = ENCHIMENTOi & ( 18 & Skip) & IniciarEsvaziamento1 ) (hte1 6= 0i & 2 (hte1 = 0i DecrementarTe1 ) & IniciarDecantacao1 ) )) 2 (hmodo = DECANTAMENTOi & Skip) 2 (fimDecant → IniciarDrenagem) 2 ((hmodo1 = ABORTAGEM i & Finalizar ) k TratarFinalizar ) 2( (hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altB1 ∧ alturaFluido ≤ altA1 i & AbertB1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altC1 ∧ alturaFluido ≤ altB1 i & AbertC1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altD1 ∧ alturaFluido ≤ altC1 i & AbertD1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altE1 ∧ alturaFluido ≤ altD1 i & AbertE1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido ≤ altE1 i 2 ((lcircguardmodo1 = DRENAGEM i sensorInterface → (Coletar1 ; & AbertF1 ) & (saida !altOleo → Skip)) ; Finalizar ) k TratarFinalizar ) ) 2 (abort → Finalizar k TratarFinalizar ) ) \ PocoSync Observe que as partes paralelas atuam sobre as mesmas partições e sobre o mesmo conjunto de canais de sincronização. Assim, os próximos passos terão a nalidade de organizar as ações sobre essa comum composição paralela. Primeiramente, vamos unir as ações que atuam na nalização do teste através da aplicação da lei B.15. ≡ [B.14] ((hmodo1 = DRENAGEM i & sensorInterface → (Coletar1 ; (saida !altOleo → Skip)) ; Finalizar ) 2 (abort → Finalizar ) 2 (hmodo1 = ABORTAGEM i & Finalizar ) k TratarFinalizar ) Realizamos a mesma operação sobre a ação 19 TratarAbrirValvula . ≡ [B.14] ((hmodo1 = ESVAZIAMENTO ∧ alturaFluido = 0i & Encher ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i & Encher ) k TratarAbrirValvula) Após essas últimas transformações, a ação DinamicaExecucao terá o seguinte corpo. ( ((hmodo1 = SEM TESTE i & (indexP ?i → Alinhar )) k (TratarAlinhamento) ) 2( (hmodo1 = ESVAZIAMENTO ∧ alturaFluido = 0i & Encher ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i & Encher ) k TratarAbrirValvula) 2( (hmodo1 = DRENAGEM i & sensorInterface → (Coletar1 ; (saida !altOleo → Skip)) ; Finalizar ) 2 (abort → Finalizar ) 2 (hmodo1 = ABORTAGEM i & Finalizar ) k TratarFinalizar ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 6= 0i & DecrementarTc1 ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido 6= 0i & IniciarEsvaziamento1 ) 2 (hmodo1 = ESVAZIAMENTO ∧ alturaFluido 6= 0i & Skip) 2 (hmodo1 = ENCHIMENTOi & ( (hte1 6= 0i & DecrementarTe1 ) 2 (hte1 = 0i & IniciarDecantacao1 ) )) 2 (hmodo = DECANTAMENTOi & Skip) 2 (fimDecant → IniciarDrenagem) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altB1 ∧ alturaFluido ≤ altA1 i & AbertB1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altC1 ∧ alturaFluido ≤ altB1 i & AbertC1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altD1 ∧ alturaFluido ≤ altC1 i & AbertD1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altE1 ∧ alturaFluido ≤ altD1 i & AbertE1 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido ≤ altE1 i & AbertF1 ) ) \ PocoSync Intuitavamente, dividimos o conjunto dessas escolhas externas em dois grupos. O primeiro compreende as ações que já apresentam paralelismo e devemos apenas juntar as ações sobre o mesma composição paralela, através da aplicação da lei B.13 20 ≡ [B.20, B.23] (hmodo1 = SEM TESTE i & (indexP ?i → Alinhar )) 2 (hmodo1 = ESVAZIAMENTO ∧ alturaFluido = 0i & Encher ) 2 (hmodo1 = CONDICIONAMENTO ∧ tc1 = 0 ∧ alturaFluido = 0i 2 (hmodo1 = DRENAGEM i & sensorInterface → (Coletar1 ; & Encher ) (saida !altOleo → Skip)) ; Finalizar ) 2 (abort → Finalizar ) 2 (hmodo1 = ABORTAGEM i & Finalizar ) k (TratarAlinhamento 2 TratarAbrirValvula 2 TratarFinalizar ) O segundo grupo ainda não presenta elementos de paralelização. Eles deverão ser inseridos. Apresentaremos o renamento que insere a seguinte ação na paralelização. notações A1 e Para facilitar a compreenssão de todo processo utilizaremos as A2 para referir as partes das ações paralelas. (A1 k A2 ) 2 (hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) Os mesmos passos são utilizados para inserir os demais elementos do segundo grupo. No processo, é adiciona um novo canal, chamado jump que é utilizada para sincronização. O objetivo é que cada ação que não apresenta nenhum ele- Sistema , deve enviar um sinal através do Pocos para que o mesmo não que parado esperando requisições e perca a sincronização com o canal tick . Assim, ao receber um sinal do canal jump a partição não realiza nenhuma ação (Skip) e continua sua execução (executará PassoExecucaoPocos ). O primeiro passo é justamente a adição do canal jump . mento de paralelização, na partição do jump que deverá ser tratada pela partição de ≡ [B.26, B (A1 k A2 ) 2 ((hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) ; (jump → Skip) circhide{jum jump , como o mesmo pertence ao PocoSync , este está implícito dentro do ocultamento de PocoSync uma vez que podemos reduzi-lo através da lei B.27, uma vez que PocoSync∪{jump} = PocoSync . Expandimos o ocultamento sobre o canal conjunto ≡ [B.20, B.22, B.27] (A1 k A2 ) 2 ((hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) ; (jump → Skip)) Iremos transformar a ação Skip na composição paralela das ações Skip sobre as mesmas partições e sobre o mesmo conjunto de canais. Em seguida, introduz- jump para dentro dessa composição PocoSync ∪ {jump} = PocoSync no conjunto imos o canal paralela. Mais uma vez, note que de canais de sincronização. 21 ≡ [B.12, B (A1 k A2 ) 2 ((hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) ; (jump → Skip k jump → Sk Continuando o renamento, inserimos a ação dentro do composição paralela, através da lei B.11. ≡ [B.12, B.19] (A1 k A2 ) 2 ((hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) ; (jump → Skip)) k jump → Skip)) Juntamos as ações sobre a mesma composição paralela. Note que realizarmos esses passos com as outras ações, teremos várioas repetições de escolhas externas de jump → Skip. Para removermos essas repetições, aplicaremos a lei B.29. ≡ [B.13] (A1 2 ((hmodo1 = DRENAGEM ∧ alturaFluido > altA1 i & AbertA1 ) ; (jump → Skip)) k A2 2 jump → Skip) Utilizamos esses mesmos passos nas ações restantes. Ao nal do processo teremos o comportamento da atual operação em função das ações em paralelo: DinamicaExecucaoSistema e TratarRequisicaoPocos . (DinamicaExecucaoSistema k TratarRequisicaoPocos) \ PocoSyncS Diante da transformação da operação original DinamicaExecucao , voltemos a prova do lema inicial. (tick → (VerificarVolumeTanque1 )) ; (DinamicaExecucaoSistema k TratarRequisicaoPocos) \ PocoSync ; (PassoExecucaoPocos ; (µ X • RunPocos ; X )) k (PassoExecucaoSistema ; (µ X • RunSistema ; X )) )) \ PocoSync (( Expandiremos o ocultamento de PocoSync sobre toda a expressão e iremos aos poucos retirar as ações da primeira composição paralela, para depois inserir na composição paralela das recursões. ≡ [B.26] ((tick → (VerificarVolumeTanque1 )) 22 ; (DinamicaExecucaoSistema ; Skip k TratarRequisicaoPocos ; Skip) ; ( (PassoExecucaoPocos ; (µ X • RunPocos X )) ; k (PassoExecucaoSistema )) \ PocoSync (µ X • RunSistema ; ; X )) Iremos retirar as ações da primeira composição paralela de forma a se forma uma sequência que será inserida na composição das recursões. Além disso, retiramos o Skip. ≡ [B.11, B.7, B.11, B.12, B.26] ((tick → (VerificarVolumeTanque1 )) (DinamicaExecucaoSistema ; ; TratarRequisicaoPocos) ; ( (PassoExecucaoPocos ; (µ X • RunPocos X )) ; k (PassoExecucaoSistema ; (µ X • RunSistema ; X )) )) \ PocoSync Inserimos as operações DinamicaExecucaoSistema e TratarRequisicaoPocos na composição paralela das recursõess. ≡ [B.11, B.7, B.11, B.7] ((tick → (VerificarVolumeTanque1 )) ( (TratarRequisicaoPocos ; ; PassoExecucaoPocos ; (µ X • RunPocos ; X )) k (DinamicaExecucaoSistema ; PassoExecucaoSistema ; (µ X • RunSistema ; X )) )) \ PocoSync Iremos mais um vez introduzir Skip, precedendo a operação de VerificarVolumeTanque1 partição Sistema . O objetivo é introduzir a operação de posição paralela responsável pela ≡ VerificarVolumeTanque1 . na parte da com- [B.26, B.16, B.7, B.11] ( (tick → ( (TratarRequisicaoPocos ; PassoExecucaoPocos (µ X • RunPocos ; X )) ; k (VerificarVolumeTanque1 ; DinamicaExecucaoSistema 23 ; PassoExecucaoSistema ; (µ X • RunSistema ; X )) )) \ PocoSync tick Como último passo, distribuímos de bre que tick já faz parte de sobre as composição paralela. Lem- PocoSync . ≡ [B.19] ( (tick → (TratarRequisicaoPocos (µ X • RunPocos ; ; PassoExecucaoPocos) ; X )) k (tick → (VerificarVolumeTanque1 (µ X • RunSistema ; ; DinamicaExecucaoSistema ; PassoExecucaoSistema) X )) ) \ PocoSync Utilizando as denições de RunPocos e RunSistema . ≡ [Denições] ( (RunPocos ; (µ X • RunPocos ; X )) k (RunSistema ; (µ X • RunSistema ; X )) ) \ PocoSync Como último passo da prova, aplicamos a duas vezes a lei 30 que dobrará cada recursão, obtendo o lado direto do lema 2.1. Com o término desse lema, terminamos o renamento de ação no qual obtivemos uma estrutura ainda que centralizada (apenas um processo), mas contendo duas partições que modicam apenas seus próprios elementos, ou seja, temos uma estrutura eminente para o renamento de processos o qual nos fornecerá uma estrutura distribuída de processos. ≡ [B.30] ( (µ X • RunPocos ; X) k (µ X • RunSistema ; X) ) \ PocoSync 24 ; A Leis de Renamento B Leis de Renamento Law 1 (Schema expressions) ASExp CSExp provided • ∀ P1 .State; P2 .State; L • R ∧ pre ASExp ⇒ pre CSExp • ∀ P1 .State; P2 .State; P2 .State 0 ; L • R ∧ pre ASExp ∧ CSExp ⇒ (∃ P1 .State 0 ; L0 • R 0 ∧ ASExp) Law 2 (Guard combination) g1 & (g2 & A) = (g1 ∧ g2 ) & A Law 3 (Guard/Sequenceassociativity) (g & A1 ); A2 = g & (A1 ; A2 ) Law 4 (Guard/External choicedistribution) g & (A1 2 A2 ) = (g & A1 ) 2 (g & A2 ) Law 5 (Schema expression/Sequenceintroduction) [∆S1 ; ∆S2 ; i ? : T | preS1 ∧ preS2 ∧ CS1 ∧ CS2 ] vA [∆S1 ; ΞS2 ; i ? : T | preS1 ∧ CS1 ]; [ΞS1 ; ∆S2 ; i ? : T | preS2 ∧ CS2 ] provided • α(S1 ) ∩ α(S2 ) = ∅ • FV (preS1 ) ⊆ α(S1 ) ∪ {i ?} • FV (preS2 ) ⊆ α(S2 ) ∪ {i ?} • DFV (CS1 ) ⊆ α(S10 ) • DFV (CS2 ) ⊆ α(S20 ) • UDFV (CS2 ) ∩ DFV (CS1 ) = ∅ Law 6 (Initialisation schema/Sequenceintroduction ) ∗ 25 [ S10 ; S20 | CS1 ∧ CS2 ] = [ S10 | CS1 ]; [ S20 | CS2 ] provided • α(S1 ) ∩ α(S2 ) = ∅ • DFV (CS1 ) ⊆ α(S10 ) • DFV (CS2 ) ⊆ α(S20 ) Law 7 (Parallelism composition commutativity ) ∗ A1 |[ ns1 | cs | ns2 ]| A2 = A2 |[ ns2 | cs | ns1 ]| A1 Law 8 (Sequence/Parallelism compositionintroduction 1) A1 ; A2 (e) = ((A1 ; c!e → Skip) |[ wrtV (A2 ) | {|c|} | wrtV (A2 ) ]| c?y → A2 (y)) \ {|c|} provided • c∈ / usedC (A1 ) ∪ usedC (A2 ) • y∈ / FV (A2 ) • wrtV (A1 ) ∩ usedV (A2 ) = ∅ • FV (e) ∩ wrtV (A2 before e) = ∅ Law 9 (Channel extension 1) A1 |[ ns1 | cs | ns2 ]| A2 = A1 |[ ns1 | cs ∪ {|c|} | ns2 ]| A2 provided c ∈/ usedC (A ) ∪ usedC (A ) Law 10 (Channel extension 2) 1 2 A1 |[ ns1 | cs | ns2 ]| A2 (e) = (c!e → A1 |[ ns1 | cs ∪ {|c|} | ns2 ]| c?x → A2 (x )) \ {|c|} provided • c∈ / usedC (A1 ) ∪ usedC (A2 ) • x∈ / FV (A2 ) • FV (e) ∩ wrtV (A2 before e) = ∅ 26 Law 11 (Parallelism composition/Sequencestep ) ∗ (A1 ; A2 ) |[ ns1 | cs | ns2 ]| A3 = A1 ; (A2 |[ ns1 | cs | ns2 ]| A3 ) provided • initials(A3 ) ⊆ cs • cs ∩ usedC (A1 ) = ∅ • wrtV (A1 ) ∩ usedV (A3 ) = ∅ • A3 is divergence-free • wrtV (A1 ) ⊆ ns1 Law 12 (Parallelism composition unit ) ∗ Skip |[ ns1 | cs | ns2 ]| Skip = Skip Law 13 (Parallelism composition/External choiceexchange) (A1 |[ ns1 | cs | ns2 ]| A2 ) 2 (B1 |[ ns1 | cs | ns2 ]| B2 ) = (A1 2 B1 ) |[ ns1 | cs | ns2 ]| (A2 2 B2 ) provided A |[ ns | cs | ns ]| B = A |[ ns | cs | ns ]| B = Stop Law 14 (Parallelism composition/External choicedistribution ) 1 1 2 2 2 1 2 1 ∗ 2 i • (Ai |[ ns1 | cs | ns2 ]| A) = (2 i • Ai ) |[ ns1 | cs | ns2 ]| A provided • initials(A) ⊆ cs • A is deterministic Law 15 (Parallelism composition/External choiceexpansion ) ∗ (2 i • ai → Ai ) |[ ns1 | cs | ns2 ]| (2 j • bj → Bj ) = (2 i • ai → Ai ) |[ ns1 | cs | ns2 ]| ((2 j • bj → Bj ) 2 (c → C )) provided • S i {ai } ⊆ cs • c ∈ cs S • c∈ / i {ai } S • c∈ / j {bj } 27 Law 16 (Prex/Sequential compositionassociativity) c → (A1 ; A2 ) = (c → A1 ); A2 c.e → (A1 ; A2 ) = (c.e → A1 ); A2 provided FV (A ) ∩ α(c) = ∅ Law 17 (Prex/Hiding ) 2 ∗ (c → Skip) \ {c} = Skip (c.e → Skip) \ {c} = Skip Law 18 (Prex introduction ) ∗ A = (c → A) \ {| c |} provided c ∈/ usedC (A) Law 19 (Prex/Parallelism compositiondistribution) c → (A1 |[ ns1 | cs | ns2 ]| A2 ) = (c → A1 ) |[ ns1 | cs ∪ {|c|} | ns2 ]| (c → A2 ) c.e → (A1 |[ ns1 | cs | ns2 ]| A2 ) = (c.e → A1 ) |[ ns1 | cs ∪ {|c|} | ns2 ]| (c.e → A2 ) provided c ∈/ usedC (A ) ∪ usedC (A ) Law 20 (Hiding Identity ) 1 2 or c ∈ cs ∗ A \ cs = A provided cs ∩ usedC (A) = ∅ Law 21 (Hiding combination) (A \ cs1 ) \ cs2 = A \ (cs1 ∪ cs2 ) Law 22 (Hiding/Sequencedistribution ) ∗ (A1 ; A2 ) \ cs = (A1 \ cs); (A2 \ cs) Law 23 (Hiding/External choicedistribution ) ∗ (A1 2 A2 ) \ cs = (A1 \ cs) 2 (A2 \ cs) provided (initials(A1 ) ∪ initials(A2 )) ∩ cs = ∅ 28 Law 24 (Schemas/Parallelism compositiondistribution ) ∗ SExp ; (A1 |[ ns1 | cs | ns2 ]| A2 ) = (SExp ; A1 ) |[ ns1 | cs | ns2 ]| A2 provided • wrtV (SExp) ⊆ ns1 • wrtV (SExp) ∩ usedV (A2 ) = ∅ Law 25 (Parallelism composition introduction 1 ) ∗ c → A = (c → A |[ ns1 | {| c |} | ns2 ]| c → Skip) c.e → A = (c.e → A |[ ns1 | {| c |} | ns2 ]| c.e → Skip) provided • c∈ / usedC (A) • wrtV (A) ⊆ ns1 Law 26 (Sequence unit) (A)Skip; A (B )A = A; Skip Law 27 (Hiding combination) (A \ cs1 ) \ cs2 = A \ (cs1 ∪ cs2 ) Law 28 (Hiding expansion 2 ) ∗ A \ cs = A \ cs ∪ {c} provided c ∈/ usedC (A) Law 29 (External choice elimination ) ∗ A2A=A Law 30 (Recursion unfold) µ X • F (X ) = F (µ X • F (X )) Law 31 (Recursionleast xed-point) F (Y ) vA Y ⇒ µ X • F (X ) vA Y 29 Law 32qd(Process splitting) rd stand for the declarations of the processes Q and R , deterQ.State , Q.PPar , and Q.Act , and R.State , R.PPar , and R.Act , respectively, and pd stand for the process declaration. Let and mined by process P = b begin state State = b Q.State ∧ R.State Q.PPar ∧Ξ R.State R.PPar ∧Ξ Q.State • F (Q.Act, R.Act) end Then pd = (qd rd process P = b F (Q, R) ) provided Q.PPar and R.PPar are disjoint with respect to Q.State . 30 R.State and