METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino...

23
M ´ ETODOS FORMAIS E SEGURANC ¸A EM COMPUTAC ¸ ˜ AO CORREC ¸ ˜ AO DE PROGRAMAS RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESP ´ IRITO SANTO 1. etodos formais e projeto de algoritmos O foco principal destas notas consiste no uso de m´ etodos formais para projeto e valida¸ ao de algoritmos. Entre os t´ opicos abordados est˜ ao o uso de racioc´ ınio indutivo no projeto e valida¸ ao de algoritmos e a metodologia de Dijkstra para deriva¸ ao de programas corretos por constru¸ ao. Um dos grandes paradoxos da Ciˆ encia da Computa¸ ao reside no ensino daquilo que ´ e a pr´ opria essˆ encia e raz˜ ao de ser dessa ciˆ encia: algoritmos. Manber, por exemplo, abre o pref´ acio de [12] falando sobre sua frustra¸ ao com a dificuldade do ensino de algoritmos e Knuth em [10] parece considerar que algoritmos s´ o seriam analis´ aveis em termos de complexidade, sendo a corre¸ ao e a disciplina de projeto inviavel- mente complexos. Os cl´ asicos de Engenharia de Software, por outro lado, parecem ter uma solu¸ ao mais direta para o problema: Pressman [15], por exemplo, simplifica o processo da constru¸ ao de software pelo estudo superficial do projeto de valida¸ ao de algoritmos: tais livros transmitem comumente a id´ eia de que existe uma forma de constru¸ ao de software sem algoritmos, o que inevitavelmente traz ` a mente uma craracteriza¸ ao de Dijkstra sobre o que seria Engenharia de Software: what to do if you cannot. De qualquer forma a dificuldade inerente do ensino de projeto de algoritmos, ou a incapacidade inerente dos curriculos atuais de Ciˆ encia da Computa¸ ao em abodar tal disciplina, deve provavelmente estar na raiz da baixa qualidade de software e do aviso inevit´ avel que acompanha qualquer programa comercial: o fabricante deste programa n˜ ao oferece quaisquer garantias sobre a qualidade do produto e sobre poss´ ıveis danos resultantes de seu uso. Por outro lado, se o ensino de algoritmos tem sido apresentado como frustrante por diversos e pretigiados autores, mais frustrante ainda pode ser a tentativa de entender alguns algoritmos apresentados em 1

Transcript of METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino...

Page 1: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EMCOMPUTACAO

CORRECAO DE PROGRAMAS

RAUL H.C. LOPESUNIVERSIDADE FEDERAL DO ESPIRITO SANTO

1. Metodos formais e projeto de algoritmos

O foco principal destas notas consiste no uso de metodos formaispara projeto e validacao de algoritmos. Entre os topicos abordadosestao o uso de raciocınio indutivo no projeto e validacao de algoritmose a metodologia de Dijkstra para derivacao de programas corretos porconstrucao.

Um dos grandes paradoxos da Ciencia da Computacao reside noensino daquilo que e a propria essencia e razao de ser dessa ciencia:algoritmos. Manber, por exemplo, abre o prefacio de [12] falando sobresua frustracao com a dificuldade do ensino de algoritmos e Knuth em[10] parece considerar que algoritmos so seriam analisaveis em termosde complexidade, sendo a correcao e a disciplina de projeto inviavel-mente complexos. Os clasicos de Engenharia de Software, por outrolado, parecem ter uma solucao mais direta para o problema: Pressman[15], por exemplo, simplifica o processo da construcao de software peloestudo superficial do projeto de validacao de algoritmos: tais livrostransmitem comumente a ideia de que existe uma forma de construcaode software sem algoritmos, o que inevitavelmente traz a mente umacraracterizacao de Dijkstra sobre o que seria Engenharia de Software:what to do if you cannot.

De qualquer forma a dificuldade inerente do ensino de projeto dealgoritmos, ou a incapacidade inerente dos curriculos atuais de Cienciada Computacao em abodar tal disciplina, deve provavelmente estar naraiz da baixa qualidade de software e do aviso inevitavel que acompanhaqualquer programa comercial: o fabricante deste programa nao oferecequaisquer garantias sobre a qualidade do produto e sobre possıveis danosresultantes de seu uso.

Por outro lado, se o ensino de algoritmos tem sido apresentado comofrustrante por diversos e pretigiados autores, mais frustrante aindapode ser a tentativa de entender alguns algoritmos apresentados em

1

Page 2: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

2 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

textos classicos da Ciencia da Computacao. Dijkstra, por exemplo,apresenta como motivacao para escrever [5] a constatacao de que amaioria dos programas sao apresentados mesmo em textos classicos emformato totalmente inadequado para apreciacao por seres humanos.Para aqueles que consideram esse mais um exagero do mentor maiorda derivacao formal de algoritmos vale um convite a ler a apresentacaodo algoritmo de exclusao em arvore B apresentado por Wirth em [17]:sao duas paginas de um texto ambıguo que nao cobre todos os casosdo algoritmo, seguido de uma implementacao de mais duas paginas emModula-2, onde figuram mais de uma dezena de referencias via pon-teiros. Se a seguinte observacao de Hoare, retirada de [9], ainda temalgum valor, esse nao e definitivamente um codigo estruturado e legıvel:

Pointers are like jumps, leading wildly from one part ofthe data structure to another. Their introduction intohigh-level languages has been a step backwards fromwhich we may never recover.

Vale lembrar que [11] e o mais recente [8] relegam a exclusao emarvore B a uns poucos exemplos sem nenhuma tentativa de apresentarqualquer algoritmo: exercıcio trivial para o leitor.

2. Algoritmos e inducao

O raciocınio indutivo pode ser a base de uma poderosa disciplinade projeto de programas. E interessante notar que a inducao esta nofundamento de conceitos importantes como a relacao de transitividadeda maquina de Turing, que tem um definicao indutiva, e de estruturasde dados complexas como arvores B ou heaps binomiais. Em geral,tipos de dados podem ser apresentados como classes indutivas, ver [2],definidos atraves de:

• um conjunto de objetos iniciais;• um conjunto de operadores que permitem construir novos ob-

jetos a partir de objetos inicialmente dados.

Sequencias, por exemplo, sao apresentadas em [7] como uma classeindutiva formada a partir de:

• uma funcao constante, que representa a sequencia vazia;• uma funcao que constoi uma nova sequencia a partir de uma

sequencia dada e um objeto qualquer.

Page 3: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS3

Os axiomas a seguir definem sequencias de elementos de A, denotadaseq.A:

⊥ ∈ seq.A(1)

(a / x) ∈ seq.A ⇐ x ∈ seq.A ∧ a ∈ A(2)

fecho universal.(3)

O fecho universal acima estabelece que sao elementos de seq.A ape-nas objetos construıdos pelo uso exclusivo dos axiomas 1 e 2.

Assumindo que x, y ∈ seq.A e que a, b ∈ A, os seguintes axiomastratam a igualdade sobre sequencias.

⊥ 6= (a / x)(4)

(a / x) = (b / y) .=. a = b ∧ x = y(5)

O princıpio da inducao sobre sequencias estabelece condicoes paraque uma propriedade P seja valida para qualquer sequencia, sendodenotado WPI(P ).

WPS(P )4= (∀x : x ∈ seq.A : ∀a : a ∈ A : P.x ⇒ P.a / x)(6)

WPI(P )4= (P.⊥ ∧WPS(P )) ⇒ (∀x : x ∈ seq.A : P.x)(7)

2.0.1. Ordenacao por insercao. Apresentados os axiomas que estabe-lecem a classe de sequencias, definicoes indutivas podem ser usadaspara introduzir operacoes sobre sequencias. Por exemplo, a soma doselementos de uma sequencia e definida indutivamente atraves de doisaxiomas:

• a soma dos elementos de uma sequencia vazia e zero;• a soma dos elementos de uma sequencia (a /x) e o resultado de

somar a a soma dos elementos de x.

Essa definicao reflete exatamente a estrutura do tipo de dados emquestao, como deveria ser: na terminologia modernosa de orientacaopara objetos, o tipo seq.A tem dois construtores e qualquer definicaode operadores deve ter extamente um caso para cada construtor.

Considere-se agora a operacao de ordenacao de sequencias, topicofundamental de qualquer curso de Ciencia da Computacao. Cabe pri-meiro a pergunta: o que significa uma sequencia estar ordenda?

Um definicao indutiva poderia estabelecer que:

• (λ) ↗: a sequencia vazia esta ordenada;• (a / x) ↗: (a / x) esta ordenada quando a e um mınimo para a

sequencia e x esta ordenada.

Page 4: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

4 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

(⊥) ↗(8)

(a / x) ↗= ((x) ↗ ∧∀b : b ∈ x : b � a(9)

Os axiomas acima definem o que significa uma sequencia estar orde-nada com a respeito a alguma relacao (�) sobre os elementos de umtipo A. Mais interessante, no entanto, e poder calcular a versao or-denada de uma sequencia x, ou seja, poder calcular uma permutacaoordenada de x.

Novamente, usando raciocınio indutivo sobre a construcao de umasequencia dada, e uma certa/muita dose de analogia com o processo desoma anteriormente discutido, segue uma definicao ordenacao:

sort ⊥ = ⊥(10)

sort (a / x) = a (sort x)(11)

Cabe garantir a correcao da definicao, ou seja, que dada uma sequenciax:

• (sort x) e uma sequencia ordenada;• (sort x) e uma permutacao de x.

A correcao depende obviamente da correcao do operador , que eintroduzido nos axiomas a seguir.

a ⊥ = (a / x)(12)

a � b ⇒ (a (b / x) = (a / (b / x)))(13)

b ≺ a ⇒ (a (b / x) = (b / (a x)))(14)

Teorema 1. Se (x) ↗ entao (a x) ↗.

Prova.

Prova por inducao, usando o axioma WPI(P ).

Teorema 2. Dada uma sequencia x, qualquer (sort x) ↗.

Prova.

Prova e obtida usando novamente o axioma WPI(P ).

Page 5: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS5

3. Derivacao formal de programas

Dijkstra foi certamente um dos fundadores e grande mentor da analisematematica da correcao de algoritmos. Sua mais original contribuicao,no entanto, esta na derivacao formal de programas corretos por cons-trucao, que infelizmente e confundida na maior parte dos textos sobreanalise algoritmos com prova de correcao de programas. Para Dijsktraprogramas nao devem ser provados corretos e sim derivados corretos.Esta secao tenta apresentar essas duas faces da metodologia de Dijsks-tra: derivacao e prova de correcao de programas.

3.1. Pesquisa em sequencia ordenada. Dados x ∈ Int e S.0..m−1 ∈ Int e ∀i, j : 0 ≤ i < j < m : S.i ≤ S.j, determine

present = ∃i : 0 ≤ i < m : x = S.i

O algoritmo exposto a seguir e apresentado por Dijkstra em [3].1

Para efeito de desenvolvimento, parece razoavel relaxar o objetivo eassuma que a sequencia se estende ate a posicao e que x < S.m.

Por outro lado, dado que o objetivo consiste em computar um quan-tificador existencial, parece intuitivo usar uma leitura construtiva dessequantificador e propor construir um i tal que:

• S.i = x determina a presenca de x em S;• S.i 6= x garante que x 6∈ S.

O objetivo de determinar o valor de present passa a ser construıdoem duas etapas:

• construir um i tal que S.i ≤ x < S.i + 1, proposicao• estabelecer o valor de present

present := S.i = x

Um primeiro refinamento para o algoritmo aparece na figura 1.No estado inicial e valido que

S.0 ≤ x < S.m

Generalizando esta proposicao produzimos a invariante

P4= S.i ≤ x < S.j ∧ 0 ≤ i < j ≤ m

O objetivo do algoritmo consiste em reduzir a secao entre i e j ateque j seja i + 1, quando a condicao R estara estabelecida. A variavelderivada sera

T4= j − i

1Ao ler estas notas voce estara lendo minha interpretacao, o que certamente naodeveria ser substituto para a leitura do original. Note tambem que o texto originalde Dijkstra nao contem prova alguma: a derivacao formal garante a correcao.

Page 6: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

6 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

b insearch (x , S . 0 . .m−1, pre sent ) i s{x ∈ Int ∧m>0 ∧ S.0..m− 1 ∈ Int ∧ ordered.S(0..m− 1)}

[[ Var i ∈ Int

e s t a b l i s h R; pre sent := x=S . i

]]

Figura 1. Pesquisa binaria: primeiro refinamento

b insearch (x , S . 0 . .m−1, pre sent ) i s{x ∈ Int ∧m>0 ∧ S.0..m− 1 ∈ Int ∧ ordered.S(0..m− 1)}

[[ Var i ∈ Intin i t i a l l y i=1∧ j=m

doB → shr ink ( i , j )

od{P ∧ ¬B}{R}pre sent := x=S . i

]]

Figura 2. Pesquisa binaria: segundo refinamento

e a guarda do loop

B4= j 6= i + 1

O novo algoritmo aparece na figura 2.A secao entre i e j pode ser reduzida por:

• reducao de j para algum h tal que

x < S.h ∧ i ≤ h < j

que mantem a validade da invariante;• incremento de i para algum h tal que

S.h ≤ x ∧ i < h ≤ j

Page 7: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS7

shr ink ( i , j ) i s[[ l et h :− i<h< j

in i fx < S . h → j :=h

][ S.h ≤ x → i :=hf i

te l]]

Figura 3. Pesquisa binaria: shrink

{Q}i f

B0 −> S0

][B1 −> S1

. . .][Bn −> Sn

f i {P}

Figura 4. Comando if

que tambem mantem a validade da invariante.

Se existem duas ou mais alternativas para a mesma acao, considereum comando alternativo: if. Veja o algoritmo de shrink na figura 3.

Duas construcoes importantes se destacam na especificacao de sh-rink : o uso do comando alternativo e o uso da atribuicao nao deter-minıstica.

O comando alternativo da linguagem de comandos guardados deDijkstra e nao-determinıstico. O trecho da figura 4 define que:

• ao menos um dos Bi (0 ≤ i ≤ n) deve ser verdadeiro;• se mais de um Bi for valido, um deles sera selecionado sendo a

acao Si respectiva executada.

Provar a correcao desse comando demanda provar que:

(∃i : 0 ≤ i ≤ n : Bi) ∧ (∀i : 0 ≤ i ≤ n : Q ∧Bi ⇒ P

A ideia de usar atribuicoes nao determinısticas em especificacoes deprogramas parece ter sido proposta originialmente por Morris, ver porexemplo [13]. A semantica dessa atribuicao e dada pelo seguinte calculo

Page 8: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

8 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

b insearch (x , S . 0 . .m−1, pre sent ) i s{x ∈ Int ∧m>0 ∧ S.0..m− 1 ∈ Int ∧ ordered.S(0..m− 1)}[[ Var i , j , h ∈ Int

in i t i a l l y i=0∧ j=mdo {P }j 6= i +1 → {P ∧B}

l et h = ( i+j )/2in {P ∧B ∧ i < h < j}

i f x < S . h → j :=h{P }

][ S . h≤x → i :=h{P }

f i {P }od{P ∧ ¬B}{R}pre sent := x=S . i

]]

Figura 5. Pesquisa binaria

de pre-condicao:

wp(z :Q,P ) = (∀x : Q.x ⇒ P )

Nessa especificacao, o valor de h e escolhido arbitrariamente de umrange valido. No entanto, se o valor de h for a media aritmetica dei e j, cada ciclo do loop reduzira a secao do array a considerar pelametade: o que significa esgotar o array em O(lg m) passos. O algoritmocompleto segue na figura 5.

Considere tambem nas provas a seguir que:

B04= x < S.h

B14= S.h ≤ x

e que:

S04= j := h

S14= i := h

Page 9: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS9

Assuma que

S.0 ≤ x < S.m ∧ S(m− 1) < S.m

e prove os teoremas a seguir. Os teoremas 13 e 12 consideram os casosem que x < S.0 e x > S.m− 1.

Teorema 3. Prove que

P ∧B ⇒ wp(h := (i + j)/2, i < h < j)

Prova.

Trivial: aritmetica.

O teorema a seguir estabelece que, em qualquer ciclo em que P e Bsao validos, o comando alternativo nao bloqueia.

Teorema 4. Prove que

P ∧B ⇒ (B0 ∨B1)

Prova.

Trivial. B0 e a negacao de B1: a implicacao e sempre verdadeira.

Teorema 5. Prove que P vale inicialmente.

Prova.

Exercıcio.

Os teoremas a seguir provam que o comando alternativo preserva ainvariante do loop.

Teorema 6. Prove que

P ∧B ∧ i < h < j ` B0 ⇒ wp(S0, P )

Prova.

P ∧B ∧ i < h < j ` B0 ⇒ wp(S0, P ) = 〈Teorema da deducao〉` P ∧B ∧ i < h < j ∧B0 ⇒ wp(S0, P )

Page 10: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

10 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

O objetivo, entao, consistira em provar que:

P ∧B ∧ i < h < j ∧B0 ⇒ wp(S0, P )

wp(S,) 0P

=

0 ≤ i < h ≤ m ∧ S.i ≤ x < S.h

=〈logica〉0 ≤ i ∧ i < h ∧ h ≤ m ∧ S.i ≤ x ∧ x < S.h

⇐〈Eliminacao de ∧〉0 ≤ i ∧ i < h ∧ h < j ∧ j ≤ m ∧ S.i ≤ x ∧ x < S.h

= 〈trasitividade de <〉0 ≤ i < j ≤ m ∧ h < j ∧ S.i ≤ x ∧ x < S.h

⇐〈h < j e S ordenado〉0 ≤ i < j < m ∧ S.i ≤ x ∧ x < S.j ∧ x < S.h ∧ i < h < j

=

P ∧B ∧ i < h < j ∧B0

Teorema 7. Prove que

P ∧B ∧ i < h < j ` B1 ⇒ wp(S1, P )

Prova.

Parecido com anterior. Exercıcio.

Teorema 8. Prove que P e uma invariante do loop do algoritmo dafigura 5.

Prova.

P vale inicialmente, de acordo com teorema 5, e validade de P e man-tida pelo loop, segundo teorema 6.

Teorema 9. Prove que

P ∧B ⇒ T > 0

Prova.

Exercıcio.

Page 11: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS11

Teorema 10. Prove que T decresce, provando que

P ∧B ∧ i < h < j ` ∀v : T = v ⇒ wp(S0, T > v)

e queP ∧B ∧ i < h < j ` ∀v : T = v ⇒ wp(S0, T > v)

Prova.

Exercıcio.

Teorema 11. Prove que o loop do algoritmo da figura 5 termina.

Prova.

Exercıcio.

Teorema 12. Assuma que x > S(m− 1) e prove que P ainda e umainvariante do algoritmo da figura 5.

Prova.

Exercıcio.

Teorema 13. Assuma que x < S.0 e prove que

i = 0 ∧ x < S.0

e uma invariante do loop do algoritmo da figura 5.

Prova.

Exercıcio.

Teorema 14. Prove que o algoritmo estabelece

present = ∃k : 0 ≤ k < m : S.k = x

Prova.

Exercıcio.

Algumas observacoes finais sobre o algoritmo de pesquisa binaria:

• A derivacao do algoritmo e feita passo a passo baseada emcondicoes logicamente consistentes: o resultado inevitavel e umalgoritmo correto. Na verdade, a metodologia de programacaode Dijkstra da relevancia a esse processo de derivacao do algo-ritmo ficando a prova em segundo plano: por exemplo, [3] naocontem a prova de correcao do algoritmo final.

Page 12: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

12 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

• A prova de correcao levou em conta tres casos: x ser menordo que S.0, x estar entre S.0 e S.m − 1 e x ser maior do queS.m−1. E possıvel, no entanto, estabelecer um invariante maisforte para o mesmo algoritmo e construir provas para x generico.

• Embora a prova assuma que S.m > S.m− 1, S.m nao e usadono algoritmo. No segmentation fault!

3.2. Permutacoes de uma sequencia. Esta secao aborda algorit-mos que tratam de variantes de um mesmo problema: calcular algumapermutacao de uma sequencia.

Dado um vetor S.0..m− 1 ∈ Int e dados inteiros p, q, n tais que

n > 0 ∧ 0 ≤ p ≤ p + n ≤ q ≤ q + n ≤ m

calcule in-locu uma permutacao de S que consiste em trocar as secoes2

S.p..p + n − 1 por S.q..q + n − 1. Assumindo que B contem o valorinicial de S, o objetivo consiste em calcular 3

R4=S(0..p− 1) = B(0..p− 1)

∧ S(p..p + n− 1) = B(q..q + n− 1)

∧ S(p + n..q − 1) = B(p + n..q − 1)

∧ S(q..q + n− 1) = B(p..p + n− 1)

∧ S(q + n..m− 1) = B(q + n..m− 1)

A invariante P do algoritmo para calcular o swap de secoes do arraye obtida generalizando R, via troca da constante n por uma variavel k,que deve ser um inteiro entre 0 e n.

P4=0 ≤ k ≤ n

∧ S(0..p− 1) = B(0..p− 1)

∧ S(p..p + k − 1) = B(q..q + k − 1)

∧ S(p + k..q − 1) = B(p + k..q − 1)

∧ S(q..q + k − 1) = B(p..p + k − 1)

∧ S(q + k..m− 1) = B(q + k..m− 1)

A variavel derivada e obvia:

T4= n− k

2Exemplo retirado de [6].3B e introduzido aqui como variavel auxiliar para facilitar a derivacao do

programa.

Page 13: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS13

swapsec (S , p , q , n ) i s{m ≥ 0 ∧ S.0..m− 1 ∈ Int ∧ p, q, n ∈ Int ∧ n ≥ 0}[[ Var k ∈ Int ;

i n i t i a l l y B=S ∧ i =0 ∧ m≥0 ∧ n≥0{P}do

n−k>0 → S(p+k ) , S(q+k ) , k:=S(q+k ) , S(p+k ) , k+1od{P ∧ ¬B}

{R}]]

Figura 6. Array swap

Essa variavel deve decrescer ate atingir o valor 0, o que da a guardado loop:

B04= n− k > 0

Progresso no loop demanda reduzir T , via incremento de k, man-tendo a validade de P . A acao associada a transicao do loop, facilmentederivada a partir de P e do incremento de k, fica:

S04= S(p + k), S(q + k), k := S(q + k), S(p + k), k + 1

O algoritmo esta na figura 6.

Exercıcio 1. Prove que:

(1) P∧ ⇒ T > 0(2) O programa da figura 6 termina.(3) P ∧B0 ⇒ wp(S0, P )(4) P e uma invariante do loop do programa da figura 6.(5) P ∧ ¬B0 ⇒ R

O primeiro objetivo consiste em provar que a execucao de S0 naoaltera a validade de P . Antes, porem, observe que, apos S0, um novoS, que chamaremos de S ′, e produzido.

S ′ 4= (S; p + k : S(q + k); q + k : S(p + k))

Page 14: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

14 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

Note que S ′ define os novos valores de S e que as igualdades abaixode verificam e elas mostram que secoes de S nao foram alteradas.

S ′(0..p + k − 1) = S(0..p + k − 1)

S ′(p + k + 1..q + k − 1) = S(p + k + 1..q + k − 1)

S ′(q + k + 1..m− 1) = S(q + k + 1..m− 1)

As igualdades a seguir mostram as posicoes de S que foram alteradas:

S ′(p + k) = S(q + k)

S ′(q + k) = S(p + k)

Alem disso, observe que

S(q + k) = B(q + k)

S(p + k) = B(p + k)

Esses dois conjutnos de igualdades sao usadas na prova do teoremaa seguir.

Teorema 15. P ∧B0 ⇒ wp(S0, P )

Prova.

Page 15: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS15

wp(S0, P )

=−1 ≤ k ≤ n− 1

∧ S ′(0..p− 1) = B(0..p− 1)

∧ S ′(p..p + k) = B(q..q + k)

∧ S ′(p + k + 1..q − 1) = B(p + k + 1..q − 1)

∧ S ′(q..q + k) = B(p..p + k)

∧ S ′(q + k + 1..m− 1) = B(q + k + 1..m− 1)

=−1 ≤ k ≤ n ∧ k 6= n

∧ S ′(0..p− 1) = B(0..p− 1)

∧ S ′(p..p + k − 1) = B(q..q + k − 1)

∧ S ′(p + k) = B(q + k)

∧ S ′(p + k..q − 1) = B(p + k..q − 1)

∧ S ′(q..q + k − 1) = B(p..p + k − 1)

∧ S ′(q + k) = B(p + k)

∧ S ′(q + k..m− 1) = B(q + k..m− 1)

=〈subsituindo S ′〉−1 ≤ k ≤ n ∧ k 6= n

∧ S(0..p− 1) = B(0..p− 1)

∧ S(p..p + k − 1) = B(q..q + k − 1)

∧B(q + k) = B(q + k)

∧ S(p + k..q − 1) = B(p + k..q − 1)

∧ S(q..q + k − 1) = B(p..p + k − 1)

∧B(p + k) = B(p + k)

∧ S(q + k..m− 1) = B(q + k..m− 1)

=〈simplificando ∧〉−1 ≤ k ≤ n ∧ k 6= n

∧ S(0..p− 1) = B(0..p− 1)

∧ S(p..p + k − 1) = B(q..q + k − 1)

∧ S(p + k..q − 1) = B(p + k..q − 1)

∧ S(q..q + k − 1) = B(p..p + k − 1)

∧ S(q + k..m− 1) = B(q + k..m− 1)

⇐〈Introducao de ∨〉0 ≤ k ≤ n ∧ k 6= n

∧ S(0..p− 1) = B(0..p− 1)

∧ S(p..p + k − 1) = B(q..q + k − 1)

∧ S(p + k..q − 1) = B(p + k..q − 1)

∧ S(q..q + k − 1) = B(p..p + k − 1)

∧ S(q + k..m− 1) = B(q + k..m− 1)

=P ∧B0

Page 16: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

16 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

Gries e Schneider, em [6], apresentam o seguinte conjunto de axiomaspara definir o reverso de um sequencia.

rev.⊥ = ⊥(15)

rev.c / x = (rev.x) ˆ〈c〉(16)

onde

⊥ ˆy = y(17)

(c / x) ˆy = c / (x ˆy)(18)

A solucao funcional, em Haskell, para o problema do reverso de umasequencia e retirada diretamente dos axiomas 15 e 16.

Talvez seja mais intuitivo ler y como reverso de x quando: o ultimoelemento de x e o primeiro de y, o primeiro de x e ultimo em y ea subsequencia que vai do segundo ao penultimo elemento de y e oreverso da subsequencia que vai do segundo ao penultimo elemento dex.

reverse.〈〉 = 〈〉(19)

reverse.〈a〉 = 〈a〉(20)

reverse(a / x . b) = b / (reverse.x) . a(21)

onde(22)

x . a = x ˆ〈a〉(23)

Exercıcio 2. Prove que:

(1) rev.〈a〉 ˆx = (rev.x) ˆ〈a〉(2) rev.x ˆ〈a〉 = 〈a〉 ˆrev.x(3) rev.〈a〉 ˆx ˆ〈b〉 = 〈b〉 ˆ(rev.x) ˆ〈a〉

A ultima prova do exercıcio 2 fornece a base a definicao da invariantedo algoritmo imperativo para calculo do reverso de uma sequencia.

A invariante do algoritmo para calculo do reverso de uma sequenciasurge da generalizacao do teorema provado no exercıcio 2.

Exercıcio 3. Prove que

(1) rev.x ˆy = (rev.y) ˆ(rev.x)(2) rev.x ˆwˆ y ˆz = (rev.z) ˆ(rev.wˆy) ˆ(rev.x)

Uma definicao alternativa para o reverso de uma sequencia, maisadequada ao tratamento de sequencia como array.

Page 17: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS17

Definicao 1.

S.i..j = rev(B.h..k)4=

j − i = k − h

∧. j − i < 0

∨ (S.i = B.k ∧ S(i + 1..j) = rev(B.h..k − 1))

Exercıcio 4. Apresente uma definicao formal de secao de uma sequenciaS e prove que para qualquer inteiro i nao negativo, menor do que zero:

rev.S(0..m− 1) =(rev.S(m− 1− i..m− 1))

ˆ (rev.S(i..m− 1− i))

ˆ (rev.S(0..i))

Exercıcio 5. Apresente uma algoritmo para calculo do reverso de umasequenciae prove sua correcao.

(1) Use teorema provado no exercıcio 4 para definir a invariante Pdo loop do algoritmo.

(2) Use a variavel derivada

T = m− 2i

(3) Define a guarda B do loop e prove que

P ∧B .⇒. wp(α, P )

onde α e

S.i, S(m− 1− i), i := S(m− 1− i), S.i, i + 1

3.2.1. Particao de uma sequencia por um pivo. Dada uma sequencia Se um elemento indicado como pivo, o objetivo consiste em particionara sequencia original em duas sequencias: de elementos menores do queo pivoe de elementos maiores do que o pivo. Acrescentada a restricaode que a sequencia seja representada em um vetor e de que as trocasdevem ser realizadas no proprio vetor, evitando a geracao de sequenciasadicionais, o objetivo consiste em encontrar uma permutacao de S eum valor p tal que

R4= 0 ≤ p < m ∧ S(0..p− 1) < S.p ∧ S(p + 1..m− 1) ≥ S.p

Dado que a posicao inicial do pivo nao foi especificada, e razoavelarbitrar que ele se encontrar inicialmente na posicao 0 e que o objetivoconsiste em estabelecer para algum i que

S(0..i− 1) < S.0 ∧ S(i..m− 1) > S.0

para, entao, computar R.

Page 18: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

18 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

Note que se

β4= S.0, S(i− 1), p := S(i− 1), S.0, i− 1

entao

wp(β, R)

=0 ≤ i− 1 < m

∧S ′(0..i− 1− 1) < S ′(i− 1)

∧S ′(i− 1 + 1..m− 1) ≥ S ′(i− 1)

∧i− 1 = i− 1

=〈aritmetica〉∧1 ≤ i ≤ m

∧S ′(0..i− 1− 1) < S ′(i− 1)

∧S ′(i− 1 + 1..m− 1) ≥ S ′(i− 1)

=1 ≤ i ≤ m

∧S ′(0) < S ′(i− 1) ∧ S ′(1..i− 2) < S ′(i− 1)

∧S ′(i..m− 1) ≥ S ′(i− 1)

=〈S ′ = (S; 0 : S(i− 1); i− 1 : S.0)〉1 ≤ i ≤ m

∧S(i− 1) < S(0) ∧ S(1..i− 2) < S(0)

∧S(i..m− 1) ≥ S(0)

=1 ≤ i ≤ m

∧S(1..i− 1) < S(0)

∧S(i..m− 1) ≥ S(0)

A precondicao derivada define o estado final do loop que construiraa permutacao de S:

1 ≤ i ≤ m ∧ S(1..i− 1) < S(0) ∧ S(i..m− 1) ≥ S(0)

Uma generalizacao dessa condicao, substituindo m por j, define parteda invariante:

1 ≤ i ≤ m ∧ S(1..i− 1) < S(0) ∧ S(i..j − 1) ≥ S(0)

A invariante e obtida fortalecendo essa condicao pela observacao deque:

• os elementos menores do que S(0) estao compreendidos entreas posicoes 1 e i− 1;

Page 19: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS19

• os elementos restantes estao compreendidos entre as posicoes ie j − 1, o que impoem i ≤ j, devendo j ficar limitado a m.

P4= 1 < i ≤ j ≤ m ∧ S(1..i− 1) < S(0) ∧ S(i..j − 1) ≥ S(0)

O loop analisara cada elemento da sequencia da esquerda para di-reita, incorporando a cada transicao um elemento uma das particoes ereduzindo a secao nao particionada do vetor, que e S(j..m − 1). Suavariavel derivada

T4= (m− j)

A guarda do loop

B4= m− j 6= 0

O progresso do loop em direcao ao ponto-fixo demanda decrementarT , que so pode ocorrer incrementando j, ja que m e constante. Poroutro lado, o incremento de j pode ocorrer sem perturbar invarianteem duas condicoes:

• quando B0 e valido

B04= S.j ≥ S.0

;• quando B1 e valido

B14= S.j < S.0

que demanda incorporar S.j a particao dos elementos menoresdo que S.0.

A figura 7 apresenta o algoritmo, que Bentley em [1] atribui a Lomut.Note que cada comando apresenta suas precondicoes e poscondicoesdetalhadas. As acoes S0 e S1 sao facilmente derivadas:

S04= j := j + 1

S14= S.i, S.j, i, j := S.j, S.i, i + 1, j + 1

O proximo passo consiste em provar a correcao do algoritmo da figura7.

Teorema 16. Prove que P e valida inicialmente.

Prova.

Exercıcio.

Page 20: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

20 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

pa r t i t i o n (S , p ) i s{S.0..m− 1 ∈ Int ∧m ≥ 0}

[[ Var B . 0 . .m−1 ∈ Int ; i , j ∈ Int ;i n i t i a l l y B=S ∧ i =1 ∧ j=1do {P}

B → i f {P ∧B}B0 → {P ∧B ∧B0}S0{P}

][ B1 → {P ∧B ∧B1}S1{P}f i {P}

od{P ∧ ¬B}S . 0 , S ( i −1),p:=S( i −1),S . 0 , i−1{R}

]]

Figura 7. Particao de Lomut

O teorema a seguir estabelece que quando a invariante P e a guardado loop sao validas, ao menos uma das guardas do comando if seravalida.

Teorema 17. Prove que

P ∧B ⇒ (B0 ∨B1)

Prova.

B0 e B1 sao complementares.

O proximo teorema estabelece que a acao associada a primeira guardado if, acao S0 da guarda B0, preserva a invariante do loop. Sua provafica como exercıcio.

Teorema 18. Provar que

P ∧B ∧B0 ⇒ wp(S,) 0P )

Prova.

Exercıcio: veja prova a seguir.

Page 21: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS21

O teorema a seguir estabelece que a acao S1, associada a guarda B1

preserva a invariante P .

Teorema 19. Provar que

P ∧B ∧B1 ⇒ wp(S,) 1P )

Prova.

wp(S1, P )

=

1 < i + 1 ≤ j + 1 ≤ m

∧ S ′(1..i + 1− 1) < S ′(0) ∧ S ′(i + 1..j + 1− 1) ≥ S ′(0)

=

− 1 < i ≤ j ≤ m− 1

∧ S ′(1..i) < S ′(0) ∧ S ′(i + 1..j) ≥ S ′(0)

=

0 ≤ i ≤ j ≤ m

∧ (m 6= j ∧ S ′(1..i) < S ′(0) ∧ S ′(i + 1..j) ≥ S ′(0))

=

(0 = i ∨ 0 < i ≤ j ≤ m)

∧ (m 6= j ∧ S ′(1..i) < S(0) ∧ S ′(i + 1..j) ≥ S ′(0))

=

(0 = i ∧m 6= j ∧ S ′(1..i) < S ′(0) ∧ S ′(i + 1..j) ≥ S ′(0))

∨ (0 < i ≤ j ≤ m ∧m 6= j

∧ S ′(1..i) < S ′(0) ∧ S ′(i + 1..j) ≥ S ′(0))

⇐〈Introducao de lor〉(0 < i ≤ j ≤ m) ∧m 6= j

∧ S ′(1..i) < S ′(0) ∧ S ′(i + 1..j) ≥ S ′(0)

=〈trocando S ′ por seus valores em S〉(0 < i ≤ j ≤ m) ∧m 6= j

∧ S(1..i− 1) < S(0) ∧ S(i) ≥ S(0)

∧ S(i + 1..j − 1) ≥ S(0) ∧ S(j) < S(0)

=

P ∧B ∧B1

Page 22: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

22 RAUL H.C. LOPES UNIVERSIDADE FEDERAL DO ESPIRITO SANTO

4. Conclusao

Correcao de programas e apenas um topico de area da Seguranca emComputacao. Outros assuntos relevantes na area cobrem, por exemplo,criptografia, protocolos e projeto de sistemas: nos estudos ligados aestes topicos tambem se tem tornado cada vez mais relevante o estudodo uso de metodos formais ao nıvel de projeto e prova de correcao.Embora, as tecnicas de prova e projeto tenham os mesmos fundamentosdas que foram empregadas nestas notas, suas aplicacoes sao por si sosuficientemente complexas para demandar nova apresentacao(e curso)e, por isso, nao figuram aqui.

Em relacao ao que foi apresentado e importante estar ciente de quemetodos formais tem sido e possivelmente ainda serao por um tempo(ou para sempre) o futuro da computacao. Provavelmente, como variosautores tem salientado, ver [14, 16], porque o onus da falha de um pro-grama ainda recai exclusivamente sobre o usuario do mesmo. Mas,isso nao ocorre mais em outros ramos: o custo da reposicao de umsistema de freios com defeito de concepcao recai sobre o fabricante doautomovel. Uma mudanca de paradigma na atribuicao de custos re-sultantes de falhas de programas certamente provocaria uma alteracaono panorama do campo de projeto de algoritmos. Sem tentar preverquando isso ocorrera, vale, pelo menos, questionar o quanto os cursosde Ciencia da Computacao em geral tem tentado influenciar essa mu-danca ou se estamos nos profissionais da programacao de computadorese do ensino da disciplina satisfeitos com o presente estado da arte dodesenvolvimento de programas.

Referencias

1. Jon Bentley, Programming pearls, second ed., Addison-Wesley, 2000.2. Haskell B. Curry, Foundations of mathematical logic, Dover Publications, Inc.,

1977.3. Edsger W. Dijkstra, Fillers at the YoP intitute, in Formal Development of

Programs and Proofs [4].4. Edsger W. Dijkstra (ed.), Formal development of programs and proofs, Addison-

Wesley, 1990.5. E.W. Dijkstra, A discipline of programming, Prentice Hall, Englewood Cliffs,

1976.6. David Gries, The science of programming, Springer-Verlag, 1985.7. David Gries and Fred B.Schneider, A logical approach to discrete mathematics,

Springer-Verlag, 1993.8. Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest, and Clifford Stein,

Introduction to algorithms, MIT Press, 2001.

Page 23: METODOS FORMAIS E SEGURANC¸A EM´ COMPUTAC¸AO˜ CORREC¸AO DE ... · Por outro lado, se o ensino de algoritmos tem sido apresentado como ... Pointers are like jumps, leading wildly

METODOS FORMAIS E SEGURANCA EM COMPUTACAOCORRECAO DE PROGRAMAS23

9. C. A. R. Hoare, Hints on programmin language design, Tech. Report MEMOAIM 224, Stanford Artificial Intelligence Laboratory, 1973.

10. Donald E. Knuth, The art of computer programmimg, volume 1: Fundamentalalgorithms, Addison-Wesley, 1998.

11. , The art of computer programmimg, volume 3: Sorting and searching,Addison-Wesley, 1998.

12. Udi Manber, An introduction to algorithms: A creative approach, Addison-Wesley, 1986.

13. Joseph M. Morris, Piecewise data refinment, in Dijkstra [4].14. Charles P. Pfleeger and Shari Lawrence Pfleeger, Security in computing, Pren-

tice Hall, 2003.15. Roger S. Pressman, Software engineering: A practitioneer’s approach, McGraw-

Hill Education, 2000.16. Bruce Schneier, Secrets & lies, John Wiley, 2003.17. Niklaus Wirth, Algorithms and data structures, Prentice-Hall, 1986.