Está en la página 1de 56

4.

El Pseudolenguaje y Construccin de programas correctos


Un programa en el pseudolenguaje tendr la misma forma de una especificacin:
[Declaracin de variables
{ Precondicin }
Programa
{ Postcondicin }
].
!ora pasaremos a describir las acciones elementales de nuestro pseudolenguaje" as#
como los constructores del pseudolenguaje" $ue tambi%n llamaremos instrucciones del
pseudolenguaje" & $ue determinan el control del flujo de ejecucin de un programa. Por
cada constructor ' daremos adems " una regla $ue permite probar formalmente $ue '
cumple una especificacin dada. (stas reglas se deducirn de la interpretacin
operacional de cada instruccin & la interpretacin operacional de la proposicin {P} '
{)} *recordemos: cada ejecucin de ' termina en un estado $ue cumple ) cuando es
aplicada a un estado $ue cumple P+.
4.1. Acciones elementales y tipos no estructurados en el pseudolenguaje
,os programas act-an sobre objetos. (n el cambio de estado de estos objetos es donde se
refleja la accin $ue el programa describe. ,os objetos sern referenciados por variables.
,os nombres de las variables las colocaremos en min-sculas *a menos $ue sean
constantes+ comen.ando por una letra.
/igura 0
(n un computador" un objeto ser almacenado en la memoria & la variable $ue lo
referencia la podemos ver como una direccin de memoria donde se encuentra el objeto
almacenado. ,a memoria del computador la podemos imaginar como un casillero donde
se almacenan los valores de las variables de nuestro programa. 1ada casilla ser un
objeto diferente *ver figura 0+.
,as acciones bsicas son las de observacin del valor de un objeto & modificacin del
valor de los objetos.
,a observacin de un valor de un objeto se describir por el simple uso de su nombre. Por
ejemplo" al evaluar la e2presin *23&+45 en la cual aparecen dos variables de tipo entero"
06
x
la variable x !ace
referencia a un objeto
en memoria con valor 5
5 7.06 8 0 memoria
..........
......
2 representa el valor del objeto 2" e & representa el valor del objeto &9 por lo tanto se
observa el valor de 2 & de &.
4.1.1. Tipos no estructurados del pseudolenguaje
(l tipo o clase de un objeto es la informacin necesaria & suficiente para poder conocer
las manipulaciones $ue se podrn !acer con ese objeto. Por ejemplo" si 2 es un objeto de
tipo entero" entonces podremos sumarlo" restarlo" multiplicarlo con otro objeto de tipo
entero. 1uando decimos :un objeto es de tipo ;< estamos impl#citamente diciendo $ue el
objeto puede poseer un valor de un conjunto preciso de valores & $ue sobre el valor de
ese objeto podemos ejecutar determinadas operaciones.
(n el pseudolenguaje podemos declarar variables de tipo entero" real" carcter" booleano.
,as acciones elementales $ue podemos !acer con estos tipos de datos vienen dadas por
las operaciones com-nmente utili.adas para %stos. De igual forma" las e2presiones se
forman por combinaciones vlidas de los operadores" por ejemplo" las e2presiones de tipo
entero consisten de las constantes *representadas de manera usual" 5" 7" 80+" variables de
tipo entero" & combinaciones de estas formadas por operadores sobre enteros. Por
ejemplo a4*b35+ es una e2presin sobre n-meros enteros $ue consta de dos operaciones
elementales sobre los enteros.
,as siguientes operaciones elementales toman por operandos n-meros enteros o reales:
3" 8" 4 suma" resta" multiplicacin
= divisin: produce un n-mero real
>" ?" @" " " operadores de comparacin: producen verdadero o falso
,as siguientes operaciones tienen slo enteros como operandos:
2 div & divisin entera de 2 entre &. (s la parte entera de 2=&.
Ao est definida para &@B
2 mod & resto de la divisin entera de 2 entre &. (s igual a 28*2 div &+4&.
(st definida slo para 2 no negativo e & positivo
,as operaciones sobre tipos bol%anos: " " " "
'i a & b son enteros & p booleano entonces *a b86+ p es una e2presin booleana o
predicado.
1ual$uiera de los tipos bsicos admite como accin elemental la igualdad *@+.
4.1.2. La Asignacin
1ual$uier cambio de estado $ue ocurra durante la ejecucin de un programa" es debido a
la modificacin del valor de los objetos. 'i a & b son dos variables $ue referencian a
objetos del mismo tipo base" entonces podemos modificar el valor de a :asignndole< el
05
valor de b. (sta accin elemental la denotaremos en el pseudolenguaje por: a :@ b. ms
generalmente" una asignacin es de la forma: 2:@(" donde 2 es una variable & ( es una
e2presin del mismo tipo $ue 2" por ejemplo (@*b3c+42.
,a interpretacin operacional de la accin de asignacin es: la ejecucin de 2 :@ (
reempla.a el valor de 2 por el valor resultante de evaluar (.
(n la figura C vemos el efecto $ue produce la asignacin 2 :@ *b3c+42 para b @ 7" c @ C &
2 @ 5.
/igura C
'i ) es un predicado $ue contiene la variable libre 2" Q(x:=E) es el predicado que resulta
de sustituir cada aparicin de la variable x en Q por la expresin E. Dado un predicado
)" ) se cumple *es verdad+ despu%s de la ejecucin de 2 :@ ( si & slo si )*2:@(+ se
cumple antes de la ejecucin de 2:@(. Por lo tanto podemos definir formalmente la regla
que garantiza que una asignacin cumple una especificacin de la siguiente manera:
Probar $ue {P} 2:@( {)} se cumple es e$uivalente a
probar $ue P)*2:@(+ es una tautolog#a
Dmpl#citamente se debe tener en cuenta $ue cuando P se cumple" este !ec!o debe implicar
$ue la e2presin ( puede ser evaluada en el estado $ue describe P" es decir" ( est bien
definida para ese estado *por ejemplo" no !a& divisin por cero+.
Por ejemplo" mostremos $ue se cumple:
{2 7} 2 :@ 236{2 B}
Aote primero *como observamos+ $ue la e2presin 236 est bien definida para valores de
2 ma&ores o iguales $ue 7. Eemos $ue si la variable 2 es ma&or o igual a 7 entonces al
sumarle 6 ser con ms ra.n ma&or o igual a cero. ,a demostracin formal ser#a como
sigue" partimos de la postcondicin:
*2 B+*2:@236+
07
7
b
Despu%s de la asignacin 2:@ *b3c+42" los valores de b" c" 2
sern:
C
c
5
2
'i los valores de las variables b" c" 2 son:
7
b
C
c
6F
2
definicin de la regla de sustitucin *sustituir todas las apariciones de 2 por 236+
236 B
por aritm%tica
2 86
por aritm%tica
2 7
1omo 2 7 *2 B+*2:@236+ es una tautolog#a" entonces la regla de la asignacin nos
dice $ue:
{2 7} 2 :@ 236{2 B} se cumple
Por lo tanto" siempre $ue 2 7 se cumpla *es decir" sea verdadero+ despu%s de ejecutar la
instruccin 2 :@ 236 se tendr $ue 2 B ser verdadero. los predicados 2 7" 2 B"
tambi%n se les llama aserciones *o afirmaciones+" en el sentido $ue estamos afirmando
$ue son verdad en ese punto de la ejecucin del programa.
G1-al ser#a la solucin ms d%bil H para $ue se cumpla: {H} 2 :@ ( {)}I Jecordemos
$ue H4 es el predicado ms d%bil $ue cumple {H} 2 :@ ( {)} si para todo predicado H
$ue cumple {H} 2 :@ ( {)} se tiene $ue HH4. ,a solucin es H @ )*2:@(+" &a $ue
para $ue ) se cumpla despu%s de ejecutar la asignacin" antes de ejecutar la asignacin se
debe cumplir ) reempla.ando 2 por el valor por el $ue fue modificado" es decir" el valor
de (. (n el ejemplo anterior el predicado ms d%bil es 236 B.
(jercicios: pgina 5B de KaldeLaij seccin B de ejercicios.
4.1.3. La instruccin sip
Una instruccin $ue ser necesaria ms adelante es la instruccin sip. ,a ejecucin de
:salto< no tiene ning-n efecto sobre el estado de las variables en el momento de su
ejecucin. ,a instruccin salto la caracteri.amos por la regla:
Probar $ue {P} sip {)} se cumple es e$uivalente a
Probar $ue P ) es una tautolog#a
G1ul ser#a la precondicin ms d%bil de sipI. ,a respuesta es ).
(jercicios: pgina 6M del KaldeLaij.
4.2 !ecuenciacin de acciones
1mo los programas $ue !aremos describirn procesos secuenciales" necesitamos alg-n
constructor $ue nos permita e2presar una secuencia de instrucciones.
00
,a secuenciacin de las instrucciones ' & ; la denotamos por '";.
,a interpretacin operacional es: primero se ejecuta ' & luego ;.
Para probar formalmente $ue se cumple {P} '9; {)} tenemos $ue conseguir un
predicado J tal $ue {P} ' {J} & {J} ; {)} se cumplan. Por lo tanto tenemos la regla de
la secuenciacin siguiente:
Probar $ue{P} '9; {)} se cumple es e$uivalente a
encontrar un predicado J tal $ue {P} ' {J} & {J} ; {)} se cumplan
(l punto & coma *9+ no se usa como un terminador o separador sino como un operador de
composicin para combinar dos instrucciones.
,a instruccin de secuenciacin *el punto & coma+ es una operacin de composicin de
dos operaciones pues cuando $ueremos encontrar la precondicin ms d%bil H tal $ue
{H} '9; {)} se cumple" esta es la precondicin H ms d%bil $ue cumple {H} '
{precondicin ms d%bil N $ue cumple {N} ; {)}}.
(jemplos de desarrollo & prueba de programas:
6+ Oacer un programa $ue cumpla la especificacin siguiente:
[var v" P" l" 2" r : reales9
{'ean E" K" ," H n-meros reales no negativos. N se tiene $ue v@E" P@K" l@," 2@H" con K
& E distintos de cero" " donde , es la cantidad de litros consumidos por el ve!#culo
cuando recorre K Pilmetros a la velocidad constante E. }
Q'R,DA 1RA'USDD
{ r es la cantidad de gasolina $ue consume el ve!#culo al recorrer H Pilmetros a una
velocidad constante E}
)ueremos encontrar el programa Q'R,DA 1RA'USDD. Jecordemos $ue
aplicando la t%cnica de diseTo descendente" este problema lo descompusimos en dos
problemas a resolver secuencialmente: primero el clculo del n-mero de litros de
gasolina $ue consume por Pilmetro el automvil a velocidad constante E" & luego el
clculo de la gasolina consumida por el automvil al recorrer H Pilmetros a velocidad
constante E.
(l primer problema se resuelve mediante la e2presin ( @ l=P
(l segundo problema se resuelve mediante la e2presin 24(" !abiendo calculado (.
'in embargo podemos colocar todo en una sola e2presin r :@ 24*l=P+. N el programa
$uedar#a:
0C
[var v" P" l" 2" r : reales9
{'ean E" K" ," H n-meros reales no negativos" con K & E distintos de cero. N se tiene $ue
v@E" P@K" l@," 2@H.}
r :@ 24*l=P+
{ ): r es la cantidad de gasolina $ue consume el ve!#culo al recorrer H Pilmetros a una
velocidad constante E. }
Aote $ue la variable v no interviene en el programa" slo sirve en la especificacin" por lo
$ue puede ser eliminada del programa. ,a demostracin de la correctitud de este
programa es mu& sencilla: partimos de la postcondicin ) & aplicamos la regla de la
asignacin:
Partiendo de la postcondicin :): r es la cantidad de gasolina $ue consume el automvil
al recorrer H Pilmetros a una velocidad constante E< & aplicando la regla de sustitucin:
)*r:@24*l=P++
regla de sustitucin
24*l=P+ es la cantidad de gasolina $ue consume el automvil al recorrer H Pilmetros a
una velocidad constante E" donde , es la cantidad de litros consumidos por el ve!#culo
cuando recorre K Pilmetros a la velocidad constante E.
por definicin de igualdad
24*l=P+ @ H4*,=K+ H4*,=K+ representa la cantidad de gasolina $ue consume un
automvil al recorrer H Pilmetros a una velocidad constante E" donde , es la cantidad
de litros consumidos por el ve!#culo cuando recorre K Pilmetros a la velocidad
constante E.
por definicin de igualdad de 2" l" P a H" ," K & resultados de la f#sica
'ean E" K" ," H n-meros reales no negativos" con K & E distintos de cero. N se tiene
$ue v@E" P@K" l@," 2@H.
Por lo tanto la regla de la asignacin garanti.a $ue el programa es correcto &a $ue:
* v@E" P@K" l@," 2@H" K & E distintos de cero+ )*r:@24*l=P++
5+ Oacer un programa $ue cumpla la siguiente especificacin:
[ var 2" &" . : entero9
0F
{ 2@H &@N .@U}
'
{ 2@54U &@ H3N .@2354*H3N+ }
].
De acuerdo a la postcondicin" . depende de 2 modificado a 54U" 2 e & dependen slo de
los valores iniciales" por lo $ue primero !abr#a $ue calcular 2 e &" luego .. Aote tambi%n
$ue & depende del valor inicial de 2" por lo $ue si modificamos 2 primero $ue &
perder#amos el valor inicial de 2 & no podr#amos calcular &. (n consecuencia" !abr#a $ue
calcular & antes $ue 2. Aotemos tambi%n $ue . depende del valor inicial de &. Pero si
modificamos & para $ue contenga H3N" perdemos el valor inicial de &. 'in embargo" este
nuevo valor H3N de &" aparece en el valor final de ." por lo $ue no importa si
modificamos el valor inicial de & por H3N" &a $ue este -ltimo valor es el $ue nos interesa
para calcular .. Podr#amos entonces reempla.ar en la postcondicin a .@2354*H3N+ por
.@2354&.
Un posible programa ser#a:
[ var 2" &" . : entero9
{ 2@H &@N .@U}
& :@ 2 3 &9
2 :@ 54.9
. :@ 2 3 5 4 &
{ 2@54U &@ H3N .@2354*H3N+ }
].
Demostracin de la correctitud del programa anterior:
Partiendo de la postcondicin" iremos calculando aserciones intermedias *$ue se
satisfacen entre dos instrucciones consecutivas del programa+ de abajo !acia arriba !asta
llegar a la precondicin:
*2@54U &@ H3N .@2354*H3N++*. :@ 2 3 5 4 &+
regla de sustitucin
2@54U &@ H3N 2 3 54&@2354*H3N+
simplificacin usando aritm%tica & lgica
2@54U &@ H3N
cabamos de probar $ue se cumple:
*6+ { 2@54U &@ H3N } . :@ 2 3 5 4 & { 2@54U &@ H3N .@2354*H3N+ }
s#" antes de la instruccin . :@ 2 3 5 4 &" se cumple 2@54U &@ H3N. Por lo $ue la
podemos tomar como postcondicin de la instruccin 2 :@ 54. :
0M
*2@54U &@ H3N+ *2 :@ 54.+
sustitucin 2 por 54.
54.@54U &@ H3N
1on esto -ltimo !emos probado $ue:
*5+ { 54.@54U &@ H3N } 2 :@ 54. { 2@54U &@ H3N }
Por lo tanto *6+ & *5+ nos permiten concluir" por la regla de la secuenciacin" $ue:
{ 54.@54U &@ H3N }
2 :@ 54. 9
. :@ 2 3 5 4 &
{ 2@54U &@ H3N .@2354*H3N+ }
!ora tomamos 54.@54U &@ H3N como postcondicin de la instruccin & :@ 2 3 & :
*54.@54U &@ H3N+ *& :@ 23&+
sustitucin & por 23&
54.@54U 23& @ H3N
por igualdad
2@H &@N .@U
,o anterior nos dice $ue se cumple lo siguiente:
*0+ { 2@H &@N .@U } & :@ 2 3 & { 54.@54U &@ H3N }
*7+ & *0+ nos permiten concluir" aplicando la regla de la secuenciacin" $ue:
{ 2@H &@N .@U}
& :@ 2 3 &9
2 :@ 54.9
. :@ 2 3 5 4 &
{ 2@54U &@ H3N .@2354*H3N+ }
(l programa puede ser documentado con ms detalle colocando entre cada par de
instrucciones consecutivas los predicados $ue van resultando de la demostracin de
correctitud. (stos predicados son aserciones *o afirmaciones+ en cada punto de la
ejecucin del programa" pues afirmamos $ue son verdad en ese punto de la ejecucin del
programa. (stas aserciones determinan un es$uema de la demostracin de la correctitud
del programa. (l programa documentado con todas sus aserciones ser#a:
[ var 2" &" . : entero9
0V
*7+
{ 2@H &@N .@U}
& :@ 2 3 &9
{ 54.@54U & @ H3N }
2 :@ 54.9
{ 2@54U &@ H3N }
. :@ 2 3 5 4 &
{ 2@54U &@ H3N .@2354*H3N+ }
].
Un programa junto con una asercin entre cada par de instrucciones es llamado un
esquema de demostracin o un programa con anotaciones pues en efecto es un
es$uema de una demostracin formal la cual puede ser reconstruida a cabalidad
utili.ando las reglas $ue caracteri.an cada constructor del pseudolenguaje. Un programa
con anotaciones es una manera de documentar detalladamente un programa" & permite a
otra persona reconstruir fcilmente la demostracin de correctitud del mismo.
Rtro posible programa para la misma especificacin anterior lo podr#amos construir
aumentando el espacio de estados con nuevas variables $ue contengan los valores
iniciales de 2" &" .. (sta solucin es ms costosa en t%rminos de espacio" pues se re$uiere
usar ms casillas de memoria para almacenar los valores de las variables adicionales:
[ var 2" &" ." 26" &6" .6 : entero9
{ 2@H &@N .@U}
26 :@ 29
&6 :@ &9
.6 :@ .9
2 :@ 54.69
& :@ 26 3 &69
. :@ 54.6 3 54*26 3 &6+
{ 2@54U &@ H3N .@2354*H3N+ }
].
(jercicios:
a+ demostrar la correctitud del programa anterior.
b+ Oacer varios programas *pudiendo aumentar el espacio de estados de ser
re$uerido+ $ue cumplan las especificaciones siguientes & demuestre la correctitud:
[ var 2" &" . : entero9
{ 2@H &@N .@U}
'
{ 2@54U &@ H3N .@2354*H3N
5
+ }
].
[ var 2" &: entero9
{ 2@H &@N }
0W
'
{ 2@N &@H}
].
c+ (jercicios pgina 55 del KaldeLaij.
(jemplo de s#ntesis *espeficicacin" desarrollo & prueba de programas+:
Problema: Oacer un programa $ue dada una cantidad de segundos" convierta esa cantidad
de segundos en d#as" !oras" minutos & segundos. Un resultado del tipo: 7 d#as" 5F !oras"
F0 minutos" WB segundos no es vlido" &a $ue WB segundos e$uivalen a 6 minuto & 7B
segundos & !emos podido agregar ese minuto al n-mero de minutos resultando as# FC
minutos. Pero de nuevo" FC minutos e$uivalen a 6 !ora & C minutos" podemos agregar esa
!ora al n-mero de !oras resultando as# 5M !oras. Pero de nuevo" 5M !oras e$uivalen a 6
d#a & 7 !oras" & !emos podido agregar ese d#a al n-mero de d#as resultando as# 0 d#as. Por
lo $ue el resultado vlido debe ser: 0 d#as" 7 !oras" C minutos" 7B segundos
Por ejemplo: 'i la cantidad es 7BW.F7W segundos entonces el resultado de nuestro
programa deber ser: 7 d#as" 60 !oras" B minutos & 7W segundos.
Sejoremos el enunciado anterior" !agamos una especificacin adecuada del programa.
Denotemos por # el n-mero de segundos $ue $ueremos convertir en d#as" !oras" minutos
& segundos. 'uponemos $ue # es un n-mero entero no negativo. ,os resultados $ue
$ueremos produ.ca el programa son cuatro n-meros enteros no negativos. Para ello
debemos declarar cuatro variables tipo entero d$ %$ m$ s" $ue correspondern
respectivamente a los d#as" los minutos" las !oras & los segundos. ,a relacin $ue debe
e2istir entre # & d$ m$ %$ m$ s es la siguiente:
# & '(4))*d + 3.())*% + ()*m + s

) s < () ) m < () ) % <24 ) d


donde VF.0BB" 7.FBB" FB son los n-meros de segundos $ue posee" respectivamente un d#a"
una !ora & un minuto. Por lo tanto la especificacin del programa es:
[ const A: entero
,ar d" !" m" s: entero9
{ A B }
'
{* A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s +
B s < FB B m < FB B ! < 50 B d }
].
,a manera" conocida por todos" de calcular d es determinando el cociente de la divisin
entera de # entre VF.0BB *esto se debe al !ec!o $ue 7.FBB4% 3 FB4m 3 s es menor
estricto $ue VF0BB & a la definicin de divisin entera. Suestre $ue seg-n este !ec!o d es
CB
-nico" as# como sern -nicos !" m" & s+. (l resto de esa divisin nos dar el n-mero de
segundos restantes. !ora esos segundos restantes los podremos convertir en !oras"
minutos & segundos procediendo en forma similar. Aote $ue estamos aplicando diseTo
descendente en el ra.onamiento anterior: el problema lo dividimos en dos sub8problemas
ms simples de resolver" a saber" calcular d & luego calcular !" m" s.
Auestro problema se reduce a determinar '6 & '5 tal $ue se cumpla:
{ P: A B }
'6
{ ): A @ VF.0BB 4 d 3 rd B rd < VF.0BB B d }
'5
{ J: * A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s + B s < FB B m < FB B ! < 50
B d }
Proponemos $ue '6 sea:
d :@ A div VF.0BB9
rd :@ A mod VF.0BB
Sostremos $ue se cumple {P} '6 {)}:
)* rd :@ A mod VF.0BB +
regla de sustitucin
)6: A @ VF.0BB 4 d 3 A mod VF.0BB B A mod VF.0BB < VF.0BB B d
(l predicado )6 lo tomamos como postcondicin de la instruccin d :@ A div VF.0BB &
vemos $ue:
)6 * d :@ A div VF.0BB +
regla de sustitucin
A @ VF.0BB 4 *A div VF.0BB+ 3 A mod VF.0BB B A mod VF.0BB < VF.0BB
B A div VF.0BB
por definicin de div & mod
A B
Por la regla de secuenciacin tenemos $ue {P} '6 {)} se cumple.
!ora el problema restante lo podemos dividir en dos sub8problemas: calcular el n-mero
de !oras %$ & luego" calcular m & s. (l n-mero de !oras % lo podemos calcular de manera
similar a como calculamos d" pero a partir de rd$ $ue representa la cantidad de segundos
restantes. 'i vemos la especificacin original" se re$uiere $ue % sea menor $ue 50.
,a especificacin de este tro.o de programa ser#a:
C6
{ ): A @ VF.0BB 4 d 3 rd B rd < VF.0BB B d }
'7
{ )5: * A @ VF.0BB4d 3 7.FBB4! 3 r! + B r! < 7.FBB B ! < 50 B d }
s# rd & 7.FBB 4 % 3 r%" con % B & B r% < 7.FBB" donde r% representa la cantidad de
segundos restantes despu%s de !aber calculado los d#as *d+ & las !oras *%+. Proponemos
como '7:
! :@ rd div 7.FBB9
r! :@ rd mod 7.FBB
Sostremos $ue '7 cumple la especificacin anterior:
)5 * r! :@ rd mod 7.FBB +
regla de sustitucin
* A @ VF.0BB4d 3 7.FBB4! 3 rd mod 7.FBB + B rd mod 7.FBB < 7.FBB
B ! < 50 B d
definicin de mod
)7: * A @ VF.0BB4d 3 7.FBB4! 3 rd mod 7.FBB + B rd B ! < 50 B d
;omando )7 como postcondicin de ! :@ rd div 7.FBB" tenemos:
)7 * ! :@ rd div 7.FBB +
regla de sustitucin
* A @ VF.0BB4d 3 7.FBB4 rd div 7.FBB 3 rd mod 7.FBB + B rd
B rd div 7.FBB < 50 B d
ver demostracin ms abajo.
A @ VF.0BB 4 d 3 rd B rd < VF.0BB B d
'i B rd < VF.0BB entonces se cumple $ue:
B rd div 7.FBB < VF.0BB div 7.FBB @ 50
Por otro lado" por definicin de div & mod:
rd @ 7.FBB4 rd div 7.FBB 3 rd mod 7.FBB
plicando la regla de la secuenciacin llegamos a $ue se cumple:
{ P: A B }
d :@ A div VF.0BB9
rd :@ A mod VF.0BB9
! :@ rd div 7.FBB9
r! :@ rd mod 7.FBB
C5
{ )5: * A @ VF.0BB4d 3 7.FBB4! 3 r! + B r! < 7.FBB B ! < 50 B d }
/altar#a determinar el tro.o de programa '0 $ue cumple:
{ )5 } '0 { J }
Ja.onando de manera similar obtenemos $ue '0 es:
m :@ r! div FB9
s :@ r! mod FB9
(ntonces el proceso de clculo ser#a: se calcula el cociente & el resto de la divisin entera
de A entre VF.0BB9 el cociente se asigna a d & el resto a una nueva variable $ue
denominamos rd" pues necesitamos este valor para continuar con el clculo de !" m & s.
Para calcular !" calculamos primero el cociente & el resto de dividir rd entre 7.FBB9 el
cociente ser ! & el resto lo asignamos a una nueva variable $ue llamaremos r!.
/inalmente m & s sern respectivamente el cociente & resto de la divisin entera de r!
entre FB. (l programa completo ser#a:
[ const A: entero
var d" rd" !" r!" m" s: entero9
{ A B }
d :@ A div VF.0BB9
rd :@ A mod VF.0BB9
! :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m :@ r! div FB9
s :@ r! mod FB9
{ J:* A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s + B s < FB Bm< FB B ! <50 B
d }
].
(jercicios:
6+ Demuestre la correctitud del programa anterior *la solucin de este ejercicio
mostrar la conveniencia de desarrollar el programa paso a paso paralelamente a
la demostracin de su correctitud & utili.ando anlisis desdencente" tal & como fue
e2puesto antes+.
5+ Jesolver el mismo problema anterior pero calculando primero los minutos luego
las !oras & luego los d#as.
'olucin al ejercicio *6+ anterior:
Partiendo de la postcondicin & aplicando sustitucin tenemos:
)*s :@ r! mod FB+
sustitucin de s por r! mod FB
C7
* A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 r! mod FB + B r! mod FB < FB Bm< FB
B ! <50 B d
por definicin de mod
)6: * A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 r! mod FB + Bm< FB B r! B ! <50
B d
)6* m :@ r! div FB+
sustitucin de m por *r! div FB+
)5: * A @ VF.0BB4d 3 7.FBB4! 3 FB4*r! div FB+ 3 r! mod FB + B r! div FB < FB
B r! B ! <50 B d
)5* r! :@ rd mod 7.FBB+
sustitucin de r! por *rd mod 7.FBB+
* A @ VF.0BB4d 3 7.FBB4! 3 FB4**rd mod 7.FBB+ div FB+ 3 **rd mod 7.FBB+ mod FB+ +
B *rd mod 7.FBB+ div FB < FB B *rd mod 7.FBB+ B ! <50 B d
simplificacin usando definicin de mod & div
)7: * A @ VF.0BB4d 3 7.FBB4! 3 FB4**rd mod 7.FBB+ div FB+ 3 *rd mod 7.FBB+ mod FB +
B rd B ! <50 B d
)7 *! :@ rd div 7.FBB+
sustitucin de ! por *rd mod 7.FBB+
* A @ VF.0BB4d 3 7.FBB4*rd div 7.FBB+ 3 FB4**rd mod 7.FBB+ div FB+ 3
*rd mod 7.FBB+ mod FB + B rd B *rd div 7.FBB+ <50 B d
B rd es redundante
)0: * A @ VF.0BB4d 3 7.FBB4*rd div 7.FBB+ 3 FB4**rd mod 7.FBB+ div FB+ 3
*rd mod 7.FBB+ mod FB + B *rd div 7.FBB+ < 50 B d
)0 *rd :@ A mod VF.0BB+
sustitucin de rd por *A mod VF.0BB+
* A @ VF.0BB4d 3 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3 FB4***A mod VF.0BB+ mod
7.FBB+ div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB + B **A mod VF.0BB+ div 7.FBB+
< 50 B d
como VF.0BB @ 5047.FBB se tiene $ue B **A mod VF.0BB+ div 7.FBB+ < 50 n
B
)C: * A @ VF.0BB4d 3 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3 FB4***A mod VF.0BB+ mod
7.FBB+ div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB + B A B d
)C *d :@ A div VF.0BB+
sustitucin de d por *A div VF.0BB+
* A @ VF.0BB4*A div VF.0BB+ 3 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3 FB4***A mod
VF.0BB+ mod 7.FBB+ div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB + B A B *A
div VF.0BB+
C0
simplificacin
* A @ VF.0BB4*A div VF.0BB+ 3 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3 FB4***A mod
VF.0BB+ mod 7.FBB+ div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB + B A
definicin de mod & div *ver justificacin ms abajo+
B n
Probar $ue la siguiente igualdad siempre se cumple para A entero no negativo:
*6+ A @ VF.0BB4*A div VF.0BB+ 3 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3
FB4***A mod VF.0BB+ mod 7.FBB+ div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB
(n efecto a A lo podemos escribir en la forma:
A @ VF.0BB 4 $ 3 r donde $" r representan respectivamente el cociente & resto de la
divisin entera de A entre VF.0BB
s# $ es igual a *A div VF.0BB+ & r es *A mod VF.0BB+ por definicin de div & mod
Por lo $ue probar:
A @ VF.0BB4*A div VF.0BB+ 3 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3 FB4***A mod VF.0BB+
mod 7.FBB+ div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB
es e$uivalente a probar:
*A mod VF.0BB+ @ 7.FBB4**A mod VF.0BB+ div 7.FBB+ 3 FB4***A mod VF.0BB+ mod 7.FBB+
div FB+ 3 **A mod VF.0BB+ mod 7.FBB+ mod FB
esta igualdad ser#a consecuencia de probar:
r @ 7.FBB4*r div 7.FBB+ 3 FB4**r mod 7.FBB+ div FB+ 3 *r mod 7.FBB+ mod FB" r B
plicando un ra.onamiento similar a lo &a e2puesto" obtendremos $ue la igualdad *6+ es
verdad cual$uiera sea A entero no negativo.
4.3. Acciones Parametri-adas. Procedimientos y /unciones
4.3.1. Procedimientos
1uando diseTamos un algoritmo para resolver un problema de cierta complejidad" la
t%cnica de diseTo descendente nos dice $ue es conveniente descomponer el problema en
varios subproblemas correctamente especificados. Un algoritmo $ue resuelva el problema
original resultar de ensamblar correctamente *por ejemplo" secuencialmente+ las
acciones :abstractas< $ue resuelven cada uno de los subproblemas. 'i cada subproblema
es especificado correctamente & sus soluciones corresponden a algoritmos correctos"
entonces el problema original $uedar resuelto correctamente. (n otras palabras" para
CC
entender lo $ue !ace un algoritmo & probar su correctitud" basta con conocer & especificar
precisamente lo que acen cada una de las acciones $ue lo conforman sin necesidad de
saber cmo lo acen.
(n el proceso de convertir el algoritmo en un programa" las acciones :abstractas< *el
t%rmino abstracto es utili.ado a$u# para indicar $ue las acciones vienen e2presadas en
t%rminos de la informacin descrita por el enunciado original del problema & no en
t%rminos de las instrucciones del lenguaje de programacin $ue se va&a a utili.ar+ son
refinadas a niveles ms bajos de abstraccin" convirti%ndose en secuencias de otras
acciones menos abstractas. 1omo en cada nivel de abstraccin" a cada accin :abstracta<
la denotamos por un nombre $ue designa lo $ue ella !ace" podemos decir $ue en el
proceso de desarrollo de programas" vamos dando nombres *el nombre de la accin
abstracta+ a la secuencia de acciones resultante del refinamiento de cada accin abstracta.
(sta secuencia de acciones con nombre corresponder a un nuevo constructor de nuestro
pseudolenguaje $ue llamaremos procedimiento o m!todo.
,os procedimientos son una !erramienta mu& -til cuando $ueremos controlar la
complejidad de las soluciones algor#tmicas de un problema" por$ue el programa final no
ser una secuencia grande & monol#tica de instrucciones del lenguaje de programacin"
sino $ue %ste estar estructurado de acuerdo a los niveles de abstraccin en $ue fuimos
refinando la solucin !asta llegar al programa. (l programa original" estructurado de esta
forma" contendr entre sus instrucciones" algunas instrucciones *llamadas a
procedimientos+ $ue servirn para indicar $ue se ejecutarn algunos procedimientos &
estos procedimientos a su ve. contendrn algunas instrucciones de este tipo $ue servirn
para indicar $ue se ejecutarn otros procedimientos" & as# sucesivamente. (n este sentido
una utilidad importante de los procedimientos es permitir e2presar niveles de abstraccin
& un medio $ue permite mantener el control de la complejidad en la programacin.
Por otro lado" puede pasar $ue en distintas partes de un mismo programa se $uiera
ejecutar la misma secuencia de acciones pero para distintos estados iniciales. 'i se tiene
el constructor procedimiento (o m!todo)" entonces en cada punto del programa donde se
tenga $ue ejecutar el mismo conjunto de acciones" podremos reempla.ar ese conjunto de
acciones por el nombre del procedimiento & el estado inicial adecuado" lo cual reduce el
n-mero de instrucciones del programa. (l conjunto de acciones entonces se declara *se
define+ aparte asignndole un nombre *el nombre del procedimiento o m%todo+9 !abr $ue
parametri.ar la secuencia de acciones" de manera $ue pueda ser ejecutada desde distintos
puntos del programa con distintos estados iniciales.
Eeamos un ejemplo para aclarar los comentarios !ec!os !asta a!ora:
Problema: Determinar el e$uivalente en d#as" !oras" minutos & segundos de tres n-meros
enteros H" N" U $ue representan segundos.
Primera 'olucin:
,a especificacin del problema ser#a:
CF
[ const H" N" U: entero
var d2" !2" m2" s2: entero9
var d&" !&" m&" s&: entero9
var d." !." m." s.: entero9
{ H B" N B" U B }
'
{ *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB Bm2< FB B !2 <50
B d2
*N @ VF.0BB4d& 3 7.FBB4!& 3 FB4m& 3 s&+ B s& < FB Bm&< FB B !& <50
B d&
*U @ VF.0BB4d. 3 7.FBB4!. 3 FB4m. 3 s.+ B s. < FB Bm.< FB B !. <50
B d. }
].
plicando diseTo descendente" el problema original se puede dividir en tres
subproblemas: calcular los d#as" !oras" minutos & segundos de H" luego calcular los d#as"
!oras" minutos & segundos de N" & finalmente calcular los d#as" !oras" minutos & segundos
de U.
Para resolver cada uno de los subproblemas anteriores podemos utili.ar el programa de la
seccin 0.5" $ue sabemos es correcto" para calcular los d#as" !oras" minutos & segundos
correspondientes a una cantidad dada de segundos. ,o $ue !abr#a $ue !acer es tomar el
programa" reempla.ar el nombre a las variables n" d" !" m" & s" respectivamente por H" d2"
!2" m2 & s2" para $ue calcule los d#as" !oras" minutos & segundos correspondientes a H
seg-n la especificacin anterior. (sto resulta en el tro.o de programa siguiente" $ue
llamaremos '6:
d2 :@ H div VF.0BB9
rd :@ H mod VF.0BB9
!2 :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m2 :@ r! div FB9
s2 :@ r! mod FB
,uego tomamos el mismo programa de la seccin 0.5. & reempla.amos el nombre a las
variables n" d" !" m" & s" respectivamente por N" d&" !&" m& & s&" para $ue calcule los d#as"
!oras" minutos & segundos correspondientes a N. (sto resulta en el tro.o de programa
siguiente" $ue llamaremos '5:
d& :@ N div VF.0BB9
rd :@ N mod VF.0BB9
!& :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
CM
m& :@ r! div FB9
s& :@ r! mod FB
/inalmente" tomamos el mismo programa de la seccin 0.5. & reempla.amos el nombre a
las variables n" d" !" m" & s" respectivamente por U" d." !." m. & s." para $ue calcule los
d#as" !oras" minutos & segundos correspondientes a U. (sto resulta en el tro.o de
programa siguiente" $ue llamaremos '7:
d. :@ U div VF.0BB9
rd :@ U mod VF.0BB9
!. :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m. :@ r! div FB9
s. :@ r! mod FB
(nsamblando la solucin del problema original a partir de la solucin de cada
subproblema nos $ueda el programa:
[ const H" N" U: entero9
var rd" r!: entero9
var d2" !2" m2" s2: entero9
var d&" !&" m&" s&: entero9
var d." !." m." s.: entero9
{ H B" N B" U B }
d2 :@ H div VF.0BB9
rd :@ H mod VF.0BB9
!2 :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m2 :@ r! div FB9
s2 :@ r! mod FB9
d& :@ N div VF.0BB9
rd :@ N mod VF.0BB9
!& :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m& :@ r! div FB9
s& :@ r! mod FB9
d. :@ U div VF.0BB9
rd :@ U mod VF.0BB9
!. :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m. :@ r! div FB9
s. :@ r! mod FB
{ *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB Bm2< FB B !2 <50
CV
B d2
*N @ VF.0BB4d& 3 7.FBB4!& 3 FB4m& 3 s&+ B s& < FB Bm&< FB B !& <50
B d&
*U @ VF.0BB4d. 3 7.FBB4!. 3 FB4m. 3 s.+ B s. < FB Bm.< FB B !. <50
B d. }
].
parentemente el programa anterior resuelve nuestro problema original" sin embargo
note $ue no !emos probado $ue se cumple lo siguiente:
{ H B" N B" U B }
'69
'59
'7
{ *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB Bm2< FB B !2 <50
B d2
*N @ VF.0BB4d& 3 7.FBB4!& 3 FB4m& 3 s&+ B s& < FB Bm&< FB B !& <50
B d&
*U @ VF.0BB4d. 3 7.FBB4!. 3 FB4m. 3 s.+ B s. < FB Bm.< FB B !. <50
B d. }
(s decir" !a& $ue probar $ue la secuenciacin de '6" '5 & '7 *ese ensamblajeX+ cumple
con la especificacin del problema original. Dntuitivamente vemos $ue esto es verdad &a
$ue las variables $ue intervienen en '6 no son modificadas por '5 & las variables $ue
intervienen en '6 & en '5 no son modificadas por '7" as# $ue lo calculado por '6" '5 &
'7 por separado" no se altera si ejecutamos la secuencia '69 '59 '7. Para probar
formalmente este !ec!o utili.amos la regla siguiente" $ue llamaremos regla de
fortalecimiento:
'i {P} ' {)} se cumple & J es un predicado cu&as variables libres no aparecen en '
entonces {PJ} ' {)J} se cumple.
(n nuestro caso tenemos $ue originalmente se cumple lo siguiente:
8 { H B } '6 { J6: *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB
Bm2< FB B !2 <50 B d2 }
8 { N B } '5 { J5: *N @ VF.0BB4d& 3 7.FBB4!& 3 FB4m& 3 s&+ B s& < FB
Bm&< FB B !& <50 B d& }
8 { U B } '7 { J7: *U @ VF.0BB4d. 3 7.FBB4!. 3 FB4m. 3 s.+ B s. < FB
Bm.< FB B !. <50 B d. }
;omando a J" en la regla de fortalecimiento" como N B U B" se cumple entonces:
CW
{ )6: H B N B U B}
'6
{ )5: J6 N B U B}
;omando a J" en la regla de fortalecimiento" como:
U B J6
se cumple:
{ )5: N B U B J6 }
'5
{ )7: J5 U B J6 }
;omando a J" en la regla de fortalecimiento" como:
J6 J5
se cumple:
{ )7: U B J6 J5 }
'7
{ )0: J6 J5 J7 }
/inalmente por la regla de la secuenciacin se prueba formalmente $ue el programa es
correcto" pues al cumplirse:
{)6} '69 {)5} '59 {)7} '7 {)0}
se cumple:
{)6} '69 '59 '7 {)0}
'egunda 'olucin:
(l algoritmo anterior lo podemos escribir en forma mu& compacta" de manera $ue refleje
el :pe$ueTo< diseTo descendente $ue se !i.o. 'i tuvi%ramos una instruccin *o accin+
FB
como la siguiente:
Con,ertir 0n$ d$ %$ m$ s1
cu&o significado operacional es :convertir la cantidad de segundos n en d#as" !oras"
minutos & segundos" seg-n la especificacin dada en la seccin 0.5." & guardar estos
valores respectivamente en d" %" m & s<. (ntonces" el programa para convertir tres
cantidades H" N" U de segundos en d#as" !oras" minutos & segundos se reducir#a a:
[ const H" N" U: entero9
var d2" !2" m2" s2: entero9
var d&" !&" m&" s&: entero9
var d." !." m." s.: entero9
{ H B" N B" U B }
1onvertir*H" d2" !2" m2" s2+9
1onvertir*N" d&" !&" m&" s&+9
1onvertir*U" d." !." m." s.+
{ *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB Bm2< FB B !2 <50
B d2
*N @ VF.0BB4d& 3 7.FBB4!& 3 FB4m& 3 s&+ B s& < FB Bm&< FB B !& <50
B d&
*U @ VF.0BB4d. 3 7.FBB4!. 3 FB4m. 3 s.+ B s. < FB Bm.< FB B !. <50
B d. }
].
Aote $ue dimos un nombre" :Con,ertir<" al conjunto de acciones $ue calcula los d#as"
!oras" minutos & segundos de una cantidad dada en segundos9 adems" parametri.amos
ese conjunto de acciones para $ue pueda ser ejecutado con variables de diferentes
nombres9 en el ejemplo anterior" primero con H" d2" !2" m2" s2" luego con N" d&" !&" m&"
s&" & finalmente con U" d." !." m." s.. (l conjunto de acciones" junto con el nombre & los
parmetros" es lo $ue llamaremos procedimiento o m!todo.
(n el pseudolenguaje" el procedimiento *o m%todo+ :1onvertir< lo definimos *o
declaramos+ de la siguiente manera:
proc 1onvertir *entrada n: entero9 salida d" !" m" s : entero+
[ var rd" r!: entero9
{ n @ A" A B }
d :@ n div VF.0BB9
F6
rd :@ n mod VF.0BB9
! :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m :@ r! div FB9
s :@ r! mod FB
{ *A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s+ B s < FB Bm< FB B ! <50
B d }
].
donde proc" entrada & salida son palabras reservadas del pseudolenguaje para definir un
procedimiento. las variables entre par%ntesis en la cabecera del procedimiento se les
llama par"metros formales.
Un procedimiento se ejecuta mediante una instruccin de llamada al procedimiento" por
ejemplo" 1onvertir*H" d2" !2" m2" s2+. (sta instruccin se denota colocando el nombre
del procedimiento & entre par%ntesis las variables sobre las cuales se ejecutar el
procedimiento. 1ada una de estas variables" llamadas par"metros reales o argumentos#
deber ser del mismo tipo $ue el parmetro formal correspondiente. ,a manera formal de
demostrar la correctitud del programa anterior *secuencia de tres llamadas a
procedimientos+ la veremos ms adelante cuando definamos formalmente lo $ue significa
una llamada a un procedimiento.
1omo vemos en el ejemplo anterior" usar un procedimiento es como usar cual$uier
operacin elemental del pseudolenguaje *por ejemplo" 3+" sabemos lo $ue !ace la suma
pero no cmo se lleva a cabo. l escribir un procedimiento estamos prcticamente
e2tendiendo el lenguaje para $ue inclu&a otras operaciones. Por ejemplo" cuando usamos
3 en una e2presin" nunca nos preguntamos cmo esta es ejecutada9 asumimos $ue 3
funciona correctamente. De manera similar" cuando escribimos una llamada a un
procedimiento" lo $ue nos interesa es :$u%< !ace el procedimiento & no :cmo< lo !ace"
& confiamos en $ue lo $ue se supone $ue !ace" lo !ace correctamente. Podemos entonces
ver un procedimiento *& la demostracin de su correctitud+ como un :lema<. Un
programa puede ser considerado como una demostracin constructiva de $ue su
especificacin es consistente & calculable9 & un procedimiento es un lema usado en la
demostracin constructiva.
(n general un procedimiento en el pseudolenguaje se declarar de la siguiente forma:
{ Pre: P}
{ Post: ) }
proc >identificador? *>especificacin de parmetros?9 ... 9
>especificacin de parmetros?+
>cuerpo del procedimiento?
donde cada >especificacin de parmetros? tiene una de las tres formas siguientes:
F5
entrada >lista de identificadores? : >tipo?
entrada2salida >lista de identificadores? : >tipo?
salida >lista de identificadores? : >tipo?
>lista de identificadores? corresponde a una lista de uno o ms identificadores de
variables separados por comas" como por ejemplo: 2" &" .
1ada identificador es un parmetro formal. 1ada lista de identificadores tiene asociado
un tipo *entero" booleano" etc.+" el cual define el tipo $ue deber tener el correspondiente
parmetro real *o argumento+ en una llamada al procedimiento.
>cuerpo del procedimiento? es un programa" como &a lo !emos definido en el
pseudolenguaje sin incluir la pre & post condiciones" P & )" $ue sern colocadas antes del
encabe.ado del procedimiento. ,a ejecucin de una llamada a un procedimiento ser la
ejecucin del programa >cuerpo del procedimiento?. Durante la ejecucin de >cuerpo del
procedimiento?" los parmetros son considerados variables locales *es decir" slo son
vlidos en el cuerpo del procedimiento & no fuera de %l. Decimos tambi%n $ue su alcance
es el cuerpo del procedimiento >cuerpo del procedimiento?+.
,os valores iniciales de los parmetros & el uso de sus valores finales estn determinados
por los atributos entrada" entrada2salida" salida$ dados a los parmetros en el
encabe.ado del procedimiento. Oablaremos respectivamente de par"metros de entrada"
par"metros de entrada$salida & par"metros de salida. ,os datos de entrada al
procedimiento vienen dados por los parmetros de entrada & los parmetros de entrada8
salida. ,os parmetros de entrada no pueden ser modificados en el cuerpo del
procedimiento" es decir" se comportan como variables declaradas con atributo :const<.
ntes de la ejecucin del procedimiento" estos parmetros se iniciali.an con los valores
proporcionados por una llamada al procedimiento. ,os resultados de la ejecucin del
procedimiento sern almacenados en los parmetros de entrada8salida & salida" para luego
ser copiados sus valores en los argumentos correspondientes en una llamada al
procedimiento.
'uponemos $ue se cumple { P } >cuerpo del procedimiento? { ) }" & $ue esta
informacin ser utili.ada cuando escribamos llamadas al procedimiento. 1uando
declaremos un procedimiento" escribiremos la precondicin & la postcondicin antes del
cuerpo del procedimiento para $ue se !aga ms fcil encontrar la informacin necesitada
al momento de escribir & entender una llamada a un procedimiento. Para escribir una
llamada a un procedimiento slo necesitamos entender las l#neas:
{ Pre: P}
{ Post: ) }
proc >identificador? *>especificacin de parmetros?9 ... 9
>especificacin de parmetros?+
,as pre & post condiciones indican el :$u% !ace< el procedimiento & el cuerpo es el
F7
:cmo lo !ace<. Por lo tanto una especificacin de un procedimiento vendr dada por la
precondicin" la postcondicin & el encabe.ado donde se menciona el nombre del
procedimiento & se declaran los parmetros formales.
1on el propsito de garanti.ar la correctitud de los programas $ue !aremos"
impondremos las siguientes restricciones en el uso de identificadores *nombres de
variables nombres de procedimientos+ en una declaracin de un procedimiento: los
-nicos identificadores $ue pueden ser utili.ados en el cuerpo del procedimiento son los
parmetros" las variables declaradas en el cuerpo en s# & otros procedimientos *en
t%rminos de programacin esto significa $ue no se permitirn :variables globales<" pero
por el momento no nos interesar saber lo $ue significa :variable globales<+. ,os
parmetros deben ser identificadores distintos entre s#. ,a precondicin P slo debe
contener como variables libres los parmetros con atributo entrada" entrada2salida &
variables de especificacin. ,a postcondicin ) puede contener como variables libres los
parmetros de entrada" salida" entrada2salida" & variables de especificacin.
,a declaracin del procedimiento 1onvertir ser#a:
proc 1onvertir *entrada n: entero9 salida d" !" m" s : entero+
{ Pre: n @ A A B }
{ Post: *A @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s+ B s < FB Bm< FB B ! <50
B d }
[ ,ar rd" r!: entero9
d :@ n div VF.0BB9
rd :@ n mod VF.0BB9
! :@ rd div 7.FBB9
r! :@ rd mod 7.FBB9
m :@ r! div FB9
s :@ r! mod FB
].
Aote $ue como el parmetro de entrada n no puede ser modificado en el cuerpo del
procedimiento podr#amos !aber prescindido de la variable de especificacin A. 'in
embargo utili.amos una variable de especificacin A para enfati.ar el !ec!o $ue en la
postcondicin nos referimos al valor original de n.
Definicin formal de una llamada a un procedimiento:
(n lo $ue sigue supondremos $ue un procedimiento tiene la forma siguiente:
proc p*entrada x9 entrada2salida %9 salida z+
{ P }
{ ) }
'
F0
donde x representa la lista de los parmetros 2i de entrada del procedimiento p" %
representa la lista de los parmetros &i de entrada8salida & z la lista de los parmetros .i
de salida. ,os identificadores de los parmetros deben ser distintos entre si. Ao tomamos
en cuenta los tipos pues no intervienen en lo $ue e2pondremos a continuacin.
(stamos interesados a!ora en definir formalmente la instruccin :llamada a un
procedimiento< en nuestro pseudolenguaje" la cual tiene la forma:
p*a" b" c+
(l nombre del procedimiento es p. a" b" c son las respectivas listas de los parmetros
reales o argumentos ai" bi" ci separados por comas. ,os ai son e2presiones *por ejemplo" t
t4s+" mientras $ue los bi & los ci son variables. ,os ai " bi " ci son los argumentos de
entrada" entrada8salida" & salida" $ue corresponden respectivamente a los parmetros
formales 2i " &i " .i de las listas x" %" z .1ada argumento debe ser del mismo tipo $ue su
parmetro formal correspondiente. 'i un argumento es una constante" slo podr
corresponder a un parmetro formal de entrada.
,os identificadores" sean nombres de variables o procedimientos" $ue estn accesibles
*puedan ser usados+ al momento de la llamada al procedimiento" deben ser diferentes de
los parmetros formales x" %" z del procedimiento. (sta restriccin evita tener $ue usar
notacin e2tra para manejar el conflicto $ue se presenta al tener un mismo identificador
utili.ado con dos propsitos diferentes" pero no es esencial.
Una llamada al procedimiento 1onvertir del ejemplo dado antes ser#a: 1onvertir*H" d!"
!2" m2" s2+. 'u ejecucin convierte la cantidad de segundos H en d#as" !oras" minutos &
segundos" seg-n la especificacin dada en la seccin 0.5." & almacena estos valores
respectivamente en d2" !2" m2 & s2.
(n general" la interpretacin operacional de la llamada p*a" b" c+ es como sigue:
;odos los parmetros son considerados variables locales del procedimiento *su
alcance es el cuerpo del procedimiento+. Primero" se determina los valores de los
argumentos de entrada & entrada8salida a & b & se almacenan en los parmetros
correspondientes x" %. 'egundo" se determina la direccin en memoria de los
argumentos de entrada8salida & salida b" c. Aote $ue todos los parmetros con
atributo entrada son iniciali.ados" mientras $ue los otros no. ;ercero" se ejecuta el
cuerpo del procedimiento. 1uarto" se almacena los valores de los parmetros de
entrada8salida & salida %" z en los correspondientes argumentos de entrada8salida &
salida b" c *utili.ando las direcciones de memoria previamente determinadas+ en
orden de izquierda a dereca (esto es necesario precisarlo debido a que un
par"metro real de salida puede aparecer m"s de una vez en la lista de par"metros
de una llamada).
Para definir formalmente una llamada a procedimiento" definamos primero lo $ue
significa la instruccin de asignacin m-ltiple" $ue tiene la forma siguiente:
FC
26" 25" ... " 2n :@ e6" e5" ... " en
,a interpretacin operacional de la instruccin anterior es la siguiente: Primero" eval-e
las e2presiones ei" para todo i entre 6 & n. 'ea vi el valor resultante de evaluar ei. ,uego
asigne primero v6 a 26" luego v5 a 25 " ... " & finalmente vn a 2n. Aote $ue para $ue un
predicado ) se cumpla despu%s de la asignacin m-ltiple anterior entonces antes de esta
asignacin se debe cumplir el predicado $ue resulta de sustituir cada ocurrencia de 2i en
) por ei" para todo i entre 6 & n. (ste predicado lo podemos denotar por )*x:@e+" donde x"
e son respectivamente las listas de las variables 2i & las e2presiones ei.
,a definicin formal de una llamada a procedimiento es como sigue. De la anterior
interpretacin operacional" vemos $ue la ejecucin de la llamada p*a" b" c+ es e$uivalente
a la ejecucin de la secuencia:
x" % :@ a" b 9 ' 9 b" c :@ %" z
*las direcciones de memoria de b" c pueden ser evaluadas antes o despu%s de la ejecucin
de '" &a $ue la ejecucin de ' no modifica sus valores+.
Jegla de llamada a procedimiento:
'uponiendo $ue {P} ' {)} se cumple" probar formalmente $ue se cumple:
{ P6 } p*a" b" c+ { )6 }
(s e$uivalente a probar $ue se cumple:
{ P6 } x" % :@ a" b 9 { P } ' { ) } 9 b" c :@ %" z { )6 }
N esto a su ve. es e$uivalente a probar:
6+ P6 P*x" % :@ a" b+ es una tautolog#a.
5+ P6Y )* x :@ a+ )6* b" c :@ %" z+ es una tautolog#a.
Donde P6 es de la forma P6 P6Y J & P6Y es la parte de P6 $ue no contiene parmetros
de salida ni de entrada8salida. 'e dbe colocar )* x :@ a+ & no al rev%s pues a puede ser
una constante o una e2presin.
Por principio" ) no deber#a incluir parmetros de entrada &a $ue %stos son considerados
variables cu&o valor slo es utili.ado en el cuerpo del procedimiento *decimos $ue son
variables locales del procedimiento+ & por lo tanto no tienen ning-n significado una ve.
conclu&a la ejecucin del cuerpo del procedimiento. 'in embargo" en caso de $ue x
apare.ca en la postcondicin del procedimiento p" !a& $ue !acer el reempla.o de estos
parmetros formales de entrada por los reales a en la prueba formal de correctitud como
muestra *5+. Por el contrario" los parmetros de entrada8salida & salida" aun$ue son
FF
locales al procedimiento" contendrn valores $ue sern utili.ados una ve. conclu&a la
ejecucin del procedimiento & deben aparecer en la postcondicin. (s preferible utili.ar"
en la postcondicin de un procedimiento" variables de especificacin para denotar el
valor inicial de un parmetro de entrada en lugar del parmetro mismo.
Aote $ue *5+ es e$uivalente a probar $ue P6Y)* x# %" z :@ a# b" c + )6 es una
tautolog#a.
(jemplo 6:
1onsidere el procedimiento :intercambio< dado por la especificacin siguiente:
proc intercambio *entrada8salida &6" &5:entero+
{ Pre: &6 @ H &5 @ N }
{ Post: &6 @ N &5 @ H }
)ueremos probar $ue se cumple:
*6+ { a @ H b @ N } intercambio *a" b+ { a @ N b @ H }
donde a & b son variables enteras & N" H denotan respectivamente sus valores finales.
plicando la regla de llamada a procedimiento debemos mostrar $ue los siguientes
predicados son tautolog#as:
8 *a @ H b @ N+ * &6 @ H &5 @ N + *&6" &5 :@ a"b+
8 *&6 @ N &5 @ H+ *a @ N b @ H+ *a" b :@ &6" &5+
lo cual es evidente.
(jemplo5:
)ueremos probar lo siguiente:
{ 2 @ H H B }
1onvertir*2" d2" !2" m2" s2+
{ *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB Bm2< FB B !2 <50
B d2 }
(n la especificacin del procedimiento Con,ertir podemos reempla.ar variables de
especificacin por otros identificadores nuevos *$ue no apare.can en la especificacin+ &
as# obtener una especificacin e$uivalente. Jeempla.amos A por H:
FM
proc 1onvertir *entrada n: entero9 salida d" !" m" s : entero+
{ Pre: n @ H H B }
{ Post: *H @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s+ B s < FB Bm< FB B ! <50
B d }
plicando la regla de llamada a procedimiento" tenemos $ue probar:
6+ * 2 @ H H B + *n @ H H B+ *n:@2+
5+ * *H @ VF.0BB4d 3 7.FBB4! 3 FB4m 3 s+ B s < FB Bm< FB B ! <50
B d + * 2 @ H H B +

* *H @ VF.0BB4d2 3 7.FBB4!2 3 FB4m2 3 s2+ B s2 < FB Bm2< FB B !2
<50 B d2+ *2" d2" !2" m2" s2 :@ n" d" !" m" s+
lo cual resulta evidente.
(ste ejemplo ilustra cmo pueden manipularse los valores iniciales & finales de los
parmetros en la especificacin del procedimiento" con el propsito de !acer la
demostracin de correctitud. ,os identificadores $ue denotan valores iniciales & finales
de los parmetros" como el caso de la variable de especificacin A en el ejemplo anterior"
pueden ser reempla.ados por identificadores nuevos *$ue no apare.can en la
especificacin del procedimiento+ para adecuarlos a la demostracin formal de la
correctitud de la llamada al procedimiento. (n el ejemplo reempla.amos A por H en la
especificacin original.
(jercicio:
1onsidere el procedimiento :intercambio< dado por la especificacin siguiente:
proc intercambio *entrada8salida &6" &5:entero+
{ Pre: &6 @ H &5 @ N }
{ Post: &6 @ N &5 @ H }
Probar $ue se cumple:
*6+ { a @ b @ Z } intercambio *a" b+ { a @ Z b @ }
(jemplos sobre uso de procedimientos:
Problema: Oacer un programa $ue calcule *f*26+8f*25++=*26825+ para 26 & 25 dados & f*2+
@ 2
5
3 72 [5.
Una manera de ra.onar para desarrollar nuestro programa" es aplicar el diseTo
descendente & suponer $ue tenemos un procedimiento $ue calcula el valor de f*2+ para un
2 dado. ,lam%moslo 1alculoDef" cu&a llamada ser#a de la forma 1alculoDef*2" .+" donde
FV
2 es un argumento de entrada & representa el valor sobre el cual ser evaluada f*2+" .
representa un argumento de salida cu&o valor ser f*2+ una ve. se ejecute 1alculoDef.
Utili.ando este procedimiento tenemos el programa siguiente para calcular *f*26+8f*25++ =
*26825+ :
[ var 26" 25" &6" &5" . : real9
{ 26 @ H6 25 @ H5 *H6 [ H5+B }
1alculoDef *26"&6+9
1alculoDef *25"&5+9
. :@ *&6 [ &5+=*26 [ 25+
{ . @ *f*H6+8f*H5++ = *H68H5+ *2: 2 real: f*2+@ 2
5
3 72 [ 5+ }
]
(l procedimiento 1alculoDef ser#a:
proc 1alculoDef*entrada 2: real9 salida .: real+
{Pre: 2@H }
{Post: . @ H
5
3 7H [ 5 }
[
. :@ 242 3 72 [ 5
]
Oemos podido escribir lo siguiente:
proc 1alculoDef*entrada 2: real9 salida .: real+
{Pre: verdad }
{Post: . @ 2
5
3 72 [ 5 }
[
. :@ 242 3 72 [ 5
]
'in embargo" es preferible utili.ar variables de especificacin para denotar el valor inicial
de 2.
Oemos podido !acer el programa sin necesidad de crear el procedimiento 1alculoDef" &
$uedar#a de la siguiente forma:
[ var 26" 25 : real9
{ 26 @ H6 25 @ H5 *H6 [ H5+B }
. :@ **26426 3 7426 [5+ [ *25425 3 7425 [5++=*26 [ 25+
{ . @ *f*H6+8f*H5++ = *H68H5+" donde f es la funcin f*2+@ 2
5
3 72 8 5 }
]
'in embargo" el programa no refleja la estructura $ue resulta de la aplicacin del diseTo
descendente" &a $ue no se !ace mencin e2pl#cita de la funcin f. ,a versin $ue utili.a
el procedimiento 1alculoDef refleja un mejor estilo de programacin.
FW
(jercicio: Oacer las anotaciones entre cada instruccin de manera $ue podamos probar
$ue el programa anterior *versin estructurada+ es correcto & luego !aga la prueba de
correctitud formalmente.
'olucin parcial:
lgunas aserciones son *faltar#a completar & demostrar la correctitud utili.ando la regla
de fortalecimiento+:
[ var 26" 25" &6" &5" . : real9
{ 26 @ H6 25 @ H5 *H6 [ H5+B }
1alculoDef*26"&6+9
{ &6 @ f*H6+ }
1alculoDef*25"&5+9
{ &5 @ f*H5+ }
. :@ *&6 [ &5+=*26 [ 25+
{ . @ *f*H6+8f*H5++ = *H68H5+" donde f es la funcin f*2+@ 2
5
3 72 8 5 }
]
(jercicios:
Desarrolle un procedimiento correcto $ue dadas la fec!a actual & la fec!a de
nacimiento de una persona" determine la edad en aTos" meses & d#as de dic!a persona.
Uso de procedimientos: ,a m$uina de tra.ados
'uponga $ue contamos con algunos procedimientos *o m%todos+ $ue permiten dibujar
segmentos de l#nea recta & c#rculos en la pantalla del computador" respecto a un eje de
coordenadas dado. (l origen del eje de coordenadas coincide con el centro de la pantalla"
como en la figura F. (l ma&or valor absoluto $ue puede tener la coordenada x viene dado
por la constante HSH & el ma&or valor absoluto $ue puede tener la coordenada y viene
dado por la constante NSH. ,lamaremos a este conjunto de m%todos :S$uina de
;ra.ados<.
MB
*B" B+
1oordenada 2
1oordenada &
/igura F
,os m%todos son los siguientes:
{ Pre: 26 HSH &6 NSH 25 HSH &5 NSH }
{ Post: Un segmento de l#nea recta !a sido dibujado en la pantalla entre los puntos
*26"&6+ & *25"&5+ }
Dibujar'egmento*entrada 26" &6" 25" &5 : real+
{ Pre: 2 HSH & NSH B r B 23 r HSH
B &3 r NSH }
{ Post: Un c#rculo con origen *2"&+ & radio r " !a sido dibujado en la pantalla }
Dibujar1#rculo*entrada 2" &" r : real+
(jemplo de uso de la S$uina de ;ra.ados:
Oacer un programa $ue dibuje un c#rculo & un cuadrado. (l c#rculo tiene radio J.
'uponga $ue J es positivo & menor $ue el m#nimo valor entre HSH & NSH. ;anto el
c#rculo como el cuadrado tienen el centro en el origen de coordenadas & el radio del
c#rculo es igual a la mitad de la longitud de un lado del cuadrado.
Aote $ue falta especificar a-n ms.... por ejemplo" un lado del cuadrado es paralelo al eje
2.
(l programa ser#a:
[ const J: real9
{ B > J min *HSH " NSH+ }
Dibujar1#rculo*B" B" J+9
Dibujar1uadradoParaleloal(jeH*B" B" 54J+
{ 'e !a dibujado en la pantalla un c#rculo de radio J & centro *B"B+ se !a dibujado un
cuadrado con centro *B" B+" los lados de longitud 54J & un lado del cuadrado es
paralelo
al eje 2 }
]
proc Dibujar1uadradoParaleloal(jeH*entrada 2" &" long: real+
{ Pre: 2 HSH & NSH B long B 23 long=5 HSH
B &3 long=5 NSH }
{ Post: se !a dibujado en pantalla un cuadrado paralelo al eje !ori.ontal. (l centro del
cuadrado es *2" &+ & la longitud de los lados es long }
[
M6
Dibujar'egmento *28long=5" &8long=5" 28long=5" &3long=5+9
Dibujar'egmento *28long=5" &3long=5" 23long=5" &3long=5+9
Dibujar'egmento *23long=5" &3long=5" 23long=5" &8long=5+9
Dibujar'egmento *23long=5" &8long=5" 28long=5" &8long=5+
]
Aote $ue para poder utili.ar el procedimiento Dibujar'egmento en el procedimiento
Dibujar1uadradoParaleloal(jeH" es necesario establecer la precondicin dada. N vemos
$ue los argumentos de la llamada a Dibujar1uadradoParaleloal(jeH satisfacen la
precondicin de este procedimiento. (n caso de $ue la precondicin de este
procedimiento !ubiese sido 2 HSH & NSH B long" entonces
corremos el riesgo de $ue el procedimiento no pueda dibujar el cuadrado" o simplemente
se detenga la ejecucin por !aberse detectado un error.
(jercicios:
6+ demostrar la correctitud del procedimiento Dibujar1uadradoParaleloal(jeH.
5+ (specificar & !acer un programa $ue dibuje en pantalla 0 c#rculos conc%ntricos de
centro *B" B+ & donde la distancia entre dos c#rculos consecutivos cuales$uiera sea
D *Gse entiende el t%rmino distanciaI...+. (l c#rculo ms pe$ueTo tiene radio J.
4.3.2. /unciones
(n el ejemplo anterior usamos un procedimiento para calcular el valor de una funcin.
'in embargo" resulta natural tener un constructor $ue se comporte como las funciones
matemticas" es decir" al !acer :una llamada< a la funcin con ciertos argumentos" la
misma llamada represente el valor de la funcin para esos argumentos. Podemos
incorporar el constructor funcin a nuestro pseudolenguaje. ,a declaracin de una
funcin en el pseudolenguaje es como sigue:
3tipo4 5unc >identificador? *>especificacin de parmetros?9 ... 9
>especificacin de parmetros?+
{ Pre: P}
{ Post: ) }
>cuerpo de la funcin?
,a declaracin es similar a la de un procedimiento. ,as diferencias son:
8 ,a palabra reservada 5unc para denotar $ue se declara una funcin.
8 >tipo? es el tipo o clase del valor resultante de la evaluacin de la funcin
*entero" real" etc.+.
8 ,os parmetros formales debern ser de entrada. (sta restriccin es propia de
nuestro pseudolenguaje.
8 >cuerpo de funcin? es un programa $ue no inclu&e precondicin ni
postcondicin. (n una llamada a la funcin" la -ltima instruccin $ue se ejecuta
en >cuerpo de funcin? deber ser siempre :devolver el valor resultado de la
evaluacin de la funcin<. (sta instruccin se escribe en el pseudolenguaje de la
M5
siguiente forma:
6e,ol,er*>e2presin?+
donde" 6e,ol,er es una palabra reservada del pseudolenguaje" >e2presin?
representa una e2presin cu&o tipo clase es >tipo?" & puede ser un identificador
o una e2presin *aritm%tica" lgica" etc.+" por ejemplo: t4*s86+" 2" etc. (l valor
resultante de evaluar >e2presin? al momento de ejecutar la instruccin
Devolver " ser el valor de la funcin para los argumentos de entrada.
Un ejemplo de declaracin de funcin ser#a:
real 5unc /*entrada 2: real+
{Pre: 2@H }
{Post: devuelve el valor de la e2presin H
5
3 7H [ 5 }
[
6e,ol,er * 242 3 72 [ 5 +
]
Definicin formal de una llamada a funcin:
(n lo $ue sigue supondremos $ue una declaracin de funcin tiene la forma siguiente:
3tipo4 5unc /*entrada x+
{ P }
{ ) }
'
donde x representa una lista de los parmetros de entrada 2i. Ao tomamos en cuenta los
tipos de los parmetros pues no intervienen en lo $ue e2pondremos a continuacin.
(stamos interesados en definir formalmente la instruccin :llamada a una funcin< en el
pseudolenguaje" la cual tiene la forma:
/*a+
(l nombre de la funcin es /. a es la lista de los parmetros reales o argumentos ai
separados por comas. ,os ai son e2presiones *por ejemplo" t t4s+. ,os ai son los
argumentos de entrada $ue corresponden respectivamente a los parmetros formales de
entrada 2i. 1ada argumento debe ser del mismo tipo $ue su parmetro formal
correspondiente.
,os identificadores" sean nombres de variables o procedimientos" $ue estn accesibles
*puedan ser usados+ al momento de la llamada a la funcin" deben ser diferentes de los
parmetros formales x de la funcin. (sta restriccin evita tener $ue usar notacin e2tra
para manejar el conflicto $ue se presenta al tener un mismo identificador utili.ado con
dos propsitos diferentes" pero no es esencial.
M7
Una llamada a la funcin / del ejemplo dado antes es: /*a+. 'u ejecucin calcula a
5
3 7.a
[5 & devuelve el valor resultante. /*a+ representa finalmente ese valor resultante en el
punto del programa donde se !ace la llamada a /.
(n general" la interpretacin operacional de la llamada /*a+ es como sigue:
;odos los parmetros son considerados variables locales de la funcin *su alcance
es el cuerpo de la funcin+. Primero" se determina los valores de los argumentos de
entrada a & se almacenan en los parmetros correspondientes x. 'egundo" se
ejecuta el cuerpo de la funcin. ,a -ltima instruccin $ue se ejecuta en el cuerpo de
la funcin deber ser :Devolver*e2presin+< donde :e2presin<" es una e2presin
del mismo tipo $ue aparece en la declaracin de la funcin. (l valor $ue representa
/*a+ es el $ue resulta de evaluar esta e2presin" & decimos $ue este valor es el $ue
:devuelve< /.
Una llamada a funcin deber formar parte de una e2presin en una instruccin de
nuestro programa" por ejemplo:
. :@ * /*26+ [ /*25+ + =* 26 [ 25 +
,a instruccin de asignacin anterior se interpreta operacionalmente de la siguiente
manera: /*26+ & /*25+ representan los valores $ue :devuelve< la funcin / una ve. $ue
se ejecuta el cuerpo de la funcin para 26 & 25 respectivamente. Una ve. calculados estos
valores se procede a evaluar la e2presin & a asignar a la variable . el valor resultante de
esa evaluacin.
De la interpretacin operacional de una llamada a funcin" vemos $ue la ejecucin de la
instruccin c :@ /*a+" donde interviene una llamada a la funcin /" es e$uivalente a la
instruccin P/*a"c+. Donde P/ es un procedimiento con parmetros formales de entrada x
*igual a los de /+" un solo parmetro de salida z" del mismo tipo $ue la variable c" & el
cuerpo del procedimiento P/" denotado por 'P/" igual al cuerpo de / reempla.ando cada
instruccin Devolver*>e2presin?+ por la instruccin z :@ >e2presin?. ,a precondicin
PP/ de P/ es la precondicin P de / & la postcondicin )P/ de P/ es la postcondicin ) de
/ agregando $ue el valor de la funcin $ueda almacenado en z.
(n nuestro ejemplo P/ ser#a:
proc P/*entrada 2: real9 salida .: real+
{Pre: 2@H }
{Post: . @ H
5
3 7H [ 5 }
[
. :@ 2
5
3 72 [ 5
]
Por lo tanto" en general" demostrar $ue se cumple:
M0
{P6} c :@ /*a+ {)6}
es e$uivalente a demostrar $ue se cumple:
{P6} P/*a" c+ {)6}
N esto -ltimo es e$uivalente a demostrar $ue se cumple:
{ P6 } x :@ a 9 { PP/ } 'P/ 9 { )P/ } c :@ z { )6 }
Jegla de llamada a funcin:
Probar formalmente $ue se cumple:
{ P6 } c :@ /*a+ { )6 }
(s e$uivalente a probar:
6+ P6 PP/*x :@ a+ es una tautolog#a
5+ P6Y )P/*x" z :@ a" c+ )6 es una tautolog#a.
Donde P6 es de la forma P6YJ & P6Y no depende de c.
,os parmetros de entrada x pueden aparecer en la postcondicin ). 'in embargo" es
preferible utili.ar" en la postcondicin de una funcin" variables de especificacin para
denotar el valor inicial de los parmetros de entrada.
De igual forma" para demostrar $ue el cuerpo de una funcin cumple con las pre & post
condiciones de la funcin basta con demostrar $ue el cuerpo de P/ cumple con las pre &
postcondiciones de P/.
Utili.ando la funcin /" el programa $ue calcula *f*26+8f*25++=*26825+ es:
[ var 26" 25" . : real9
{ 26 @ H6 25 @ H5 *H6 [ H5+B }
. :@ */*26+ [ /*25++=*26 [ 25+
{ . @ *f*H6+8f*H5++ = *H68H5+" donde f es la funcin f*2+@ 2
5
3 72 8 5 }
]
vemos $ue este programa $ueda e2presado completamente en t%rminos de la informacin
dada en el enunciado inicial" & por lo tanto es ms fcil de entender.
'i $ueremos probar formalmente $ue se cumple:
{ P5 } . :@ */*26+8/*25++ = *26825+ { )5 }
MC
deber#amos probar $ue se cumple:
{ P5 } &6" &5 :@ /*26+" /*25+9 . :@ *&6 [ &5+=* 26 [ 25+ { )5 }
donde &6" &5 son variables nuevas $ue slo utili.amos para la demostracin de la
correctitud de este tro.o de programa.
(jercicios:
6+ Desarrolle una funcin $ue calcule el n-mero de segundos correspondientes a una
duracin e2presada en d#as" !oras" minutos & segundos. Utilice dic!a funcin para
escribir un programa $ue dadas tres duraciones e2presadas en d#as" !oras" minutos
& segundos" calcule la cantidad total de segundos de la suma de esas tres
duraciones.
4.4. An7lisis por casos. La instruccin de seleccin 0condicional o
alternati,a1
1uando resolvemos un problema" el anlisis por casos permite !acer una divisin del
espacio de estados en subespacios & resolver el mismo problema para cada subespacio.
,a solucin del problema original estar compuesta" de manera condicional" de las
soluciones para cada subespacio. Dic!o de otra forma" dado un estado inicial" la solucin
del problema est condicionada a ese estado inicial" pues se aplicar la solucin $ue
corresponda al subespacio $ue contiene a ese estado inicial.
(jemplo:
Problema: (scribir un programa $ue determine el valor absoluto de un n-mero real dado
a.
(ste problema se puede resolver particionando el espacio de estados en dos: a < B & a
B. 'i a es menor $ue B el resultado es [a" & en caso contrario el resultado ser a.
Para particionar *o dividir+ el espacio de estados contamos en el pseudolenguaje con la
instruccin de seleccin (o condicional o alternativa):
i5 ZB 'B
[] Z6 '6
[] ...
[] Zn 'n
5i
donde" i5 & 5i son palabras reservadas del pseudolenguaje" Zi" B i n" es una e2presin
booleana *su evaluacin resulta en verdad o en falso+" & 'i" B i n" es una instruccin
*recuerde $ue el operador de secuenciacin es una instruccin" por lo $ue una secuencia
MF
de instrucciones es una instruccin+. (l constructor Zi 'i se llama :comando con
guardia< & la guardia es Zi. ,a interpretacin operacional de la instruccin de seleccin
es la siguiente:
(n la ejecucin de una instruccin de seleccin todas las guardias son evaluadas. 'i
ninguna de las guardias es verdadera entonces la ejecucin de la instruccin de seleccin
produce error" en caso contrario" se escoge una de las guardias con valor :verdad< & se
ejecuta la secuencia de instrucciones correspondiente. Aote $ue no especificamos cual
guardia escogemos de las $ue resultan :verdad<" podr#a ser la primera de arriba !acia
abajo. Pero preferimos dejar sin especificar este !ec!o *lo de&amos indeterminado+.
(jemplos de instrucciones de seleccin vlidas en nuestro formalismo:
i5 *a 7+ 2 :@ 0 [] *a 7+ 2 :@ C 5i
i5 *a 7+ 2 :@ 09 b :@ a45 [] *a > 7+ a :@ C 5i
i5 *a 7+ 2 :@ 09 b :@ a45 []
*a > 7+ i5 *2 7+ 2 :@ 0 [] *2 > 7+ 2 :@ C 5i" a :@ C
5i
i5 **2 7+p+ 2 :@ 0 [] *p+ sip 5i
Aote $ue si antes de ejecutarse la -ltima instruccin el valor de las variables es 2@5 &
p@E entonces al ejecutarse la instruccin dar error & el programa" donde est inmersa
esta instruccin" no podr continuar ejecutndose.
,a solucin tentativa al problema de clculo del valor absoluto de un n-mero real es:
[ const : real9
,ar b: real9
{ verdad }
i5 * > B+ b :@ 8
[] * B+ b :@
5i
{ b @ }
]
Aota: ,erdad & 5also son palabras reservadas del pseudolenguaje para denotar los valores
de verdad.
Jegla de la instruccin de seleccin:
!ora definimos la regla $ue permite demostrar la correctitud de una instruccin de
seleccin" lo !aremos para dos guardias:
MM
Probar $ue se cumple: { P } i5 ZB 'B [] Z6 '6 5i { ) }
es e$uivalente a probar $ue se cumple:
6+ P ZB & Z6 estn bien definidas" es una tautolog#a.
5+ P ZB Z6 " es una tautolog#a .
7+ { P ZB } 'B { ) } se cumple.
0+ { P Z6 } '6 { ) } se cumple.
)ue Zi est% bien definida si P es verdad" significa $ue la e2presin se pueda evaluar para
los estados $ue cumplan P9 por ejemplo" $ue no !a&a divisin por cero. Aormalmente
omitimos demostrar *6+ por ser evidente.
Aote $ue en la ejecucin del i5" independientemente de cual comando con guardia es el
$ue se ejecuta" al final de la ejecucin se debe cumplir ). ,o importante es $ue la
ejecucin de cual$uier instruccin donde la guardia sea verdadera lleva a un resultado
correcto" el programador no tiene $ue preocuparse por cul ser ejecutado. Por lo tanto" el
programador es libre de programar tantos comandos con guardia como desee sin tomar en
cuenta $ue ms de una guardia pueda ser verdad en el mismo momento.
Demostremos la correctitud del programa dado antes para calcular el valor absoluto:
6+ P ZB & Z6 estn bien definidas

:verdad * > B+ & * B+ estn bien definidas< es e$uivalente a :* > B+ & * B+
estn bien definidas<. N en efecto" esas dos e2presiones estn bien definidas por$ue es
un n-mero real.
5+ P ZB Z6 " es una tautolog#a
De nuevo" :verdad * > B+ * B+< es e$uivalente a :* > B+ * B+<" & esta
-ltima e2presin siempre es verdad cual$uiera sea el n-mero real .
7+ { P ZB } 'B { ) } se cumple
G{ verdad * > B+ } b :@ 8 { b @ } se cumpleI:
*b @ + *b :@ 8+
por sustitucin
*8 @ +
por aritm%tica
* B+
por aritm%tica
MV
* < B+
por clculo de predicados
verdad * > B+
0+ { P Z6 } '6 { ) } se cumple
G{ verdad * B+ } b :@ { b @ } se cumpleI:
*b @ + *b :@ +
por sustitucin
* @ +
por aritm%tica
* B+
por clculo de predicados
verdad * B+
Utili.aremos las siguientes anotaciones en los programas" indicando adems" las
demostraciones correspondientes:
{ P }
i5 ZB { P ZB } 'B { )" Demostracin B }
[] Z6 { P Z6 } '6 { )" Demostracin 6 }
5i
{ )" Demostracin 5 }
con:
Demostracin B: la demostracin de $ue { P ZB } 'B { ) } se cumple.
Demostracin 6: la demostracin de $ue { P Z6 } '6 { ) } se cumple.
Demostracin 5: la demostracin de $ue P ZB Z6 " es una tautolog#a &" si es
relevante" una demostracin de $ue P ZB & Z6 estn bien definidas" es
una tautolog#a.
(jercicios:
6+ Probar $ue se cumple:
a+ {2 @ B} if verdad 2 :@ 236 [] verdad 2 :@ 236 fi { 2 @ 6}
b+ { 2 @ B } if verdad 2 :@ 6 [] verdad 2 :@ 86 fi { 2 @ 6 2 @86 }
5+ (jercicios B" 6" 5 de la pgina 5M del KaldeLaij
7+ Oacer un programa correcto $ue resuelva los problemas 5" 7" C" F de la seccin 6
del problemario de Sic!el 1unto.
0+ Oacer ejercicios 6" 7" 0" C" F" seccin 6 del problemario de Sic!el 1unto.
(jemplo de s#ntesis *uso de procedimientos" funciones" instruccin condicional" diseTo
descendente+:
MW
Problema: Oacer un procedimiento $ue calcule todas soluciones reales de la ecuacin
2
5
3Z231@B con coeficientes reales " Z" 1. 'uponga $ue cuenta con una funcin $ue
permite calcular la ra#. cuadrada de un n-mero real no negativo. ,a especificacin de
esta funcin es como sigue:
{ Pre: 2@H H B }
{ Post: devuelve H }
real Jai.1uadrada*entrada 2 : real+
Una ra#. real de un polinomio de segundo grado .2
5
3 Z.2 3 1 es un n-mero real r * r
+ tal $ue .r
5
3 Z.r 3 1@B. (n la especificacin $ue !aremos" la variable :conj<
representa el conjunto de las ra#ces reales del polinomio .2
5
3 Z.2 3 1.
,a especificacin del programa ser#a:
[ const " Z" 1: real9
var conj: conjunto de n-meros complejos9
{ Pre: verdad }
'
{Post: conj @ {2 : *2 + *.2
5
3 Z.2 3 1 @ B+ } }
]
1omo no se impone ninguna condicin a los valores de los coeficientes del polinomio"
debemos !acer un anlisis por casos9 es decir" dividimos el espacio de estados &
dependiendo del valor $ue puedan tener los coeficientes !abr una solucin distinta al
problema.
Por la teor'a asociada a la especificacin del problema" el polinomio ser de segundo
grado cuando a B & las ra#ces vienen dadas por la ecuacin:
. 5
1 . . 0 Z Z
5

tendr dos ra#ces reales si el discriminante" Z
5
[ 0..1" es ma&or $ue cero. Ao tendr
ra#ces reales si el discriminante es negativo. ;endr una sola ra#. real si el discriminante
es cero. 1uando @ B & Z B" el polinomio es de primer grado" & e2istir una sola ra#.
real. N cuando @ B" Z @ B & 1 @ B" todo n-mero real es solucin. 1uando @B" Z@B & 1
B" no e2istir solucin.
Por lo tanto podemos !acer una especificacin ms concreta *refinar la especificacin+
donde introducimos una variable entera n $ue nos indica el n-mero de soluciones $ue
tiene la ecuacin .2
5
3 Z.2 3 1@B. 'i no !a& solucin entonces n@B. 'i tiene una sola
ra#." entonces n@6 & la variable 26 contendr la ra#.. 'i !a& dos soluciones entonces n@5
& las soluciones $uedarn almacenadas en 26 & 25. 'i todo n-mero real es solucin
entonces n@7. Una especificacin ms concreta *o refinada+ ser#a:
VB
[ const " Z" 1: real9
var 26" 25: real9
var n: entero9
{ Pre: verdad }
'
{Post: *n@B * 2: 2 : .2
5
3 Z.2 3 1 B + +
*n@6 * 2: 2 : .2
5
3 Z.2 3 1 @ B 2 @ 26 + +
*n@5 * 2: 2 : .2
5
3 Z.2 3 1 @ B 2 @ 26 2 @ 25 + +
*n@7 * 2: 2 : .2
5
3 Z.2 3 1 @ B+ + }
]
'ean )B" )6" )5 & )7 respectivamente los predicados:
*n@B * 2: 2 : .2
5
3 Z.2 3 1 B + +
*n@6 * 2: 2 : .2
5
3 Z.2 3 1 @ B 2 @ 26 + +
*n@5 * 2: 2 : .2
5
3 Z.2 3 1 @ B 2 @ 26 2 @ 25 + +
*n@7 * 2: 2 : .2
5
3 Z.2 3 1 @ B+ +
Aote la forma en $ue se escribi la e2istencia de una o dos soluciones -nicas de la
ecuacin" en los predicados )6 & )5. (n el lenguaje de la lgica" cuando $ueremos
e2presar $ue un objeto d satisface una propiedad P & es el -nico $ue la satisface" podemos
escribir:
P*d+ * 2: : 2 d P*2+ +
'in embargo" esto se puede e2presar de una manera ms concisa como sigue:
*6+ * 2: : P*2+ 2@d +
Eeamos $ue esta -ltima frmula es e$uivalente a la primera:
* 2: : P*2+ 2@d +
traduccin de la e$uivalencia
* 2: : * P*2+ 2@d + * 2@d P*2+ + +
distribucin de sobre
* 2: : P*2+ 2@d + * 2: : 2@d P*2+ +
simplificacin de la segunda e2presin
* 2: : P*2+ 2@d + P*d+
contrarec#proco en la primera e2presin
* 2: : 2 d P*2+ + P*d+
conmutatividad de
P*d+ * 2: : 2 d P*2+ +
V6
Dgualmente" e2presar $ue dos objetos d & e son los -nicos $ue satisfacen P puede
formali.arse como:
P*d+ P*e+ * 2: : 2 d 2 e P*2+ +
R" de manera ms concisa" pero e$uivalente" como:
*5+ * 2: : P*2+ 2@d 2@e +
,a demostracin entre estas dos frmulas es anloga a la anterior" aun$ue utili.a algunas
reglas lgicas adicionales.
,os es$uemas de modelacin *6+ & *5+ fueron utili.ados en la formulacin de )6 & )5.
Eeamos a!ora" a efectos de desarrollar el programa" cmo puede ser reescrita la
postcondicin )B )6 )5 )7 en t%rminos de los datos de entrada " Z & 1" con la
finalidad de obtener una postcondicin $ue nos permita desarrollar un programa.
Eeamos informalmente" utili.ando la teor#a asociada a la especificacin" la relacin $ue
e2iste entre los valores de " Z & 1 & la e2istencia de B" 6" 5 o ms soluciones de la
ecuacin .2
5
3 Z.2 3 1 @ B.
;enemos $ue la ecuacin en cuestin no tiene solucin en los n-meros reales si & Z son
cero & 1 no lo es" o cuando B & Z
5
[ 0..1 < B. N este es el -nico caso en $ue no !a&
solucin" lo cual indica $ue *@B Z@B 1B+ * B Z
5
[ 0..1 < B + no es slo
condicin suficiente sino adems condicin necesaria para $ue no e2ista solucin.
/ormalmente tenemos:
*@B Z@B 1B+ * B Z
5
[ 0..1 < B + * 2: 2 : .2
5
3 Z.2 3 1 B +
,o $ue nos permite transformar el primer caso )B de nuestra postcondicin en:
)BY: * n @ B * *@B Z@B 1B+ * B Z
5
[ 0..1 < B + + +
,a e2istencia de una -nica solucin se da cuando el polinomio tiene grado 6" esto es"
cuando es cero & Z no lo es" o cuando el polinomio tiene grado 5 & ambas soluciones
coinciden. (sto -ltimo ocurre cuando no es cero & el discriminante es cero. ;enemos
entonces lo siguiente:
* @ B Z B + * B Z
5
8 0..1 @ B +
* sol : sol : * 2: 2 : .2
5
3 Z.2 3 1 @ B 2 @ sol + +
,a transformacin de )6 no es tan directa como la de )B" pero nos podemos valer del
siguiente !ec!o *demu%strelo+:
V5
Si tenemos que la existencia de un nico elemento que satisface la
propiedad P es equivalente a cierta condicin R, esto es:
R ( sol : : ( x: : P(x) x = sol ) )
Entonces, el hecho de que un cierto elemento d sea el nico que
satisfaa P equivale a que se cumpla R ! d satisfaa P, esto es:
( x: : P(x) x = d ) R P(d)
'i tomamos a:
* * @ B Z B + * B Z
5
8 0..1 @ B + + como J
.2
5
3 Z.2 3 1 @ B como P*2+
26 como d
& aplicamos el resultado anterior" podemos transformar el segundo caso )6 de nuestra
postcondicin al predicado e$uivalente siguiente:
)6Y: * n @ 6 * * @ B Z B + * B Z
5
8 0..1 @ B + +
* .26
5
3 Z.26 3 1 @ B + +
Para la transformacin de )5" nuestra teor#a sobre e2istencia de ra#ces reales del
polinomio indica $ue:
* B Z
5
8 0..1 ? B +
* sol6" sol5 : : sol6 sol5 * 2: : .2
5
3 Z.2 3 1 @ B 2 @ sol6 2 @ sol5
+
N podemos utili.ar una propiedad similar a la anterior:
Si tenemos que:
R ( sol",sol#:: sol" sol# ( x:: P(x) x = sol" x = sol# )
)
Entonces se cumple que:
( x: : P(x) x = d x = e ) d e R P(d) P(e) d e
Rbtenemos entonces $ue )5 es e$uivalente a:
)5Y: *n @ 5 B Z
5
8 0..1 ? B * .26
5
3 Z.26 3 1 @ B +
* .25
5
3 Z.25 3 1 @ B + 26 25 +
/inalmente" la teor#a relevante al -ltimo caso nos dice $ue:
@ B Z @ B 1 @ B * 2: 2 : .2
5
3 Z.2 3 1 @ B+
V7
Por lo $ue el -ltimo caso" )7" de la postcondicin se puede escribir como:
)7Y: * n @ 7 @ B Z @ B 1 @ B +
1omo resultado total" !emos reescrito la postcondicin:
)B )6 )5 )7
1omo:
)BY )6Y )5Y )7Y
)ue nos da ms informacin sobre cmo discriminar los cuatro casos en funcin de los
valores de " Z & 1" es decir" de los datos de entrada.
,a nueva especificacin ser#a:
[ const " Z" 1: real9
var 26" 25: real9
var n: entero9
{ Pre: verdad }
'
{Post: * n @ B * *@B Z@B 1B+ * B Z
5
[ 0..1 < B + + +
* n @ 6 * * @ B Z B + * B Z
5
8 0..1 @ B + +
* .26
5
3 Z.26 3 1 @ B + +
* n @ 5 B Z
5
8 0..1 ? B * .26
5
3 Z.26 3 1 @ B +
* .25
5
3 Z.25 3 1 @ B + 26 25 +
* n @ 7 @ B Z @ B 1 @ B + }
]
Aote $ue los cuatro casos de la nueva postcondicin cubren el espacio de estados" es
decir" estn considerados todos los estados posibles del espacio de estados. Una forma de
comprobar esto es !aciendo una tabla de decisin. 'ean:
1BB: * @ B Z @ B 1B +
1B6: * B Z
5
[ 0..1 < B +
16B: * @ B Z B +
166: * B Z
5
8 0..1 @ B +
15: * B Z
5
8 0..1 ? B +
17: * @ B Z @ B 1 @ B +
Z 1 Discriminante
1BB B B > 8
V0
1BB B B ? 8
1B6 > 8 8 >
1B6 ? 8 8 >
16B B > 8 8
16B B ? 8 8
166 > 8 8 B
166 ? 8 8 B
15 > 8 8 ?
15 ? 8 8 ?
17 B B B 8
Donde > significa menor $ue cero" ? significa ma&or $ue cero" B significa igual a cero" 8
significa $ue puede ser cual$uier valor. 1on la tabla anterior podemos comprobar $ue
cual$uier combinacin de valores >" ?" B de " Z" 1 & Discriminante" est cubierta por
una de las F condiciones 1BB" 1B6" 16B" 166" 15 17.
Un primer programa en el proceso de refinamiento sucesivo !asta encontrar una solucin
del problema en t%rminos de los constructores del pseudolenguaje *es decir" !asta
encontrar un programa+ vendr dado por una instruccin de seleccin" $ue se infiere
directamente de la postcondicin: (ste primer refinamiento no diferencia los casos 1B6"
166 & 15
[ const " Z" 1: real9
var 26" 25: real9
var n: entero9
{ Pre: verdad }
i5
* @ B Z @ B 1 @ B+ '7
[] * @ B Z @ B 1 B+ 'BB
[] * @ B Z B + '6B
[] * B+ 'B6&66&5
5i
{Post: )BY )6Y )5Y )7Y }
]
!ora pasamos a desarrollar '7" 'BB" '6B de forma $ue se cumpla lo siguiente:
{ Pre @ B Z @ B 1 @ B } '7 { Post }
{ Pre @ B Z @ B 1 B } 'BB { Post }
{ Pre @ B Z B } '6B { Post }
{ Pre B } 'B6&66&5 { Post }
'7 ser#a:
n :@ 7
VC
'BB ser#a:
n :@ B
'6B ser#a:
n :@ 69
26 :@ 81=Z
(jercicio: Demuestre $ue las instrucciones dadas '7" 'BB N '6B cumplen la
especificacin anterior.
'B6&66&5 es el tro.o de programa ms complicado a desarrollar" pues debemos
determinar si un polinomio de segundo grado tiene dos ra#ces reales" o una sola ra#. o
ninguna. ,as ecuaciones $ue representan los valores de las ra#ces 26 & 25 de un
polinomio de segundo grado .2
5
3 Z.2 3 1 en funcin de los coeficientes vienen dadas
por la e2presin:

. 5
1 . . 0 Z Z
5

!ora bien" dependiendo de si el discriminante *Z
5
80..1+ es cero" positivo o negativo"
tendremos una sola ra#." dos ra#ces o ninguna ra#. real" respectivamente. las ra#ces sern
reales o complejas. Rtra ve. nos encontramos con un anlisis por casos.
'i *Z
5
80..1+ es cero" tenemos una sola ri. real 26 @ 8Z=*5.+
'i *Z
5
80..1+ es positivo" las ra#ces sern
. 5
1 . . 0 Z Z
26
5
+
= &
. 5
1 . . 0 Z Z
25
5

=
'i *Z
5
80..1+ es negativo" no e2isten ra#ces reales.
Por lo tanto 'B6&66&5 ser#a:
disc :@ Z4Z804419
i5 disc @ B n :@ 69 26 :@ 8Z=*54+
[] disc ? B n :@ 59
26 :@ *8Z 3 Jai.1uadrada*8disc++=*54+9
25 :@ *8Z 8 Jai.1uadrada*8disc++=*54+9
[] disc > B n :@ B
5i
Aote $ue !emos introducido una nueva variable" disc" para mejorar la eficiencia del
algoritmo en cuanto a tiempo. 'e calcula una sola ve. la e2presin *Z4Z80441+ & se
utili.a C veces.
VF
'i convertimos el programa completo en un procedimiento este ser#a:
proc JaicesPolinomio* entrada " Z" 1: real9 salida n" 26" 25: real+
{Pre: verdad }
{Post: * n @ B * *@B Z@B 1B+ * B Z
5
[ 0..1 < B + + +
* n @ 6 * * @ B Z B + * B Z
5
8 0..1 @ B + +
* .26
5
3 Z.26 3 1 @ B + +
* n @ 5 B Z
5
8 0..1 ? B * .26
5
3 Z.26 3 1 @ B +
* .25
5
3 Z.25 3 1 @ B + 26 25 +
* n @ 7 @ B Z @ B 1 @ B + }
[ ,ar disc: real9
i5
* @ B Z @ B 1 @ B+ n :@ 7
[] * @ B Z @ B 1 B+ n :@ B
[] * @ B Z B + n :@ 69
26 :@ 81=Z
[] * B+ disc :@ Z4Z804419
i5 disc @ B n :@ 69 26 :@ 8Z=*54+
[] disc ? B n :@ 59
26 :@ *8Z 3 Jai.1uadrada*8disc++=*54+9
25 :@ *8Z 8 Jai.1uadrada*8disc++=*54+9
[] disc > B n :@ B
5i
5i
]
(jercicios:
6+ Demuestre $ue se cumple: { Pre B } 'B6&66&5 { Post }
5+ 1omplete la demostracin de correctitud del programa anterior.
4.8. An7lisis de Procesos 9terati,os. La instruccin iterati,a
Oasta a!ora podemos describir un n-mero mu& reducido de procesos con los
constructores del pseudolenguaje: a$u%llos donde el n-mero de acciones $ue se ejecutan
para obtener el resultado es proporcional al n-mero de constructores utili.ados en el
programa $ue describe dic!o proceso. Oasta el momento no podemos describir con
nuestro pseudolenguaje el proceso de pelar papas visto en el cap#tulo 6. Aecesitamos un
constructor" $ue llamaremos instruccin iterativa instruccin de repeticin" $ue nos
permita describir un proceso iterativo" es decir" un proceso $ue consiste en la ejecucin
de una misma accin un n-mero dado de veces. (l n-mero de veces $ue se ejecuta la
accin depende del estado de las variables antes de ejecutarse la accin. (n lenguaje
natural dec#amos: :Sientras !a&a papas en el cesto" pelar una papa<. (sta descripcin nos
VM
dice $ue se debe efectuar la siguiente accin repetidas veces: verificar si el cesto tiene
papas & de ser as# se debe pelar una papa. 'i el cesto no tiene papas" el proceso termina.
,a condicin de continuacin del proceso iterativo es :el cesto tiene papas<. Por
supuesto" la accin $ue se repite debe ser capa. de modificar el estado de las variables
con el fin de garanti.ar $ue el proceso descrito termine. (n un proceso iterativo" la accin
$ue consiste en :verificar la condicin de continuacin & luego" dependiendo del
resultado de la evaluacin" ejecutar la accin respectiva< la denominamos una iteracin.
Aote $ue la -ltima iteracin corresponde a $ue no se cumple la condicin de continuacin
& es cuando termina el proceso iterativo. lgunos autores no consideran este -ltimo paso
del proceso iterativo como una iteracin" sin embargo" el anlisis $ue !aremos se
facilitar si lo consideramos una iteracin.
(l n-mero de iteraciones $ue reali.a una instruccin iterativa es variable & depende del
estado inicial de las variables al momento de ejecutarse la instruccin iterativa" de la
condicin de continuacin & de los cambios de estado producidos por la accin $ue se
repite. Por lo tanto" una instruccin iterativa ser una descripcin mu& concisa de un
proceso $ue puede efectuar un n-mero considerablemente grande de acciones.
Una instruccin iterativa es usada t#picamente para describir el proceso $ue consiste en
recorrer" uno a uno" los objetos de alg-n espacio *por ejemplo" un conjunto de n-meros"
una secuencia de objetos" cesto con papas" etc.+ & efectuar la misma accin a cada objeto
del espacio *pelar la papa" sumar el valor del objeto a una variable $ue mantiene un
acumulado" etc.+. 'e e2aminan los objetos del espacio para:
6+ Zuscar alguno *o todos+ $ue cumpla ciertas propiedades. Por ejemplo" si
$ueremos buscar el menor factor primo de un n-mero entero ma&or $ue 6" x$
podr#amos proceder recorriendo *de menor a ma&or+ los n-meros naturales entre 5
& x !asta encontrar un n-mero primo $ue divida a x.
5+ plicar una funcin a cada objeto. Por ejemplo" aumentar un 6B\ el sueldo de
cada empleado.
7+ 1ombinar los objetos de alguna forma. Por ejemplo: sumar los cuadrados de los
primeros n n-meros naturales.
0+ plicar combinaciones de los anteriores. Por ejemplo" aumentar los sueldos &
reportar la suma total de los nuevos sueldos.
Una forma de capturar la esencia de la accin global $ue reali.a un proceso iterativo *es
decir" en $u% consiste el proceso iterativo+ es determinando una asercin $ue refleje el
estado del proceso al comien.o de cual$uier iteracin del mismo" incluso al comien.o de
la iteracin en la $ue no se satisface la condicin de continuacin. este tipo de
aserciones la llamamos un invariante del proceso iterativo *o de la instruccin iterativa
$ue describe al proceso+" por$ue no var#a de una iteracin a otra.
Por ejemplo" una manera de calcular la suma de los cuadrados de los primeros A *AB+
VV
n-meros naturales comen.ando desde B *es decir" la suma B
5
3 6
5
3 ... 3 *A86+
5
+ es
efectuando el proceso iterativo $ue consiste en recorrer los n-meros naturales desde B
!asta A &" para cada n-mero natural $ue obtengamos en el recorrido" sumamos su
cuadrado a una variable" llam%mosla suma" $ue iniciali.amos en cero9 cuando obtenemos
el n-mero natural A conclu#mos el proceso iterativo sin sumar su cuadrado a suma. ,a
accin $ue se reali.a en la iteracin i es :sumar i
5
a suma e incrementar i en 6< *en este
caso el n-mero de la iteracin" comen.ando con la iteracin cero" coincide con el n-mero
natural cu&o cuadrado se acumula en esa iteracin+. ,a condicin de continuacin del
proceso iterativo es i > A. Por lo tanto la esencia del proceso la podemos capturar por la
asercin *o predicado+ siguiente: :al comien.o de la iteracin i" suma contiene la suma
de los cuadrados de los primeros n-meros naturales entre B & *i86+ & B i A<. 'i
originalmente A es igual a cero" vemos $ue suma contendr cero" lo cual es consistente
*la suma de cero n-meros es cero+. Por supuesto" la condicin de terminacin del proceso
iterativo es la negacin de la condicin de continuacin" & en nuestro ejemplo" la
condicin de terminacin es :al comien.o de la iteracin i el n-mero natural cu&o
cuadrado sumaremos a suma en esa iteracin es ma&or o igual a A<. (ntonces" vemos
$ue una ve. se cumpla la condicin de terminacin" es decir" i A" se seguir cumpliendo
el invariante & tendremos A i A" por lo $ue i @ A & suma contendr la suma de los
cuadrados de los n-meros naturales entre B & A86.
l predicado :al comien.o de la iteracin i" suma contiene la suma de los cuadrados de
los primeros n-meros naturales entre B & *i86+ & B i A< lo llamamos un invariante del
proceso iterativo. 'e usa la palabra invariante por el !ec!o de $ue es un predicado $ue se
cumple" es una asercin" al comien.o de una iteracin cual$uiera del proceso iterativo.
Aote $ue un proceso iterativo puede tener muc!os invariantes" por ejemplo :verdad< es
un invariante *si suponemos $ue las operaciones $ue reali.a el proceso estn bien
definidas" al comien.o de cada iteracin" siempre se cumplir el predicado :verdad<+. 'in
embargo" estamos interesados principalmente en conseguir un invariante $ue capture la
esencia del proceso iterativo.
(jercicios:
6+ Determine un proceso iterativo & un invariante $ue capture el proceso" para
calcular * i: B i > n : s[i]+. Donde s es una secuencia de largo n.
5+ Determine un proceso iterativo & un invariante $ue capture el proceso" para
calcular * i: B i > n : 6=*i36++.
7+ Determine un proceso iterativo & un invariante $ue capture el proceso" para
calcular el ma&or elemento de una secuencia s de n-meros enteros de largo n.
0+ Determine un proceso iterativo & un invariante $ue capture el proceso" para
ordenar de menor a ma&or los elementos de una secuencia s de n-meros enteros
de largo n *la accin repetitiva no tiene por $u% comentarla con precisin+
C+ Determine un proceso iterativo & un invariante $ue capture el proceso" de los
ejercicios 65" 67" 6C" 6F" 6M" 50" 5C" 5F" 7B de la seccin 6 del problemario de
Sic!el 1unto.
,a instruccin iterativa tiene la forma siguiente:
VW
do ZB 'B
[] Z6 '6
[] ...
[] Zn 'n
od
donde" do & od son palabras reservadas del pseudolenguaje" Zi" B i n" es una
e2presin booleana *es una guardia" su evaluacin resulta en verdad o en falso+" & 'i" B i
n" es una instruccin. 1ada Zi 'i es un comando con guardia" cu&a guardia es Zi. ,a
interpretacin operacional de la instruccin iterativa es la siguiente:
'e eval-an todas las guardias. 'i todas las guardias son :falso< *esto e$uivale a la
condicin de terminacin+" entonces se ejecuta la instruccin sip. (n caso
contrario" se escoge una guardia con valor :verdad< & se procede a ejecutar la
instruccin correspondiente a esa guardia9 una ve. ejecutada la instruccin" se
procede a ejecutar la instruccin iterativa nuevamente.
1ada iteracin corresponder a la ejecucin del cuerpo de la instruccin iterativa (la
accin que se repite)# $ue es:
ZB 'B
[] Z6 '6
[] ...
[] Zn 'n
!ora podemos escribir un programa $ue describa el proceso iterativo visto ms arriba"
para el clculo de la suma de los cuadrados de los n-meros naturales de B a A" en
t%rminos de la instruccin iterativa del pseudolenguaje:
[ const A: entero9
var i" suma: entero9
{ A B }
suma :@ B9
i :@ B9
do
i > A suma :@ suma 3 i4i9 i :@ i36
od
{ suma @ * i: B i > A : i
5
+ }
]

(n cual$uier instante de la ejecucin del programa" al comien.o del cuerpo de la
iteracin" el estado de la variable i corresponde al n-mero de la iteracin $ue ser
WB
*6+
ejecutada a partir de ese instante *comen.ando con la iteracin B+. (sa misma variable i
permite :recorrer< los n-meros naturales de B a A. Por lo tanto" el predicado: :la variable
i corresponde al n-mero de la iteracin $ue ser ejecutada a partir de ese instante<" es un
invariante del proceso iterativo descrito anteriormente *tambi%n decimos $ue es un
invariante de la instruccin iterativa+. 'in embargo" este invariante no captura la esencia
del proceso $ue se lleva a cabo. (l invariante $ue captura esa esencia es el siguiente:
:suma @ * j: B j > i : j
5
+ B i A<. Ss adelante aprenderemos a demostrar
formalmente $ue en efecto este es un invariante de la instruccin iterativa anterior9 por
los momentos slo estamos suponiendo $ue este es un invariante.
Aote $ue justo antes de la instruccin do... se cumple este invariante" si sustituimos a
suma & a i por B" es decir" por sus valores originales: : ) @ * j: B j > B : j
5
+ B B
A<" lo cual es verdad. ;ambi%n se deber cumplir cuando la guardia d% valor falso" es
decir" cuando i A *condicin de terminacin+: :suma @ * j: B j > i : j
5
+ B i A<9
& vemos entonces $ue al concluir la ejecucin de la instruccin iterativa" la variable suma
contendr efectivamente el valor esperado" es decir" la suma de los cuadrados de los
primeros A n-meros naturales" es este !ec!o el $ue nos permite decir $ue este invariante
:captura la esencia del proceso iterativo<. (sto muestra la importancia de encontrar un
invariante para demostrar $ue una instruccin iterativa satisface una especificacin dada.
Oa& $ue demostrar tambi%n $ue la instruccin iterativa terminar en alg-n momento" es
decir" $ue no caer" en un ciclo infinito. (sto lo podemos garanti.ar" en el ejemplo
anterior" sabiendo $ue la variable i aumenta estrictamente en cada iteracin & $ue la
guardia dice $ue se parar el proceso iterativo una ve. i alcance el valor A. Por lo tanto
!a& dos cosas $ue deben ser probadas para demostrar $ue una instruccin iterativa
satisface una especificacin & son: encontrar el invariante $ue captura el proceso" lo cual
permite demostrar $ue la postcondicin se cumplir al final" & garanti.ar $ue la ejecucin
de la iteracin termina.
,a instruccin iterativa es el -ltimo constructor $ue daremos del pseudolenguaje. (s claro
$ue es el ms complejo. (n efecto" %ste es la esencia de la programacin imperativa o
secuencial. (s por esto $ue se puede decir $ue la actividad de la programacin consiste
principalmente en tener destre.a para determinar invariantes. ,a ciencia de la
computacin nos dice $ue los pocos constructores $ue !emos dado son suficientes para
resolver cualquier problema $ue admita una solucin algor#tmicaXX
Definicin formal de una instruccin iterativa:
Para demostrar formalmente la correctitud de una instruccin iterativa utili.aremos una
regla $ue llamaremos :;eorema de la Dnvariancia<. (sta regla depende fuertemente del
concepto de invariante $ue vimos antes.
1onsideremos $ue la instruccin iterativa posee una sola guardia. De la interpretacin
operacional de la instruccin iterativa podemos concluir lo siguiente:
Demostrar $ue se cumple { P } do Z ' od { ) }" es e$uivalente a demostrar $ue se
W6
cumple:
{ P }
i5 Z sip
[] Z '9 do Z ' od
5i
{ ) }
Oaciendo las anotaciones en la instruccin condicional" obtenemos:
{ P }
if Z { P Z} sip { ) }
[] Z { P Z} '9 do Z ' od { ) }
5i
{ ) }
1omo { P } do Z ' od { ) } deber#a cumplirse" escogemos P como predicado
intermedio en la secuenciacin :'9 do Z ' od:. Aote $ue un predicado P $ue cumpla
con lo anterior es un invariante. Rbtenemos:
{ P }
i5 Z { P Z} sip { ) }
[] Z { P Z} ' { P }9 do Z ' od { ) }
5i
{ ) }
s#" !abr#a $ue demostrar:
*i+ [P Z )] *es decir" el predicado es una tautolog#a+" $ue surge de la regla
de correctitud de la instruccin sip.
*ii+ { P Z} ' { P } se cumple
*iii+ { P } do Z ' od { ) }
en donde *iii+ corresponder#a de nuevo a *i+" *ii+ & *iii+. 'i podemos asegurar $ue la
instruccin iterativa termina" entonces ser suficiente probar *i+ & *ii+.
,o anterior lo podemos formular para dos guardias" suponiendo terminacin" como sigue.
Jegla de la instruccin iterativa:
'i
*i+ [ P ZB Z6 )] &
*ii+ { P ZB} 'B { P } & { P Z6} '6 { P } se cumplen
entonces { P } do ZB 'B [] Z6 '6 od { ) } se cumple" suponiendo $ue la
W5
instruccin iterativa termina.
,a definicin formal de invariante viene dada por *ii+" es decir" cual$uier predicado P $ue
satisfaga *ii+ es un invariante de la instruccin iterativa.
Sostremos entonces formalmente $ue :suma @ * j: B j > i : j
5
+ B i A< es un
invariante para el programa en *6+:
Probemos $ue { P i > A } suma :@ suma 3 i4i9 i :@ i36 { P } se cumple:
P*i :@ i36+
por sustitucin & aritm%tica
suma @ * j: B j > i36 : j
5
+ B i36 A
;omamos este -ltimo predicado como postcondicin de suma :@ suma 3 i4i:
*suma @ * j: B j > i36 : j
5
+ B i36 A+ *suma :@ suma 3 i4i+
por sustitucin
J. suma 3 i4i @ * j: B j > i36 : j
5
+ B i36 A
G [P i > A J] I o lo $ue es lo mismo:
G suma @ * j: B j > i : j
5
+ B i A i > A
suma 3 i4i @ * j: B j > i36 : j
5
+ B i36 A es una
tautolog#a I
6emostracin:
'upongamos $ue se cumple: suma @ * j: B j > i : j
5
+ B i A i > A. (ntonces:
B i A i > A
por aritm%tica
B i36 A
Por otro lado:
* j: B j > i36 : j
5
+
@ por separacin del t%rmino de la suma j@i" & por$ue B i > i36 *e2iste al menos
un t%rmino $ue separar" &a $ue B i es invariante+
* j: B j > i : j
5
+ 3 i
5
@ por !iptesis
W7
suma 3 i
5
,a terminacin de una instruccin iterativa se puede probar determinando una funcin
entera sobre el espacio de estados $ue est% acotada inferiormente & $ue decre.ca
estrictamente en cada iteracin" o est% acotada superiormente & $ue cre.ca estrictamente
en cada iteracin. ;al funcin la llamamos funcin de cota. Para el programa en *6+ esta
funcin es f*lista de variables+ @ i" pues de acuerdo al invariante P" i est acotado
superiormente por A. Por otra parte" i crece estrictamente en cada iteracin pues se le
suma 6 en cada iteracin *i :@ i36+" es decir" para cual$uier constante 1 se tiene $ue:
{ P i > A i @ 1 } suma :@ suma 3 i4i9 i :@ i36 { i ? 1} se cumple
Aote $ue !emos podido tambi%n tomar como funcin de cota a f*lista de variables+@ A8i"
la cual es estrictamente decreciente en cada iteracin & acotada inferiormente por B.
/inalmente" combinando la regla de la instruccin iterativa con el re$uerimiento de
terminacin" obtenemos la siguiente regla $ue permite demostrar la correctitud de una
instruccin iterativa con dos guardias:
;eorema de la Dnvariancia:
'i
*i+ [ P ZB Z6 )]
*ii+ { P ZB} 'B { P } { P Z6} '6 { P } se cumplen
*iii+ (2iste una funcin entera t sobre el espacio de estados tal $ue:
a+ [P *ZB Z6+ t B ]"
b+ { P ZB t @ 1 } 'B { t > 1 }" &
c+ { P Z6 t @ 1 } '6 { t > 1 }
entonces { P } do ZB 'B [] Z6 '6 od { ) } se cumple.
Demostracin del ;eorema de la Dnvariancia:
'abemos de antes $ue suponiendo terminacin" *i+ & *ii+ implican $ue se cumple:
{ P } do ZB 'B [] Z6 '6 od { ) }
!ora demostraremos $ue *i+" *ii+ & *iii+ implican terminacin.
Oaremos una demostracin por el absurdo.
'upongamos $ue se cumple *i+" *ii+ & *iii+ & sin embargo la instruccin iterativa no
termina" es decir" el n-mero de iteraciones es infinito.
'ea ti el valor de t cuando conclu&e la iteracin i. 1omo el n-mero de iteraciones es
W0
infinito entonces la sucesin de n-meros tB" t6" t5" ... es infinita. Por *iii.b+ & *iii.c+ sabemos
$ue esta sucesin es estrictamente decreciente. Por lo tanto e2istir un P para el cual tP es
negativo. Por otro lado" $ue no termine la instruccin iterativa es e$uivalente a decir $ue
al comien.o de cual$uier iteracin siempre ser verdad *P ZB+ *P Z6+. 1omo P
siempre es verdad al comien.o de cual$uier iteracin *por *i+ & *ii++ entonces *ZB Z6+
siempre ser verdad al comien.o de cual$uier iteracin.
Por otro lado" *iii.a+ es e$uivalente a *pues *p $+ *$ p+ es una tautolog#a+:
t > B P *ZB Z6+
1omo tP es negativo entonces P *ZB Z6+ es verdad. 1omo P es siempre verdad
por *i+ & *ii+ entonces concluimos $ue *ZB Z6+ es verdad. (sto -ltimo contradice lo
$ue !ab#amos afirmado antes: $ue *ZB Z6+ siempre ser verdad al comien.o de
cual$uier iteracin.
(n conclusin" si *i+" *ii+ &*iii+ son verdad entonces la instruccin iterativa debe terminar"
pues de lo contrario llegamos a una contradiccin.

,as anotaciones para una instruccin iterativa son las siguientes:


{ Dnvariante: P" 1ota: t }
do ZB { P ZB } 'B {P" Demostracin 6}
[] Z6 { P Z6 } '6 {P" Demostracin 5}
od
{ )" Demostracin 7" terminacin: Demostracin 0 }
donde:
Demostracin 6: demostrar $ue { P ZB} 'B { P } se cumple.
Demostracin 5: demostrar $ue{ P Z6} '6 { P } se cumple.
Demostracin 7: demostrar $ue [ P ZB Z6 )].
Demostracin 0: demostrar $ue [P *ZB Z6+ t B ]"
{ P ZB t @ 1 } 'B { t > 1 } se cumple" &
{ P Z6 t @ 1 } '6 { t > 1 } se cumple
/recuentemente" el invariante es la postcondicin de una instruccin" $ue llamamos
instruccin de inicializacin de (" $ue precede la instruccin iterativa. 'i ' corresponde a
tal instruccin & O es su precondicin" las anotaciones ser#an:
{ O }
'
{ Dnvariante: P" Demostracin B" 1ota: t }
do ZB { P ZB } 'B {P" Demostracin 6}
[] Z6 { P Z6 } '6 {P" Demostracin 5}
WC
od
{ )" Demostracin 7" terminacin: Demostracin 0 }
donde Demostracin B es una demostracin de $ue { O} ' { P } se cumple.
l igual $ue en la instruccin de seleccin" $ueda sobreentendido $ue las e2presiones ZB
& Z6 estn bien definidas en los estados $ue satisfacen P. Por lo $ue otra demostracin" de
ameritarse" debe ser demostrar [ P ZB & Z6 estn bien definidas ]" & ser incluida en la
demostracin 7.
(jercicios:
6+ Oaga las demostraciones demoB" demo6" demo5" demo7" demo0" en el
programa siguiente" para demostrar $ue es correcto:
[ var 2" &" A: int9
{ A B }
2 :@ B9
& :@ B9
{ Dnvariante P: B 2 & A" demo B" cota: 2 3 5*A8&+ }
do 2 B { P 2 B } 2 :@ 286 { P" demo6 }
[] & A { P & A } 2 :@ 2 3 69 & :@ & 3 6 { P" demo5 }
od
{ 2 @ B & @ A" demo7" terminacin: demo0}
]

5+ nalice los procesos iterativos descritos en los ejercicios B"6"5"7"0" pgina 7M
del KaldeLaij" determine un invariante" una funcin de cota & demuestre
formalmente la correctitud de dic!os programas.
WF

También podría gustarte