Semântica Axiomática

Documentos relacionados
Nelma Moreira. Departamento de Ciência de Computadores da FCUP. Aula 12

SEMÂNTICA 02/09/2013. Conceitos de LPs - Semântica

Lógica de Hoare. Abordagem que usaremos: aplicar o método de Hoare sobre uma linguagem de programação imperativa simplificada.

3 Cálculo de Hoare. 3.1 Semântica Axiomática de Linguagens de Programação

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

1 Lógica de primeira ordem

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Afirmações Matemáticas

Fundamentos 1. Lógica de Predicados

Lógica Computacional

Linguagem com sintaxe e semântica precisas: lógica. Mecanismo de inferência: derivado da sintaxe e da

Lógica. Professor Mauro Cesar Scheer

Cálculo proposicional

Matemática discreta e Lógica Matemática

Indução. Método de Prova por Indução. Jon Barwise e John Etchemendy, Capítulo: 16

JavaScript (Elementos de Programação e Programação Básica)

Nesta aula... Iteração indefinida. 1 Decisões em Python. 2 Funções lógicas. 3 Recursão. 4 Iteração. 5 Ciclo for ou while?

Introdução ao Curso. Área de Teoria DCC/UFMG 2019/01. Introdução à Lógica Computacional Introdução ao Curso Área de Teoria DCC/UFMG /01 1 / 22

LFA. Provas formais; Indução; Sintaxe e Semântica Teoria dos Conjuntos

Introdução à Programação em Python Notebook 12 - Verificação de programas

Introdução. História. História 18/03/2012. Lógica para Ciência da Computação. O que é Lógica?

LÓGICA I ANDRÉ PONTES

Programação Orientada a Objetos

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

CAPÍTULO 4 - OPERADORES E EXPRESSÕES

Conhecimento e Raciocínio Lógica Proposicional

Lógica de Predicados. Quantificadores

Linguagem de Programação I Prof. Tiago Eugenio de Melo.

Módulo: PYTHON. Felipe Oliveira

Introdução à Programação I

Programação em Lógica. UCPEL/CPOLI/BCC Lógica para Ciência da Computação Luiz A M Palazzo Maio de 2010

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Fundamentos 1. Lógica de Predicados

3 AULA. Valorações e Tabelas de Verdade LIVRO. META: Apresentar tabelas de verdade para classificar proposições lógicas.

Técnicas de projeto de algoritmos: Indução

Cálculo de Predicados

3 Cálculo Proposicional

01/09/2014. Capítulo 1. A linguagem da Lógica Proposicional

Lógica Computacional

1 TEORIA DOS CONJUNTOS

Lógica Computacional

Agenda. Complexidade Não Determinista A classe NP. A classe Co-NP Reduções de tempo polinomial. Definida por. Exemplos em:

2 AULA. Conectivos e Quantificadores. lógicas. LIVRO. META: Introduzir os conectivos e quantificadores

Programação I Apresentação

MATEMÁTICA DISCRETA CONCEITOS PRELIMINARES

Inteligência Artificial. Prof. Tiago A. E. Ferreira Aula 15 Agentes que Raciocinam Logicamente

Lógica proposicional

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.

LÓGICA FUZZY. Adão de Melo Neto

Programação Introdução

NHI Lógica Básica (Lógica Clássica de Primeira Ordem)

Lógica e Metodologia Jurídica

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Lógica Computacional

Lógica Computacional

Lógica. Cálculo Proposicional. Introdução

Aula 2, 2014/2 Sintaxe da Lógica dos Conectivos

Alfabeto da Lógica Proposicional

Aula 2: Linguagem Proposicional

2 Lógica Fuzzy. 2 Lógica Fuzzy. Sintaxe da linguagem

Cálculo proposicional

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema

Matemática para Ciência de Computadores

Raciocínio Lógico. Negação da Conjunção e Disjunção Inclusiva (Lei de Morgan) Professor Edgar Abreu.

Lógica Computacional DCC/FCUP 2017/18

Introdução à Logica Computacional. Aula: Lógica Proposicional -Sintaxe e Representação

Lógica Computacional

Sumário. Os Enigmas de Sherazade I Ele fala a verdade ou mente? I I Um truque com os números... 14

Transcrição:

Semântica Axiomática

O estilo axiomático presta-se particularmente à prova e raciocínio sobre propriedades dos programas, e à sua verificação, i.e. à prova de correcção dos programas face às suas especificações. A ferramenta semântica que estudaremos é a Lógica de Floyd-Hoare

Correcção Parcial A Lógica de Floyd-Hoare lida com triplos de correcção parcial da forma {P} C {Q} em que C é um programa e P e Q são propriedades do programa. P designa-se por pré-condição e Q por pós-condição.

Correcção Parcial Significado de {P} C {Q}: se C termina quando executado a partir de um estado S em que P se verifica, então, se C terminar, Q verifica-se. O que esta asserção não especifica: que C termine a partir do estado S o que acontece se C não terminar daí a parcialidade desta noção de correcção.

Linguagem Lógica {P} C {Q} Qual a sintaxe e poder expressivo da linguagem utilizada para descrever as propriedades P e Q? A linguagem lógica deverá conter pelo menos as conectivas disponíveis na linguagem em estudo.

mas precisaremos agora de conectivas lógicas como conjunção, disjunção, e negação: L ::= b E bop E L lop L lop {,,, } Asserções poderão ainda conter quantificadores,

Regras de Inferência para a Correcção Parcial {P }skip{p } {P }C 1 {Q} {Q}C 2 {R} {P }C 1 ; C 2 {R}

{P B}C 1 {Q} {P B}C 2 {Q} {P }if B then C 1 else C 2 {Q} {Q[E/l]} l := E {Q}

Invariantes de ciclo Uma propriedade P diz-se um invariante do ciclo while B do C se puder ser inferido. {P B}C{P } A que se deve a presença de B na pré-condição?

Note-se que se o ciclo while B do C terminar, P é verdadeiro depois da sua execução, e B só pode ser falso. {P B}C{P } {P }while B do C{P B} Porque não se inclui B na pré-condição?

Regras Lógicas: Consequência P = P {P }C{Q } Q = Q {P }C{Q} Permite fortalecer a pré-condição e/ou enfraquecer a pós-condição

Correcção da Semântica Axiomática Dados um comando C e predicados P e Q tais que o triplo de correcção parcial seguinte {P }C{Q} é derivável na Lógica de Hoare, seja s um estado que satisfaz P, e C [C ](s) = s., Então s satisfaz Q.

Interpretação de Asserções A semântica de uma linguagem lógica de predicados é bem conhecida de outras disciplinas. Identificando-se estados e valorações, a interpretação das asserções será uma extensão da interpretação das expressões booleanas da linguagem. Exemplo: [!l 1 =!l 2 ]s = (E [!l 1 ](s) = E [!l 2 ](s))

Interpr. de Triplos de Hoare [{P }C{Q}] = true se para todos os estados s e s tais que [P ](s) = true e C [C ](s) = s se tem [Q](s ) = true. [{P }C{Q}] = false em todos os outros casos

Correcção da Semântica Axiomática (v.2) Dados um comando C e predicados P e Q tais que o triplo de correcção parcial seguinte {P }C{Q} é derivável na Lógica de Hoare, então [{P }C{Q}] = true. (prova indutiva nas regras da Lógica de Hoare)

Lógica de Floyd-Hoare Complementos

Asserções Especiais Naturalmente, para uma dada pós-condição Q, temos interesse em saber qual a pré-condição mais fraca que garante essa pós-condição, uma vez que ela pode depois ser fortalecida. Caso extremo: {true} C {Q} significa que sempre que C termina, Q é satisfeito. A pré-condição é a mais fraca possível.

Asserções Especiais Simetricamente, para uma pré-condição P temos interesse em conhecer a pós-condição mais forte por ela garantida, que pode depois ser enfraquecida. Caso extremo {P} C {false} quando executado a partir de um estado em que P se verifica, C não termina. A pós-condição é a mais forte possível.

Asserções Especiais {P} C {true} e {false} C {Q} Asserções axiomaticamente válidas, correspondem à pós-condição mais fraca possível, e à pré-condição mais forte possível

Variáveis Auxiliares É útil poder referir numa pós-condição o valor que uma variável tinha no início do programa. Por exemplo para especificar o comportamento de um programa swap que troca os valores de duas variáveis: {!l1=x!l2=y} swap {!l1=y!l2=x} As variáveis auxiliares x e y permitem exprimir isto. Ex: escrever swap e provar a validade da asserção

Especificações Complexas A especificação de programas com alguma complexidade leva-nos à introdução de predicados e/ou funções na linguagem de asserções. Um exemplo típico é o do cálculo de uma grandeza matemática definida recursivamente, como a exponenciação: exp (n,0) = 1 exp (n,k+1) = n * exp (n, k)

{!l 2 0} calcexp {!l 3 = exp (!l 1,!l 2 )} Exercício: escrever calcexp e provar a sua correcção PROBLEMA: existe uma solução trivial! A especificação acima deve ser corrigida

{!l 2 0} calcexp {!l 3 = exp (!l 1,!l 2 )} Exercício: escrever calcexp e provar a sua correcção PROBLEMA: existe uma solução trivial! A especificação acima deve ser corrigida: {!l1=x!l2=y!l2 0} calcexp {!l 3 = exp (!l 1,!l 2 )!l 1 =x!l 2 =y}

Correcção Total Questão: quais as dificuldades inerentes ao tratamento de uma noção de correcção total? A única forma de se definir uma regra de inferência para lidar com a terminação de um ciclo é através da introdução de um variante de ciclo uma grandeza numérica não-negativa e decrescente em todas as iterações do ciclo.

Correcção Total As asserções de correcção total escrevem-se normalmente como [P] C [Q] [P B V=n] C [P V<n] P B V 0 [P] while B do C [P B] As restantes regras são iguais às de correcção parcial.

Se já se provou a correcção parcial, para provar a correcção total basta provar que o programa termina, ou seja [P] C [true] Exercício: Provar a correcção total do programa que calcula a exponenciação