Lógica Computação: Especificação Verificação Programas
1. Lógica para Computação (IF61B)
Lógica para Computação:
Especificação e Verificação
de Programas
Prof. Celso Antônio Alves Kaestner, Dr. Eng.
kaestner@dainf.ct.utfpr.edu.br
Alterado e complementado por
Prof. Adolfo Neto, D.Sc.
adolfo@utfpr.edu.br
2. Lógica para Computação (IF61B)
Especificação de programas
• Uma tarefa típica em Computação:
problema computacional
problema real Modelagem
• Especificações em linguagem natural exigem que se
assuma o significado de diversos termos, e por isto
são “imprecisas / vagas / inconsistentes” permitindo
diversas interpretações;
• Este é um problema amplamente estudado em
Engenharia de Software, que busca métodos e
formalismos tenta eliminar / reduzir este problema.
25/05/09 Prof. Celso A A Kaestner 2
3. Lógica para Computação (IF61B)
Especificação de programas
Visão operacional de um programa:
dados de programa dados de saída
entrada
Programas como transformadores de estados:
...
σ1 = {v11,v12...v1m} σ = {v21,v22...v2m} σ = {vn1,vn2...vnm}
25/05/09 Prof. Celso A A Kaestner 3
4. Lógica para Computação (IF61B)
Especificação de programas
Especificação de propriedades de programas:
• Exemplo: dados dois valores (x e y) inteiros maiores
ou iguais a 10 calcular sua soma (z);
• Especificação 1:
– sobre o estado inicial: x ≥ 10 ∧ y ≥ 10
– sobre o estado final: z = x + y
• Especificação 2 (superespecificação):
– sobre o estado inicial: x ≥ 10 ∧ y ≥ 10 ∧ (x + y) ≥ 0
– sobre o estado final: z = x + y ∧ z ≥ 20
25/05/09 Prof. Celso A A Kaestner 4
5. Lógica para Computação (IF61B)
Especificação de programas
• Especificação 3 (especificação pouco clara):
– sobre o estado inicial: x ≥ 10 ∧ (x + y) ≥ (10 + x)
– sobre o estado final: z = x + y
• Especificação 4 (especificação incompleta):
– sobre o estado inicial: x ≥ 10
– sobre o estado final: z = x + y
• “Especificação” 5 (não é especificação ...):
– sobre o estado inicial: x ≥ 10 ∧ y ≥ 10
– sobre o estado final: z = x + y ∧ z < 10
25/05/09 Prof. Celso A A Kaestner 5
6. Lógica para Computação (IF61B)
Especificação de programas
• Vantagens de se ter uma especificação
definida por formalismo matemático:
1. Precisão;
2. Verificação de consistência;
3. Simulação;
4. Verificação de programas.
• Pode-se usar a Lógica Matemática como
linguagem de especificação (SILVA; FINGER;
MELO, 2006, p. 165);
25/05/09 Prof. Celso A A Kaestner 6
7. Lógica para Computação (IF61B)
Especificação de programas
Sistematização das propriedades de programas:
1. Pré-condições: válidas sobre os dados de
entrada;
2. Pós-condições: válidas sobre os dados de
saída;
3. Invariantes: válidas sempre, durante toda a
execução do programa.
25/05/09 Prof. Celso A A Kaestner 7
8. Lógica para Computação (IF61B)
Especificação de programas
• Exemplo: fatorial.
1 se n=0
n! = 1 sen=1
n*(n-1)! se n>1
• PRE: n ≥ 0 ∧ n0 = n
• POS: fat = n! ∧ fat > 0
• INV: fat > 0
25/05/09 Prof. Celso A A Kaestner 8
9. Lógica para Computação (IF61B)
Verificação de Programas
• Os erros são comuns em programação;
• O funcionamento correto de um programa
depende também dos dados fornecidos
ao programa, isto é, se sua variação foi
corretamente prevista;
• Deseja-se verificar se o programa
desenvolvido atende à especificação e
corrigi-lo se for o caso.
25/05/09 Prof. Celso A A Kaestner 9
10. Lógica para Computação (IF61B)
Verificação de Programas
• Exemplo (SILVA; FINGER; MELO, 2006,
p.179-183): (Merge) dadas duas
sequências ordenadas de inteiros produzir
nova sequência ordenada que entrelace
os números das duas sequências:
• Entradas: V1 = {1,3,6,9} e
V2 = {2,3,3,7,10}
• Saída: V3 = {1,2,3,3,3,6,7,9,10}
25/05/09 Prof. Celso A A Kaestner 10
11. Lógica para Computação (IF61B)
Verificação de Programas
void merge(int V1[],V2[],V3[],int t1,int t2)
{int p1=0,p2=0,p3=0;
while(t1+t2>0)
{if (V1[p1] > V2[p2])
{V3[p3]=V2[p2];
p2=p2+1; t2=t2-1;}
else {V3[p3]=V1[p1];
p1=p1+1; t1=t1-1;}
p3++;}
}
25/05/09 Prof. Celso A A Kaestner 11
12. Lógica para Computação (IF61B)
Verificação de Programas
• Erro: se uma das sequências for vazia há
uma comparação indevida:
if (v1[p1] > V2[p2])
• Numa execução real haveria erro.
• Para a correção ... Novo programa
25/05/09 Prof. Celso A A Kaestner 12
13. Lógica para Computação (IF61B)
Verificação de programas
void merge(int V1[],V2[],V3[],int t1,int t2)
{int p1=0,p2=0,p3=0;
while(t1>0 && t2>0)
{if (V1[p1] > V2[p2])
{V3[p3]=V2[p2];
p2=p2+1; t2=t2-1;}
else {V3[p3]=V1[p1];
p1=p1+1; t1=t1-1;}
p3++;}
}
25/05/09 Prof. Celso A A Kaestner 13
14. Lógica para Computação (IF61B)
Verificação de programas
• Agora a comparação só ocorre se houver
elementos nas listas;
• Porém, quando uma lista termina deixa-se
de colocar os elementos restantes da
outra lista na lista de saída.
• Um novo erro é introduzido ao se corrigir
o erro inicial.
• Para a correção ... Novo programa
25/05/09 Prof. Celso A A Kaestner 14
15. Lógica para Computação (IF61B)
Verificação de Programas
void merge(int V1[],V2[],V3[],int t1,int t2)
{int p1=0,p2=0,p3=0;
while(t1>0 && t2>0)
{if (V1[p1] > V2[p2])
{V3[p3]=V2[p2];
p2=p2+1; t2=t2-1;}
else {V3[p3]=V1[p1];
p1=p1+1; t1=t1-1;}
p3++;}
; (continua)
25/05/09 Prof. Celso A A Kaestner 15
16. Lógica para Computação (IF61B)
Verificação de Programas
while (t1>0) {V3[p3]=V1[p1];
p1=p1+1; t1=t1-1;
p3++;}
while (t2>0) {V3[p3]=V2[p2];
p2=p2+1; t2=t2-1;
p3++;}
}
• O programa agora está OK.
25/05/09 Prof. Celso A A Kaestner 16
17. Lógica para Computação (IF61B)
Verificação de Programas
• Se tantos erros ocorrem em um programa
tão simples, como proceder no caso de
sistemas complexos ?
• Como determinar se um programa está
correto ?
• Solução: minimizar os erros, por meio de
alguns procedimentos.
25/05/09 Prof. Celso A A Kaestner 17
18. Lógica para Computação (IF61B)
Verificação de Programas
• Procedimentos utilizados para verificação:
1. Inspeção: segue-se a lógica do programa
em busca de situações incorretas ou não
previstas. Forma subjetiva de julgamento!
2. Teste de programas: alguns casos de teste
são selecionados, em conjunto com dados
de teste, sobre os quais o programa é
executado e os resultados são verificados;
não garante a correção total do programa.
25/05/09 Prof. Celso A A Kaestner 18
19. Lógica para Computação (IF61B)
Verificação de Programas
• “Para garantir que um programa responda
adequadamente aos dados do domínio,
precisamos verificar se ele é, de fato, uma
implementação particular da especificação
do problema. Para isso, precisamos
provar que o programa satisfaz a
especificação do problema” (SILVA; FINGER;
MELO, 2006, p. 183)
25/05/09 Prof. Celso A A Kaestner 19
20. Lógica para Computação (IF61B)
Verificação de Programas
Estratégias para produzir programas
corretos (SILVA; FINGER; MELO, 2006, p. 183):
1. Síntese: dada uma especificação ϕ, um
programa P é construído de forma automática
ou semi-automática, por meio de transformação
da especificação ϕ em P;
– Se tal problema estivesse resolvido por
completo, não precisaríamos mais
programar...
25/05/09 Prof. Celso A A Kaestner 20
21. Lógica para Computação (IF61B)
Verificação de Programas
Estratégias para produzir programas
corretos (SILVA; FINGER; MELO, 2006, p. 184):
2. Verificação: Dada uma especificação ϕ e um
programa P, mostrar que P é um modelo para ϕ
(P satisfaz ϕ).
– “Vários desenvolvimentos têm sido realizados
nesta área, inclusive com aplicação na
indústria”
25/05/09 Prof. Celso A A Kaestner 21
22. Lógica para Computação (IF61B)
Verificação de Programas
Uso da verificação formal na prática (SILVA;
FINGER; MELO, 2006, p. 185-186):
1) Análise: Dado um programa P, encontrar uma
especificação ϕ que defina o problema para o
qual P é a solução.
– Usada para sistemas prontos
– Permite corrigir e/ou documentar sistemas
25/05/09 Prof. Celso A A Kaestner 22
23. Lógica para Computação (IF61B)
Verificação de Programas
Uso da verificação formal na prática (SILVA;
FINGER; MELO, 2006, p. 185-186):
2) Correção: Dada uma especificação ϕ e um
programa P que NÃO satisfaz ϕ, construir P’ que
satisfaça ϕe seja próximo de P (considerando
medida de proximidade – código, por exemplo).
– Usada quando se escreve programa que não
satisfaz a especificação
– Usada quando os requisitos mudam
25/05/09 Prof. Celso A A Kaestner 23
24. Lógica para Computação (IF61B)
Verificação de Programas
Uso da verificação formal na prática (SILVA;
FINGER; MELO, 2006, p. 185-186):
3) Otimização: Dada uma especificação ϕ e um
programa P que satisfaz ϕ, obter P’ equivalente a
P que seja ótimo sob determinada medida de
complexidade.
– O novo programa P’ pode ser comparado
tanto com P (equivalência) quanto com a
especificação ϕ (satisfazibilidade)
25/05/09 Prof. Celso A A Kaestner 24
25. Lógica para Computação (IF61B)
Verificação de Programas
• “Na verificação formal, faz-se necessária
a comparação entre a especificação e o
programa correspondente.”
• “Se a especificação for escrita em
linguagem natural, não há como compará-
la com o programa de forma matemática”
(SILVA; FINGER; MELO, 2006, p. 185-186)
25/05/09 Prof. Celso A A Kaestner 25
26. Lógica para Computação (IF61B)
Verificação de Programas
• “Para que provemos que um programa
satisfaz uma dada especificação,
precisamos construir um sistema de
provas, e não há como construir tal
sistema baseado em linguagem natural
pela falta de precisão e ambiguidades das
sentenças da linguagem.”
(SILVA; FINGER; MELO, 2006, p. 185-186)
25/05/09 Prof. Celso A A Kaestner 26
27. Lógica para Computação (IF61B)
Verificação de Programas
• “Portanto, para verificarmos programas,
necessitamos de:
1)Uma especificação escrita em uma linguagem
com fundamento matemático para que seja
precisa e não ambígua
2)Um programa escrito em uma linguagem que
tem o significado de seus comandos definido de
forma precisa – semântica formal da linguagem
de programação”
(SILVA; FINGER; MELO, 2006, p. 185-186)
25/05/09 Prof. Celso A A Kaestner 27
28. Lógica para Computação (IF61B)
Verificação de Programas
• “Portanto, para verificarmos programas,
necessitamos de:
3) Uma forma de associar e comparar as
asserções da especificação com os comandos
do programa; as linguagens de especificação e
programação devem, portanto, ser comparáveis;
4) Um sistema de provas que usamos para
mostrar que um programa satisfaz uma dada
especifcação”
(SILVA; FINGER; MELO, 2006, p. 185-186)
25/05/09 Prof. Celso A A Kaestner 28
29. Lógica para Computação (IF61B)
Verificação de Programas
Exemplo de uma linguagem de
programação (SILVA; FINGER; MELO, 2006, p. 186);
• Um programa sequencial é basicamente
um transformador de dados do estado
inicial ao estado final;
• Semântica operacional: indica o
funcionamento de cada comando como
transformador de estados;
25/05/09 Prof. Celso A A Kaestner 29
30. Lógica para Computação (IF61B)
Verificação de Programas
• Semântica operacional (notação):
<C,σ> → σ’
• A execução de C sobre o estado σ produz
o estado σ’;
• Exemplo: <x:=E, σ> → σ[m/x]
25/05/09 Prof. Celso A A Kaestner 30
31. Lógica para Computação (IF61B)
Verificação de Programas
• Tripla de Hoare:
<ϕ> P <ψ>
para todo estado σ que satisfaz ϕ, se a
execução de P sobre ϕ termina
produzindo um estado σ’ que satisfaz ψ;
• Prova de programas: construir um sistema
de provas para asserções do tipo
꜔ <ϕ> P <ψ> ?
25/05/09 Prof. Celso A A Kaestner 31
32. Lógica para Computação (IF61B)
Verificação de Programas
• Correção parcial: <ϕ> P <ψ> é satisfeita sob
correção parcial se para todos os estados que
satisfazem ϕ o estado resultante da execução
de P satisfaz ψ, se P parar;
• Correção total: <ϕ> P <ψ> é satisfeita sob
correção total se para todos os estados que
satisfazem ϕ o estado resultante da execução
de P satisfaz ψ e é garantido que P pára.
25/05/09 Prof. Celso A A Kaestner 32
33. Lógica para Computação (IF61B)
Verificação de Programas
Correção parcial de programas (SILVA; FINGER;
MELO, 2006, p. 195);
Sistema de inferência com regras de Hoare
para a linguagem de programação
apresentada, sob a forma de uma lógica e
suas regras de inferência (SILVA; FINGER; MELO,
2006, p. 196);
Exemplos de demonstrações (SILVA; FINGER;
MELO, 2006, p. 200-225).
25/05/09 Prof. Celso A A Kaestner 33
34. Lógica para Computação (IF61B)
Referências
• SILVA, Flávio S. C. da; FINGER, M.;
MELO, Ana C. V. de. Lógica para
Computação. São Paulo: Thomson
Learning, 2006.