Está en la página 1de 24

T3 DISEO RECURSIVO 3.1 3.2 3.3 3.3.1 3.3.2 3.4 3.4.1 3.4.2 3.4.3 3.5 3.6 Introduccin.

Terminologa y notacin. Induccin Noetheriana. Diseo y verificacin. Anlisis por casos y composicin. Correccin y coste temporal. Tcnica de inmersin. Inmersin no final. Inmersin final. Consideraciones de eficiencia. Tcnica de desplegado y plegado. Transformacin recursivo-iterativo.

Recursividad: Caracterstica de la mayora de los lenguajes de programacin, que permite invocar un procedimiento en la propia definicin de ste. El razonamiento recursivo consiste en encontrar una relacin de recurrencia en los datos del problema, que permita obtener la solucin en base a datos ms sencillos. Programacin funcional: Paradigma de programacin, que permite prescindir por completo de la iteracin y utilizar la recursividad como nico mecanismo de repeticin. La recursividad y la iteracin, constituyen los dos mecanismos utilizados para describir algoritmos. Los procesadores proporcionan un mecanismo iterativo; no obstante, la utilidad de la recursividad reside en: -Las definiciones recursivas constituyen un mtodo natural de describir ciertos tipos de algoritmos y estructuras de datos. En dichos casos, genera rutinas ms compactas que la iteracin. -Constituye una herramienta de diseo fundamental. Se basa en establecer relaciones recurrentes entre los datos, lo que facilita el razonamiento de nuevos algoritmos. -Tiene la misma potencia expresiva que la iteracin, pudiendo describir exactamente los mismos cmputos. -Constituye una herramienta para la verificacin. Siempre es posible transformar un algoritmo recursivo a su correspondiente iterativa, lo cual proporciona los invariantes, o predicados fundamentales, que permiten razonar sobre la correccin de los bucles. En el desarrollo de ste captulo se utiliza un lenguaje funcional puro, que carece de la mayora de caractersticas propias de este tipo de lenguajes, pero con la suficiente expresividad como para desarrollar ejemplos bsicos y razonar sobre su correccin. Un algoritmo permite resolver un problema P, en trminos de unos datos D. Por ello, tanto en la aproximacin iterativa como en la recursiva, se parte del problema P, pero la diferencia entre consiste en: En el caso iterativo: P se resuelve planteando un problema ms sencillo, que, tras ser resuelto un cierto nmero de veces para los datos D, permite resolver el problema original P para dichos datos. En el caso recursivo: P se resuelve suponiendo que P ya est resuelto para otros casos ms sencillos, obteniendo una sucesin finita de datos D>D>D>, que termina en cierto caso trivial, el cual puede ser resuelto de forma directa.

3.1 Terminologa bsica. En ste texto se trata, exclusivamente, la recursividad lineal; aunque gran parte de lo explicado se generaliza al caso de la recursividad mltiple. - Rec. Lineal o simple: si cada llamada externa genera como mximo una llamada interna. - Rec. Mltiple: si una llamada externa puede generar dos o ms llamadas internas. - Esquema general de una funcin recursiva lineal: para razonar sobre la correccin, se emplea el siguiente esquema:

{ Q ( x )}

fun f ( x : T1 ) dev ( y : T2 ) = caso [] fcaso

Bt ( x ) triv( x )

Bnt ( x ) c( f ( s( x ) ) , x )

ffun { R ( x , y )}

3.2 Notacin empleada.

Tupla : = E1{ ,Ei+ 1} *


Expresin condicional: Est formada por una o ms alternativas separadas por [] :
Condicional ::= caso B1 E1

{ []

Bi +1 Ei +1 } * fcaso

Donde:

Bi es una expresin de booleana. E i una expresin de cualquier tipo.

Declaracin local: Se utiliza para evitar la reescritura de una expresin:


DecLocal ::= sea x1 = E1 , x 2 = E 2 , , x n = E n en E ( x1 , x 2 , , x n )

3.3 Induccin Noetheriana. Se introducen los principios bsicos para la verificacin de una funcin recursiva. Dada una especificacin formal:

{Q( x )}

{ R ( x , y )}

fun f ( x : T1 ) dev ( y : T2 )

Verificar la correccin de f consiste en demostrar la validez de:

x DT1 . Q( x ) R( x , f ( x ) )
Si los parmetros de entrada satisfacen la pre-condicin Q( x ) , los valores devueltos satisfacen la post-condicin R( x , f ( x ) ) . Para verificar un algoritmo recursivo, si DT1 puede considerarse infinito, es imprescindible aplicar el mtodo de induccin sobre los valores del dominio D f = x DT1 | Q( x ) .

El primer paso es establecer una estructura de preorden bien fundado con los datos del problema ( D f , ) , lo que se consigue dotando a D f de una relacin de preorden ( ) .

Definiciones:

Induccin Noetheriana: generalizacin del principio de induccin sobre los naturales. Propiedades: Reflexiva: Antirreflexiva: Transitiva: Simtrica: Antisimtrica: Definicin 3.1 (Preorden) Sea un conjunto D ; si una relacin binaria en D ( D D ) es reflexiva y transitiva, se dice que es un preorden en D . Si es un preorden en D , llamamos preorden al par ( D, ) . Corolario: Un preorden en D no tiene por qu poseer la propiedad antisimtrica. Definicin 3.1.1 (Orden Parcial) Si un preorden en D posee satisface la propiedad antisimtrica, se dice que es un orden parcial en D . Definicin 3.2 (Preorden Estricto) Sea un preorden ( D, ) , se define la relacin de preorden estricto como:
x y = ( x y ) ( y x )
def

x D . ( x x ) x , y , z D . ( x y ) ( y z ) x z
x , y D . x y y x

x D.

x x

x, y D .

( x y ) ( y x) x = z

Definicin 3.3 (Minimal) Sea un preorden ( D, ) , se dice que m D es minimal en D si no tiene predecesores estrictos, es decir: m es min imal en D = ( x D x m ) Corolario: los elementos minimales, en caso de existir, no tienen por qu ser nicos. Definicin 3.4 (pbf) Sea un preorden ( D, ) , se dice que est bien fundado, si no existen en D sucesiones infinitas estrictamente decrecientes; es decir, sucesiones de la forma: { xi } iN i. xi +1 xi . Corolario: Todo conjunto finito, con la relacin de preorden, es un pbf ( A, ) . El pbf ms conocido es el conjunto de los naturales. En muchos casos se puede dotar a un conjunto de una relacin de preorden, estableciendo una aplicacin con un pbf conocido.
def

Teorema 3.1 (Construir pbfs a partir de otro dado) Sea: - ( D2 , 2 ) un pbf. - D1 un conjunto cualquiera. - f : D1 D2 una aplicacin entre ambos.

Y, sean a, b D1 , se define el pbf ( D1 , 1 ) como:

a 1 b = f ( a) 2 f ( b)

def

Para construirlo, se siguen los siguientes pasos: 1. Demostrar que 1 es una relacin de preorden. 2. Demostrar que a , b D . a 1 b f ( a ) 2 f ( b ) . 3. En D1 no puede existir una sucesin infinita { xi } iN estrictamente decreciente, pues entonces la sucesin { f ( xi )} iN tambin lo sera, y esto es imposible, pues ( D2 , 2 ) es un pbf.

Teorema 3.2 ( Induccin Completa sobre Prerdenes Bien Fundados Noetheriana ) Sea ( D, ) un pbf, y P ( x ) un predicado con x D :
a D . ( b D . b a P ( b ) ) P( a ) a D . P ( a )

Al demostrar que, todo elemento de D cumple el predicado P sii todos sus predecesores estrictos tambin lo cumplen, dicho predicado P queda automticamente demostrado para todos los elementos de D . Corolario: 1. Si a es un elemento minimal, el antecedente del condicional externo es cierto, lo que exigira demostrar que P ( a ) es cierto. Dem. Sea ( D, ) un pbf . Sea a D un elemento minimal en D ; dado que ( D, ) es un pbf, se cumple que b D . b a P ( b ) , por lo que el antecedente es cierto. Dado que se que cumple el antecedente, el condicional ser cierto cuando el consecuente, P ( a ) , tambin lo sea; en cuyo caso, podemos afirmar que || a D . P ( a ) . 2. Se puede desdoblar la regla para trabajar, por separado, con el caso en que el elemento a es minimal, y con el caso en que no lo es:
a D. [min imal ( a ) P( a ) ] [ min imal ( a ) ( b D. b a P( b ) ) P( a ) ] a D. P( a )

Algoritmo: (Mtodo de induccin Noetheriana.) Base de la induccin. Demostrar P ( m ) para todo elemento minimal m D .

Hiptesis de induccin. Sea a D no minimal, suponer P (b ) para todo elemento b a . Paso de induccin. Mediante la hiptesis de induccin, demostrar que P ( a ) es cierto.

EJERCICIOS:

E3.1,8. Sea D el conjunto de todas las cadenas de caracteres finitas, de cualquier tamao, y long la relacin definida por: 7

c1 long c 2 = longitud ( c1 ) longitud ( c 2 )

def

a) Probar que ( C , long ) es un preorden. b) Probar que (C , long ) no es un orden parcial. c) Probar por induccin Noetheriana que: sea ( C , long ) , toda cadena c C tiene una longitud no negativa. Solucin: Sea c1 long c 2 = longitud( c1 ) longitud( c 2 ) ; De acuerdo a la definicin de preorden (3.1), ( C , long ) debe satisfacer las propiedades transitiva y reflexiva: Reflexiva.
c C . c long c longitud ( c ) longitud ( c )
def

a)

c1 , c2 , c3 C . c1 long c2 c2 long c3 c1 long c3 Transitiva. [ longitud( c2 ) longitud( c2 ) ] [ longitud( c2 ) longitud( c3 ) ] longitud( c ) longitud( c ) 2 3
b) De acuerdo a la definicin de orden parcial (3.1.1), ( C , long ) debe satisfacer la propiedad antisimtrica:
c1 , c 2 C .

(c

long c 2 ) ( c 2 long c1 ) x = z

Antisimtrica.

[ longitud ( c1 ) longitud( c 2 ) ] [ longitud( c2 ) longitud( c1 ) ] / longitud ( c1 ) = longitud ( c 2 )


FALSO

Donde observamos que no se cumple, y por lo tanto ( C , long ) no es un orden parcial.

c)

P ( x ) longitud ( c ) 0 m = , nico elemento minimal en C

Base de Induccin.

( P( ) longitud( ) 0) ( longitud( ) = 0) P( ) cierto


Sea P ( c ) longitud ( c ) 0 cierto con c C . Hiptesis de induccin. Paso de induccin.

Sea P( c ) longitud( c ) 0 con c C . c long c ; entonces:


P ( c ) longitud( c ) 0 ( c long c ) longitud( c ) > longitud( c ) longitud( c ) > 0 P ( c ) longitud ( c ) 0

E3.7. Se define el orden lexicogrfico como la relacin lex , tal que:

( a , b) lex ( a, b ) = ( a < a ) [ ( a = a ) ( b b ) ]

def

a) Demostrar que ( N N , lex ) es un pbf. b) Razonar si, al contrario que en N , cada elemento de N N puede tener infinitos predecesores estrictos. c) Dar un ejemplo de elemento minimal. Es nico? Solucin: a) De acuerdo a la definicin de preorden (3.1), ( N N , long ) debe satisfacer las propiedades transitiva y reflexiva: Reflexiva. a N .

( a, a ) lex ( a, a ) ( a < a ) [ ( a = a ) ( a a ) ] ( a < a ) { ( a = a ) [ ( a < a ) ( a = a ) ]} ( a < a ) ( a = a ) ( a a ) cierto

Transitiva.

a, b, c ( N N ) . [ ( a1 , a 2 ) lex ( b1 , b2 ) ] [ ( b1 , b2 ) lex ( c1 , c2 ) ]

{ ( a1 < b1 ) [ ( a1 = b1 ) ( a 2 b2 ) ]} { ( b1 < c1 ) [ ( b1 = c1 ) ( b2 c2 ) ]} [ ( a1 = b1 ) ( a 2 b2 ) ( b1 = c1 ) ( b2 c 2 ) ]

( a1 < b1 < c1 ) [ ( a1 = b1 ) ( a 2 b2 ) ( b1 < c1 ) ] [ ( a1 < b1 ) ( b1 = c1 ) ( b2 c 2 ) ] ( a1 < c1 ) [ ( a 2 b2 ) ( a1 < c1 ) ] [ ( a1 < c1 ) ( b2 c 2 ) ] [ ( a1 = c1 ) ( a 2 c2 ) ] ( a1 < c1 ) { ( a1 < c1 ) ( a 2 c 2 ) } [ ( a1 = c1 ) ( a 2 c2 ) ] ( a1 < c1 ) { ( a 2 c 2 ) [ ( a1 < c1 ) ( a1 = c1 ) ]} [ ( a1 < c1 ) ( a 2 c 2 ) ] [ ( a1 < c1 ) ( a1 = c1 ) ] ( a1 < c1 ) [ ( a1 = c1 ) ( a 2 c 2 ) ] ( a1 , a 2 ) lex ( c1 , c 2 ) cierto [ ( a1 < c1 ) ( a 2 c 2 ) ] [ ( a1 < c1 ) ( a1 < c1 ) ( a1 = c1 ) ]

Dado que ( N N , long ) es un preorden, para que, adems, est bien formado, por definicin (3.4), no pueden existir en D sucesiones infinitas estrictamente decrecientes:

El preorden ( N N , long ) tiene un nico elemento minmal: ( 0,0 )

10

( n, m) long ( n + 1, m ) ( n < n + 1) [ ( n = n + 1) ( m m ) ] ( 0 < 1) [ ( 0 = 1) ( 0 0 ) ] cierto ( falso cierto ) cierto


Por lo que si dejamos m constante, los sub-conjuntos obtenidos, adems de estar ordenados, forman una sucesin creciente.

( n, m ) long ( n, m + 1) ( n < n ) [ ( n = n ) ( m m + 1) ] ( 0 < 0 ) [ ( 0 = 0 ) ( 0 1) ] falso ( cierto cierto ) cierto


Por lo que si dejamos n constante, los conjuntos obtenidos, adems de estar ordenados, forman una sucesin creciente. De aqu que no puedan existir sucesiones infinitas y decrecientes en ( N N , long ) , y, por lo tanto, es un pbf. b) Por ejemplo, la infinitas parejas de la forma (1, n ) con n N , son predecesores estrictos de ( 2,0 ) . c) El nico elemento sin predecesores estrictos es ( 0,0 ) .

E3.4. Dada la relacin

tal que:
def

( a , b) ( a, b ) = ( b a ) Z ( b a )
11

a) Demostrar que ( N N , ) es un pbf. b) Encontrar una sucesin infinita estrictamente decreciente a partir de ( 0,0 ) . Solucin: a) De acuerdo a la definicin de preorden (3.1), ( N N , ) debe satisfacer las propiedades transitiva y reflexiva:

( a , a ) ( a, a )
Reflexiva.
a a a a 0 0 cierto

Transitiva.

[ ( a1 , a2 ) ( b1 , b2 ) ] [ ( b1 , b2 ) ( c1 , c2 ) ] [ ( a 2 a1 ) ( b2 b1 ) ] [ ( b2 b1 ) ( c 2 c1 ) ] ( a 2 a1 ) ( b2 b1 ) ( c 2 c1 ) ( a 2 a1 ) ( c 2 c1 ) ( a1 , a 2 ) ( c1 , c 2 ) cierto

Dado que ( N N , ) es un preorden, para que, adems, est bien formado, por definicin (3.4), no pueden existir en D sucesiones infinitas estrictamente decrecientes: Sea ( m, n ) con n N

(0, 0 ) es el nico elemento minimal de la sucesin.


( m, n + 1) ( m, n ) ( n + 1) m n m n m + 1 n m
1 0 cierto

Por lo tanto, si mantenemos m constante, tenemos una sucesin creciente, por lo que en este caso, no pueden existir sucesiones estrictamente decrecientes.

( m +1, n ) < ( m, n ) n ( m +1) < n m n m 1 < n m


1 < 0 cierto

Por lo que, al mantener m constante, encontramos que cada conjunto obtenido constituye una sucesiones infinita y estrictamente decreciente. Para que ( N N , ) sea un preorden, es necesario acotar estas sucesiones decrecientes. Esto es posible al establecer un elemento minimal, nico, tal que se cumpla que ( m, n) ( m, n ) para todo n . Es decir, para conseguir que sea un pbf, sera necesario definir el preorden como:

12

( N N , )

con N un subconjunto finito y N N .

b) Por ejemplo, la sucesin ( n,0 ) con n N :

( 0,0) (1,0) ( 2,0) ... (0, 0 ) es el elemento minimal de la sucesin.


( n +1, 0 ) ( n, 0) 0 ( n +1) < 0 n
n 1 < n 1 < 0 cierto

Por lo tanto, la sucesin es estrictamente decreciente.

E3.3. Dar dos ejemplos de prerdenes: a) Sin elementos minimales. b) Con mas de un elemento minimal. c) Con un nico elemento minimal. Solucin:

a)

( Z, Z )

no tiene elementos minimales.

13

b) ( N N , ) definido como ( a , b ) ( a , b ) = b b posee como elementos minimales todas las parejas de la forma ( n,0 ) para a N .
def

c) El conjunto de las cadenas de caracteres finitas de cualquier tamao con la relacin long , ( C , long ) , posee un nico elemento minimal; la cadena vaca . EJ-3.0-1. Ejemplos de pbfs son:

a) Los naturales con la relacin menor o igual habitual:

( N, N )

b) El conjunto de las cadenas de caracteres finitas de cualquier tamao con la relacin long : ( N , long ) c) El conjunto de las cadenas de caracteres finitas de cualquier tamao con la relacin lex : ( N , lex ) d) Partes finitas de cualquier conjunto con la relacin de inclusin:

( P ( A) , )

es decir, todo subconjunto finito de cualquier conjunto A , con la relacin de inclusin. e) Todo conjunto finito, con la relacin de preorden: ( B, ) EJ-3.0-2. Ejemplos de prerdenes que no estn bien fundado son:

a) Los enteros con la relacin menor o igual habitual:

,0] . Pues existe una sucesin estrictamente decreciente en (

( Z, Z )

b) El intervalo cerrado [0,1] sobre los reales, con la relacin menor o igual habitual:

( [ 0,1] R, R )

Pues es posible definir incontables sucesiones estrictamente decrecientes sobre R. En concreto, sobre [0,1] , un ejemplo sera: { x [ 0,1] | x = 10 n con n N } c) El preorden ( N N , ) , definido como: ( a , b ) ( a , b ) = ( b a ) ( b a ) Z
def

14

EJ-3.1,E3.6. Existen incontables maneras de convertir el conjunto N N , de las parejas de naturales, en un pbf; tantas como aplicaciones:
f : N N N

Algunos ejemplos son de aplicaciones vlidas son: 1. 2. 3. 4.

( a , b) 1 ( a, b ) ( a , b) 2 ( a, b ) ( a , b) 4 ( a, b ) ( a , b) 4 ( a, b )

def

= a < a = b < b = max( a , b ) max( a , b )

def def

= ( a + b ) ( a + b )
def

Un ejemplo de aplicacin no vlida sera: 5.


= ( a b ) Z ( a b ) Dado que es una aplicacin de N N Z

( a , b) 4 ( a, b )

def

Se pide: a) Dar un ejemplo de elemento minimal para cada uno de los prerdenes del ejemplo, indicando si ste es nico. b) Para cada ejemplo, demostrar que ste es un pbf. Solucin:
def

a)

1. ( a , b ) 1 ( a , b ) = a < a posee infinitos elementos minimales; todos aquellos elementos de la forma ( n,0 ) con n N . 2. ( a , b ) 2 ( a , b ) = b < b posee infinitos elementos minimales; todos aquellos elementos de la forma ( 0, n ) con n N . 3. elemento ( 0,0 ) .
def

( a , b) 4 ( a, b )

def

= ( a + b) ( a + b ) posee un nico elemento minimal; el

4. ( a , b ) 4 ( a , b ) = max( a , b ) max( a , b ) posee un nico elemento minimal; el elemento ( 0,0 ) . 5. elemento ( 0,0 ) .

def

( a , b) 4 ( a, b )

def

= ( a b) Z ( a b ) tiene un nico elemento minimal; el

15

b) 1. Transitiva. Reflexiva.

( a , b) 1 ( a, b )

def

= a < a

( a , a ) 1 ( a , a ) a < a a a
[ ( a1 , b1 ) 1 ( a 2 , b2 ) ] [ ( a2 , b2 ) 1 ( a3 , b ) ] ( a1 < a 2 ) ( a 2 < a3 ) ( a1 < a3 ) ( a1 , a1 ) 1 ( a3 , a3 ) cierto

Para demostrar que el preorden est bien fundado, es necesario demostrar que no existen sucesiones infinitas y decrecientes en ( N N , ) : Existe infinitos elementos minimales, todos aquellos de la forma: m N . ( m,0) Adems, la sucesin ( m, n ) es creciente para todo m, n N :

( m, n ) 1 ( m + 1, n) m < m + 1 0 < 1 cierto


Por lo tanto, ( N N , ) es un pbf.
def

2. Transitiva. Reflexiva.

( a , b) 2 ( a, b )

= b < b

( a , a ) 1 ( a , a ) a < a a a
[ ( a1 , b1 ) 1 ( a2 , b2 ) ] [( a 2 , b2 ) 1 ( a3 , b ) ] ( b1 < b2 ) ( b2 < b3 ) ( b1 < b3 ) ( b1 , b1 ) 1 ( b3 , b3 ) cierto

Existe infinitos elementos minimales, todos aquellos de la forma: n N . ( 0, n ) Adems, la sucesin ( m, n ) es creciente para todo n, m N :

( m, n ) 1 ( m, n + 1) n < n + 1 0 < 1 cierto


Por lo tanto, ( N N , ) es un pbf.
def

3. Transitiva.

( a , b) 3 ( a, b )

= ( a + b) ( a + b )

Reflexiva.

( a, a ) 3 ( a, a ) ( a + a ) ( a + a ) 0 0 cierto [ ( a1 , b1 ) 3 ( a2 , b2 ) ] [ ( a2 , b2 ) 3 ( a3 , b ) ] [ ( a1 + b1 ) ( a 2 + b2 ) ] [ ( a 2 + a 2 ) ( b3 + b3 ) ]
( a1 + b1 ) ( b3 + b3 ) ( a1 , b1 ) 3 ( a3 , b3 ) cierto

Sucesiones.

El nico elemento minimal es ( 0,0 ) .

16

( m, n ) 1 ( m + 1, n ) m + n m + 1 + n 0 1 cierto ( m, n ) 1 ( m, n + 1) m + n m + n + 1 0 1 cierto
Sea a , b, c N . f ( a, b ) = a + b , cada par ( a , b ) tiene un nmero concreto de predecesores estrictos, que podemos clasificar en funcin de f . Por ejemplo: para f ( a, b ) = 2 ; (1,0 ) y (0,1) . para f ( a , b ) = 3 ; (1,1) , ( 2,0 ) y (0,2 ) para f ( a , b ) = 4 ; (1,2 ) , ( 2,1) , (3,0 ) y ( 0,2 ) 4. Transitiva.

( a , b) 4 ( a, b )

def

= max( a , b ) max( a , b )

( a, a ) 4 ( a, a ) max( a, a ) max( a, a ) a a cierto


[ ( a1 , b1 ) 3 ( a2 , b2 ) ] [( a 2 , b2 ) 4 ( a3 , b ) ] [ max( a1 , b1 ) max( a 2 , b2 ) ] [ max( a 2 , b2 ) max( a3 , b3 ) ] max( a1 , b1 ) max( a3 , b3 ) ( a1 , b1 ) 4 ( a3 , b3 ) cierto
El nico elemento minimal es ( 0,0 ) .

Reflexiva.

Sucesiones.

( m, n) 1( m + 1, n) max( m, n) max( m + 1, n)

( m n) ( m + 1 > n )
max( m, n) = m max( m + 1, n) = m + 1 cierto

( m < n) ( m + 1 < n ) ( m + 1 = n ) ( m + 1 n )
max( m, n) = n max( m + 1, n) = n cierto

17

( m, n) 1( m, n + 1) max( m, n) max( m, n + 1)

( n m) ( n + 1 > m)
max( m, n) = n max( m, n + 1) = n + 1 cierto

( n < m) ( n + 1 < m) ( n + 1 = m) ( m + 1 n)
max( m, n) = m max( m + 1, n) = m cierto

E3.2. Sea la relacin de preorden estricto ( ) , demostrar que sta es transitiva y antirreflexiva. Solucin: Por la definicin de preorden estricto (3.2), se tiene que, para que un preorden ( D, ) sea estricto:
x y = ( x y ) ( y x )
x, y , z D. ( x y ) ( y z ) x z ( x y ) ( y x ) ( y z ) ( z y ) ( x z ) ( z x ) x z cierto
def

Transitiva.

Antirreflexiva.

x D. ( x x ) ( x x ) ( x x ) ( x x ) cierto falso falso

E3.5. Demostrar que: Para que sea un pbf ( D, ) , es condicin necesaria y suficiente que, en todo subconjunto no vaco de D , exista al menos un elemento minimal. Solucin:

18

3.3

Diseo y Verificacin. de sus algoritmos

La secuencia que se recomienda a los lectores para el diseo recursivos es: 1. 2. 3. 4. 5. 3.3.1 Especificacin formal. Anlisis por casos. Composicin. Verificacin formal. Estudio de la eficiencia.

Diseo; anlisis por casos y composicin.

La primera etapa del diseo es la ms creativa. Consiste en establecer una recurrencia entre: - Las sucesivas llamadas, de forma que se reduzca el tamao del problema. - Los parmetros de entrada y los de salida en cada llamada. La solucin ms eficiente suele alcanzarse mediante la relacin que ms drsticamente reduce el tamao del problema. 1. Escoger una recurrencia, que relacione las sucesivas llamadas recursivas. 2. Anlisis por casos. Una vez escogida una recurrencia, se analizan los casos que se pueden presentar en la funcin: Casos triviales, y solucin a aplicar en cada caso. Casos no triviales, y solucin a aplicar en cada caso.

stos resultados suelen recogerse en una tabla: Condicin caso trivial Condicin caso no trivial Solucin trivial Solucin no trivial

3. Comprobacin informal. Se debe asegurar que: La recurrencia conduce a problemas ms pequeos.

19

La recurrencia siempre termina en un caso trivial. Entre los casos triviales y no triviales, se cubren todos los estados previstos por la precondicin.

4. Composicin. Consiste en expresar, mediante LR, el resultado del anlisis por casos. Se han de tener dos consideraciones: Asegurarse de que las condiciones son mutuamente excluyentes. Emplear declaraciones locales, para evitar calcular varias veces la misma expresin.

3.3.2 Correccin formal. Verificar la correccin de una funcin recursiva f , equivale a demostrar:

x DT1 . Q( x ) R( x , f ( x ) )
Y, sea D f = x DT1 | Q( x ) , esto equivale a:

x D f . R ( x , f ( x ) )

Si se dota a D f de una relacin de preorden , de forma que ( D f , ) sea un pbf, entonces sta demostracin puede hacerse por induccin noetheriana: Demostrarlo para los elementos minimales de D f . Suponer que es cierto para todo x D f no minimal. Demostrarlo para todo x D f . x x .

Funcin recursiva lineal: Sea f una funcin recursiva lineal y ( D f , ) un pbf, se requiere satisfacer las siguientes condiciones antes de poder demostrar su correccin: La funcin recursiva f est bien definida sobre D f : La llamada interna satisface la precondicin: La llamada interna se realiza con parmetros estrictamente ms pequeos:
Q( x ) Bt ( x ) Bnt ( x )

Q( x ) Bnt ( x ) Q( s( x ) )
Q ( x ) Bnt ( x ) s( x ) x

Todos los elementos minimales de D f estn incluidos en el caso trivial. Lo que siempre es cierto si el sucesor s ( x ) ha sido bien definido en los pasos 2 y 3. Funcin limitadora:

Se define t : D f N de tal forma que, para todo x i dado, t ( xi ) proporciona una cota superior intuitiva, al nmero de llamadas recursivas generadas a partir de f ( xi ) . 20

Resulta til emplearla para inducir un pbf en D f (teorema 3.1). Una vez definida t , se tiene que: Q( x ) Bnt ( x ) s( x ) x Q( x ) Bnt ( x ) t ( s( x ) ) t ( x ) Para definir t : D f N , se sugiere definir t : DT Z , y demostrar que, cuando el dominio se restringe a D f , entonces t N : Q( x ) t ( x ) 0
1

En resumen, los cinco puntos a demostrar son: 1. 2. 3. 4. 5. 6.


Q( x ) Bt ( x ) Bnt ( x )

(se cubren todos los casos) Q( x ) Bnt ( x ) Q( s( x ) ) (llamadas satisfacen la precondicin) Definir t : DT1 Z tal que Q( x ) t ( x ) 0 (definir pbf) Q( x ) Bnt ( x ) t ( s ( x ) ) t ( x ) (tamao del subproblema decrece) Q( x ) Bt ( x ) R ( x , triv ( x ) ) (base de induccin) Q( x ) Bnt ( x ) R( s( x ) , f ( s ( x ) ) ) R( x , f ( x ) ) (paso de induccin)

En las demostraciones es frecuente emplear la notacin definida en (2.14). s( x ) Por ejemplo: Q x Q( s( x ) ) s ( x ) y Qx Q ( s ( x ) , y ) ,y Los parmetros de llamada y retorno se la llamada interna o sucesora, se nombran igual que los de la llamada externa, pero precedidos con prima. Por ejemplo: x para designar a s ( x ) y para designar a f ( s ( x ) )

21

EJEMPLO:

Probar la correccin del siguiente algoritmo (p60):

{Q ( a Z ) ( n N ) } fun potencia ( a : entero; n : natural ) dev ( p : entero ) =


caso n = 0 1 [] n > 0 ffun
n

{R p = a }
Solucin: -

En primer lugar, establecemos los distintos trminos:


Q( x ) n 0 R( x , y ) p = a c( x , y ) a p s( x ) ( a, n 1) x ( a, n ) y p triv( x ) 1 Bt ( x ) n = 0

Bnt ( x ) n > 0

El exponente n en se corresponde exactamente con el nmero de pasos requeridos por la funcin recursiva. Por ello, utilizamos el exponente como funcin limitadora t ( a, n ) = n . En segundo lugar, efectuamos la verifiacin:
n 0 n = 0 n > 0 cierto
n 0 n > 0 n 1 0 [ ( n > 0 ) ( n = 0 ) ] ( n > 0 ) n > 0 n 1 cierto
def

1. Q( x ) Bt ( x ) Bnt ( x ) 2. Q( x ) Bnt ( x ) Q( s( x ) ) 3. Q( x ) t ( x ) 0 4. Q( x ) Bnt ( x ) t ( s( x ) ) t ( x ) 5. Q( x ) Bt ( x ) R ( x , triv ( x ) )

n 0 n 0 cierto

( n 0) ( n > 0 ) ( n 1 < n ) ( n > 0) ( 1 < 0) ( n > 0 ) cierto cierto ( n 0) ( n = 0) 1 = a n


n = 0 a n = 1 cierto

6. Q( x ) Bnt ( x ) R( s( x ) , f ( s( x ) ) ) R( x , c( x , f ( s( x ) ) ) )

22

( n 0) ( n > 0) ( p = a n1 ) p = a p ( n > 0) ( p = a n 1 ) a p = a n cierto

E3.10. La siguiente funcin recursiva no es lineal (p61):

{ Q 1 i j +1 } fun suma ( a : vect; i , j : entero ) dev ( s : entero ) = caso ( i > j ) 0 [] ( i = j ) a[ i ] sea m = ( i + j ) DIV 2 en [] (i < j ) suma ( a , i , m ) + suma( a , m + 1, j )
fcaso ffun
j R s = a[ p ] p =i

a) Verificar su correccin. b) Al efectuar la demostracin, encuentras alguna dificultad especial al aplicar algn paso? Solucin:
Q( x ) n 0 R( x , y ) p = a c( x , y ) a p s( x ) ( a, n 1) x ( a, n ) y p triv( x ) 1 Bt ( x ) n = 0

Bnt ( x ) n > 0

1. (1 i j + 1) ( i < j ) [ ( i = j ) ( i > j ) ]

Q( x ) Bt ( x ) Bnt ( x )

(1 i ) ( i
(1 i

j + 1) ( i j + 1) ( i = j ) ( i j ) ( i < j ) ( i = j ) ( i > j )

2.

Q( x ) Bnt ( x ) Q( s( x ) )

j + 1) ( i < j ) (1 i m + 1) (1 m + 1 j ) 1 i m + 1 j

23

E3.9. Analizar la correccin de los siguientes algoritmos, que calculan el mximo comn divisor de dos naturales mediante el algoritmo de euclides: a)

{Q ( a N ) ( b N ) [( a 0 ) ( b 0) ]} fun mcd1 ( a , b : natural ) dev ( m : natural )


caso b = 0 b [] a = 0 a [] a b mcd1( b, a MOD b ) [] a < b mcd1( a , b MOD a ) fcaso ffun

{ R m = mcd ( a, b )}
x ( a, b ) s( x ) ( a , aMODb ) ( b, bMODa ) y m Q ( a, b ) ( a N ) ( b N ) [ ( a 0 ) ( b 0 ) ] c( ( a, b ) , m ) aplicacin identidad R ( ( a , b ) , m ) m = mcd ( a, b ) Bt ( a , b ) ( a = 0 ) ( b = 0 ) triv1 ( a , b ) a Bnt ( a, b ) ( a b ) ( a < b ) triv 2 ( a , b ) b Q ( x ) Bt ( x ) Bnt ( x )

a, b N . a 0 b 0 ( a = 0 ) ( b = 0 ) ( a b ) ( a < b ) ( a = 0 ) ( b = 0 ) cierto cierto

Q ( x ) Bnt ( x ) Q( s( x ) )

a, b N . ( a 0 b 0 ) ( a b a < b ) ( a b ) b 0 a MOD b 0 ( a 0 b 0) ( a b ) b 0 a MOD b 0 cierto a, b N . ( a 0 b 0 ) ( a b a < b ) ( a < b ) a 0 b MOD a 0 ( a 0 b 0) ( a < b ) a 0 b MOD a 0 cierto Q( x ) t ( x ) 0

24