Sie sind auf Seite 1von 8

Apuntes de Algoritmos I

Luis Astorga
Universidad Simón Bolívar
Septiembre-Diciembre 2007

November 13, 2007

1 Asignación de arreglos
Para todo par de naturales n; m tales que n m, se de…ne la secuencia [n::m)
como el conjunto fn; n + 1; : : : ; m 1g. Nótese que [n::m) = ? si n = m, y
[n::m) = fng si m = n + 1.
Una función de arreglo de tipo T es una función

a: [n::m) ! T
i 7 ! a[i]

que asigna a cada natural i : n i < m un valor a[i] de tipo T.


Un arreglo es el conjunto imagen de la función de arreglo a

a[n::m) = fa[n]; a[n + 1]; : : : ; a[m 1]g

Dado el arreglo a[n::m) de tipo T, para cualquier expresión aritmética E


de tipo T y para algún natural k tal que n k < m se de…ne la función
modi…cación de a en k
a(k;E) : [n::m) ! T
E si i = k
a(k;E) [i] =
a[i] si i =
6 k

de modo que el arreglo a(k;E) [n::m) es similar a a[n::m) con la única diferencia
que a(k;E) [k] = E.
De manera general se de…ne la función modi…cación de a en fk1 ; : : : ; kj g

a(k1 ;:::;kj ;E1 ;:::;Ej ) : [n::m) ! T


8
>
> E1 si i = k1
>
>
< E2 si i = k2
>
a(k1 ;:::;kj ;E1 ;:::;Ej ) [i] = .. ..
> . .
>
>
>
> E j si i = kj
:
a[i] si i 6= k1 ^ ^ i 6= kj

1
donde j m ny

fk1 ; : : : ; kj g fn; n + 1; : : : ; m 1g

En particular, la función de modi…cación de un arreglo a[n::m) que inter-


cambia dos valores a[k1 ] y a[k2 ] de posición es

a(k1 ;k2 ;a[k2 ];a[k1 ]) : [n::m) ! T


8
< a[k2 ] si i = k1
a(k1 ;k2 ;a[k2 ];a[k1 ]) [i] = a[k1 ] si i = k2
:
a[i] si i 6= k1 ^ i 6= k2

En el lenguaje de comandos con guardas GCL se de…ne la instrucción asignación


de arreglo
a := a(k1 ;:::;kj ;E1 ;:::;Ej )
que sustituye el arreglo a[n::m) por el arreglo a(k1 ;:::;kj ;E1 ;:::;Ej ) [n::m). Es más
cómodo usar la notación abreviada

a[k1 ]; : : : ; a[kj ] := E1 ; : : : ; Ej

siempre que no se pierda de vista que la asignación de arreglo que esta expresión
denota es una sustitución de funciones de arreglo.
La función de precondición más débil para la asignación de arreglo dada una
postcondición Q es entonces

wpa[k1 ];:::;a[kj ]:=E1 ;:::;Ej (Q) Q (a[k1 ]; : : : ; a[kj ] := E1 ; : : : ; Ej )

La instrucción de asignación de arreglo que intercambia dos valores

a[k1 ]; a[k2 ] := a[k2 ]; a[k1 ]

se conoce como la instrucción swap(k1 ; k2 ). El signi…cado operacional de swap(k1 ; k2 )


es la secuenciación

aux : = a [k1 ] ;
a[k1 ] : = a[k2 ];
a[k2 ] : = aux

cuya correctitud ya conocemos.

2 Ejemplo de fortalecimiento del invariante


2.1 Problema
Dado un arreglo a[n::m), se quiere calcular el segmento a[p::q), donde n p
q m, tal que la suma de sus valores sea máxima en a.

2
2.2 Especi…cación
j[
const N : Int;
const a : Array [0; N ) de Int;
var sumax : Int;
{P : N 0}
Programa P
{Q : sumax = (Max p; q : 0 p q N :( k:p k < q : a[k]))}

]j

2.3 Comentarios
1. Recuérdese que el operador max se de…ne por

(x max y = c) (x = c _ y = c) ^ (x c^y c)
y el elemento neutro es 1 puesto que, para todo entero x se tiene que

( 1) max x = x max ( 1) = x

Como max es también asociativo se de…ne inductivamente el cuanti…cador


Max para sintetizar expresiones como

x1 max x2 max max xt

(Max p : ? : p) = 1
(Max p : 0 p < n + 1 : p) = (Max p : 0 p < n : p) max n

Esta de…nición se puede generalizar sobre cualquier función f de enteros

(Max p : ? : f (p)) = 1
(Max p : 0 p < n + 1 : f (p)) = (Max p : 0 p < n : f (p)) max f (n)

Un cuanti…cador sobre dos variables se de…ne como

(Max p; q : 0 p q < n : f (p; q)) = (Max q : 0 q < n : (Max p : 0 p q : f (p; q)))

donde f es ahora una función de dos variables.


Finalmente, + distribuye con max, es decir,

(y max z) + x = (y + x) max (z + x)

y en el cuanti…cador

(Max k : 0 k < n : k) + x = (Max k : 0 k < n : k + x)

3
2. Recuérdese también que para el operador asociativo con elemento neutro
+ se de…ne el cuanti…cador
P
( k : ? : f (k)) = 0
P P
( k : 0 k < n + 1 : f (k)) = ( k : 0 k < n : f (k)) + f (n)

En particular, si se quiere sumar los valores de un arreglo a se tiene que


P
( k : ? : a[k]) = 0
P P
( k : 0 k < n + 1 : a[k]) = ( k : 0 k < n : a[k]) + a[n]
P
3. Obsérvese que la expresión ( k : p k < q : a[k]) es una función que
depende de p y q puesto que
P
( k : p k < q : a[k]) = a[p] + a[p + 1] + + a[q 1]

de manera que es conveniente simpli…car la notación haciendo


P
f (p; q) = ( k : p k < q : a[k])

Nótese que, cuando p = q


f (p; p) = 0

2.4 Invariante
Aplicando la técnica de sustitución de constante por variable en la postcondición
Q se obtiene un primer posible invariante P
{I : (0 n N )^sumax = (Max p; q : 0 p q n : ( k : p k < q : a[k]))}
Primero se veri…ca las condiciones de inicio: cuando n = 0
P
sumax = (Max p; q : 0 p q 0 : ( k : p k < q : a[k]))
P
= (Max p; q : p = q = 0 : ( k : ? : a[k]))
= (Max p; q : p = q = 0 : 0)
= 0

Por lo tanto, I es cierto con

n; sumax := 0; 0

Luego, vemos que, por construcción,

[I ^ (n = N ) =) Q]

Por lo cual (n 6= N ) es la guarda del ciclo que estamos buscando y la función


de cota puede ser N n.

4
2.5 Derivación del programa
Veamos que sucede en el incremento de la variable

n := n + 1

Para ello analizamos la estructura donde se cambió la constante N por la


variable n :
(Max p; q : 0 p q n + 1 : f (p; q))
= por de…nición de Max con dos variables
(Max q : 0 q n + 1 : (Max p : 0 p q : f (p; q)))
= por de…nición inductiva de Max (...split)
(Max q : 0 q n : (Max p : 0 p q : f (p; q))) max (Max p : 0 p q : f (p; n + 1))
= de nuevo por de…nición de Max con dos variables (en sentido inverso)
(Max p; q : 0 p q n : f (p; q)) max (Max p : 0 p q : f (p; n + 1))
= por de…nición de I
sumax max (Max p : 0 p q : f (p; n + 1))

Se tiene la siguiente situación: para calcular sumax en n + 1 el programa debe


calcular primero
(Max p : 0 p q : f (p; n + 1))
y luego compararlo con sumax en n. Es decir, tenemos la situación de recur-
rencia
g(n + 1) = g(n) ~ h(n + 1)
donde g representa la función que calcula sumax y h es la función que calcula,
en n + 1,
(Max p : 0 p q : f (p; n + 1))
donde ~ es el operador max.
Por lo tanto, introducimos una variable auxiliar que llamamos aux y debemos
fortalecer el invariante con el predicado

aux = (Max p : 0 p q : f (p; n))

que se inicializa cuando n = 0, con lo cual aux = 0 puesto que p = q = 0.


El nuevo invariante es

P
I : (0 n N ) ^ sumax = (Max p; q : 0 p q n:( k:p k < q : a[k]))
^ aux = (Max p : 0 p q : f (p; n))

Veamos ahora que sucede en el incremento n : n + 1 para la nueva estructura

5
en el invariante:
(Max p : 0 p n + 1 : f (p; n + 1))
= por de…nición inductiva de Max (...split)
(Max p : 0 p n : f (p; n + 1)) max f (n + 1; n + 1)
= porque f (k; k) = 0
(Max p : 0 p n : f (p; n + 1)) max 0
= porque f (p; n + 1) = f (p; n) + a[n] (...split de )
(Max p : 0 p n : f (p; n) + a[n]) max 0
= porque + distribuye con max
((Max p : 0 p n : f (p; n)) + a[n]) max 0
= por de…nición del nuevo predicado en I
(aux + a[n]) max 0

Por lo tanto, para calcular aux en n + 1 se debe sumar aux en n con a[n] y
compararlo con 0.
En conclusión, recuérdese la situación: para calcular sumax en n + 1 el
programa debe calcular primero aux en n + 1 y luego compararlo con sumax
en n, y así derivamos las instrucciones

aux : = (aux + a[n]) max 0


sumax : = sumax max aux

2.6 Programa con obligaciones de prueba


j[
const N : Int;
const a : Array [0; N ) de Int;
var sumax : Int;
{P : N 0}
n; sumax; aux := 0; 0; 0; P
{I : (0 n N )^sumax = (Max p; q : 0 p q n : ( k : p k < q : a[k]))
^ aux = (Max p : 0 p q : f (p; n)) : cota N n}
do (n 6= N ) ! aux := (aux + a[n]) max 0;
sumax := sumax max aux;
n := n + 1
od P
{Q : sumax = (Max p; q : 0 p q N : ( k : p k < q : a[k]))}

]j

2.7 Prueba de correctitud


2.7.1 Prueba 0
fP g n; sumax := 0; 0fIg se cumple :

6
I (n; sumax; aux := 0; 0)
por sustitución
(0 0 N ) ^ (0 = f (0; 0)) ^ (0 = f (0; 0))
porque f (0; 0) = 0
(0 0) ^ (0 N ) ^ (0 = 0) ^ (0 = 0)
por trivialidad
true ^ (0 N ) ^ true ^ true
porque [p ^ true p]
(0 N )

2.7.2 Prueba 1
[I ^ (n = N ) =) Q] por construcción.

2.7.3 Prueba 2
fI ^ (n 6= N )g
aux := (aux + a[n]) max 0; sumax := sumax max aux; n := n + 1
fIg se cumple :
Se aplica la técnica de prueba de la secuenciación
fI ^ (n 6= N )g
aux := (aux + a[n]) max 0
fR1g
sumax := sumax max aux
fR2g
n := n + 1
fIg

Primer paso

I (n := n + 1)
por sustitución
(0 n + 1 N ) ^ sumax = (Max p; q : 0 p q n + 1 : f (p; q))
^ aux = (Max p : 0 p q : f (p; n + 1))
por split de Max en sumax y en aux
(0 n + 1) ^ (n + 1 N )
^ sumax = (Max p; q : 0 p q n : f (p; q)) max (Max p : 0 p n + 1 : f (p; n + 1))
^ aux = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0

Se de…ne
8 9
< (0 n + 1) ^ (n + 1 N ) =
R2 : ^ sumax = (Max p; q : 0 p q n : f (p; q)) max (Max p : 0 p n + 1 : f (p; n + 1))
: ;
^ aux = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0

7
Segundo paso

R2 (sumax := sumax max aux)


por sustitución
(0 n + 1) ^ (n + 1 N )
^ sumax max aux = (Max p; q : 0 p q n : f (p; q)) max (Max p : 0 p n + 1 : f (p; n + 1))
^ aux = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0
(= porque aux = (Max p : 0 p n + 1 : f (p; n + 1)) = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0
(0 n + 1) ^ (n + 1 N )
^ sumax = (Max p; q : 0 p q n : f (p; q))
^ aux = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0

Se de…ne
8 9
< (0 n + 1) ^ (n + 1 N ) =
R1 : ^sumax = (Max p; q : 0 p q n : f (p; q))
: ;
^ aux = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0

Tercer paso

R1 (aux := (aux + a[n]) max 0)


por sustitución
(0 n + 1) ^ (n + 1 N )
^ sumax = (Max p; q : 0 p q n : f (p; q))
^ (aux + a[n]) max 0 = ((Max p : 0 p q : f (p; n1)) + a[n]) max 0
(= por aritmética
(0 n + 1) ^ (n + 1 N )
^ sumax = (Max p; q : 0 p q n : f (p; q))
^ aux = (Max p : 0 p q : f (p; n1))
(= porque [(0 n + 1) (= (0 n)] y [(n N ) ^ (n 6= N ) (n + 1 N )]
(0 n) ^ (n N ) ^ (n 6= N )
^ sumax = (Max p; q : 0 p q n : f (p; q))
^ aux = (Max p : 0 p q : f (p; n1))
por de…nición de I
I ^ (n 6= N )

2.7.4 Prueba 3
Ejercicio

Das könnte Ihnen auch gefallen