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. [email protected] Alterado e complementado por Prof. Adolfo Neto, D.Sc. [email protected] Lógica para Computação (IF61B) Especificação de programas • Uma tarefa típica em Computação: problema real • • Modelagem problema computacional 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 Lógica para Computação (IF61B) Especificação de programas Visão operacional de um programa: dados de entrada programa dados de saída Programas como transformadores de estados: ... 1 = {v11,v12...v1m} 25/05/09 = {v21,v22...v2m} Prof. Celso A A Kaestner = {vn1,vn2...vnm} 3 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 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 Lógica para Computação (IF61B) Especificação de programas • Vantagens de se ter uma especificação definida por formalismo matemático: 1. 2. 3. 4. Precisão; Verificação de consistência; Simulação; 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 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 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 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 Lógica para Computação (IF61B) Verificação de Programas • Exemplo (SILVA; FINGER; MELO, 2006, p.179-183): (Merge) dadas duas seqüê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 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 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 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 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 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 Lógica para Computação (IF61B) Verificação de Programas while (t1>0) p1=p1+1; p3++;} while (t2>0) p2=p2+1; p3++;} } {V3[p3]=V1[p1]; t1=t1-1; {V3[p3]=V2[p2]; t2=t2-1; • O programa agora está OK. 25/05/09 Prof. Celso A A Kaestner 16 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 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 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 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 um especificação , um programa P é construído de forma automática ou semiautomá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 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 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 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 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 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 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 da sentenças na linguagem.” (SILVA; FINGER; MELO, 2006, p. 185-186) 25/05/09 Prof. Celso A A Kaestner 26 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 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 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 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 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 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 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 provas (SILVA; FINGER; MELO, 2006, p. 200-225). 25/05/09 Prof. Celso A A Kaestner 33 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.