• Nenhum resultado encontrado

Estendendo CRefine para o suporte de táticas de refinamento

N/A
N/A
Protected

Academic year: 2017

Share "Estendendo CRefine para o suporte de táticas de refinamento"

Copied!
138
0
0

Texto

(1)

UNIVERSIDADEFEDERALDO RIO GRANDE DO NORTE

UNIVERSIDADEFEDERAL DORIOGRANDE DONORTE CENTRO DECIÊNCIASEXATAS E DATERRA

DEPARTAMENTO DEINFORMÁTICA EMATEMÁTICA APLICADA PROGRAMA DEPÓS-GRADUAÇÃO EMSISTEMAS ECOMPUTAÇÃO

Estendendo CRefine para o Suporte de Táticas

de Refinamento

Madiel de Sousa Conserva Filho

Orientador: Prof. Dr. Marcel Vinicius Medeiros Oliveira

Dissertação de Mestrado apresentada ao Pro-grama de Pós-Graduação em Sistemas e Computação do Departamento de Informá-tica e MatemáInformá-tica Aplicada da Universidade Federal do Rio Grande do Norte como requi-sito para a obtenção do grau de Mestre em Sistemas e Computação.

(2)

Divisão de Serviços Técnicos

(3)

Agradecimentos

Em primeiro lugar, agradeço a Deus pela oportunidade e capacidade dada para alcan-çar mais um objetivo na minha vida.

Aos meus pais, Madiel e Déborah, pelo apoio durante toda a minha vida e por não medirem esforços para os meus estudos.

Aos meus tios, irmãos e primos, que sempre me motivaram a dar novos passos na área acadêmica.

Ao professor Marcel Oliveira, pelo suporte e orientação sempre presente e por confiar no meu trabalho.

A Alessandro Gurgel, por tirar inúmeras dúvidas sobre o funcionamento da ferra-mentaCRefinee por ajudar a resolver algumas questões relacionadas com a extensão da ferramenta.

A Leo Freitas, por ter proporcionado algumas idéias relacionadas à CZT. A CAPES, por financiar meu trabalho no último ano do mestrado.

(4)

Resumo

A utilização de aplicações de software cada vez mais complexas está exigindo um maior investimento no desenvolvimento de sistemas, garantindo uma melhor qualidade das aplicações. Diante desse contexto, novas técnicas estão sendo utilizadas na área de Engenharia de Software, tornado o processo de desenvolvimento mais eficaz. Destacam-se, como exemplo dessas novas abordagens, os Métodos Formais. Estes métodos utilizam linguagens formais que têm sua base fundamentada na matemática, apresentando uma semântica e sintaxe bem definidas. Uma dessas linguagens éCircus, que possibilita a mo-delagem de sistemas concorrentes. Esta linguagem foi desenvolvida a partir da união dos conceitos das linguagens formais Z (que permitem a modelagem de dados complexos) e CSPCommunicating Sequential Processes(que permitem a modelagem de sistemas

con-correntes). Adicionalmente,Circustambém possui um cálculo de refinamento associado, que pode ser utilizado para desenvolver software de forma precisa e gradual. Cada etapa deste cálculo é justificada pela aplicação de uma lei de refinamento (possivelmente com a prova de certas condições chamadas de obrigações de prova). Algumas vezes, as mesmas leis podem ser aplicadas da mesma forma em diferentes desenvolvimentos ou mesmo em partes diferentes de um único desenvolvimento. Uma estratégia para otimizar esse cál-culo é formalizar estas aplicações como táticas de refinamento, que podem ser utilizadas como uma simples regra de transformação. A ferramentaCRefinefoi desenvolvida para realizar o suporte a este cálculo de refinamento deCircus. Entretanto, antes deste traba-lho, essa ferramenta não fornecia suporte para as táticas. A proposta desta dissertação é oferecer um suporte ferramental para a utilização das táticas no cálculo de refinamento de programasCircus. Para tanto, foi desenvolvido um novo módulo em CRefine, que auto-matiza o processo de definição e aplicação das táticas de refinamento. Nesta extensão as táticas são formalizadas na linguagem de táticas para sistemas concorrentes,ArcAngelC. Por fim, validamos a extensão, aplicando o novo módulo a um estudo de caso, que utiliza as táticas em uma estratégia de refinamento para verificação de implementaçõesSPARK Adade sistemas de controle. Nesta dissertação, aplicamos o novo modulo às duas fases

iniciais desta estratégia.

(5)

Abstract

The use of increasingly complex software applications is demanding greater invest-ment in the developinvest-ment of such systems to ensure applications with better quality. The-refore, new techniques are being used in Software Engineering, thus making the deve-lopment process more effective. Among these new approaches, we highlight Formal Methods, which use formal languages that are strongly based on mathematics and have a well-defined semantics and syntax. One of these languages isCircus, which can be used to model concurrent systems. It was developed from the union of concepts from two other specification languages: Z, which specifies systems with complex data, and CSP, which is normally used to model concurrent systems.Circushas an associated refinement calcu-lus, which can be used to develop software in a precise and stepwise fashion. Each step is justified by the application of a refinement law (possibly with the discharge of proof obligations). Sometimes, the same laws can be applied in the same manner in different developments or even in different parts of a single development. A strategy to optimize this calculus is to formalise these application as a refinement tactic, which can then be used as a single transformation rule. CRefinewas developed to support theCircus refine-ment calculus. However, before the work presented here, it did not provide support for refinement tactics. The aim of this work is to provide tool support for refinement tactics. For that, we develop a new module inCRefine, which automates the process of defining and applying refinement tactics that are formalised in the tactic languageArcAngelC. Fi-nally, we validate the extension by applying the new module in a case study, which used the refinement tactics in a refinement strategy for verification of SPARK Ada implemen-tations of control systems. In this work, we apply our module in the first two phases of this strategy.

(6)

Sumário

Sumário i

Lista de Figuras iv

Lista de Tabelas vi

Lista de Símbolos e Abreviações vii

1 Introdução 1

1.1 Contextualização e Motivação . . . 1

1.2 Objetivos Gerais e Específicos . . . 4

1.3 Estrutura da Dissertação . . . 4

2 Circus 6 2.1 A linguagemCircus . . . 6

2.1.1 ProgramaCircus . . . 6

2.1.2 Canais emCircus . . . 7

2.1.3 Processos emCircus . . . 7

2.2 Cálculo de Refinamento deCircus . . . 11

2.2.1 Simulação . . . 12

2.2.2 Refinamento de Ações . . . 13

2.2.3 Refinamento de Processos . . . 15

2.3 Ferramentas deCircus. . . 15

2.3.1 JCircus . . . 15

2.3.2 Model Checker . . . 16

2.3.3 CRefine . . . 17

2.4 Considerações Finais . . . 25

3 Táticas de Refinamento 26 3.1 Sintaxe deArcAngelC . . . 26

3.2 Declaração de uma Tática . . . 28

(7)

3.3 Táticas Básicas . . . 29

3.4 Tacticals . . . 29

3.5 Táticas de afirmação . . . 31

3.6 Combinadores Estruturais . . . 32

3.6.1 Combinadores Estruturais de Ações . . . 32

3.6.2 Combinadores Estruturais de Processos . . . 33

3.6.3 Combinadores Estruturais para Ações e Processos . . . 33

3.6.4 Construtores Indexados . . . 34

3.6.5 Combinador Estrutural de Programa . . . 34

3.7 Considerações Finais . . . 35

4 Estendendo CRefine 36 4.1 Nova Interface . . . 36

4.2 Utilizando as Táticas de Refinamento . . . 37

4.3 Arquitetura da Extensão . . . 42

4.3.1 Criação da Tática . . . 44

4.3.2 Aplicação da Tática . . . 45

4.4 Considerações Finais . . . 49

5 Estudo de Caso 51 5.1 Contextualização . . . 51

5.2 Estratégia para o Refinamento . . . 53

5.3 Formalização do ModeloCircus . . . 55

5.3.1 Especificação Abstrata . . . 55

5.4 Táticas de Refinamento . . . 56

5.4.1 FaseNB . . . 56

5.4.2 Fase BJ . . . 67

5.5 Executando o Estudo de Caso na Ferramenta . . . 78

5.6 Análise do Estudo de Caso . . . 80

6 Conclusão 82 6.1 Considerações Finais . . . 82

6.2 Trabalhos Relacionados . . . 83

6.2.1 Groves . . . 83

6.2.2 Ergo 6.0 . . . 84

6.2.3 Refinement Editor . . . 86

(8)

6.2.5 Key . . . 86

6.2.6 Comparação dos Trabalhos Relacionados . . . 87 6.3 Trabalhos Futuros . . . 87

Referências bibliográficas 89

A Sintaxe deCircus 94

B ModeloCircuspara os blocosSimulink 96

C Especificação emSpark Adados diagramasSimulink 103 D Táticas de Refinamento 111 E Leis de Refinamento 118

E.1 Novas Leis Implementadas na Ferramenta . . . 118 E.2 Novas Leis Definidas . . . 123 E.3 Leis Utilizadas . . . 124

(9)

Lista de Figuras

2.1 Especificação do Caixa Eletrônico . . . 10

2.2 Etapas da Estratégia de Refinamento . . . 12

2.3 Propriedades da Simulação . . . 13

2.4 Estratégia para oModel Checker . . . 17

2.5 Interface deCRefine. . . 19

2.6 Menu pop-up na Janela de Refinamento. . . 19

2.7 Tela de Parâmetros e o Teclado Virtual . . . 20

2.8 Detalhes de uma Lei de Refinamento . . . 21

2.9 Diagrama de Classes da Arquitetura Inicial deCRefine . . . 22

2.10 Carregar Especificação na Ferramenta . . . 24

3.1 Sintaxe deArcAngelC . . . 27

4.1 Funcionalidades Desejadas para a Extensão. . . 37

4.2 Nova interface deCRefine. . . 38

4.3 Editor de Táticas . . . 39

4.4 Teclado Virtual . . . 40

4.5 Aplicação de uma Tática de Refinamento . . . 41

4.6 Resultado da Aplicação da Tática . . . 42

4.7 Diagrama de Casos de Uso . . . 43

4.8 Diagrama de Classes da Extensão . . . 44

4.9 Diagrama de Sequência para Criar uma Tática . . . 45

4.10 Diagrama de Sequência para Aplicar uma Tática . . . 46

4.11 Diagrama de Classes do PacoteApply . . . 48

5.1 Controlador PID . . . 52

5.2 Subsistema Diff . . . 52

5.3 Configurações dos Blocos . . . 53

5.4 Estratégia Utilizada para o Refinamento . . . 54

5.5 Especificação Abstrata do blocoDiff . . . 55

(10)

5.6 Resultado da Aplicação da TáticaNBStep1 ao ProcessoDiff . . . 58

5.7 Resultado da Aplicação da TáticaNBStep2 ao processoDiff . . . 60

5.8 Resultado da Aplicação da TáticaNBStep3 ao ProcessoDiff . . . 61

5.9 Resultado da Aplicação da TáticaNBStep4 . . . 62

5.10 Resultado da Aplicação da TáticaNBStep5 6 ao ProcessoDiff . . . 63

5.11 Resultado da Aplicação da TáticaNBStep7 ao ProcessoDiff . . . 64

5.12 Processo Resultante da Estratégia de Refinamento . . . 65

5.13 Resultado da Aplicação deBJStep1 . . . 68

5.14 Resultado da Aplicação deBJStep2 . . . 70

5.15 Resultado da aplicação deBJStep3 . . . 71

5.16 Resultado da Aplicação da Tática BjSt4A . . . 73

5.17 Resultado da Aplicação da táticaBjSt4 HidPrep . . . 74

5.18 Resultado da TáticaBjSt4B . . . 76

5.19 Resultado da Aplicação da FaseNB . . . 79

5.20 Resultado da Aplicação da Fase BJ . . . 80

(11)

Lista de Tabelas

5.1 Dados do Estudo de Caso . . . 81

6.1 Resumo dos Trabalhos Relacionados . . . 87

(12)

Lista de Símbolos e Abreviações

AST - Abstract Syntax Tree

CSP - Communicating Sequential Processes CZT - Community Z Tools

EM - External Manager IM - Internal Manager

Kiv - Karlsruhe Interactive Verifier MVC - Model-View-Controller OPs - Obrigações de Prova

(13)

Capítulo 1

Introdução

Neste capítulo, apresentamos a contextualização e a motivação para o desenvolvi-mento deste trabalho (seção 1.1). Em seguida, descrevemos os objetivos principais e secundários desta dissertação (seção 1.2). Por fim, apresentamos uma visão geral da es-trutura do trabalho (seção 1.3).

1.1

Contextualização e Motivação

A crescente demanda por aplicações cada vez mais complexas está fazendo com que a atividade de desenvolver software utilize novas técnicas, metodologias e ferramentas, a fim de garantir mais qualidade e segurança no processo de desenvolvimento.

A área de Engenharia de Software é um campo de pesquisa que tem a preocupação com todos os elementos presentes no processo de desenvolvimento de sistemas. Essa área engloba as atividades de especificar, projetar, implementar, validar e manter o software [43]. Além disso, o uso da Engenharia de Software torna o processo de desenvolvimento mais produtivo. Entretanto, novas abordagens estão sendo incorporadas a esse processo para permitir que as aplicações sejam desenvolvidas de forma confiável. As principais razões por trás dessas novas abordagens são o desenvolvimento de novas tecnologias e o fato de que, em algumas situações, apenas a utilização dos métodos tradicionais não são suficientes para assegurar qualidade e segurança no software.

Uma abordagem que está sendo utilizada na Engenharia de Software, tanto no meio acadêmico como industrial [21, 23, 19], são os Métodos Formais [24]. Esta abordagem utiliza linguagens formais que possuem uma sintaxe e semântica bem definidas e funda-mentadas em estruturas matemáticas. Os Métodos Formais fornecem técnicas e ferramen-tas para a especificação e verificação das propriedades dos sistemas.

(14)

sis-CAPÍTULO 1. INTRODUÇÃO 2

tema. Com isso, essa técnica permite encontrar e remover falhas, ambiguidades e incon-sistências que não são tratadas utilizando apenas a especificação informal.

Outra contribuição é a possibilidade de ser utilizada para produzir documentação, que pode ser usada como um guia para as fases posteriores, como a de desenvolvimento, testes e manutenção do software. Com o sistema desenvolvido, é possível realizar a prova de que o software realmente segue a especificação formal realizada no início do processo.

Com a crescente utilização dos Métodos Formais várias linguagens são encontradas na literatura que possibilitam especificar os requisitos e as propriedades do software. Alguns exemplos dessas linguagens são: Z [48], Communicating Sequential Processes - CSP

[40], Circus [47], LOTOS [5], Alloy [42] e B [41]. Cada linguagem possui um foco específico para lidar com os diferentes aspectos de um sistema.

A linguagem de especificação formalCircusune os conceitos de Z com os conceitos de CSP. A linguagem Z é normalmente utilizada na especificação do comportamento de sistemas sequenciais e permite especificar estruturas complexas de dados. Já CSP tem uma abordagem voltada para sistemas concorrentes e permite a modelagem do comporta-mento concorrente do sistema. Além disso, CSP é utilizada para especificar a ordem em que as operações devem ser executadas. Por agregar as principais características destas duas linguagens,Circuspermite utilizar os construtores de Z e CSP livremente durante a especificação de um sistema.

A linguagemCircuspossui algumas ferramentas que foram desenvolvidas para facili-tar sua utilização. As principais ferramentas estão disponíveis no repositório dos projetos Circus1.

A semântica deCircusé definida usando aUnifying Theories of Programming- UTP [20] e é baseada nas semânticas definidas individualmente para Z e CSP [33].

Circus, além de possibilitar a especificação de aspectos de dados e comportamentais dos sistemas concorrentes, possui um cálculo de refinamentos. Este cálculo é utilizado para desenvolver software de forma precisa e gradual. Cada etapa deste cálculo consiste na aplicação de uma lei de refinamento, possivelmente com a prova de certas condições chamadas de obrigações de prova. No cálculo de refinamentos, partimos de uma especifi-cação formal abstrata para gerar uma especifiespecifi-cação concreta.

Entretanto, realizar o desenvolvimento manual utilizando o cálculo de refinamentos não é uma tarefa trivial e pode resultar em erros. Em sua grande maioria, os refinamentos são longos, repetitivos e possuem várias aplicações de leis. Para otimizar este processo, a ferramenta CRefine foi desenvolvida. Esta ferramenta oferece suporte a este cálculo através da aplicação das leis de refinamento. Algumas leis possuem obrigações de prova

(15)

CAPÍTULO 1. INTRODUÇÃO 3

(OPs), que devem ser provadas para validar a aplicação das leis de refinamento. CRefine

também gerencia as OPs e oferece a prova automática da maioria delas. Nesta versão de

CRefine são provadas restrições e funções sintáticas de Z e de Circus para predicados. Entretanto, ainda não é possível realizar a prova automática de OPs com relação aos conceitos de divergência e não-determinismo.

Durante o desenvolvimento utilizando o cálculo de refinamentos, as mesmas leis de refinamento podem ser aplicadas da mesma forma em vários desenvolvimentos ou mesmo em partes diferentes de um único desenvolvimento. Uma estratégia para otimizar esse cálculo consiste em formalizar estas aplicações como táticas de refinamento que podem ser usadas como uma regra única de transformação. Com essa abordagem, o processo do cálculo de refinamentos pode se tornar mais ágil, reduzindo tempo e esforço.

Para a utilização das táticas de refinamento é necessária uma linguagem para expressar como essas regras podem ser combinadas. Vários autores já desenvolveram linguagens de táticas de refinamento. Algumas linguagens de tática encontradas na literatura sãoAngel

[25], Ltac [11],ArcAngel[29],ArcAngelC[37], Hitac [2] e Gumtree[26].

Com o objetivo de fornecer um suporte ferramental para a linguagem de táticas de refinamento para programas concorrentes este trabalho apresenta o desenvolvimento de um novo módulo dentro deCRefine. Este módulo irá permitir a definição e aplicação de táticas de refinamento formalizadas emArcAngelC. Esta linguagem é similar à linguagem de táticas para sistemas sequenciais,ArcAngel, que possui a ferramenta Gabriel [29] para automatizar a criação e aplicação de suas táticas. As duas linguagens são baseadas na linguagem de táticas de propósito geral Angel [25]. Esta linguagem apenas define que regras transformam objetivos de prova.

A principal diferença deArcAngelCparaArcAngelé a possibilidade de definir táticas que podem ser aplicadas em ações, processos e programasCircus. As táticas emArcAngel apenas são utilizadas na formalização de táticas para programas sequenciais.

A semântica deArcAngelC [37] é baseada na semântica deArcAngel. No entanto, foi reformulada com a inclusão de algumas generalizações de maneira a levar em considera-ção todas as particularidades presentes na linguagemCircus.

ArcAngelCpossui táticas básicas, como a aplicação de uma lei de refinamento,

tacti-cals, que permitem a combinação de táticas, e os combinadores estruturais, que permitem

a aplicação de táticas a componentes específicos de um programaCircus. As táticas bási-cas e ostacticalsforam reutilizados deAngel. No entanto, elas foram reformuladas a fim

de possibilitar a aplicação de leis de refinamento para programas concorrentes.

(16)

CAPÍTULO 1. INTRODUÇÃO 4

Com isso, um diferencial nesta linguagem é a adição dos combinadores estruturais que estão relacionados com a linguagem formal CSP.

Outras ferramentas também oferecem suporte para a criação e aplicação das táticas de refinamento. Entretanto, elas não possuem o suporte para a formalização de táticas para programas concorrentes. Além disso, algumas linguagens de táticas [18, 45] não possuem todos os construtores presentes emArcAngelC. Por fim, algumas ferramentas utilizam a abordagem das táticas de refinamento para realizar o descarte das obrigações de prova [38, 4]. No caso da linguagemArcAngelC, utilizamos as táticas para auxiliar no processo do cálculo de refinamento de programas e não para a prova das OPs.

1.2

Objetivos Gerais e Específicos

O objetivo principal desta dissertação é desenvolver um novo módulo dentro da ferra-mentaCRefine, no intuito de possibilitar a criação e aplicação das táticas de refinamento de forma automática. Estas táticas são definidas utilizando a linguagem de táticas para programasCircus,ArcAngelC[37].

Através deste novo módulo, o usuário poderá adicionar, editar, remover e utilizar as táticas de refinamento no desenvolvimento de programasCircus.

Os objetivos específicos deste trabalho são:

• Desenvolver umparserpara a linguagem de táticasArcAngelC;

• Desenvolver a nova GUI e arquitetura deCRefinepara suportar a extensão;

• Definir o processo de criação e aplicação de uma tática de refinamento na ferra-menta;

• Validar o novo módulo deCRefinedesenvolvido nesse trabalho através da aplicação do mesmo a um estudo de caso.

1.3

Estrutura da Dissertação

Este trabalho está estruturado da seguinte maneira. No capítulo 2, apresentamos a lin-guagemCircus, detalhando suas principais características. Um exemplo é utilizado para descrever uma especificação Circuse seus operadores. Além disso, apresentamos uma descrição do cálculo de refinamentos deCircus. Por fim, descrevemos as principais ferra-mentas desenvolvidas para oferecer suporte à esta linguagem, em especial, a ferramenta

(17)

CAPÍTULO 1. INTRODUÇÃO 5

O capítulo 3 apresenta a linguagem de táticas de refinamento para sistemas concor-rentes,ArcAngelC. Neste capítulo, descreveremos os principais operadores utilizados para formalizar as táticas de refinamento.

O capítulo 4 descreve o novo módulo que possibilita a criação e aplicação das táticas de refinamento emCRefine. Além disso, apresentamos a nova interface, arquitetura e as principais funcionalidades desta extensão.

No capítulo 5, detalhamos a aplicação do novo módulo ao estudo de caso como forma de validar este módulo emCRefine.

Finalmente, no capítulo 6 apresentamos as considerações finais da dissertação, dis-cutimos alguns dos trabalhos relacionados e apresentamos as diversas possibilidades de trabalhos subsequentes a esta dissertação.

Este trabalho possui cinco apêndices. O apêndice A apresenta a sintaxe completa da linguagemCircus. O apêndice B descreve a especificação do modelo Circus do estudo de caso. O apêndice C apresenta o código na linguagem Spark Adada implementação

dos diagramas Simulink do estudo de caso. O Apêndice D possui a definição de todas

(18)

Capítulo 2

Circus

Este capítulo descreve a linguagem de especificação formalCircus. A seção 2.1 apre-senta uma descrição informal desta linguagem, descrevendo os principais operadores e a estrutura de um programaCircus. A seção 2.2 apresenta a estratégia utilizada para a apli-cação do cálculo de refinamento deCircus. Por fim, a seção 2.3 descreve as ferramentas que foram desenvolvidas para a utilização desta linguagem.

2.1

A linguagem

Circus

Circusé uma linguagem de especificação formal que pode ser utilizada para especifi-car sistemas concorrentes. Esta linguagem, por unir os conceitos de Z e CSP, foca tanto na parte estrutural quanto nos aspectos comportamentais das aplicações concorrentes. Um diferencial dessa linguagem é o cálculo de refinamentos de programas. Este cálculo con-siste na aplicação repetida de leis de refinamento a uma especificação abstrata a fim de produzir, passo-a-passo, uma especificação concreta e correta por construção. Cada passo corresponde à aplicação de uma lei de refinamento. Algumas destas leis possuem obriga-ções de prova que precisam ser provadas para validar a aplicação da lei. No que se segue, apresentaremos os principais componentes da linguagem formalCircus.

2.1.1

Programa

Circus

Um programa Circus é formado por uma lista de parágrafos. Cada parágrafo pode ser um parágrafo Z, uma definição de canal, uma definição de conjunto de canais ou uma definição de um processo [30].

(19)

CAPÍTULO 2. CIRCUS 7

2.1.2

Canais em

Circus

O conceito de canal emCircuspode ser entendido como a interface entre o sistema e o usuário. Além disso, canais emCircustambém podem ser utilizados internamente por processos e serem escondidos do ambiente. Um canal pode ser utilizado para comunicar valores ou não. Essa comunicação de valores ocorre tanto do usuário para o sistema (canais de entrada) quanto do sistema para o usuário (canais de saída). Quando um canal não comunica valores, ele é considerado um canal de sincronização. Estes canais têm a função de realizar um sincronismo entre os processos do sistema. Além disso, canais em Circuspodem ser utilizados por processos e serem escondidos do ambiente.

Para declarar um canal que comunica valor em Circus, utilizamos a palavra-chave

channel, seguida do nome do canal e o tipo do valor que este canal comunica. Caso este

canal seja de sincronização, o tipo deve ser omitido. Exemplos de declarações de canais podem ser observados abaixo.

channelin,out:R

channelcash,deposit,check balance

O exemplo acima apresenta os dois primeiros parágrafos da especificação do caixa eletrônico. No nosso exemplo, temos dois canais, in e out, que comunicam valores do

tipo real. Os demais canais, cash, deposit e check balance, não comunicam nenhum

valor; eles são utilizados apenas para sincronização.

2.1.3

Processos em

Circus

A estrutura de declaração de um processo é iniciada pela palavra-chaveprocess,

se-guida do nome do processo e por sua definição. Um processo emCircuspode ser decla-rado de forma explícita ou em termos de outros processos. A declaração explícita de um processo é formada por uma definição de estado, uma sequência de parágrafos e por uma ação principal, que é responsável por determinar o comportamento do processo. Para a especificação de um processo explícito é necessário utilizar as palavras reservadasbegin

eend, que representam o início e o fim da declaração deste processo, respectivamente.

O processo principal definido na especificação do nosso exemplo é o CashMachine.

Este processo é formado por uma definição de estado, três parágrafos de operações Z, uma ação fundamentalmente CSP e uma ação principal.

(20)

CAPÍTULO 2. CIRCUS 8

balance, que armazena o valor do saldo na conta. Para definir os estados de um processo

em Circus, é utilizada a palavra reservada state. A título de ilustração, apresentamos a parte inicial da definição do processo básicoCashMachine, que possui o estadoAState.

A definição completa desse processo é apresentada na Figura 2.1, no final da seção.

processCashMachine=b

stateAState= [b balance:R]

Antes de apresentar os outros elementos da especificação do caixa eletrônico, ire-mos informar os símbolos e notações da linguagem Z que são utilizados na especificação do nosso exemplo. Por exemplo, as variáveis em Z podem ser anotadas com o símbolo

dash(’) no final do seu nome. Esta anotação indica o valor final da variável. Caso a

va-riável não esteja anotada com o símbolodash, temos a representação do valor inicial da

variável. Por exemplo, nas operações que apresentaremos a seguir,balancerepresenta o

valor inicial do componente de estado ebalance′representa o seu valor final. O símbolo

∆é utilizado para indicar que a operação realiza alguma mudança no estado do processo.

Mais detalhes sobre todos os símbolos e notações utilizadas pela linguagem Z são encon-tradas em [48].

O processo também possui uma lista de parágrafos. Os parágrafos emCircuspodem ser uma operação Z ou um parágrafo CSP. No nosso exemplo, os três primeiros parágrafos da especificação do processo são operações Z como apresentados a seguir:

MStart= [b AState′|balance′=0]

MCash= [bAState|balance=balancevalue?]

MDeposit= [bAState|balance=balance+value?]

A operação ZMStart inicializa o valor do saldo para 0. A operaçãoMCashretira o

valor de entrada do saldo. Por fim, a operação MDeposit adiciona ao saldo o valor de

entrada.

Além das operações Z, um processo pode conter ações CSP e deve apresentar uma ação principal, que determina o comportamento do processo. No nosso exemplo, temos apenas uma ação CSP,Run, e em seguida a ação principal, que não possui nome.

Circus possui três ações básicas: Skip, Stop e Chaos. A ação Skip não altera o es-tado, não comunica nenhum valor e termina com sucesso. A segunda ação representa o

deadlockeChaosdivergência.

(21)

CAPÍTULO 2. CIRCUS 9

Esta ação oferece ao ambiente três opções: cash, depositecheck balance. A ação CSP Runpode ser visualizada a seguir.

Run=b cash→in?value→((balance≥value)&MCash

✷(balance<value)&Skip)

✷deposit→in?value→MDeposit

✷check balance→out!balance→Skip

Caso o ambiente escolha realizar um saque ou fazer um depósito, um valor de entrada deve ser fornecido para realizar a operação. EmCircus, comandos de guarda podem estar associados a uma ação. Por exemplo, um saque apenas é realizado caso haja saldo na conta (balance≥value). Caso contrário, a ação não executará o saque e manterá o estado

inalterado. A última escolha da açãoRun, check balance, é utilizada para obter o saldo

atual da conta, que é disponibilizado através do canal de saídaout!.

Por fim, a ação principal do processo tem um comportamento recursivo. Para definir uma ação recursiva é utilizado o símboloµ, seguido do nome do ponto de recursão e de

uma ação. A ação principal do processoCash Machineé definida a seguir.

•MStart

;

(µ X•(Run

;

X))

end

Através da ação principal, o processoCashMachineinicializa o sistema, utilizando a

açãoMStarte, em seguida, executa a açãoRunde forma recursiva.

A especificação completa desse sistema é encontrada na Figura 2.1.

Os operadores de CSP também podem ser utilizados para compor ações. Os principais operadores são:

• Composição Sequencial: A1

;

A2, define a ordem em que as ações devem ser

execu-tadas;

• Escolha Externa:A1✷A2, oferece ao ambiente as açõesA1 eA2

• Escolha Interna: A1⊓ A2, representa uma escolha entre as ações envolvidas de

forma não determinística;

• Hiding:A\cs, esconde do ambiente o canalcs;

• Paralelismo: A1|[ns1|cs|ns2]|A2;

• Interleaving: A1||[ns1|ns2]||A2.

(22)

CAPÍTULO 2. CIRCUS 10

channelin,out:R

channelcash,deposit,check balance

processCashMachine=b

begin stateAState= [b balance:R]

MStart= [b AState′|balance′=0]

MCash= [bAState|balance=balancevalue?]

MDeposit= [bAState|balance=balance+value?]

Run=b cash→in?value→((balance>value)&MCash

✷(balance<value)&Skip)

✷deposit→in?value→MDeposit

✷check balance→out!balance→Skip

•MStart

;

(µ X•(Run

;

X))

end

Figura 2.1: Especificação do Caixa Eletrônico

conjuntos disjuntos de nomes que são utilizados para particionar as variáveis do escopo. Isto é necessário a fim de evitar conflitos no acesso das variáveis. Por exemplo, a compo-sição paralela apresentada abaixo utiliza as açõesA1 eA2 que sincronizam nos canais do

conjuntocs.

A1|[ns1|cs|ns2]|A2

Além disso, estas ações têm acesso a todos os valores iniciais das variáveis. Entretanto,

A1 apenas pode modificar as ações emns1 e, semelhantemente,A2 emns2. Para as ações

deInterleaving, (A1||[ns1|ns2]||A2), temos o mesmo comportamento, no entanto, sem

realizar sincronização em nenhum canal.

Os operadores CSP também podem ser utilizados para definir processos em Circus. São eles:

• Composição Sequencial: P1

;

P2, define a ordem em que os processos devem ser

executados;

• Escolha Externa:P1✷P2, oferece ao ambiente os processosP1 eP2 ;

• Escolha Interna:P1⊓P2, representa uma escolha entre os processos envolvidos de

forma não determinística;

• Interleaving: P1|||P2, utiliza dois processos sem requerer comunicação entre eles;

• Composição paralela: P1|[cs]|P2, executa os dois processos em paralelo.

Entre-tanto, os processos devem sincronizar nos canais decs;

(23)

CAPÍTULO 2. CIRCUS 11

Além dos construtores CSP, Circuspermite definir processos indexados, x:TP, e parametrizadosx:T•P. Para estes dois tipos é necessário definir parâmetros,

semelhan-temente a uma declaração Z. Por exemplo, o processo indexado i:T⊙P se comporta

da mesma forma que o processoP. Entretanto, usa os canais definidos implicitamente.

CasoP utilize um canalc1 :N, o processo indexado comunica valores através do canal c i:T×N, que é definido implicitamente. Neste caso, o canal comunica um par, onde

o tipo do primeiro elemento é o tipo do índice e o segundo elemento é o tipo do canal original.

Nesta seção apresentamos os principais operadores da sintaxe deCircus. No entanto, a linguagem possui outros elementos, que podem ser encontrados em [30]. A sintaxe com-pleta deCircusestá presente no apêndice A. Na próxima seção, apresentamos a estratégia utilizada no processo do cálculo de refinamentos emCircus.

2.2

Cálculo de Refinamento de

Circus

O refinamento é um conceito que está diretamente ligado com o desenvolvimento de sistemas. De acordo com Cavalcanti [7], a utilização de um refinamento, mesmo sem o uso de métodos formais, pode auxiliar os engenheiros de software nas atividades de pro-jetar e programar. Entretanto, com a utilização em conjunto do refinamento e de técnicas formais têm-se a garantia de que as funcionalidades implementadas realmente seguem a especificação, ou seja, que a especificação é refinada pela implementação.

O cálculo de refinamento deCircusé uma técnica utilizada para refinar gradualmente os programas concorrentes [10]. Neste cálculo, o ponto de partida é uma especificação abstrata (geralmente centralizada) de um sistema e, através de sucessivas aplicações de leis de refinamento, obtém-se um sistema concreto (geralmente distribuído).

A estratégia de refinamento para programasCircusfoi inicialmente definida em [10]. Esta estratégia, que na maioria das vezes possui diversas iterações, envolve três etapas: si-mulação, refinamento de ações e refinamento de processos. Cada iteração do refinamento tem a função de decompor um processo.

(24)

CAPÍTULO 2. CIRCUS 12

Figura 2.2: Etapas da Estratégia de Refinamento

2.2.1

Simulação

A primeira etapa da estratégia de refinamento é utilizada para organizar a estrutura interna do processo. Para isso, esta etapa adiciona elementos concretos no sistema. A simulação é utilizada como uma técnica para provar o refinamento de dados em Z [32], que consiste em alterar a representação dos dados, mas mantendo o comportamento.

Para o refinamento em Circus, a etapa de simulação envolve uma relação entre os estados de dois processos que satisfaz algumas propriedades [10]. Estas propriedades (representadas na Figura 2.3) são responsáveis por assegurar uma transformação com preservação de comportamento entre os estados dos processos.

(25)

CAPÍTULO 2. CIRCUS 13

Figura 2.3: Propriedades da Simulação

que pode ser alcançado através da relaçãoR. Uma lei de refinamento que representa esta

propriedade de simulação é apresentada a seguir. Nesta lei o elemento L representa as

variáveis locais que são utilizadas no processo.

Law 1 (Schema expressions)

ASExp CSExp

provided

➭ ∀P1.State; P2.State; L•R∧preASExp⇒preCSExp

➭ ∀P1.State; P2.State; P2.State′; L•R∧preASExp∧CSExp⇒

(∃P1.State′; L′•R′∧ASExp) ❑

A propriedade de Correção garante que para todo estado do processo abstrato e con-creto, relacionados porR, e para todo estado concreto resultante da aplicação da açãoA2

no estadoP2.State, deve existir um estado final abstrato que é o resultado da ação deA1

sobre o estadoP1.State[30].

O resultado da etapa de simulação define um estado concreto e um esquema que re-laciona o estado abstrato com o estado concreto, a fim de que as propriedades sejam satisfeitas.

Por fim, uma simulação entre os processosP1 eP2 é uma simulação entre suas ações

principais. Além disso, a etapa de simulação preserva a estrutura das ações do processo original na definição do novo processo [30].

2.2.2

Refinamento de Ações

(26)

CAPÍTULO 2. CIRCUS 14

visualizadas na Figura 2.2 pelas caixas internas representadas no terceiro processo. Neste processo, temos o estadoSc, que é formado pela união dos estados Sc1 eSc2, as ações,

que são realizadas independentemente nos estados, e a ação principalActC, que é formada

pela combinação independente das açõesAct1CeAct2C.

Para o refinamento de ações existem aproximadamente 120 leis de refinamento [30]. A título de ilustração, temos a LeiHid-Step-2, a qual afirma que ohidingnão tem nenhum

efeito se o canal que está sendo escondido não estiver sendo utilizado pela ação.

Law 2 (Hid-Step-2)

A\cs=A

provided

usedC(A)∩cs=0/

Com isso, através desta lei é possível remover ohiding de uma ação Circus. Entre-tanto, a aplicação da lei apenas é válida caso nenhum dos canais utilizados na ação A

esteja no conjunto de canaiscs. Para verificarmos quais canais estão sendo utilizados por

uma ação utilizamos a funçãousedC, a qual retorna o conjunto de canais mencionados na

ação. Por exemplo, temos a ação abaixo.

(c1→Skip)\ {c2}

Neste caso, a ação (c1→Skip) utiliza o canalc1 para se comunicar. Com isso,

pode-mos observar que a obrigação de prova é verdadeira,{c1} ∩ {c2}=0/. Logo, a Lei

Hid-Step-2pode ser utilizada nesta ação para remover ohiding. O resultado deste refinamento

é apresentado abaixo.

(c1→Skip)\ {c2}

= [LeiHid-Step-2]

c1→Skip

(27)

CAPÍTULO 2. CIRCUS 15

2.2.3

Refinamento de Processos

O refinamento de processos é a última etapa da estratégia de refinamento deCircus. Esta etapa é definida em termos do refinamento das ações principais e considera o estado e o comportamento das partições criadas na etapa anterior. Com isto, um processo P1 é refinado por um processo P2 se a ação principal de P1 for refinada pela ação principal de P2. Para o refinamento de processos, podemos destacar a Lei 45 Process splitting

(definida no Apêndice E), que é utilizada para este propósito.

Um ciclo de refinamento não deve necessariamente utilizar as três etapas. Em alguns refinamentos, a etapa de simulação pode ser inserida na etapa de refinamento de ações. Algumas vezes, pode ser necessário realizar várias aplicações de uma única etapa. Em outros casos, quando um processo já possui os componentes internos particionados é realizado apenas o refinamento do processo.

2.3

Ferramentas de

Circus

Esta seção descreve as ferramentas que foram desenvolvidas para fornecer um suporte para a utilização da linguagemCircus.

Na seção 2.3.1, apresentamos a ferramentaJCircus[13], que transforma uma

especifi-caçãoCircusem código implementável. Em seguida, a seção 2.3.2 descreve o verificador de modelos paraCircus. Por fim, na seção 2.3.3, informamos as principais funcionalida-des de CRefine, enfatizando como esta ferramenta automatiza o processo do cálculo de refinamentos de programasCircus. Além disso, uma breve descrição de sua arquitetura é apresentada.

2.3.1

JCircus

A ferramenta JCircus realiza a tradução automática de Circus para a linguagem de programação Java. Para iniciar o processo de tradução, o usuário carrega um arquivo que contém a especificaçãoCircus escrita em LATEX. Neste arquivo, vários processosCircus podem ser declarados.

Após carregar o arquivo na ferramenta, o sistema realiza uma verificação na especi-ficaçãoCircus. Esta verificação ocorre através doparserdeCircusque é fornecido pela

Community Z Tools- CZT. Caso a sintaxe da especificação esteja correta, é criada a Abs-tract Syntax Tree- AST. Caso contrário, uma mensagem de erro é fornecida ao usuário.

(28)

CAPÍTULO 2. CIRCUS 16

AST.

A fase final desta tradução ocorre em duas etapas. A primeira realiza o pré-processa-mento da AST e a segunda é responsável pela geração do código Java. Para esta segunda etapa, a ferramenta utiliza a API JCSP [46]. Esta API implementa os conceitos utilizados pela linguagem CSP. Entretanto, JCSP apresenta algumas limitações, pois nem todos os conceitos de CSP são implementados, como, por exemplo, a multi-sincronização. Esta ferramenta foi atualizada para o novo parserda CZT (2.0). Com isso, a tradução agora

permite o suporte à multi-sincronização sem o protocolo, usando barreiras alternantes, comunicações com decorações arbitrárias de campos (comunicações complexas), tradu-ção do modelo de concorrência de CSP e de uma GUI livre dedeadlocks para interação

com o código gerado.

Uma funcionalidade desta ferramenta é permitir que o usuário possa definir qual pro-cesso será a classe principal dessa tradução. Além disso, a ferramenta fornece uma inter-face para a classe principal.

Para todos os processos Circusda especificação é criada uma classe Java correspon-dente. Caso o processo escolhido para ser a classe principal seja um processo parametri-zado, a ferramenta então solicita ao usuário os parâmetros necessários.

Uma contribuição desta ferramenta é a otimização no processo de conversão de uma especificação formal,Circus, para uma linguagem de programação, Java, de forma auto-mática. Com isso, tempo e esforço podem ser reduzidos consideravelmente. Entretanto, nenhuma verificação é realizada no código Java gerado. A estratégia completa de tradução utilizada por essa ferramenta pode ser encontrada em [13].

2.3.2

Model Checker

A linguagemCircustambém apresenta um verificador de modelos [15], que permite a representação de programasCircuscomo autômatos, possibilitando estabelecer o refi-namento entre dois programas. Estes autômatos são construídos a partir da semântica operacional que representa o comportamento de programasCircus. Estemodel checker é baseado na abordagem da teoria de refinamento domodel ckeckingde CSP [39] e no seu

modelo de arquitetura [15].

Através deste model checkeré possível realizar a verificação das estruturas de dados

e dos aspectos comportamentais deCircus. Por exemplo, ações básicas, expressões de esquema, todas as formas de comunicação por prefixing, ações de guarda, recursão,

(29)

CAPÍTULO 2. CIRCUS 17

A estrutura de dados utilizada para representar um programa Circus é a Predicate

Transition System (PTS). Esta estrutura é gerada através de uma semântica operacional

desenvolvida por Freitas [15].

A Figura 2.4 apresenta um esboço da estratégia utilizada para o model checker de

Circus. Esta figura ilustra as quatro fases que fazem parte deste processo.

Figura 2.4: Estratégia para oModel Checker

Inicialmente, o pacoteparserrecebe a especificaçãoCircusescrita em LATEX e a trans-forma em uma AST. Em seguida, o type checker recebe a AST e adiciona informações

sobre a declaração de canais, conjuntos de canais, processos, ações, conjuntos de nomes, e variáveis locais. Após a validação do type-checker, a AST é enviada para o pacote Compiler, que implementa a semântica operacional e realiza a geraçãoon-the-flydo PTS

da especificaçãoCircus. Esta geração é necessária para realizar a verificação de modelos para os programas Circus. Durante a transformação da AST para PTS são necessárias algumas verificações de predicados e expressões. Para isso, é realizada uma integração com teoremas de provas. Por fim, o pacote Refinement Model recebe a PTS e realiza a

verificação do modelo. ORefinement Model possui um subpacote específico para a

ve-rificação de divergências. Este pacote é utilizado para a prova de OPs que se referem à ausência dedeadlock em ações na especificaçãoCircus.

2.3.3

CRefine

(30)

CAPÍTULO 2. CIRCUS 18

Esta ferramenta é baseada emRefine[36], uma ferramenta que suporta a aplicação do cálculo de refinamento de Morgan [27] para programas sequenciais.

Com a utilização de CRefine é possível obter o controle e o gerenciamento de todo o processo de refinamento dos sistemas concorrentes. No que se segue, apresentamos as principais características da interface desta ferramenta. Em seguida, descrevemos como realizar o processo de refinamento através deCRefine. Por fim, detalhamos a arquitetura utilizada por esta ferramenta.

Interface Gráfica

A interface gráfica deCRefine é composta por um menu e por três janelas principais [34], que são: Refinamento, Código e Obrigações de Prova. A primeira possibilita visua-lizar todos os passos do refinamento, sendo considerada a janela principal da ferramenta. Através da janela de Refinamento, o usuário realiza o processo do cálculo de refinamento, que consiste em escolher e aplicar uma lei de refinamento em um programaCircus. A janela de Código mostra o resultado atual do refinamento. Esta janela é atualizada toda vez que uma lei é aplicada. Por fim, a janela de Obrigações de Prova lista todas as OPs que foram geradas pelas leis de refinamento. Quando uma OP é gerada, são apresentadas duas informações, que são:

• Status, que pode ser de três tipos:

1. Verificado verdadeiro; 2. Verificado falso;

3. Não verificado. Neste caso o usuário precisa validar a OP manualmente.

• Predicado da OP.

A Figura 2.5 apresenta o menu e as janelas que fazem parte da ferramenta.

UtilizandoCRefine

Entre outras funcionalidades, a ferramenta permite: refazer e desfazer partes de um re-finamento, abrir desenvolvimentos, filtrar as leis de refinamento aplicáveis de acordo com o programa que está selecionado, adicionar, editar e remover comentários no desenvolvi-mento e alterar o formato de impressão da especificação, Unicode ou LATEX. Além disso,

a ferramenta possibilita imprimir o desenvolvimento, gerando um documento LATEX, e

salvar o refinamento para continuar o processo em outro momento.

O arquivo de entrada na ferramenta é um arquivo LATEX, o qual possui toda a

(31)

CAPÍTULO 2. CIRCUS 19

Figura 2.5: Interface deCRefine.

Para iniciar o processo do cálculo de refinamentos é necessário carregar uma especi-ficaçãoCircusna ferramenta. Com a especificação presente na janela de Refinamento, o usuário deve selecionar as linhas que representam o termo a ser refinado (ação, processo, ou programa). Após selecionar as linhas, um menu pop-up é disponibilizado ao usuário. Para aplicar uma lei de refinamento, o usuário deve escolher a opção Apply Law. Com

isso, a ferramenta lista todas as leis de refinamento que podem ser aplicadas ao termo que foi selecionado. Este menu é apresentado na Figura 2.6.

(32)

CAPÍTULO 2. CIRCUS 20

Para disponibilizar apenas as leis que podem ser aplicadas no programa selecionado, oCRefineimplementa a funcionalidade de Filtragem de Leis. Com isso, a ferramenta ve-rifica o termo que foi selecionado e analisa quais leis de refinamento presentes no sistema podem ser aplicadas a este termo. Na ferramenta várias leis já foram criadas e podem ser utilizadas no processo de refinamento. Entretanto, não é possível por parte do usuário definir e adicionar uma nova lei de refinamento na ferramenta. Isso garante a corretude do desenvolvimento, uma vez que as leis disponíveis da ferramenta serão apenas aquelas que já foram provadas corretamente.

Durante o processo de aplicação de algumas leis, argumentos podem ser solicitados ao usuário. Esta inserção dos argumentos pode ser realizada através do teclado virtual, o qual possibilita digitar os argumentos através do formato Unicode ou LATEX. A Figura 2.7

apresenta a tela de parâmetros e o teclado virtual.

Figura 2.7: Tela de Parâmetros e o Teclado Virtual

Outra característica da ferramenta é a fácil visualização dos detalhes das leis de refi-namento. Para isso, deve-se selecionar a opçãoWindows->Laws. Após o usuário

sele-cionar a lei, uma nova janela disponibiliza as informações acerca da lei de refinamento. Na Figura 2.8 é possível observar esta janela. Nesta tela são disponibilizados os seguintes detalhes:

• O nome da lei;

(33)

CAPÍTULO 2. CIRCUS 21

• O termo antes da aplicação e o termo resultante;

• Tipo da lei, que pode ser: refinamento, equivalência ou simulação.

Figura 2.8: Detalhes de uma Lei de Refinamento

No que se segue, apresentamos a arquitetura deCRefine e o design de seus compo-nentes. Além disso, fazemos uma breve descrição de como esta ferramenta interage com oframeworkda CZT e com o pacote ZB2SMT.

Arquitetura deCRefine

A ferramentaCRefinefoi desenvolvida em Java e sua arquitetura é baseada na arqui-tetura para ferramentasCircus, apresentada em [17]. Esta ferramenta é baseada no padrão arquiteturalModel-View-Controller - MVC [12], que possui três camadas: apresentação,

gerenciamento e dados. A primeira é responsável pelo controle de toda a interação com o usuário. A camada de gerenciamento é formada por duas classes: External Manager

(EM), que tem a função de controlar a interface gráfica, eInternal Manager(IM), que é

responsável pelo controle interno da aplicação. Esta classe gerencia a aplicação das leis de refinamento e a prova automática das OPs. Além disso, o IM armazena a AST que é atualizada após cada aplicação de lei. Por fim, a camada de dados armazena e manipula os dados da aplicação.

CRefine interage com dois módulos externos: oframework da CZT [17] e o pacote

ZB2SMT [1]. O framework da CZT fornece ferramentas como o parser de Circus, o

(34)

CAPÍTULO 2. CIRCUS 22

para a linguagem Z e as que são derivadas dela, comoCircus. Além da CZT, oCRefine também utiliza o pacote ZB2SMT para auxiliar no descarte das OPs.

A Figura 2.9 apresenta o diagrama de classes inicial deCRefine. Nesta figura é possí-vel observar os principais pacotes que cada camada possui e a interação deCRefinecom oframeworkda CZT e o pacote ZB2SMT.

Figura 2.9: Diagrama de Classes da Arquitetura Inicial deCRefine

De acordo com a Figura 2.9, podemos observar que todos os elementos da interface estão inseridos no pacotegui, que interage apenas com o EM. Esta classe é responsável

por enviar as solicitações da GUI para métodos específicos no IM. Além disso, o EM também interage com o core.print e o core.docgenerator. O primeiro pacote é

responsável por imprimir a AST no formato desejado (Unicode ou LATEX). O pacote core.docgenerator cria um arquivo em LATEX que contém toda a documentação do

refinamento.

O IM gerencia internamente a aplicação e recebe todas as solicitações da GUI através do EM. Ele interage com os seguintes pacotes:

• core.developments, que armazena os dados de cada refinamento;

• core.storage, que transforma um refinamento em uma sequência de passos

utili-zada para salvar um refinamento;

• core.crules, responsável pela criação das leis de refinamento. Para isso, o

(35)

CAPÍTULO 2. CIRCUS 23

Rulesda CZT. As leis de refinamento são carregadas na ferramenta durante a

inici-alização, utilizando a fábrica de leis.CRefinecontém 18 fábricas de leis, que foram classificadas conforme o tipo de termo em que são aplicadas. Cada uma dessas fábricas representa uma classe Java que possui o métodocreateAllda classe Laws-Factory. Este método cria todas as leis de refinamento da fábrica. Cada lei possui

um nome, o tipo de transformação e o tipo da lei. Atualmente, a ferramenta contém 134 leis de refinamento.

• core.podischarge, responsável pela prova automática das OPs. Inicialmente, este

pacote tenta provar restrições e funções sintáticas de Z e de Circus para predica-dos. Após essa tentativa, caso a prova automática não aconteça, ele interage com o ZB2SMT para tentar provar OPs que sejam predicados. O ZB2SMT converte o predicado em um formato padrão aceito por váriosSatisfability Module Theory

(SMT). Atualmente, o ZB2SMT interage apenas com veriT [6].

Processo de Refinamento

O processo de refinamento noCRefineinicia com o usuário carregando na ferramenta uma especificaçãoCircusescrita em LATEX. Esta solicitação é enviada da GUI para o EM, que encaminha a requisição para o IM. Por sua vez, o IM interage com o módulo da CZT para realizar oparserna especificação. Caso oparserdeCircusencontre algum erro na especificação, uma mensagem de erro é enviada para o usuário. Caso contrário, o módulo da CZT retorna a AST da especificação inicial. De posse da AST, o IM a repassa para o EM, que utiliza o pacotecore.printpara imprimir a especificação no formato desejado.

Essa especificação em formato de String é então enviada para a GUI, que disponibiliza para o usuário. A Figura 2.10 apresenta esta sequência de passos.

(36)

CAPÍTULO 2. CIRCUS 24

Figura 2.10: Carregar Especificação na Ferramenta

ser aplicadas ao termo. Esta lista é disponibilizada na GUI para que o usuário selecione a lei que deseja aplicar. Esta lei juntamente com o termo selecionado é enviada para o IM, que é responsável por gerenciar o processo de aplicação de uma lei de refinamento. Para tanto, é realizada a (4) unificação do termo selecionado com a lei selecionada. Em algumas situações é necessária a entrada de argumentos. Com isso, o sistema realiza (5) a construção do termo resultante, (6) a prova das OPs, quando necessário, e, por fim, (7) atualiza a AST.

Nesta seção, descrevemos a arquitetura inicial e os principais pacotes utilizados pelo

CRefine. Através desta ferramenta é possível automatizar o processo de aplicação do cálculo de refinamento deCircuse o gerenciamento de suas obrigações de prova. Além disso, apresentamos como esta ferramenta realiza a interação com oframeworkda CZT e

com o pacote ZB2SMT.

Para automatizar o processo de definição e aplicação das táticas de refinamento em

CRefine foi necessário incluir novos componentes nesta arquitetura inicial, a fim de ge-renciar as novas funcionalidades da ferramenta. Para esta extensão nossa idéia consiste em reutilizar os conceitos arquiteturais definidos nesta seção e adicionar um novo módulo na camada de dados. Este módulo tem a função de gerenciar o processo de definição e aplicação das táticas de refinamento. Além disso, ele interage diretamente apenas com a classe IM com a intenção de tornar possível o acesso a todos os outros pacotes da fer-ramenta. As outras duas camadas também são atualizadas. Por exemplo, na camada de apresentação adicionamos novos componentes para que o usuário possa criar e aplicar as táticas de refinamento.

(37)

CAPÍTULO 2. CIRCUS 25

uma tática de refinamento ao invés de selecionar a opção para aplicar uma lei. Todas estas alterações mencionadas serão detalhadas no Capítulo 4.

2.4

Considerações Finais

(38)

Capítulo 3

Táticas de Refinamento

Este capítulo aborda a linguagem de táticas de refinamento para programas Circus,

ArcAngelC, a qual será utilizada para formalizar as táticas de refinamento na extensão de

CRefine.

A linguagem de táticas de refinamento paraCircus,ArcAngelC, foi desenvolvida com o intuito de prover uma linguagem capaz de definir táticas de refinamento para programas concorrentes [37]. ArcAngelC é baseada na linguagem de táticas de refinamento para programas sequenciais,ArcAngel. Ambas utilizam como base a linguagem de táticas de propósito geral,Angel, que apenas define que regras transformam objetivos de prova.

Em ArcAngelC é possível definir táticas para ações, processos e programas Circus. Para isto, novos construtores foram adicionados emArcAngelCpara suportar a aplicação em partes específicas de um programaCircus.

ArcAngelCtem uma semântica formal que é baseada na semântica deArcAngel. En-tretanto, acrescenta algumas generalizações que permitem o suporte a todos os combi-nadores estruturais presentes em Circus. No que se segue, informaremos a sintaxe e os principais operadores deArcAngelC.

3.1

Sintaxe de

ArcAngel

C

UtilizandoArcAngelC é possível definir táticas básicas, como a aplicação de uma lei de refinamento, e tacticals, que permitem a combinação de várias táticas.

Adicional-mente, em ArcAngelC uma tática de refinamento também pode ser aplicada em partes específicas de um programaCircus como em ações, processos e programas, através dos combinadores estruturais. Por este motivo, todos os operadores de Circuspossuem cor-respondentes na sintaxe deArcAngelC. A Figura 3.1 apresenta a sintaxe completa de

Ar-cAngelC.

(39)

CAPÍTULO 3. TÁTICAS DE REFINAMENTO 27

TacticDecl ::= TacticN(Decl)Tactic [declaração tática] [generatesProg]

[proof obligationsPred+]end

Tactic ::= law N(Exp∗) [aplicação lei]

|

tactic N(Exp∗) [aplicação tática]

|

skip

|

fail

|

abort [táticas básicas]

|

applies to ProgdoTactic [padrões]

|

Tactic; Tactic

|

Tactic“|”Tactic [sequência/alternação]

|

µTN•Tactic

|

!Tactic [recursão/cut]

|

succsTactic

|

failsTactic [afirmações]

|

→Tactic

|

& Tactic [ações]

|

µTactic

|

if Tactic+ fi

|

varTactic

|

valTactic

|

resTactic

|

vresTactic

|

beginend((N,Tactic)∗,Tactic) [processos]

|

⊙Tactic

|

⊙instTactic

|

=b Tactic

|

Tactic

;

Tactic [ações/processos]

|

Tactic ✷Tactic

|

⊓Tactic

|

TactickTactic

|

Tactic|||Tactic

|

;

iTactic

|

✷iTactic

|

⊓iTactic

|

kiTactic

|

|||iTactic

|

\Tactic

|

:=Tactic

|

•Tactic

|

•instTactic

|

program (N,Tactic)∗ [programa]

(40)

CAPÍTULO 3. TÁTICAS DE REFINAMENTO 28

ePred+ é uma lista de um ou mais predicados Z.Expé utilizado para representar uma possível sequência vazia de expressões eTactic+ representa uma sequência não vazia de táticas.

As próximas seções apresentam toda a linguagem deArcAngelC. A seção 3.2 informa a estrutura de declaração de uma tática de refinamento. Na seção 3.3, apresentamos as táticas básicas presentes emArcAngelC. A seção 3.4 descreve os combinadores utilizados para a composição de táticas. Na seção 3.5, informamos as táticas utilizadas para fazer afirmações. Por fim, a seção 3.6 apresenta os combinadores estruturais utilizados para formalizar táticas que são aplicadas em partes específicas de um programaCircus.

3.2

Declaração de uma Tática

A declaração de uma tática utiliza a formaTactic N(Decl)Tactic end. A declaração

é composta pelo nome da táticaN, os argumentosDecl, se houver, e pelo corpo da tática

Tactic. Além disso, a declaração de uma tática pode incluir duas cláusulas opcionais:

1. generates, que documenta o programa gerado;

2. proof obligations, que lista as OPs geradas pela aplicação da tática.

Estas duas cláusulas são utilizadas apenas para fins de documentação. Apesar da lin-guagem não realizar nenhuma verificação nestas cláusulas, isto não apresenta nenhuma consequência na aplicação da tática de refinamento.

A título de ilustração, considere o esboço da tática interIntroAndSimpl apresentada abaixo. Esta é uma das 85 táticas de refinamento que fazem parte do estudo de caso desta dissertação, apresentado na seção 5. Todas as táticas de refinamento utilizadas nesta dissertação podem ser encontradas no Apêndice D. Neste exemplo, a aplicação da tática

tacticsó é válida caso as OPs,Pred, sejam satisfeitas. Neste caso, o programa resultante

éProg.

Tactic interIntroAndSimpl( )=b tactic

generates Prog

proof obligations Pred

end

(41)

CAPÍTULO 3. TÁTICAS DE REFINAMENTO 29

3.3

Táticas Básicas

ArcAngelC possui cinco táticas básicas. A tática law N(Exp) aplica a lei de refina-mentoNutilizando os argumentosExp. De forma semelhante,tacticN(Exp), que aplica

a táticaN com os argumentosExp. A tática NBStep1, que corresponde à primeira etapa

da fase NB no estudo de caso ilustra a utilização da táticatactic. Tactic NBStep1(fs)=b tacticapplyCopyRule(fs)

end

Esta tática recebe como argumento uma lista de nomes de ações, fs, e invoca a tática

tacticapplyCopyRule().

As três últimas táticas básicas são:

• skip, tática que não altera o resultado e termina com sucesso;;

• fail, a tática cuja aplicação sempre falha;

• abort, a tática que não termina e é executada indefinidamente.

Baseada nas táticas básicas, podemos criar táticas mais elaboradas utilizando os com-binadores (tacticals) deArcAngelC. No que se segue, apresentamos estes combinadores.

3.4

Tacticals

Em ArcAngelC é possível realizar a combinação de táticas. Por exemplo, temos a tática applies toProgdoTactic, que aplica a tática Tactic a um componenteCircus que seque o padrãoProg. As meta-variáveis utilizadas no padrãoCircus,Prog, também podem ser utilizadas pela tática Tactic. Por exemplo, o meta-programaA|[ns1 |cs|ns2]|Skip,

é uma composição paralela que possui como meta-variáveis A,ns1,cs,ns2. A estrutura

completa de uma tática utilizando oapplies to doé apresentada a seguir. Tactic interIntroAndSimpl( )=b applies to A|[ns1|cs|ns2]|Skip

do Tactic

generates newProg

proof obligations pred

end

(42)

CAPÍTULO 3. TÁTICAS DE REFINAMENTO 30

da aplicação de T1. CasoT1 ouT2falhe, então toda a tática falha. Quando a aplicação da tática ocorre com sucesso, as obrigações de provas geradas são aquelas resultantes da aplicação deT1e deT2. Por exemplo, podemos remover a composição paralela, primeiro transformando o paralelismo em uminterleaving, aplicando a Lei 24 (par-inter), e então simplificamos esseinterleavingutilizando a Lei 15 (inter-unit). As duas aplicações de leis

ocorrem em sequência. A táticainterIntroAndSimpl, apresentada (integralmente) abaixo, formaliza esta estratégia. Esta tática se aplica a uma composição paralela, em que a ação do lado direito éSkip. A aplicação desta tática resulta na açãoAe as obrigações de prova

são originadas da aplicação da Lei 15 (inter-unit).

Tactic interIntroAndSimpl( )=b applies to A|[ns1|cs|ns2]|Skip

do lawpar-inter();lawinter-unit()

generates A

proof obligations usedC(A)∩cs=0/

end

Nesta tática, foram incluídas as cláusulas opcionais generatese proof obligations, que

são utilizadas para documentar o resultado.

O operador de alternação, |, também é utilizado para compor táticas de refinamento. A tática T1|T2 primeiro aplica a táticaT1. Caso esta aplicação tenha sucesso, então a tática termina com sucesso. CasoT1falhe, então a táticaT2é aplicada. Se a aplicação de

T2ocorrer com sucesso, então a tática termina com sucesso. Se a aplicação deT2falhar, então toda a tática falha. Caso uma das táticas aborte, então a composição das táticas também aborta.

A definição da tática abaixo é uma tática de alternação que utiliza a táticaNBStep2 f

para ser aplicada em processos que possuem a ação principal sendo uma composição em paralelo. Entretanto, para os processos que não possuem paralelismo na ação principal, a táticaNBStep2 f falha e a táticatacticNBStep2()tenta aplicar a táticatacticNBStep2 l(), que cria uma composição em paralelo na ação principal deste processo.

Tactic NBStep2( )=b

tacticNBStep2 f()|tacticNBStep2 l()

end

Com isso, a tática NBStep2 pode ser utilizada como uma única regra de transformação,

(43)

CAPÍTULO 3. TÁTICAS DE REFINAMENTO 31

sobre as táticas são apresentadas na Seção 5.

De uma forma geral, a escolha angelical é comutativa. Entretanto, em ArcAngelC o operador de alternação não é. Com isso, a alternação possibilita um maior controle na aplicação das táticas de refinamento. Para a alternação,ArcAngelC fornece uma escolha que é implementada através dobacktracking: que em casos de falha, as aplicações de leis

são desfeitas até o último ponto onde alternativas adicionais estão disponíveis e podem ser exploradas, como é o caso de uma tática de alternação:T1|T2.

Uma nova declaração da táticaNBStep2( )é apresenta a seguir, e será apenas utilizada

para ilustrar o processo debacktracking.

Tactic NBStep2( )=b

tacticNBStep2 f()|tacticNBStep2 l(); tacticT()

end

Nesta tática, se a aplicação detacticNBStep2 f()ocorrer com sucesso, então o

pró-ximo passo é aplicar a tática tactic T(). Caso esta aplicação falhe, há um mecanismo

de backtracking que possibilita a aplicação de tactic NBStep2 l() e em seguida aplica

tacticT()novamente. Entretanto, isso pode resultar em buscas ineficientes. Como alter-nativa,ArcAngelCdispõe do operador de corte, !.

Este operador é utilizado para realizar uma aplicação no programa e apenas considerar o primeiro resultado válido da tática. A nova definição da táticaNBStep2( ), para que não implemente obacktracking, deve ser da seguinte maneira:

Tactic NBStep2( )=b

!(lawprom-var-state()|lawprom-var-state-2()); tacticT()

end

O operador de ponto fixoµT é utilizado para definir táticas recursivas emArcAngelC. A táticaµTX•T1( ), possui a variável que representa o ponto de recursão (X) e o corpo da

tática (T1). Utilizando recursão emArcAngelC, algumas vezes, a aplicação pode resultar em um loop infinito. Nestes casos, a tática apresenta o mesmo comportamento da tática básicaabort.

3.5

Táticas de afirmação

(44)

CAPÍTULO 3. TÁTICAS DE REFINAMENTO 32

verificando o resultado da aplicação da tática. A táticasuccs T se comporta como a tática

básicaskipquando a aplicação deT é bem-sucedida. Caso contrário, a táticasuccs T se

comporta comofail. A táticafails T se comporta comoskipquando a aplicação da tática

T falha e comofailquando a aplicação deT for bem-sucedida.

3.6

Combinadores Estruturais

Um diferencial de ArcAngelC é a possibilidade de formalizar táticas de refinamento que são aplicadas em partes específicas de um programaCircus. Isto é realizado através dos combinadores estruturais. Basicamente,ArcAngelCpossui um combinador estrutural para cada operadorCircus.

Dentre todos os combinadores estruturais presentes emArcAngelC, apenas os corres-pondentes à alternação ( if fi ), blocos de variáveis (var), declaração de variáveis (val, res, vres), e sequência (; ) foram herdados deArcAngel. Para todos os combinadores

es-truturais, se a aplicação de uma tática em um componente de ação, processo ou programa Circusfalhar, então a aplicação de toda a tática também falha.

Através de ArcAngelC podemos definir táticas a serem aplicadas apenas em ações, apenas em processos, em ações e processos e em parágrafos específicos de um programa Circus. No que se segue, apresentamos estes combinadores estruturais.

3.6.1

Combinadores Estruturais de Ações

Os combinadores estruturais de ações são utilizados para realizar a aplicação de táticas de refinamento em açõesCircus. A tática Té aplicada em uma ação dePrefixing, por exemplo,c→A, ondecrepresenta um canal e Auma açãoCircus. Com isso, a táticaT é aplicada apenas na ação Ae a comunicação se mantém inalterada. O resultado desta

aplicação resulta em uma nova ação dePrefixing c→B, ondeBrepresenta o resultado da

aplicação da táticaTaA.

Outro combinador estrutural de ação é o & T, que permite aplicar táticas em ações de guarda, g&A. A tática é aplicada de forma semelhante a anterior. O resultado da

aplicação da táticaTà ação Aresulta em uma nova ação de guarda, sendo que a guarda

não é alterada.

ArcAngelCtambém permite definir táticas para as ações de recursão,µ XA(X). Para tanto, é utilizado o combinador µT.

O combinador estrutural if T1 [] . . . [] Tn fi, é aplicado a uma alternação Circus:

Imagem

Figura 2.2: Etapas da Estratégia de Refinamento
Figura 2.6: Menu pop-up na Janela de Refinamento.
Figura 2.7: Tela de Parâmetros e o Teclado Virtual
Figura 2.9: Diagrama de Classes da Arquitetura Inicial de CRefine
+7

Referências

Documentos relacionados

Nessa situação temos claramente a relação de tecnovívio apresentado por Dubatti (2012) operando, visto que nessa experiência ambos os atores tra- çam um diálogo que não se dá

Hoje o gasto com a saúde equivale a aproximada- mente 8% do Produto Interno Bruto (PIB), sendo que, dessa porcentagem, o setor privado gasta mais que o setor público (Portal

“O aumento da eficiência e o plano de produção fizeram com que a disponibilidade das células de fabricação aumentasse, diminuindo o impacto de problemas quando do

Por último, temos o vídeo que está sendo exibido dentro do celular, que é segurado e comentado por alguém, e compartilhado e comentado no perfil de BolsoWoman no Twitter. No

LUIS ANTONIO FIORANI, Prefeito Municipal de Vista Alegre do Alto, Estado de São Paulo, no uso de suas atribuições legais, em especial o Inciso II, Alínea “a”, do Artigo 65 da

Tendo em conta, os efeitos que as soluções de irrigação exercem, não só no tecido dentário, como também nas propriedades dos materiais de obturação do

As métricas por trás do Tomatometer, os seus diversos critérios de cálculo, o selo Certified Fresh, o conceito de Top Critic, como também a possibilidade que usuários cadastrados

O objetivo principal deste estudo de caso era verificar o grau de valorização da medicina popular de plantas entre o próprio povo, tendo por base uma comunidade com diferentes