Programas e Refinamento
Programming from Specifications
Carroll Morgan Prentice-Hall, 1994
[Capítulo 1]
Equipe:
Klaus Cavalcante
Tarcísio Quirino
Raquel Monteiro
Visão Tradicional
Programa x Especificação
Programas são executáveis, mas de difícil
compreensão.
Especificações são legíveis, de fácil
entendimento, mas não são executáveis.
Uma Nova Visão
Não há distinção entre especificações e
programas
Tudo é programa
Nem todos os programas são executáveis
Hierarquia de programação
Programas abstratos
Programas executáveis (código)
Nível intermediário
Projetos
Mistura de construtores abstratos e concretos
Programas como Contratos:
Refinamento
Cliente
Programador
Negociação
Cliente -> Deseja: programas com maior precisão,
rapidez e aplicabilidade em diferentes contextos.
Programador -> Deseja: maior liberdade na
implementação, bem como folga na seleção e
apresentação de resultados; deseja ainda, mais
informação sobre condições de execução do programa,
além do acesso a técnicas de implementação, baratas e
padronizadas.
Programas como Contratos:
Refinamento
Se para o cliente, o programa prog2 é melhor
do que o programa prog1, então nós dizemos
prog1
prog2
ou seja, prog2 “refina” prog1.
Visão do cliente
Exemplos:
saída de 220V
resistente a chuva
precisa de 4Mb
saída de 220/110V
resistente a 50m de
profundidade
precisa de 2Mb
Programas Abstratos
Estados inicial e final
estado
inicial
estado
final
Estado
ação
do
programa
variáveis são nomes
valores
mapeamentos de variáveis para valores
Um programa imperativo realiza modificações de
estado
Programas Abstratos
Descrições de estado
Exemplo de estado
Variáveis x, y, e z
x
y
z
2
17
3
Nós descrevemos estados ao invés de desenhá-los
Dizemos que uma fórmula descreve um estado quando
ela se faz verdadeira pelos mapeamentos do estado
x = 2  x + z < y  z 4  x = 2 y = 17 z = 3
Um estado satisfaz uma fórmula se aquela fórmula o
descreve
Cálculo de predicados
Usamos o cálculo de predicados como linguagem de
nossas formulas. Isto inclui:
Termos ( variáveis, constantes, e funções )
Formulas atômicas ( uma composição entre termos e
operadores relacionais, Ex.: =, <, >=)
Formulas proposicionais (uma composição entre
formulas atômicas e conectivos proposicionais, Ex.: ,
, ¬, , )
Quantificadores ( , )
Quantificadores tipados [ (x:T · A), (x:T · A)]
Cálculo de predicados
Os Operadores Vínculo
A declaração F1
F2, significa: em qualquer estado,
se F1 é verdade então F2 é verdade
A declaração F1
F2, significa: em qualquer estado,
F1 é verdade se F2 é verdade
O Operador Equivalência
A declaração F1
F2 verdadeiro
F2, significa: F1 verdadeiro SSE
Programas Abstratos
Especificações: A especificação é a principal
característica dos programas abstratos
w: [ pre , pos ]
quadro (w): valores que podem ser modificados
pré-condição (pre): descreve estados iniciais
pós-condição (pos): descreve estados finais
Exemplo: faça y a raiz quadrada de x desde
que 0 x  9
y : [0 x  9 , y ^ 2 = x ]
(1.1)
Uma especificação captura a intenção sem dar o
método
Programas Abstratos
Lei 1.1 Fortalecimento da pós-condição
Se pos’
pos,
então
w :[ pre , pos]
w :[ pre , pos’]
Programas Abstratos
Refinamento de especificações
Uma especificação é melhorada pelo
fortalecimento de sua pós-condição
Exemplo:
A especificação
y : [0 x  9 , y ^ 2 = x y ]
refina
y : [0 x  9 , y ^ 2 = x]
 (1.2) é melhor do que (1.1) pela lei 1.1
(1.2)
(1.1)
Programas Abstratos
Lei 1.2 Enfraquecimento da pré-condição
Se pre
pre’,
então
w :[ pre , pos]
w :[ pre’ , pos]
Programas Abstratos
Refinamento de especificações:
Uma outra forma de melhoria é conseguida
pelo enfraquecimento da pré-condição
Exemplo:
A especificação
y : [x  0 , y ^ 2 = x y  ]
refina
y : [0 x  9 , y ^ 2 = x y ]
 (1.3) é melhor do que (1.2) pela lei 1.2
(1.3)
(1.2)
Exercício
1.
Quais destes refinamentos são válidos? (Use
enfraquecimento da pré-condição e fortalecimento da
pós-condição)
Programas Executáveis
Código
Linguagem de especificação é muito expressiva
Nenhum computador pode executar especificações
Construtores executáveis (código)
O Comando de Atribuição
w := E
Lei 1.3 Atribuição
Se pre
pos[w\E], então
w ,x:[ pre , pos]
w := E
O refinamento total, da especificação para o código; é feito em
passos, cada qual introduzindo um pouco mais de executabilidade
ou eficiência
Programas Viáveis
Definição 1.4 Viabilidade
A especificação w :[pre,pos] é viável se e somente se
pre
(w:T pos)
onde T é o tipo da variável w.
 Exemplo:
y : [true , y ^ 2 = x y ]
(1.4)
Isso seria como tentar provar que:
true
(y:R · (y ^ 2 = x y 
Especificações inviáveis não podem ser
implementadas
Algumas abreviações comuns
Abreviação 1.5 Pré-condição default
w :[pos] é uma abreviação para w :[ true , pos]
Abreviação 1.6 Suposição (Assumption)
{pre} é uma abreviação para :[ pre , true ]
Programas Executáveis
Abreviação
Exemplo:
A especificação
{0 x  9} y := sqr(x)
(1.5)
refina
y : [0 x  9 , y ^ 2 = x y ]
(1.2)
(1.5) é melhor do que (1.2) pela Abreviação 1.6
Lei 1.7 Especificação simples
w := E = w :[w = E]
Algumas abreviações comuns
Lei 1.8 Absorção de suposição
{pre’} w :[pre , pos] = w :[ pre’ pre , pos]
Assim, uma suposição antes de uma
especificação pode ser absorvida diretamente
na pré-condição desta
Programas Extremos
Abort
w :[ false , true ]
Choice
w :[ true , true ]
skip
Mágica (inexequível)
w :[ true , false ]
choose w
Skip
:[ true , true ]
abort
magic
A maioria destes programas não são escritos
deliberadamente
Programas e Refinamento
Programming from Specifications
Carroll Morgan Prentice-Hall, 1994
[Capítulo 1]
Equipe:
Klaus Cavalcante
Tarcísio Quirino
Raquel Monteiro