Lógica para Computação Prof. Celso Antônio Alves Kaestner, Dr. Eng. celsokaestner (at) utfpr (dot) edu (dot) br 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, produtividade e qualidade. 2 Prof. Celso A A Kaestner 05/11/2015 Lógica para Computação (IF61B) Especificação de programas Uma tarefa típica em Computação: problema real problema Modelagem computacional 3 Prof. Celso A A Kaestner 05/11/2015 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. 4 Prof. Celso A A Kaestner 05/11/2015 Lógica para Computação (IF61B) Especificação de programas Visão operacional de um programa: dados de programa dados de entrada saída Programas como transformadores de estados: 1 = {v11,v12...v1m} = {v21,v22...v2m} = {vn1,vn2...vnm} ... 5 Prof. Celso A A Kaestner 05/11/2015 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 6 Prof. Celso A A Kaestner 05/11/2015 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 7 Prof. Celso A A Kaestner 05/11/2015 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 8 Prof. Celso A A Kaestner 05/11/2015 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 sobre o estado final: z = x + y 9 Prof. Celso A A Kaestner 05/11/2015 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 10 Prof. Celso A A Kaestner 05/11/2015 Lógica para Computação (IF61B) Especificação de programas 1. 2. Vantagens de se ter uma especificação definida por formalismo matemático: Precisão: a linguagem matemática é precisa e identifica um significado único para cada propriedade; 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; 11 Prof. Celso A A Kaestner 05/11/2015 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. 12 Prof. Celso A A Kaestner 05/11/2015 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. 13 Prof. Celso A A Kaestner 05/11/2015 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. 14 Prof. Celso A A Kaestner 05/11/2015 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 PRE: n 0 POS: fat = n! fat > 0 INV: n>1 fat > 0 15 Prof. Celso A A Kaestner 05/11/2015 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. 16 Prof. Celso A A Kaestner 05/11/2015 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} Saída: V3 = {1,2,3,3,6,7,9,10} 17 Prof. Celso A A Kaestner 05/11/2015 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++;} } 18 Prof. Celso A A Kaestner 05/11/2015 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 19 Prof. Celso A A Kaestner 05/11/2015 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++;} } 20 Prof. Celso A A Kaestner 05/11/2015 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 21 Prof. Celso A A Kaestner 05/11/2015 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++;} ; (continua) 22 Prof. Celso A A Kaestner 05/11/2015 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. 23 Prof. Celso A A Kaestner 05/11/2015 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. 24 Prof. Celso A A Kaestner 05/11/2015 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 correção total do programa. 25 Prof. Celso A A Kaestner 05/11/2015 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 (P satisfaz ). 26 Prof. Celso A A Kaestner 05/11/2015 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 complexidade. 27 Prof. Celso A A Kaestner 05/11/2015 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; 28 Prof. Celso A A Kaestner 05/11/2015 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] 29 Prof. Celso A A Kaestner 05/11/2015 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 <> ? 30 Prof. Celso A A Kaestner 05/11/2015 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. 31 Prof. Celso A A Kaestner 05/11/2015 Lógica para Computação (IF61B) Verificação de programas Correção parcial de programas (pg. 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 (pg. 196); Exemplos de provas (pg. 200 em diante). 32 Prof. Celso A A Kaestner 05/11/2015