Você está na página 1de 14

Metodologia de Dijkstra - Introduca o

Metodologia de Dijkstra
Metodos semi-informais baseados na Axiomatica de Hoare para o desenvolvimento de comandos corretos
face a` sua especificaca o.

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

1 / 15

Metodologia de Dijkstra - Introduca o


CD - Especificaca o de Entrada ou Pre condica o
CO - Especificaca o de sada ou Pos condica o
c - Comando (ou sequencia de comandos)

A correca o de um programa esta estritamente relacionada com a sua especificaca o


Usamos, para a formalizar a especificaca o, 2 predicados:
Pre condica o: estabelece as condico es para que o comando possa funcionar - CD
Pos condica o: estabelece o que deve acontecer apos a execuca o do comando - CO

Sendo c o programa, escrevemos


{CD} c {CO}
querendo significar:
Se CD e valido entao CO e valido apos execuca o de c (desde que o comando c termine)

O algoritmo/programa esta Correto SE satisfaz a sua Especificaca o

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

2 / 15

Ideia Chave
Especificaca o CD c {CO}: equaca o onde a variavel e o (bloco de) comando(s) c
Para concretizar o(s) comando(s) c podemos usar as regras de Hoare mas em sentido inverso: da
conclusao para as premissas

Exemplos de Especificaco es
? Especificaca o para um programa que estabelece o resto da divisao inteira de dois numeros naturais

Pre condica o (CD): x, y Int , x 0, y > 0


Pos condica o (CO): 0 r < x q y + r = x
? Especificaca o para um programa que procura um valor X num vector, desde o ndice 0 ao ndice n

Pre condica o (CD): True


Pos condica o (CO): (0 i n , v[i] 6= X) (0 i n v[i] = X)

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

3 / 15

MD - Desenvolvimento de Comandos Iterativos

Dada uma especificaca o {CD} c {CO}, caso c seja uma estrutura iterativa, ENTAO:
1 Usar uma estrutura de ciclo while com inicializaca o:

c = { inic while(G){ aca o prog }}

2 De acordo com as Regras de Hoare, identificar uma condica o invariante - CI


3 Desenvolver as componentes identificadas em (1) de acordo com os seguintes criterios:

o comando inic deve garantir que a condica o invariante CI e satisfeita ANTES da

primeira iteraca o do ciclo


a condica o ( G) identifica a condica o de terminaca o do ciclo
o comando prog deve garantir que a condica o de terminaca o ( G) vai ser satisfeita

cada
o comando aca o deve garantir que a condica o invariante CI e satisfeita APOS
iteraca o do ciclo

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

4 / 15

Desenvolvimento de Comandos Iterativos


Exemplo FolhasAED, pgs. 29,30

Soma dos primeiros 100 numeros inteiros nao negativos


1. Especificaca o: {CD} c {CO}
{True} adicao {s =

99
X

= 0 + 1 + 2 + + 99}

i=0

int s; variavel iterativa acumuladora com o resultado do comando


2. Identificaca o da Estrutura:
adicao {inic while(G){ aca o prog }}

3. Identificaca o da Condica o Invariante:


CI : s = 0 + 1 + 2 + + k 0 k 99
int k; variavel iterativa (contador) de controlo do ciclo
Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

5 / 15

Desenvolvimento de Comandos Iterativos


Exemplo FolhasAED, pgs. 29,30

3.1 inic: inicializaca o das variaveis iteradoras do ciclo


{k = 0; s = 0} Que outras hipoteses existem?
ou {k = 1; s = 1} ou {k = 2; s = 3} ou {k = 3; s = 6} ou
A inicializaca o tem de satisfazer a: a {True} inic {s = 0 + 1 + + k 0 k 99}
3.2 desenvolvimento da guarda do ciclo (o ciclo deve iterar enquanto G for verdade)
G : k ! = 99 logo G : k == 99 e a condica o de terminaca o
A
guarda tem de satisfazer a:


a ( s = 0 + 1 + + k 0 k 99) k = 99 s = 0 + 1 + + 99
3.3 aca o : (computaca o de mais um resultado da iteraca o)
s = s + (k + 1);
s ja acumulou ate o valor de k; tem de acumular o proximo valor
3.4 prog: (condica o de progresso (avanco) )
k = k + 1;
a inicializaca o a um numero positivo menor que 99 e este progresso garante atingir a condica o de
terminaca o
Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

6 / 15

Desenvolvimento de Comandos Iterativos


- Exemplo FolhasAED, pgs. 29,30

Vejamos que esta correto (aca o seguida do progresso):


a` entrada do ciclo: s = 0 + 1 + + k 0 k<99
aca o: s = s + 1;
apos a execuca o da aca o: s = 0 + 1 + + (k + 1) 0 (k + 1)99
prog: k = k + 1;
apos a execuca o de prog (antes da sada do ciclo): s = 0 + 1 + + k 0 k99
depois de terminar o ciclo): s = 0 + 1 + + k k=99

4. Estrutura Final(izada):
adicao { k = 0; s = 0; while(k != 99) { s = s + (k + 1);

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

k = k + 1; } }

Versao de 2015/2016

7 / 15

Tecnicas para Obtenca o de CI - Hipotese 1


CI1 - Variavel de progresso a evoluir da esquerda para a direita
Inic: primeiro valor a contar da esquerda (LI - limite inferior)
(No exemplo anterior temos k = 0, 1, . . . , 99 logo k = 0; e, portanto, s = 0 )

Ciclo - aca o seguida de progresso - com progresso a variar de LI ate ao limite superior
(LS):
a` Guarda
LI, . . . , k, k + 1, . . . , LS = ATENC
AO
{s = s + (k + 1); k = k + 1; }

No exemplo anterior:
adica o { k = 0; s = 0; while(k != 99){ s = s + (k + 1); k = k ++;}}

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

8 / 15

Tecnicas para Obtenca o de CI - Hipotese 2


CI2 - Variavel de progresso a evoluir da direita para a esquerda
Inic: maior de todos os valores a contar da esquerda (LS)
(No exemplo anterior teramos k = 99, 98, . . . , 90 logo k = 99; e, portanto, s = 99 )

Ciclo com progresso a variar de LS ate LI:


LS, . . . , k, k 1, . . . , LI
{s = s + (k 1); k = k 1; }

No exemplo anterior:
adica o { k = 99; s = 99; while(k != 0){ s = s + (k - 1); k = k - - ;}}

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

9 / 15

Tecnicas para Obtenca o de CI - Hipotese 3


CI3 - Variavel de progresso ADIANTADA a evoluir da esquerda para a direita
Inic: segundo valor a contar da esquerda (LI + 1)
(No exemplo anterior teramos k = 1; MAS s = 0 )

Ciclo com progresso a variar de LI+1 ate LS+1:


LI + 1, . . . , k 1, k, . . . , LS + 1
{s = s + k; k = k + 1; }

No exemplo anterior:
adica o { k = 1; s = 0; while(k != 100){ s = s + k ; k = k ++;}}

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

10 / 15

Tecnicas para Obtenca o de CI - Hipotese 4


CI2 - Variavel de progresso ADIANTADA a evoluir da direita para a esquerda
Inic: LS-1
(No exemplo anterior teramos k = 98; MAS, s = 99 )

Ciclo com progresso a variar de LS-1 ate LI-1:


LS 1, . . . , k, k 1, . . . , LI 1
{s = s + k; k = k 1; }

No exemplo anterior:
adica o { k = 98; s = 99; while(k != -1){ s = s + (k - 1); k = k - - ;}}

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

11 / 15

Comandos Iterativos - Tecnicas Adicionais


Tecnica da Inicializaca o
Simplificaca o do comando inic: No invariante, considerar que a(s) variavel(eis) introduzida(s) pode(m) tomar um valor
alem dos limites estabelecidos, representando situaco es em que AINDA nada foi analisado.

Usando a tecnica da inicializaca o, desenvolver o comando positividade:


dada a sucessao inteira, F : N0 Z, determinar se os primeiros 31 termos sao todos positivos.

Especificaca o: {True} positividade {b = ( 0 j 30 F(j) > 0)}


boolean b; variavel booleana que indica o resultado (parcial/final)

Invariante: (progresso da Esq para a Dir)


int n; variavel de progresso
CI

CO[30 n] 1 n 30

b = ( 0 j n F(j) > 0) 1 n 30

inic: { n =-1; b = true;}

Ana de Almeida (ISCTE/DCTI)

Ainda nada foi testado

Algoritmos e Estruturas de Dados

Versao de 2015/2016

12 / 15

Comandos Iterativos - Tecnicas Adicionais


Tecnica do Caso Favoravel para aca o
Durante a execuca o do comando aca o prog existe uma condica o- CF - que so permite progredir
se ainda houver necessidade (ou seja, caso nao tenha ainda sido produzido o resultado final). Neste caso temos,
` {CI G CF} prog {CI} e aca o if(!CF) c

Continuando a desenvolver o comando positividade.

(progresso da Esq para a Dir) inic: { n = n + 1;}


Invariante e Condica o Favoravel:
ao primeiro ndice j t.q. F(j) < 0 temos a resposta final: false logo
CF F(n + 1) > 0)
esta condica o, quando verdadeira, garante a continuaca o correta da procura:
{ b = j = 0, . . . , n F(j) > 0 1 n < 30 F(n + 1) > 0}
n = n + 1;
{ b = j = 0, . . . , n F(j) > 0 1 n30}
aca o : { if( F(n+1) <= 0) b = false; }

Se a negaca o da condica o favoravel decide a resposta final do ciclo, este deve terminar imediatamente . . .

Ana de Almeida (ISCTE/DCTI)

Algoritmos e Estruturas de Dados

Versao de 2015/2016

13 / 15

Comandos Iterativos - Tecnicas Adicionais


Tecnica do reforco da Guarda
Para alem de ( G), existe uma condica o BOOLEANA , C tal que
`


(CI C) CO .

Neste caso, escolhe-se para guarda do ciclo: G && !C

Para terminar o desenvolvimento do comando positividade:


Recorde que CO b = j = 0, . . . , 30 F(j) > 0

e ainda que, CI b = j = 0, . . . , n (F(j) > 0 1 n 30)

Guarda G: n != 30
a primeira negaca o da CF (ser positivo) determina a resposta final como false:, portanto,
C b porque, se b se tornou falso, entao,
a

b = j = 0, . . . , n F(j) > 0 1 n 30 b

Reforco da Guarda: n != 30 && b

Ana de Almeida (ISCTE/DCTI)

b = j = 0, . . . , 30 F(j) > 0

b falso
Algoritmos e Estruturas de Dados

Versao de 2015/2016

14 / 15

Você também pode gostar