Lógica para Computação (IF61B)
Especificação de programas
Engenharia de Requisitos: como entender e
modelar um problema real para obter uma solução computacional;
Engenharia de Software: é uma área da
Computação voltada à especificação,
desenvolvimento e manutenção de sistemas de software, com aplicação de tecnologias e práticas de gerência de projetos e outras disciplinas, visando organização,
Lógica para Computação (IF61B)
Especificação de programas
Uma tarefa típica em Computação:
problema problema
Lógica para Computação (IF61B)
Especificação de programas
Especificações em linguagem natural exigem
que se assuma o significado de diversos
termos, e por isto são “imprecisas / vagos / inconsistentes” permitindo diversas
interpretações;
Este é um problema amplamente estudado
em Engenharia de Software, que busca de métodos e formalismos tenta eliminar / reduzir este problema.
Lógica para Computação (IF61B)
Especificação de programas
Visão operacional de um programa:
dados de dados de
entrada saída
Programas como transformadores de estados:
... 1 = {v1
1,v12...v1m} = {v21,v22...v2m} = {vn1,vn2...vnm}
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
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 2 (superespecificação):
sobre o estado inicial: x 10 y 10 (x + y) 0 sobre o estado final: z = x + y z 20
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 3 (especificação pouco clara):
sobre o estado inicial: x 10 (x + y) (10 + x) sobre o estado final: z = x + y
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 4 (especificação incompleta): sobre o estado inicial: x 10
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” 5 (não é especificação ...): sobre o estado inicial: x 10 y 10 sobre o estado final: z = x + y z < 10
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: a linguagem matemática é precisa e
identifica um significado único para cada propriedade;
2. Verificação de consistência: a linguagem
matemática nos possibilita verificar
inconsistências nas especificações quando há propriedades contraditórias sobre um mesmo objeto;
Lógica para Computação (IF61B)
Especificação de programas
3. Simulação: especificações em algumas
linguagens matemáticas podem ser
parcialmente executáveis, auxiliando a verificação;
4. Verificação de programas: após a construção de
um programa é possível – de forma automática ou semiautomática – verificar se esta é uma
solução (ou satisfaz) a especificação do problema.
Lógica para Computação (IF61B)
Especificação de programas
Pode-se usar o Lógica Matemática como
linguagem de especificação;
Ver na referência (da Silva, Finger, de Melo) às
páginas 165 a 169 o uso da Lógica Matemática como linguagem de especificação.
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
Lógica para Computação (IF61B)
Especificação de programas
Exemplo: fatorial. 1 se n=0 n! = 1 se n=1 n*(n-1)! se n>1 PRE: n 0 POS: fat = n! fat > 0 INV: fat > 0
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
Lógica para Computação (IF61B)
Verificação de programas
Exemplo: (Merge) dadas duas seqüências
ordenadas de inteiros produzir nova seqüência ordenada que entrelace os números das duas seqüências:
Entradas: V1 = {1,3,6,9} e
V2 = {2,3,3,7,10}
Lógica para Computação (IF61B)
Verificação de programas
void merge(int V1[],V2[],V3[],t1,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++;}Lógica para Computação (IF61B)
Verificação de programas
Erro: se uma das seqüê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
Lógica para Computação (IF61B)
Verificação de programas
void merge(int V1[],V2[],V3[],t1,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++;}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.
Lógica para Computação (IF61B)
Verificação de programas
void merge(int V1[],V2[],V3[],t1,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++;}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++;} }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
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;
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
Lógica para Computação (IF61B)
Verificação de programas
Estratégias para produzir programas corretos
(pg. 183):
1.
Síntese: dada um 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;
2.
Verificação: Dada uma especificação
e um
programa P, mostrar que P é um modelo para
Lógica para Computação (IF61B)
Verificação de programas
Uso da verificação formal na prática:
1) Análise: Dado um programa P, encontrar uma
especificação que defina o problema para o qual P é a solução;
2) Correção: Dados uma especificação e um
programa P que não satisfaz , construir P’ que satisfaça e que seja “próximo” a P;
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
Lógica para Computação (IF61B)
Verificação de programas
Exemplo de uma linguagem de
programação (pg. 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;
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
’;
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
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
Lógica para Computação (IF61B)
Verificação de programas
Correção parcial de programas (pg. 195);