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