MENU: [ Avisos | Informações Gerais | Regras | Plano de Atividades ]
Última atualização em 14/04/2016 (interrupção da disciplina).
Leia toda esta página no início do semestre: ela contém informações essenciais, como as regras para solicitação de segunda chamada e para o cálculo da nota na disciplina.
Esta página está em contínua construção. Por favor, entre em contato comigo caso você precise de alguma informação adicional, ou caso acredite ter encontrado um erro aqui. Obrigado!
:-(
Meus sinceros agradecimentos aos 3 alunos ouvintes pela participação
de qualidade até o fim das aulas.
Aos alunos interessados nesta disciplina:
até 2017.1!
Nesta disciplina nós aprendemos a demonstrar matematicamente a corretude de algoritmos e programas estruturados. A chamada da disciplina possui um resumo do conteúdo, a regulamentação oficial contém informações importantes como justificativa, objetivos, ementa e bibliografia.
O nosso livro de referência é este
Krzysztof R. Apt, Frank S. de Boer, Ernst-Rüdiger Olderog. Verification of Sequential and Concurrent Programs, Third Edition. Springer, 2010. ISBN-13: 978-1-84882-744-8, 978-1- 4471-2513-6. [editora] [pdf]mas ele é teórico demais para ser seguido linearmente nesta disciplina introdutória de graduação, além de não abordar todo o conteúdo desejado. Por isso, a principal fonte de conteúdo serão as aulas e os materiais nelas sugeridos.
Todas as atividades da disciplina já têm data estimada no plano de atividades, que também descreve as 3 partes da disciplina.
A minha sugestão para a obtenção de um bom desempenho na disciplina é participar das aulas e, aula-a-aula, estudar o conteúdo ministrado, fazer os exercícios e tirar as dúvidas. Caso você possua uma dúvida no horário da aula, o ideal é tirá-la na própria ocasião, para que os demais alunos também se beneficiem das explicações. Esteja, porém, à vontade para me contactar fora do horário de aula.
Segunda chamada: consulte as regras para a solicitação de prova de segunda chamada.
Média das Avaliações | ≥ 7 | 7 > média ≥ 4 | < 4 |
---|---|---|---|
Situação | Aprovado | AF | Reprovado |
Recursos Básicos de Verificação Dedutiva: assim como em CAnA vários problemas são postos e resolvidos, utilizando as técnicas apresentadas na disciplina, nesta parte da disciplina nós fazemos a verificação de uma série de algoritmos e programas, sucessivamente mais elaborados. Nas aulas teóricas, apresentamos os recursos que nos permitem demonstrar matematicamente a corretude de um algoritmo. Nas aulas práticas, utilizamos esses recursos na verificação de programas reais, provavelmente usando a plataforma Frama-C.
Formalismos para a Verificação de Programas: são apresentados dois formalismos lógicos para a verificação de programas, a Lógica de Hoare e as Weakest Preconditions de Dijkstra. É certamente a parte mais teórica da disciplina (não haverão aulas práticas), e, para ex-alunos de Lógica, talvez pareça uma versão aplicada de aulas de Dedução Natural, pelo uso de regras de inferência e etc.
Recursos mais Elaborados de Verificação: são apresentados recursos para casos mais elaborados de verificação, como código fantasma e funções-lema, e em particular recursos para a verificação de manipulação de memória, como Dynamic Frames (aulas práticas usando Dafny).
Aula | Data | Descrição |
---|---|---|
01 | 14/03 | Introdução à Verificação Dedutiva de Programas |
02 | 16/03 | Pré- e Pós-Condições; Estrutura de Seleção; Invariantes e Variantes de Laço. |
03 | 21/03 | Aula Prática (requires, ensures, assigns, loop invariant / variant / assigns )
|
04 | 23/03 | Prova de Variantes e Invariantes de Laços "Enquanto" e "Para" |
05 | 28/03 | Aula Prática (busca binária) |
06 | 30/03 | Laços com "Break"; Operadores ([] , ÷ , etc)
|
07 | 04/04 | Aula Prática |
08 | 06/04 | Chamadas de Funções; Recursão; Terminação. |
09 | 11/04 | Aula Prática |
10 | 13/04 | Exercícios de Verificação |
11 | 18/04 | Aula Prática |
* | 20/04 | Avaliação Parcial 1 |
12 | 25/04 | Correção da AP1 |
13 | 27/04 | Lógica de Hoare: Atribuição, Sequência, Teste, Laço, Consequência. |
14 | 02/05 | Lógica de Hoare: Atribuição "para a Frente"; Exercícios. |
15 | 04/05 | Lógica de Hoare: Vetores. |
16 | 09/05 | Lógica de Hoare: Corretude Total como Corretude Parcial + Terminação. |
17 | 11/05 | Lógica de Hoare: Funções, usos simples. |
18 | 16/05 | Lógica de Hoare: Funções, usos mais elaborados. |
19 | 18/05 | Weakest Preconditions de Dijkstra |
20 | 23/05 | Mais Weakest Preconditions |
* | 25/05 | Avaliação Parcial 2 |
21 | 30/05 | Correção da AP2. |
22 | 01/06 | Funções-Lema |
23 | 06/06 | Aula Prática |
24 | 07/06 | (AULA EXTRA – Decidir Horário) Código Fantasma |
08/06 | Sem Aula (Compromisso Pessoal do Professor) | |
25 | 13/06 | Aula Prática |
26 | 15/06 | Ponteiros |
27 | 20/06 | Aula Prática |
28 | 22/06 | Tipos Indutivos e Verificação de Estruturas de Dados |
29 | 27/06 | Aula Prática |
30 | 29/06 | Verificação de Estruturas de Dados |
31 | 04/07 | Aula Prática |
* | 06/07 | Acompanhamento dos Projetos de Verificação |
* | 11/07 | Acompanhamento dos Projetos de Verificação |
* | 13/07 | Apresentações dos Projetos de Verificação |
* | 18/07 | AF |
* | 20/07 | Notas Finais da Disciplina. |
Aula 1 (2016-03-14, segunda-feira): introdução à disciplina; exemplos de verificação na plataforma Frama-C (máximo de 2 números e busca linear num vetor; arquivos no SIGAA).
EXERCÍCIOS RECOMENDADOS:
Tomando como base o exemplo do arquivo busca_linear.c
(e extensões óbvias, como \exists
),
escreva e verifique uma função que calcula o máximo de um vetor.
Idem ao exercício anterior, mas com relação a uma versão iterativa do algoritmo de busca binária.
PARA INSTALAR O FRAMA-C:
Uma maneira trivial é usar o gerenciador de pacotes do Linux
e instalar de lá. Ou simplesmente executar
sudo apt-get install frama-c-gui
.
A desvantagem é que a versão instalada pode não ser a última, e além disso essa instalação não inclui provadores automáticos de teorema fora o Alt-Ergo (Z3, CVC4, etc). Para tanto, é preciso instalar o Why3 (que eu instalo via OPAM, opção abaixo).
Outra maneira simples, mas não tão direta quanto essa acima, é instalar o OPAM (que instala programas OCaml compilando o código fonte), e daí instalar o Frama-C, o Why3, etc, todos sendo automaticamente as versões mais recentes.
A desvantagem é você não conseguir instalar a tempo, e daí não conseguir fazer os exercícios, que são o principal; não perca tempo demais com esses detalhes!
A instalação do OPAM pode ser
trivial (executar eval `opam config env`
em seguida,
como solicitado ao fim da instalação).
Depois disso, basta fazer algo como:
opam install depext opam depext why3 opam install why3 opam depext frama-c opam install frama-cDepois disso, basta instalar o Z3 e o CVC4, executar
why3 config --detect
(para o Why3 reconhecer os provadores instalados)
e chamar o Frama-C usando -wp -wp-prover alt-ergo,z3,cvc4
(para ele usar todos os 3 provadores).
Aula 2 (2016-03-17, quarta-feira): introdução à verificação de algoritmos; exemplo 1: máximo de dois números (projeto de pré- e pós-condições; manipulação de estrutura de seleção; prova de terminação); exemplo 2: busca linear (prova de correção total usando variante e invariantes de laço; prova de variante: limite inferior (inicial e ao fim de iteração) e diminuição).
EXERCÍCIOS ESSENCIAIS:
Tente provar que os invariantes que escrevemos para o algoritmo de busca linear estão corretos. Como explicado em sala, a prova tem duas partes: validade inicial e preservação. Depois de escrever a sua prova, veja o material citado mais abaixo para conferir.
Especifique, via pré- e pós-condições, um algoritmo para calcular o máximo de um vetor v[1..n] (n ≥ 1), e prove, usando variante e invariantes, que o algoritmo atende à especificação. Além disso, você deve provar que o variante e os invariantes estão corretos. ATENÇÃO: o exercício 5-C do material 3 abaixo possui uma solução, mas veja-a APENAS DEPOIS de preparar a sua!
Idem ao exercício anterior, mas com relação a uma versão iterativa do algoritmo de busca binária. (Esse exercício é mais trabalhoso, e portanto útil para testar a sua compreensão do assunto e identificar possíveis dúvidas.)
MATERIAL DE ESTUDO: as notas de aula [1], [2] e [3] de CAnA 2015.1 cobrem essencialmente o mesmo conteúdo que vimos nesta aula, e apresentam por escrito as demonstrações que apresentei apenas verbalmente (há diferenças, mas mais em forma que em conteúdo).
Aula 3 (2016-03-21, segunda-feira):
prática de verificação na plataforma
Frama-C
(frama-c-gui -wp -wp-rte codigo.c
).
Exemplos abordados:
teste de igualdade entre dois vetores;
identificação do primeiro par de adjacentes iguais num vetor;
teste de ordenação de um vetor.
Recursos ACSL utilizados:
requires, ensures, assigns,
loop invariant, loop variant, loop assigns.
EXERCÍCIOS ESSENCIAIS:
Com relação aos exercícios feitos durante a aula,
compare as especificações que você escreveu
com aquelas disponibilizadas no SIGAA – atenção aos detalhes!
Certifique-se de que as suas funções atendem às especificações,
e, para garantir a terminação do código,
apresente e prove um loop variant
para cada laço.
(A linguagem ACSL já aceita uma especificação como
terminates \true
para funções, mas infelizmente
ela ainda é ignorada pelo plug-in WP.)
Escreva e verifique uma função que receba um vetor "v" de "n" inteiros em ordem crescente (≤) e um um inteiro "x", e que retorne a posição "k" do vetor tal que, se inseríssemos "x" entre v[k-1] e v[k], o vetor continuaria ordenado (em caso de múltiplas opções, retorne a posição mais à esquerda).
Escreva e verifique uma função iterativa de busca binária.
MATERIAL DE REFERÊNCIA: manual da linguagem de especificação ACSL.
Aula 4 (2016-03-23, quarta-feira): prova de invariantes de laço: validade inicial e preservação (exemplo: busca linear); variantes e invariantes de laço "Para" (exemplo: primeiro par de adjacentes iguais num vetor).
EXERCÍCIOS ESSENCIAIS:
Escreva, especifique e verifique um algoritmo que retorne o índice do segundo menor número de um vetor v[1..n] tal que "n ≥ 2".
Escreva, especifique e verifique um algoritmo que receba um vetor de inteiros e que substitua por zero todos os números negativos do vetor (use um laço "para").
MATERIAL DE ESTUDO: os mesmos materiais [1], [2] e [3] mencionados na aula 2.
Aula 5 (2016-03-28, segunda-feira): prática de verificação: busca binária iterativa.
EXERCÍCIOS ESSENCIAIS:
Compare a especificação que você escreveu no laboratório com aquela disponibilizada no SIGAA – atenção aos detalhes! Certifique-se de que a sua função atende a toda a especificação, e, para garantir a terminação do código, apresente e prove um variante para o laço do algoritmo.
MATERIAL DE REFERÊNCIA: manual da linguagem de especificação ACSL.
Aula 6 (2016-03-30, quarta-feira):
verificação de laços com "break" (exemplo: checar ordenação de vetor);
verificação do uso de operadores ([]
, ÷
, etc);
verificação do algoritmo iterativo de busca binária.
EXERCÍCIOS ESSENCIAIS:
Especifique, escreva e verifique um algoritmo que retorne o índice do primeiro elemento negativo de um vetor de "n ≥ 0" números, ou que retorne "n+1" se não existir tal elemento. Use "break"!
Especifique, escreva e verifique um algoritmo de particionamento para o Quicksort (você pode escolher entre a partição de Lomuto, a de Hoare ou ainda outra, se você preferir).
Atenção: este exercício não pede que você trate do algoritmo de ordenação Quicksort propriamente dito, mas apenas do algoritmo de particionamento, que coloca o pivô à direita dos elementos menores que ele e à esquerda dos elementos maiores que ele.
Sugestão: receba a posição do pivô como argumento, ao invés de o valor do pivô.