Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-1-
Lenguaje de Especifcación Contenido ..................... ................................ ..................... ..................... ..................... ..................... ..................... ..................... ...................... ........................................ ............................. 1 Lenguaje de Especifcación................. Especifcación........................... ..................... ..................... ...................................................... ............................................ 1 Contenido................. Contenido............................ ..................... ..................... ..................... ..................... ..................... ..................... ....................................... ............................ 1 Tipos de datos..................... datos................................ ..................... ..................... ..................... ..................... ..................... ...................................... ............................ 2 Tipos de Datos Básicos................ Básicos........................... ..................... ..................... ..................... ..................... ..................... .............................. .................... 2 Términos..... Términos................ ..................... ..................... ..................... ..................... ...................... ..................... ..................... ..................... ............................... ..................... 4 unciones !u"i#iares............... !u"i#iares.......................... ..................... ..................... ..................... ..................... ..................... ................................... ......................... 4 Tipos Enumerados Enumerados $ %inónimos de Tipo................... Tipo............................. ..................... ............................................ ................................. & %ecuencias............... %ecuencias.......................... ..................... ..................... ...................... ..................... ..................... ................................................. ...................................... ' Especifcación de (ro)#emas............ (ro)#emas...................... ..................... ...................... ..................... ........................................... ................................... 1* Tipos Compuestos....... Compuestos.................. ..................... ..................... ..................... ..................... ..................... ............................................ .................................. 14 unción i+T,enE#se................ i+T,enE#se.......................... ..................... ..................... ..................... ...................... ..................... ..................... ......................... .............. 2*
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-2-
ipos de datos ecor ecorde demo mos s ue ue un tipo tipo de dato datos s es un conj conjun unto to de /a#o /a#orres con con cier cierta tas s operaciones en com0n. amos a empear /iendo unos tipos de datos )ásicos para después introducir otros más comp#ejos. En nuestro #enguaje de especifcación3 para ,a)#ar de un e#emento de un tipo3 escri)imos un t!rmino o e"presión. n término puede ser • una /aria)#e3
• •
una constante de# tipo o una +unción 5operación6 ap#icada a otros términos.
Todos Todos #os tipos tienen un e#emento distinguido 5un /a#or especia#3 distinto de #os demás6 demás6 ##amado ##amado indefnido. En e# #enguaje de especifcación3 podemos representar#o por #a constante 7nde+ o o por e# s8m)o#o ⊥.
ipos de Datos #$sicos Valores de verdad ( Bool Bool ) Es un tipo mu$ importante3 i mportante3 porue sus términos son #os predicados 5afrmaciones3 condiciones6 de nuestro #enguaje de especifcación. (or ejemp#o3 #a precondición $ #a poscondición de un pro)#ema son términos de tipo Boo#. True $ a#se. Este tipo tiene dos constantes9 True
Todos Todos #os tipos de# #enguaje tienen una operación a :: b3 ue es de tipo tipo Boo# e indica indica si #os términ términos os a $ b representan e# mismo /a#or. La operación contraria se escri)e a ;: b o a ≠ b. Las operaciones más +recuentes de tipo Boo# son #os conecti/os #ógicos9 • a1 ∧ a2 ∧ ... ∧ an9 conjunción 5se puede escri)ir << en #ugar de ∧63 • a1 ∨ a2 ∨ ... ∨ an9 dis$unción 5se puede escri)ir == en #ugar de ∨63 5tam)ién se puede puede escri)ir escri)ir no5a663 • ¬a9 negación 5tam)ién • a → b9 imp#icación 5tam)ién se puede escri)ir a --> b6. La igua#dad de# tipo Boo# 5a :: b6 es #a do)#e imp#icación 5si $ so#o si63 ue se puede escri)ir tam)ién ?--> o ↔. Los conecti/os tienen sem$ntica secuencial o sea ue #os términos se e/a#0an de iuierda a derec,a $ #a e/a#uación termina cuando se puede deducir e# /a#or de /erdad de #a e"presión comp#eta3 aunue e# resto esté indefnido. (or #o tanto3 • 5a#se << a6 :: a#se • 5True == a6 :: True • 5a#se -> a6 :: True True3 a#se En estos ejemp#os3 a puede ser cua#uier término de tipo Boo#3 con /a#or True o 7nde+ .
Números enteros ( Int Int ) E# tipo tipo 7nt corresponde corresponde a# conjunto conjunto % 5e# #enguaje tam)ién permite escri)ir#o con este s8m)o#o63 de #os n0meros enteros.
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-@-
Las constantes de# tipo son #os #itera#es ue representan n0meros enteros en notación decima#9 *A 1A 1A 2A 2A @A @A ... %us +unciones son #as operaciones más comunes en %9 • a b3 • a b3 • a b 5mu#tip#icación3 tam)ién se puede escri)ir a ⋅ b o a × b63 • a3 • a)s5 a6 5/a#or a)so#uto63 • a di/ b 5di/isión entera3 b ≠ *63 • a mod b 5resto de #a di/isión entera3 b ≠ *63 • pot5 a,b6 5potenciación3 tam)ién se puede escri)ir ab6. Las comparaciones entre enteros son términos de tipo Boo#9 • a ? b3 • a > b3 • a ?: b 5o a ≤ b63 • a >: b 5o a ≥ b6. Las comparaciones se pueden encadenar9 si escri)imos a1 ζ1 a2 ζ2 a@3 donde #os ζi son comparaciones 5?3 >3 ?:3 >:3 ::63 es como si ,u)iéramos escrito 5a1 ζ1 a26 ∧ 5a2 ζ2 a@63 $ as8 sucesi/amente para cadenas más #argas. La operación )eta5a6 se ap#ica a un término de tipo Boo# $ de/ue#/e su /a#or numérico de /erdad 5 * o 16. (or ejemp#o )eta51 ? 26 :: 1 3 $ )eta52 ? 16 :: * . tra +orma de escri)ir#a es β5a6.
Números reales ( Float ) %us /a#ores son #os de# conjunto & 5ue tam)ién es una notación /á#ida para e# tipo6. %us constantes son #itera#es ue representan n0meros raciona#es escritos en )ase die3 usando e# punto como separador de #a parte decima#9 *A 1A &A 2.FA G2.HG'A ... Tam)ién /amos a usar #a constante (i 5o π6. Como pueden /er3 a#gunas de estas constantes son compartidas con e# tipo 7nt3 pero esto no ocasiona pro)#emas3 porue e# tipo a# ue pertenecen se puede deducir de# conte"to. E# tipo #oat soporta #as mismas operaciones ue 7nt3 e"cepto di/ $ mod. %e agregan además • #a di/isión 5a I b63 • e# #ogaritmo de ) en )ase a 5#og5a3b6 o #ogab63 • #as +unciones trigonométricas 5 sin3 cos3 tan3 atan3 etc.6. La operación int5a6 de/ue#/e #a parte entera de un rea# 5e# resu#tado es de tipo 7nt63 tam)ién se escri)e a. Los términos de tipo 7nt pueden usarse como si +ueran de tipo #oat3 prestando atención a# tipo de# resu#tado de #as operaciones 5por ejemp#o3 #a di/isión entre dos enteros es siempre un término de tipo #oat6.
Caracteres ( Char ) Cada e#emento de este tipo es una #etra o s8m)o#o. %us constantes se escri)en entre comi##as simp#es9 J!J3 JBJ3 ...3 JKJ3 ...3 JaJ3 J)J3 ...3 JJ3 ...3 J*J3 J1J3 ...3 JGJ3 ...
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-4-
La +unción ord5a6 numera todos #os caracteres 5de/ue#/e un n0mero entero distinto para cada carácter6. o es importante ué n0mero corresponde a cada carácter3 pero s8 se sa)e ue #a numeración es co,erente con e# orden a#+a)ético $ numérico9 • ord5M!N6 1 :: ord 5MBN6 A • ord5MaN6 1 :: ord 5M)N6A • ord5M1N6 1 :: ord 5M2N6 . La +unción in/ersa es c,ar5a69 dado un entero3 correspondiente3 $ tam)ién se puede escri)ir ord15a6.
de/ue#/e
e#
carácter
Las comparaciones entre caracteres se interpretan como comparaciones entre sus órdenes9 5a ? b6 :: 5ord5a6 ? ord5b66.
!rminos Los términos de un tipo pueden ser t!rminos simples 5/aria)#es o constantes de# tipo6 o t!rminos compuestos 5com)inaciones de +unciones ap#icadas a términos de #os tipos correspondientes6. (or ejemp#o3 #os siguientes son términos de tipo 7nt9 • *1 • pot555@ 46 F6326 • 1 • 2 O51 1 :: 26 • 1 ord5M!N6 P estos otros tam)ién #o son3 siempre $ cuando " sea una /aria)#e de tipo 7ntA $3 de tipo #oatA de tipo Boo#9 • 2"1 • O5pot5$326 > Q6 " • 5" mod @6 O56 En cuanto a su semántica3 #os términos representan e#ementos de# tipo correspondiente. %u /a#or es 7nde+ cuando no se puede rea#iar a#guna de #as operaciones ue contiene. (or ejemp#o3 • 1 di/ * • pot5-13 *.&6 Todas #as operaciones se consideran estrictas 5si uno de sus argumentos es indefnido3 e# resu#tado tam)ién #o será6A e"cepto #os conecti/os #ógicos3 como $a ,emos /isto. (or ejemp#o3 e# término * 51I*6 es indefnido. En particu#ar3 intentar comparar #a igua#dad de un término con otro indefnido es una e"presión indefnida. Esto /a#e tam)ién para #os casos en ue am)os términos son indefnidosA por ejemp#o3 7nde+ :: 7nde+ es 7nde+ $ no True.
'unciones Au"iliares (ara simp#ifcar #a escritura $ #a #ectura de especifcaciones3 muc,as /eces /amos a defnir +unciones au"i#iares. %e trata de +unciones ue se pueden usar 50nicamente6 en #a especifcación3 a di+erencia de #as ue especifcamos como so#ución a un pro)#ema. E# mecanismo para defnir#as simp#emente #e asigna un nom)re a una e"presión.
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-&-
La sinta"is es #a siguiente9 au" f 5 parámetros69 tipo : eA
Donde f es e# nom)re ue se #e uiere dar a #a +unción au"i#iar3 ue podrá usarse en e# resto de #a especifcación en #ugar de #a e"presión e. Los parámetros 5opciona#es6 pueden aparecer en e $ se reemp#aan por #as e"presiones correspondientes cada /e ue se uti#ia f . (or ejemp#o3 si defnimos au" suc5i9 7nt69 7nt : i 1A podemos después usar #a +unción suc en #a poscondición de un pro)#ema. tipo es e# tipo resu#tante de #a +unción defnida $ de)e coincidir con e# tipo de #a
e"presión ue #a defne 5 e6. Es importante tener c#ara #a di+erencia entre defnir una +unción au"i#iar $ especifcar un pro)#ema. Cuando defnimos una +unción au"i#iar3 damos una e"presión de# #enguaje a #a ue #a +unción es eui/a#ente. P esto nos permite usar #a +unción dentro de #as especifcaciones. Cuando especifcamos un pro)#ema3 en cam)io3 estamos dando #as condiciones 5e# contrato6 ue de)er8a cump#ir a#guna +unción para ser so#ución de# pro)#ema. Eso no uiere decir ue e"ista esa +unción 5podr8a no ,a)er ning0n a#goritmo ue sir/iera como so#ución6 o ue sepamos cómo escri)ir#a. %i a#guna /e damos una +unción ue so#ucione e# pro)#ema p#anteado3 /amos a ,acer#o en otro #enguaje 5pro)a)#emente3 en un #enguaje de programación63 no en e# #enguaje de especifcación. (or todo esto no podemos usar3 en #a especifcación de un pro)#ema o de un tipo3 otra +unción ue ,a$amos especifcado.
ipos Enumerados y (inónimos de ipo Los tipos enumerados son e# primer mecanismo ue /an a aprender para defnir sus propios tipos de datos. %on tipos ue tienen una cantidad fnita de e#ementos3 representados cada uno por una constante distinta. (ara dec#arar un tipo enumerado en una especifcación3 escri)imos tipo Nombre : constantesA
E# Nombre ue #e damos a# tipo tiene ue ser distinto de todos #os e"istentes. Las constantes son tam)ién nom)res nue/os3 separados por comas. (or con/ención3 todos estos nom)res empiean con ma$0scu#a. Las constantes son términos de# tipo. %e cuenta con una operación ord5a6 ue de/ue#/e #a posición 5empeando de *6 de# e#emento en #a #ista de defnición. %u opuesta es nombre5a63 ue tam)ién se puede escri)ir ord-1 5,a$ ue tener cuidado a# usar#a3 porue esta +unción no está defnida para /a#ores ma$ores o igua#es a #a cantidad de e#ementos de# tipo6. Las comparaciones se defnen de acuerdo a# orden3 como ,emos /isto para e# tipo C,ar. (or ejemp#o3 si defnimos tipo D8a : Lunes3 Rartes3 Riérco#es3 Sue/es3 iernes3 %á)ado3 DomingoA /a#en ord5Lunes6 :: *A D8a526 :: Riérco#esA Sue/es ? iernes.
P podemos defnir3 por ejemp#o3 una +unción au"i#iar ue diga si un d8a pertenece a# fn de semana9 au" esinde5d9 D8a69 Boo# : d :: %á)ado == d :: DomingoA
se puede ,acer as89 au" esinde25d9 D8a69 Boo# : d > iernesA
Los sinónimos de tipo sir/en simp#emente para asignar otro nom)re a un tipo. En e# resto de #a especifcación3 pueden usarse am)os nom)res indistintamente9 tipo Edad : 7ntA
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-'-
(ecuencias Las secuencias 5tam)ién se #as ##ama listas6 son una )amilia de tipos ue tiene un #ugar mu$ importante en e# #enguaje de especifcación. %on una +ami#ia porue para cada tipo de datos e"iste un tipo secuencia correspondiente3 ue tiene como e#ementos #as secuencias de e#ementos de ese tipo. Las secuencias están +ormadas por /arios e#ementos de# mismo tipo3 posi)#emente repetidos3 u)icados en un cierto orden. E# tipo de #as secuencias con e#ementos de tipo T se ##ama T U 5se #ee Vsecuencia de T W6. P una +orma de escri)ir un e#emento de este tipo es escri)iendo entre corc,etes /arios términos de tipo T separados por comas. (or ejemp#o3 e# siguiente es un término de tipo 7ntU 5secuencia de 7nts69 13113@3223@3&U
La secuencia /ac8a 5de e#ementos de cua#uier tipo6 se representa con dos corc,etes en+rentados9 U. %e puede +ormar secuencias de e#ementos de cua#uier tipo. Como #as secuencias son tipos3 en particu#ar se puede usar secuencias de secuencias. (or ejemp#o3 e# siguiente es un término de# tipo #oatUU 5secuencia de secuencias de #oats69 2.@3 F.1U3 2@.'3 G3 *U3 &U3 U3 U3 4.@UU
Secuencias por comprensión La notación de secuencias por comprensión es una manera de construir secuencias de e#ementos ue cump#an ciertas condiciones3 a partir de otras secuencias e"istentes. expresión = selectores3 condicionesU expresión9 cua#uier e"presión /á#ida de# #enguaje3 sue#e contener #as /aria)#es de
#os se#ectores. selectores9 son de #a +orma variable <− secuencia3 $ puede ,a)er /arios separados por coma. La variable irá tomando3 por turno3 e# /a#or de cada uno de #os e#ementos de #a secuencia. Las /aria)#es ue aparecen en se#ectores se ##aman *aria+les ligadas. E# resto de #as /aria)#es de una e"presión se ##aman *aria+les li+res . condiciones9 e"presiones de tipo Boo#A sue#en contener #as /aria)#es de #os se#ectores. %e separan por comas $ se consideran re#acionadas por e# operador <<. E# resu#tado es una secuencia con e# /a#or de #a expresión ca#cu#ado para todos #os e#ementos se#eccionados por #os selectores ue cump#en #as condiciones. Ejemp#o9 5"3$6 = " <− 132U3 $ <− 1323@U3 " ? $U :: 513263513@63523@6U expresión1..expresión2U
Defne una secuencia mediante un inter/a#o. Las e"presiones son de# mismo tipo3 discreto $ tota#mente ordenado 5por ejemp#o3 7nt3 C,ar3 enumerados6. E# resu#tado son todos #os /a#ores de# tipo entre e# de #a expresión1 $ e# de #a expresión2 5am)as inc#usi/e6. %i no /a#e expresión1 ?: expresión23 #a secuencia es /ac8a. sando paréntesis en #ugar de corc,etes3 se puede e"c#uir uno o #os dos e"tremos. Ejemp#os9 &..GU :: &3'3F3H3GU &..G6 :: &3'3F3HU
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-F-
5&..GU :: '3F3H3GU 5&..G6 :: '3F3HU
Operaciones frecuentes En esta sección presentamos a#gunas operaciones con secuencias ue usaremos +recuentemente en #as especifcaciones. Rás ade#ante e"aminaremos #as secuencias con más deta##e. Ruc,as de estas operaciones tienen una precondición3 porue no pueden ap#icarse a cua#uier com)inación de argumentos3 si #a precondición no se cump#e e# resu#tado es indefnido. Esto no signifca ue estén especifcadas mediante contratos9 #uego /eremos ue se trata de o)ser/adores $ +unciones au"i#iares. Longitud9 #ong5a9 T U69 7nt Es #a #ongitud de #a secuencia a. otación9 #ong5a6 se puede escri)ir =a=. Inde"ación9 8ndice5a9 T U3 i9 7nt69 T reuiere * ?: i ? =a=A
Es e# e#emento en #a i-ésima posición de a. La primera posición es #a *. otación9 8ndice5a3i6 se puede escri)ir aiU $ tam)ién ai. Ca+e,a9 ca)5a9 T U69 T reuiere =a= > *A
Es e# primer e#emento de #a secuencia. Cola9 co#a5a9 T U69 T U reuiere =a= > *A
Es #a secuencia sin su primer e#emento. -ertenencia9 en5t9 T 3 a9 T U69 Boo# 7ndica si e# e#emento aparece 5a# menos una /e6 en #a secuencia. otación9 en5t3a6 se puede escri)ir t en a $ tam)ién t ∈ a. tra +orma de escri)ir no5t en a6 es t ∉ a. Agregar ca+e,a9 cons5t9 T 3 a9 T U69 T U Constru$e una secuencia como #a reci)ida3 a #a ue se #e ,a agregado t como primer e#emento. otación9 cons5t3a6 se puede escri)ir t9a. Concatenación9 conc5a3 )9 T U69 T U Constru$e una secuencia con #os e#ementos de a3 seguidos de #os de ). otación9 conc5a3)6 se puede escri)ir a ). (u+secuencia 9 su)5a9 T U3 d3 ,9 7nt69 T U La su)secuencia de a +ormada por #os e#ementos u)icados en #as posiciones entre d $ , 5am)os inc#usi/e6. Todos #os casos en ue no se cump#e * ?: d ?: , ? =a= eui/a#en a #a secuencia /ac8a. otación para o)tener su)secuencias mediante inter/a#os. ad..,U :: su)5a3d3,6 ad..,6 :: su)5a3d3,-16 a5d..,U :: su)5a3d13,6 a5d..,6 :: su)5a3d13,-16 ad..U :: su)5a3d3=a=-16
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-H-
a5d..U :: su)5a3d13=a=-16 a..,U :: su)5a3*3,6 a..,6 :: su)5a3*3,-16
En #as especifcaciones resu#ta mu$ +recuente usar inter/a#os a)iertos a derec,a3 $a ue =ad..,6= :: , - d3 $ =a..,6= :: ,. Asignación a una posición 9 cam)iar5a9 T U3 i9 7nt3 /a#9 T 69 T U reuiere * ?: i ? =a=A
Es una secuencia igua# a #a secuencia a3 e"cepto porue e# /a#or en #a posición i es /a#.
Operaciones de combinación Estas operaciones com)inan #os /a#ores de todos #os e#ementos de una secuencia de /a#ores de /erdad o de n0meros. odos *erdaderos9 todos5sec9 Boo#U69 Boo# Es /erdadero so#amente si todos #os e#ementos de #a secuencia son True 5o #a secuencia es /ac8a6. Alguno *erdadero 9 a#guno5sec9 Boo#U69 Boo# Es /erdadero so#amente si a#g0n e#emento de #a secuencia es True 5$ ninguno es 7nde+ 6. (umatoria9 sum5sec9 T U69 T T de)e ser un tipo numérico 5 #oat3 7nt6. Ca#cu#a #a suma de todos #os e#ementos de #a secuencia. %i #a secuencia es /ac8a3 e# resu#tado es *. otación9 sum5sec6 se puede escri)ir Σ sec. Ejemp#o9 au" (otenciasegati/asDeDosXastan5n9 7nt69 #oat : Σ 2-m = m <− 1..nUUA -roductoria9 prod5sec9 T U69 T T de)e ser un tipo numérico 5 #oat3 7nt6. Ca#cu#a e# producto de todos #os e#ementos de #a secuencia. %i #a secuencia es /ac8a3 e# resu#tado es 1. otación9 prod5sec6 se puede escri)ir Π sec. -ara todo9 5∀ selectores3 condiciones6 expresión Es un término de tipo Boo# ue permite afrmar ue todos #os e#ementos de una #ista defnida por comprensión cump#en una propiedad 5representada por #a expresión3 ue tam)ién de)e ser Boo# 6. Es simp#emente una +orma eui/a#ente de escri)ir #o siguiente9 todos5 expresión = selectores3 condicionesU6. Ejemp#o 5#os e#ementos en posiciones pares son ma$ores ue &69 au" par5n9 7nt69 Boo# : n mod 2 :: *A au" pos(arR&5a9 7ntU69 Boo# : 5 ∀ i <− *..=a=63 par5i66 aiU>&A
La e"presión ue defne esta +unción es eui/a#ente a esta otra9 todos5aiU>& = i <− *..=a=63 par5i6U6A otación9 en #ugar de ∀ se puede escri)ir paratodo. E"iste9 5∃ selectores3 condiciones6 expresión
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
-G-
La di+erencia con #a notación anterior es ue3 en #ugar de afrmar ue todos #os e#ementos de #a #ista determinada por #os selectores $ condiciones cump#en #a expresión3 au8 se dice ue ,a$ alguno ue #a cump#e. Es3 por #o tanto3 eui/a#ente a escri)ir #o siguiente9 a#guno5expresión = selectores3 condicionesU6. Ejemp#o 5,a$ a#g0n e#emento de #a #ista ue es par $ ma$or ue &69 au" ,a$(arR&5a9 7ntU69 Boo# : 5 ∃ " <− a3 par5"66 ">&A P es eui/a#ente a defnir au" ,a$(arR&N5a9 7ntU69 Boo# : a#guno5">& = " <− a3 par5"6U6A otación9 en #ugar de ∃ se puede escri)ir e"iste o e"isten.
Cantidades ! /eces ueremos sa)er cuántos e#ementos de una secuencia cump#en una condición. na +orma de ,acer#o es contando #a cantidad de e#ementos de una secuencia construida por comprensión. (or ejemp#o3 para /er cuántas /eces aparece e# e#emento " en #a secuencia a3 podemos defnir esta +unción9 au" cuenta5"9 T3 a9 TU69 7nt : #ong5$ = $ ?- a3 $ :: "U6A
P podemos usar#a para /er si dos secuencias tienen #os mismos e#ementos3 aunue en distinto orden9 au" mismos5a3 )9 TU69 Boo# : =a= :: =)= ∧ 5∀ c <− a6 cuenta5c3a6 :: cuenta5c3)6A tro ejemp#o9 au" cant(rimosRenores5n9 7nt69 7nt : #ong5$ = $ ?- *..n63 primo5$6U6A au" primo5n9 7nt69 Boo# : n >: 2 << ¬ 5∃ m <− 2..n66 n mod m :: *A
cumulación La notación de acumu#ación pro/ee un mecanismo simi#ar a# de construcción de secuencias por comprensión3 aumentando su poder e"presi/o. Constru$e un /a#or a partir de una o más secuencias. La +orma genera# de una e"presión de acumu#ación es #a siguiente9 acum5expresión = inicialización3 selectores3 condición6
La di+erencia entre esta sinta"is $ #a de secuencias por comprensión está en #a inicia#iación3 ue es de #a +orma acumulador 9 tipoAcum : init . Donde acumulador es una /aria)#e e init es una e"presión de tipo tipoAcum. E# resto de #os componentes coinciden con #os de #as secuencias por comprensión3 e"cepto porue en expresión3 además de #as /aria)#es de #os se#ectores3 puede aparecer e# acumulador . E# acumulador so#o puede aparecer en #a expresión pero no en #a condición. E# resu#tado de #a acumu#ación es de tipo tipoAcum. E# acumulador tiene como /a#or inicia# e# de init . ! medida ue #as /aria)#es de #os selectores toman cada uno de #os /a#ores de #a secuencia correspondiente3 se /ue#/e a ca#cu#ar e# /a#or de #a expresión $ ese es e# /a#or ue aduiere e# acumulador . E# resu#tado de #a acumu#ación es e# /a#or fna# de# acumulador . eamos a#gunos ejemp#os9 au" sum5#9 #oatU69 #oat : acum5s i = s9 #oat : *3 i ?- #6A au" prod5#9 #oatU69 #oat : acum5p i = p9 #oat : 13 i ?- #6A
La siguiente +unción au"i#iar constru$e3 dado n ≥ 13 #a sucesión de #os n1 primeros n0meros de #a de i)onacci9
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1* -
au" f)o%uc5n9 7nt69 7ntU : acum5+ +i-1U+i-2UU = +9 7ntU : 131U3 i ?- 2..nU6A
)ser/ar ue para n : *3 e# au" anterior es #a #ista 131U. P esta otra ca#cu#a e# n-ésimo n0mero de i)onacci3 para n ≥ 19 au" f)o5n9 7nt69 7nt : 5f)o%uc5n-166n-1UA
Esta otra +unción concatena todos #os componentes de una secuencia de secuencias. Tiene e# e+ecto de construir una secuencia Vap#anadaW9 au" concat5a9 TUU69 TU : acum5# c = #9 TU : U3 c ?- a6A
La construcción de secuencias por comprensión puede defnirse en términos de #a acumu#ación. E# término expresión = selectores3 condiciónU3 donde expresión es de tipo T es eui/a#ente a acum5res expresiónU = res9 T U : U3 selectores3 condición6.
Especifcación de -ro+lemas ecordemos ue /amos a especifcar pro)#emas ue se resue#/an mediante +unciones. La +unción ue sir/a como so#ución /a a tener por conjunto de partida #os /a#ores posi)#es de sus parámetros. %iempre /amos a considerar ue #os parámetros tienen /a#ores defnidos $ tamaYo fnito. La especifcación determina e# contrato ue de)er8a cump#ir #a +unción para ser considerada so#ución de# pro)#ema. Como tam)ién mencionamos3 es importante distinguir e# qué 5#a especifcación3 e# contrato a cump#ir6 de# cómo 5#a imp#ementación de #a +unción3 ue se escri)irá #uego en un #enguaje de programación6. Es decir ue en #a especifcación so#amente /amos a decir ué condiciones tiene ue cump#ir #a so#ución3 pero /amos a e/itar re+erencias a posi)#es métodos para reso#/er e# pro)#ema. Esta técnica de especifcación deja a)ierta #a posi)i#idad a dar distintas so#uciones a un mismo pro)#ema. na di+erencia o)/ia entre una so#ución $ otra puede ser e# #enguaje de programación e#egido para escri)ir #a +unción. En #a materia /amos a tra)ajar con dosA $ se /an a dar cuenta de ue no so#amente diferen en su sinta"is3 sino tam)ién en #a manera en ue se piensan #as so#uciones para imp#ementar#as en cada uno de e##os. 7nc#uso si se e#ige un 0nico #enguaje de programación3 genera#mente /a a ,a)er distintas +ormas de programar una +unción ue cump#a con #a especifcación 5si es ue ,a$ a#guna3 como /eremos más ade#ante6. Cada a#goritmo posi)#e constitu$e una so#ución distinta para e# pro)#ema. En consecuencia3 para cada especifcación e"iste un conjunto 5ta# /e /ac8o6 de a#goritmos ue #a cump#en.
!"emplos eamos a#gunos ejemp#os de especifcación de pro)#emas.
•
%i e# pro)#ema ue tenemos es ca#cu#ar e# cociente de dos enteros dados3 podr8amos escri)ir #a siguiente especifcación9 pro)#ema di/isión5a3 )9 7nt6 : resu#t9 7nt Z reuiere ) ;: *A asegura resu#t :: a di/ )A [
•
E"tendamos a,ora e# pro)#ema a ca#cu#ar e# cociente $ e# resto de #a di/isión3 siempre $ cuando e# di/isor sea positi/o. %e nos presenta entonces #a necesidad de ue #a +unción de/ue#/a dos /a#ores. na +orma de #ograr#o es usando un par
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 11 -
ordenado. Las tuplas son tipos de datos ue /eremos en deta##e más ade#ante. (or a,ora3 a#cana con sa)er ue e# tipo 57nt3 7nt6 representa #os pares ordenados de enteros $ ue #as +unciones prm $ sgd de/ue#/en #a primera $ #a segunda componente3 respecti/amente. pro)#ema cocienteesto5a3 )9 7nt6 : resu#t9 57nt37nt6 Z reuiere ) > *A asegura a :: ) r << * ?: r ? )A au" 9 7nt : prm5resu#t63 r9 7nt : sgd5resu#t6A [
Como #a poscondición se ,ac8a un poco #arga3 #es pusimos nom)re a #as dos componentes de# resu#tado. Tam)ién noten ue defnimos dos nom)res en una 0nica sentencia au". na a#ternati/a ,u)iera sido dejar e# cociente como 0nico resu#tado de# pro)#ema3 $ agregar#e un parámetro modifca)#e para representar e# resto. En matemática3 #a ap#icación de +unciones da un resu#tado3 sin modifcar e# /a#or de #os parámetrosA sin em)argo nuestro #enguaje permite especifcar ue #a so#ución a un pro)#ema s8 #o ,ace. pro)#ema cocienteesto25a3 )3 r9 7nt6 : 9 7nt Z reuiere ) > *A modifca rA asegura a :: ) r << * ?: r ? )A [
(odr8amos ,a)er usado tam)ién un parámetro para de/o#/er e# cocienteA en cu$o caso e# pro)#ema no tiene ning0n resu#tado9 pro)#ema cocienteesto@5a3 )3 3 r9 7nt6 Z reuiere ) > *A modifca 3 rA asegura a :: ) r << * ?: r ? )A [
•
(#anteémosnos a,ora e# pro)#ema de ca#cu#ar #a suma de #os in/ersos mu#tip#icati/os de /arios n0meros rea#es. Como no sa)emos cuántos n0meros /an a ser 5#a cantidad /a a /ariar en cada instancia de# pro)#ema63 no podemos usar tup#as3 ue tienen una cantidad fja de componentes. amos a tra)ajar entonces con secuencias9 pro)#ema sumar7n/ertidos5a9 #oatU6 : resu#t9 #oat Z reuiere * ∉ aA asegura resu#t :: Σ 1I" = " ?- aUA [
En #a precondición estamos pidiendo ue e# argumento no contenga ning0n * 5porue ese n0mero no puede in/ertirse6. %i no #o pidiéramos3 #a poscondición podr8a indefnirse3 $ esta es una situación ue tenemos ue e/itar a toda costa9 las precondiciones y las poscondiciones de+en estar defnidas para cual.uier *alor de los par$metros. (odr8amos ,a)er escrito esta misma precondición de distintas +ormas3 #as siguientes son todas eui/a#entes9 reuiere 5∀ " <− a 6 " ≠ *A reuiere ¬5∃ " <− a6 " :: *A reuiere ¬5∃ i <− *..=a=66 aiU :: *A
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 12 -
reuiere " = " ?- a3 " :: *U :: UA
•
E# siguiente pro)#ema a especifcar es encontrar una ra8 de un po#inomio de grado 2 a coefcientes rea#es. Digamos ue e# po#inomio /a a /enir descrito por sus coefcientes a3 ) $ c3 en grado decreciente9 pro)#ema unaa8(o#i25a3 )3 c9 #oat6 : r9 #oat Z asegura a r r ) r c :: *A [
Esta especifcación no tiene precondición3 #o cua# es eui/a#ente a decir ue #a precondición es True. %i constru$éramos una +unción ue reso#/iera este pro)#ema $ #a ##amáramos con argumentos 13 *3 1A o)tendr8amos como resu#tado r :: unaa8(o#i2513*316 ta# ue rr 1 :: *. (ero r ser8a un rea# cu$o cuadrado es -13 #o cua# no e"iste. Este es un ejemp#o de especifcación ue no puede ser cump#ida por ninguna +unción. Es un pro)#ema ue no tiene so#ución. E# error estu/o en #a escritura de #a especifcación9 no es correcto escri+ir especifcaciones .ue no puedan cumplirse . La precondición es demasiado dé)i#. De)er8amos garantiar ue e# po#inomio tu/iera ra8ces rea#es. La nue/a precondición podr8a ser 5entre otras69 reuiere )) >: 4acA
En cuanto a #a poscondición3 sir/e de ejemp#o para /er cómo #a especifcación de)e descri)ir ué ,acer $ no cómo ,acer#o. o dice cómo ca#cu#ar #a ra83 ni ué ra8 de/o#/er. E# siguiente es un ejemp#o de so+respecifcación9 una poscondición ue pone más restricciones de #as necesarias3 a# punto ue fja #a +orma de ca#cu#ar #a so#ución9 asegura resu#t :: 5-)5)2-4ac61I26I52a6
•
E# pró"imo pro)#ema es encontrar e# 8ndice 5#a posición6 de# e#emento de menor /a#or en una secuencia de n0meros rea#es distintos no negati/os9 pro)#ema 8ndiceRenorDistintos5a9 #oatU6 : res9 7nt Z reuiere oegati/os9 todos5" >: * = " ?- aU6A reuiere Distintos9 5∀ i<−*..=a=63 j<−*..=a=63 i≠ j6 ai ≠ a jA asegura * ?: res ? =a=A asegura 5∀ " ?- a6 a res ?: "A [
En este ejemp#o e#egimos poner#es nom)res a #as precondiciones para ac#arar su signifcado. Estos nom)res tam)ién pueden usarse como predicados en cua#uier #ugar de #a especifcación. !tención9 e# nom)re de #os predicados es so#amente eso9 una +orma de ,acer re+erencia a e##os. (or más ue escri)amos reuiere oegati/os3 si no ponemos #uego una condición ue e+ecti/amente ponga esa restricción e"p#icando en e# #enguaje de especifcación ué signifca3 e# pro)#ema podrá reci)ir /a#ores negati/os. Tam)ién aparecen en e# ejemp#o /arias notaciones a#ternati/as com)inadas3 para ue /a$an +ami#iariándose con e##as. tra +orma de escri)ir #a segunda precondición9 reuiere Distintos29 5∀ i<−*..=a=66 aiU ∉ a..i6A
Sinta#is La especifcación de un pro)#ema tiene esta +orma9 pro+lema nombre / par$metros nombre%es tipo%es contrato
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1@ -
parámetros es una #ista opciona#3 separada por comas3 donde cada e#emento es de #a +orma variable9 tipo3 o simp#emente una /aria)#e. En este 0#timo caso3 e# tipo será
e# de# parámetro siguiente 5e# 0#timo e#emento de)e inc#uir su tipo6. tipoes es e# tipo de# resu#tado $ nombrees es e# nom)re con e# ue /amos a
re+erirnos a ese resu#tado en e# contrato. Cuando e# pro)#ema modifca sus parámetros en #ugar de dar un resu#tado3 se omiten am)os 5$ e# :6. E# contrato está +ormado por /arias sentencias encerradas entre ##a/es 5 Z $ [6. Cada sentencia está enca)eada por una pa#a)ra c#a/e 5 reuiere3 asegura3 modifca o au"63 como se e"p#ica a continuación. Todas #as sentencias terminan con un punto $ coma ue es opciona#. re.uiere nombre &3
7ntroduce una precondición en #a especifcación de una +unción 5pro)#ema6. E# predicado & de)e cump#irse antes de #a in/ocación de #a +unción. Eui/a#e a #a o)#igación de# usuario en e# contrato especifcado. %i ,a$ más de una precondición3 se #as supone unidas por e# operador <<3 con su e/a#uación de cortocircuito 5es decir ue si una es +a#sa3 no importa ue #as siguientes se indefnan6. Cuando se resue#/a e# pro)#ema se ,ará mediante una +unción3 ue es #o ue se ##ama una implementación de #a especifcación. Todas #as precondiciones pueden suponerse ciertas en #a imp#ementación3 porue si no /a#en cuando se #a in/oca3 #a +unción no está o)#igada a cump#ir e# contrato. Esta semántica es de eximición de responsabilidadA difere de una semántica de condición de activación3 ue signifcar8a ue #a +unción no se /a a ejecutar si se #a ##ama en un estado ue no satis+aga #a precondición. (or ejemp#o3 considérese #a especifcación de #a ra8 cuadrada ue pide #a siguiente precondición9 reuiere " >: *A %i e# /a#or de# argumento es negati/o3 #a especifcación no indica ué de)er8a ,acer #a imp#ementación3 por #o ue esa posi)i#idad no necesita considerarse a# escri)ir esta 0#tima. %i una precondición es e# predicado constante True3 se puede omitir #a c#áusu#a reuiere comp#eta. Estas +unciones pueden ser ##amadas siempre. %u imp#ementación no puede ,acer suposiciones so)re #a ##amada3 e"cepto #a ue consiste en ue #os parámetros /an a tener #os tipos dec#arados 5$ ue tienen /a#ores defnidos3 de tamaYo fnito6. E# nombre es optati/o $ puede ser/ir tanto para ac#arar e# o)jeti/o de #a precondición3 como para ,acer re+erencia a e##a en otros predicados. asegura nombre &3
7ntroduce una poscondición en #a especifcación de un pro)#ema. ! es genera#mente un predicado en e# ue se mencionan #os parámetros $ e# resu#tado de# pro)#ema. epresenta #as o)#igaciones3 en e# contrato especifcado3 de una +unción ue resue#/a e# pro)#ema. Cuando se raona so)re un ##amado a esa +unción3 puede suponerse cierta #uego de #a in/ocación. %i ,a$ más de una poscondición3 se #as e/a#0a en orden como si estu/ieran unidas con e# operador <<. La interpretación de una especifcación es ue si #as precondiciones se cump#enA entonces #a +unción ue resue#/a e# pro)#ema de)e terminar norma#mente3 en un estado ue cump#a #as poscondiciones.
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 14 -
En ! puede aparecer nom)re ue se #e dio a# resu#tado en e# enca)eado3 representando a# /a#or ca#cu#ado por #a +unción. modifca variables3
7ntroduce #a #ista de variables ue pueden ser modifcadas por #a ejecución de #a +unción. na /aria)#e se modifca si su /a#or cam)ia como e+ecto de #a ejecución de #a +unción especifcada 5tiene un /a#or distinto en e# pre-estado $ en e# post-estado6. ótese ue #a c#áusu#a modifca no signifca ue #a ejecución deba cam)iar #os /a#ores de #as /aria)#esA simp#emente #e otorga a #a +unción permiso para cam)iar#as. (or ejemp#o3 si una +unción ue intercam)ia #os /a#ores de dos de sus parámetros3 reci)e dos /aria)#es con e# mismo /a#or3 no de)er8a ,a)er ning0n cam)io. La c#áusu#a modifca es un atajo sintáctico para e/itar escri)ir un predicado más #argo en #a poscondición. Como so#amente #os o)jetos #istados en #a c#áusu#a modifca pueden cam)iar de /a#or en #a ejecución3 #os demás de)en mantener#o. Cuando #a especifcación permite modifcaciones3 a /eces es necesario ,acer re+erencia a# /a#or de una /aria#)e en e# pre-estado 5estado pre/io a #a ejecución de #a +unción6. %e ,ace mediante #a sinta"is pre/e. au" de'niciones3
Las de"niciones son de #a +orma F/ par$metros tipo e3 separadas por comas. Cada una defne un nom)re de +unción au"i#iar 5 # 6 ue puede ser usado en e# resto de #a especifcación para reemp#aar a #a e"presión e. Los parámetros 5opciona#es3 con #a sinta"is $a /ista6 pueden aparecer #i)res en e $ se reemp#aan por #as e"presiones correspondientes cada /e ue se uti#ia # . Los parámetros de# pro)#ema especifcado tam)ién pueden aparecer en e. En e no se puede mencionar # . E# nom)re puede ser usado en e# )#oue donde aparece o en toda #a especifcación si no está dentro de un )#oue. E# tipo puede omitirse3 porue se deduce de# de #a e"presión3 pero es )uena práctica inc#uir#o.
ipos Compuestos Cada /a#or de un tipo )ásico representa un e#emento atómico3 indi/isi)#e. En cam)io3 un /a#or de un tipo compuesto contiene in+ormación ue puede ser di/idida en componentes de otros tipos. Pa /imos dos ejemp#os de tipos compuestos9 #as secuencias $ #as tup#as. n /a#or de tipo secuencia de enteros tiene /arios componentes3 cada uno es un entero. n /a#or de tipo par ordenado de enteros tiene dos componentes. (ara defnir un tipo compuesto3 tenemos ue dar#e un nom)re $ uno o más o+ser*adores. Los o)ser/adores son +unciones ue se ap#ican a /a#ores de# tipo compuesto 5pueden tener más parámetros6 $ de/ue#/en e# /a#or de sus componentes. %e usan en e# resto de #a especifcación 5precondiciones3 poscondiciones3 +unciones au"i#iares6. Los o)ser/adores son #os ue defnen e# tipo compuesto. %i dos términos de# tipo dan e# mismo resu#tado para todos #os o)ser/adores3 se #os considera igua#es 5esta es #a defnición imp#8cita de #a igua#dad3 ::3 para #os tipos compuestos6. %i un término de# tipo tiene /a#or defnido3 entonces ninguna operación 5ni siuiera #os o)ser/adores6 puede dar resu#tado indefnido a# ap#icárse#e. (ara garantiar#o3 #os o)ser/adores pueden tener precondiciones. (or e# contrario3 #os o)ser/adores no tienen poscondiciones. %i ,a$ condiciones genera#es ue de)an cump#ir #os e#ementos de# tipo3 se #as presenta como in*ariantes de tipo .
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1& -
E# mecanismo más ,a)itua# para especifcar +unciones ue tienen como resu#tado e#ementos de un tipo compuesto es indicando cuánto /a#en #os o)ser/adores ap#icados a# resu#tado.
!"emplos eamos a#gunos ejemp#os de tipos compuestos9
•
E# tipo (unto representa un punto en e# p#ano. %us componentes son #as dos coordenadas 5\ e P6A tiene un o)ser/ador para o)tener cada una de e##as. tipo (unto Z o)ser/ador \5p9 (unto69 #oatA o)ser/ador P5p9 (unto69 #oatA [
Especifuemos a,ora un pro)#ema ue reci)a dos n0meros rea#es $ constru$a un punto con esas coordenadas9 pro)#ema nue/o(unto5a3 )9 #oat6 : resu#t9 (unto Z asegura \5resu#t6 :: a asegura P5resu#t6 :: )A [
En este ejemp#o se /e cómo especifcar un pro)#ema ue tiene un tipo compuesto como resu#tado9 indicando ué se o)tiene a# ap#icar#e cada uno de #os o)ser/adores. %i ueremos defnir una +unción au"i#iar para ca#cu#ar #a distancia entre dos puntos3 no /amos a usar esta misma técnicaA porue e# resu#tado no es de tipo compuesto. (ero s8 /amos a ap#icar #os o)ser/adores a #os parámetros3 para o)tener #os componentes de #os argumentos9 au" dist5p3 9 (unto69 #oat : 55\5p6-\56625P5p6-P566261I2A
•
!,ora /amos a apro/ec,ar e# tipo compuesto ue aca)amos de defnir para defnir un tipo nue/o9 au" tri5a3 )3 c9 (unto69 Boo# : dist5a3)6 ? dist5a3c6 dist5)3c6A tipo Triángu#o Z o)ser/ador 15t9 Triángu#o69 (untoA o)ser/ador 25t9 Triángu#o69 (untoA o)ser/ador @5t9 Triángu#o69 (untoA in/ariante tri515t6325t63@5t66A in/ariante tri515t63@5t6325t66A in/ariante tri525t63@5t6315t66A [
Los in/ariantes de tipo son #a garant8a de ue #os e#ementos estén )ien construidos3 de)en cump#irse para cua#uier e#emento de# tipo. En este caso3 se piden #as desigua#dades triangu#ares 5representadas por #a +unción au"i#iar tri6 para ue no ,a$a un par de puntos igua#es $ #os puntos no estén a#ineados. Todos #os pro)#emas ue reci)an /a#ores de# tipo compuesto como argumentos pueden suponer3 además de su precondición3 ue se cump#en #os in/ariantes. P #os ue ca#cu#en resu#tados de ese tipo tienen ue asegurar ue #os in/ariantes no se /an a /io#ar. (or ejemp#o3 especifuemos e# pro)#ema de construir un triángu#o a partir de tres puntos3 garantiando #as desigua#dades triangu#ares9
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1' -
pro)#ema nue/oTriángu#o5a3 )3 c9 (unto6 : res9 Triángu#o Z reuiere tri5a3)3c6 << tri5a3c3)6 << tri5)3c3a6A asegura 15res6 :: a << 25res6 :: ) << @5res6 :: cA [
]^ué pasar8a si se ,u)iera omitido #a precondición_ Estar8amos especifcando e# pro)#ema de construir un triángu#o a partir de tres puntos cua#esuiera3 sin ac#arar en #a poscondición ué se de)e ,acer cuando no cump#en #a desigua#dad triangu#ar. na +unción ue reso#/iera e# pro)#ema3 generar8a triángu#os ue no respetar8an e# in/ariante de# tipo3 #o cua# no es acepta)#e. La especifcación es errónea porue no admite ninguna so#ución. Todos #os pro)#emas ue especifuemos de)en garantiar e# cump#imiento de #os in/ariantes de tipo.
•
E# t8po C8rcu#o es parecido a# ue aca)amos de defnir3 pero difere en ue sus componentes son de tipos distintos. tipo C8rcu#o Z o)ser/ador Centro5c9 C8rcu#o69 (untoA o)ser/ador adio5c9 C8rcu#o69 #oatA in/ariante adio5c6 > *A [
Los dos pro)#emas siguientes especifcan +unciones ue constru$en un c8rcu#o. na3 a partir de su centro $ su radioA #a otra3 a partir de su centro $ un punto so)re #a circun+erencia9 pro)#ema nue/oC8rcu#o5c9 (unto3 r9 #oat6 : circ9 C8rcu#o Z reuiere r > *A asegura Centro5circ6 :: c << adio5circ6 :: rA [ pro)#ema nue/oC8rcu#o(untos5c3 "9 (unto6 : circ9 C8rcu#o Z reuiere dist5c3"6 > *A asegura Centro5circ6 :: c << adio5circ6 :: dist5c3"6A [
ipos en*ricos En #os ejemp#os de tipos compuestos ue /imos recién3 cada uno de #os componentes es de un tipo predeterminado. Xa$ otros tipos compuestos ue representan estructuras cu$o contenido /an a ser /a#ores3 no siempre de# mismo tipo. n ejemp#o ue $a ,emos /isto son #as secuencias. Cada secuencia representa una co#ección ordenada de e#ementos ue pueden ser de cua#uier tipo 5aunue todos de)en ser de# mismo6. Las secuencias estructuran e#ementos de un tipo siempre de #a misma +orma3 sin importar de ué tipo se trate. E"isten secuencias de enteros3 de rea#es3 de c8rcu#os $ de todos #os tipos ue defnamos. 7nc#uso secuencias de secuencias de enteros. P todas #as secuencias tienen e# mismo comportamiento9 #as especifcaciones $ defniciones de +unciones )ásicas /a#en para secuencias de todo tipo. Estos tipos se ##aman tipos gen!ricos o tipos param!tricos3 porue e# nom)re de# tipo tiene parámetros3 /aria)#es ue representan a #os tipos de #os componentes. Los parámetros de tipo se escri)en entre #os s8m)o#os ? $ > 5o 〈 $ 〉6 después de# nom)re de# tipo. (or ejemp#o3 Ratri?T> es e# tipo genérico de #as matrices cu$os e#ementos pertenecen a un tipo a# ue3 en #a especifcación de #as matrices3 nos /amos a re+erir como T. imos ue #os pro)#emas ten8an distintas instancias3 una para cada com)inación de /a#ores de sus parámetros. Lo mismo ocurre con #os tipos genéricos. (or ejemp#o3 una
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1F -
instancia del tipo gen!rico Ratri?T> es Ratri?C,ar>3 e# tipo de #as matrices cu$os e#ementos son caracteres. n tipo genérico defne entonces3 en rea#idad3 una +ami#ia de tiposA cada e#emento de #a +ami#ia es una instancia de# tipo genérico. (or ejemp#o3 Ratri?C,ar> es uno de #os miem)ros de #a +ami#ia defnida por Ratri?T>A otros miem)ros son Ratri?7nt>3 Ratri?D8a>3 Ratri?Triángu#o> .
!"emplos eamos a#gunos ejemp#os de tipos compuestos genéricos9
•
Empeamos por e# ue mencionamos en #a e"p#icación3 #as matrices. Las operaciones ue defnen una matri son sus dimensiones 5n0mero de f#as $ co#umnas6 $ #a o)tención de# contenido en una posición9 tipo Ratri?T> Z o)ser/ador f#as5m9 Ratri?T>69 7ntA o)ser/ador co#umnas5m9 Ratri?T>69 7ntA o)ser/ador /a#5m9 Ratri?T>3 +3 c9 7nt69 T Z reuiere * ?: + ? f#as5m6A reuiere * ?: c ? co#umnas5m6A [ in/ariante f#as5m6 > *A in/ariante co#umnas5m6 > *A [
Tam)ién podemos defnir $ especifcar operaciones gen!ricas 3 +unciones cu$a descripción dependa 0nicamente de #a estructura de# tipo genérico $3 por #o tanto3 no necesiten defnirse so)re una instancia en particu#ar. n ejemp#o es #a +unción e#ementos3 ue cuenta #a cantidad de e#ementos de una matri9 au" e#ementos5m9 Ratri?T>69 7nt : f#as5m6 co#umnas5m6A
Especifuemos a,ora e# pro)#ema de cam)iar e# /a#or de una posición de una matri9 pro)#ema cam)iarR5m9 Ratri?T>3 +3 c9 7nt3 /9 T6 Z reuiere * ?: + ? f#as5m6A reuiere * ?: c ? co#umnas5m6A modifca mA asegura /a#5m3+3c6 :: /A asegura 5∀ i?-*.. f#as5m663 j?-*.. co#umnas5m663i≠+ == j≠c6 /a#5m3i3j6 :: /a#5pre5m63i3j6A [
En #a poscondición ,io +a#ta asegurar ue #os /a#ores de #as demás posiciones de #a matri no se modifca)an3 porue #a c#áusu#a modifca so#o a/isa ue m puede cam)iar3 pero no ué posiciones /an a cam)iar 5recordar ue en #a c#áusu#a modifca só#o se pueden #istar /aria)#es6. Es por esto ue en #a poscondición tenemos .ue escri)ir e"p#8citamente ue #as posiciones distintas a 5+3c6 no cam)ian de /a#or. P3 por supuesto3 podemos tam)ién especifcar pro)#emas para instancias particu#ares de# tipo genérico. (or ejemp#o3 e# ue constru$e #a matri identidad de n × n9 pro)#ema mat7d5n9 7nt6 : resu#t9 Ratri?7nt> Z reuiere n > *A asegura f#as5resu#t6 :: co#umnas5resu#t6 :: nA
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1H -
asegura 5∀ i?-*..n66 /a#5resu#t3i3i6 :: 1A asegura 5∀ i?-*..n63 j?-*..n63 i≠ j6 /a#5resu#t3i3j6 :: *A [
•
(asemos a,ora a# tipo genérico %ecuencia?T>. Lo usamos desde ue empeamos a /er e# #enguaje de especifcación3 con su nom)re a#ternati/o9 TU. Pa presentamos tam)ién #os o)ser/adores ue usamos para e# tipo9 #a #ongitud $ #a inde"ación9 tipo %ecuencia?T> Z o)ser/ador #ong5s9 %ecuencia?T>69 7ntA o)ser/ador 8ndice5s9 %ecuencia?T>3 i9 7nt69 T Z reuiere * ?: i ? #ong5s6A [ [
ecordemos #as notaciones a#ternati/as9 =s= para #a #ongitud $ si o siU para #a inde"ación. %i )ien #as secuencias son un tipo genérico compuesto como otros3 tienen un #ugar especia# en nuestro #enguaje de especifcación. Este pri/i#egio se #o dan #as notaciones para construir secuencias por comprensión e inter/a#os3 ue no son compartidas por otros tipos. La siguiente +unción au"i#iar sir/e para /er si una secuencia es su)secuencia contigua de otra9 au" ssc5a3)9 TU69 Boo# : 5 ∃ i ?- *..=)=-=a=U6 a :: )i..5i=a=66A P a,ora ue sa)emos cuá#es son #os o)ser/adores3 podemos defnir a#gunas de #as otras +unciones au"i#iares ue presentamos para #as secuencias9 au" ca)5a9 TU69 T : a*UA au" co#a5a9 TU69 TU : a1..UA au" en5t9 T3 a9 TU69 Boo# : " = " ?- a3 " :: tU ≠ UA au" su)5a9 TU3 d3 ,9 7nt69 TU : aiU = i <− d..,UUA au" todos5sec9 Boo#U69 Boo# : a#se ∉ secA au" a#guno5sec9 Boo#U69 Boo# : True ∈ secA
(ara a#gunas de estas operaciones no usamos directamente #os o)ser/adores3 apro/ec,amos #a notación de #istas por comprensión. Es importante notar ue e# se#ector ?- es parte de #a notación de #istas por comprensión $ no una ap#icación de #a +unción en. (ara
representar te"tos 5cadenas de caracteres6 /amos a usar e# tipo %ecuencia?C,ar> 5o C,arU6. %upongamos ue tenemos una #ista de pa#a)ras $ ueremos /er si a#guna de e##as aparece en un #i)ro. Esta ser8a una +orma de especifcar e# pro)#ema9 pro)#ema ,a$!#guna5pa#a)ras9 C,arUU3 #i)ro9 C,arU6: res9 Boo# Z reuiere oac8as9 5∀ p ?- pa#a)ras 6 =p= > *A reuiere %inEspacios9 ¬5∃ p ?- pa#a)ras6 J J en pA asegura res :: 5∃ p ?- pa#a)ras6 ssc5p3#i)ro6A [
(ara #a #ista de pa#a)ras usamos e# tipo C,arUU3 ue tam)ién se puede escri)ir %ecuencia?%ecuencia?C,ar>> $ tiene como /a#ores secuencias ue en cada posición tienen una secuencia de caracteres.
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 1G -
Como sus nom)res #o indican3 #as dos precondiciones #imitan e# uso de #a +unción a #os casos en ue cada pa#a)ra tenga a# menos una #etra $ no contenga ning0n espacio 5dejar8a de ser una pa#a)ra6. Tam)ién podr8amos ,a)er reemp#aado #a precondición %inEspacios por una ue pidiera ue #as pa#a)ras no contu/ieran ning0n s8m)o#o ue no +uera una #etra3 de #a siguiente manera9 reuiere %in%8m)o#os9 5∀ p ?- pa#a)ras6 so#oLetras5p6A au" #etras9 C,arU : M!N..MKNU MaN..MNUA au" so#oLetras5s9 C,arU69 Boo# : 5 ∀ # ?- s6 # en #etrasA
•
tros tipos genéricos ue $a mencionamos son #as tup#as. %e trata de secuencias de tamaYo fjo3 cada uno de cu$os e#ementos puede pertenecer a un tipo distinto. Como ejemp#o3 /eamos #os pares $ #as ternas9 tipo (ar?!3B> Z o)ser/ador prm5p9 (ar?!3B>69 !A o)ser/ador sgd5p9 (ar?!3B>69 BA [ tipo Terna?!3B3C> Z o)ser/ador prm@5t9 Terna?!3B3C>69 !A o)ser/ador sgd@5t9 Terna?!3B3C>69 BA o)ser/ador trc@5t9 Terna?!3B3C>69 CA [
Pa ,a)8amos /isto ue (ar?!3B> tam)ién se pod8a escri)ir 5!3B6A $ Terna?!3B3C> es 5!3B3C6. La siguiente especifcación descri)e una +unción 5in0ti#6 ue toma un par +ormado por un entero $ un carácter3 $ de/ue#/e otro par de# mismo tipo3 con e# do)#e de# entero $ e# siguiente carácter9 pro)#ema otro(ar5p9 57nt3C,ar66 : resu#t9 57nt3C,ar6 Z asegura prm5resu#t6 :: 2prm5p6A asegura sgd5resu#t6 :: c,ar5ord5sgd5p6616A [
]Cuá# es #a di+erencia entre escri)ir esta especifcación $ defnir una +unción au"i#iar ue de/ue#/a un par con estas mismas caracter8sticas_ !# ,a)er#o p#anteado como un pro)#ema3 nos estamos proponiendo construir una +unción 5en un #enguaje de programación6 ue cump#a #a especifcación. %i ,u)iéramos defnido una +unción au"i#iar3 podr8amos usar#a en e# resto de #a especifcación. (ara construir una tup#a3 se escri)en #os términos correspondientes a cada componente como una #ista separada por comas $ encerrada entre paréntesis. (or ejemp#o3 #as poscondiciones de #a +unción anterior podr8an ,a)erse escrito as89 asegura resu#t :: 52prm5p63 c,ar5ord5sgd5p66166A
Sinta#is La defnición de un tipo compuesto tiene esta +orma9 tipo nombre paripo5 declaración parTipo es una #ista opciona# de /aria)#es de tipo separadas por coma. Las /aria)#es aparecen en #a declaración representando tipos de datos.
La declaración son sentencias de tipo entre ##a/es3 enca)eadas por una pa#a)ra c#a/e 5o)ser/ador3 in/ariante3 au"69
Lenguaje de especifcación
Algoritmos y Estructura de Datos I – 1er Cuatrimestre 2014
- 2* -
o+ser*ador nombre/ par$metros tipo%es contrato
Los parámetros son de #a +orma conocida $ e# contrato no inc#u$e poscondiciones 5c#áusu#as asegura6. o se #e pone nom)re a# resu#tado porue3 a# no ,a)er poscondición3 no es necesario re+erenciar#o. in*ariante nombre &3
E# nombre es opciona#. ! es un predicado ue puede tener una 0nica /aria)#e #i)re3 #a cua# se interpreta como Vcua#uier /a#or de# tipo especifcadoW. Esta e"presión de)e ser /á#ida antes $ después de #a in/ocación a todas #as +unciones3 por #o ue cua#uier especifcación o defnición de +unción puede suponer#a /á#ida 5sin necesidad de tener#o como parte de su precondición6. Los pro)#emas tienen #a o)#igación de cump#ir#a en su poscondición 5sin ue fgure e"p#8citamente6. au" de'niciones3
Es #a misma sentencia ue ,emos /isto para #as especifcaciones. Cuando fgura dentro de una dec#aración de un tipo3 #os nom)res defnidos pueden usarse en toda #a dec#aración. %i se uiere ue estén disponi)#es en #a especifcación de otras +unciones3 #a sentencia de)e co#ocarse +uera de #a dec#aración.
'unción i)6enElse La +unción 7+T,enE#se e#ige entre dos e#ementos de# mismo tipo3 de acuerdo a una guarda . %i #a guarda es /erdadera3 e#ige e# primero de #os dosA si no3 e#ige e# segundo. (or ejemp#o3 i+T,enE#se5";:*3 1I"3 H6 es e# /a#or de 1I" cuando " es distinto de cero $ es H en caso contrario. Tam)ién se puede escri)ir i+ ";:* T,en 1I" E#se H. )ser/ar ue 7+T,enE#se es una +unción no estricta. Con esta +unción podemos defnir tam)ién a#gunas otras de #as +unciones au"i#iares ue estamos usando para #as secuencias9 au" cons5t9 T3 a9 TU69 TU : i+ i::-1 t,en t e#se aiU = i <− -1..=a=6UA au" conc5a3 )9 TU69 TU : i+ i?=a= t,en a i e#se )i-=a= = i <− *..=a==)=6UA au" cam)iar5a9 TU3 i9 7nt3 /9 T69 TU : i+ i≠ j t,en ai e#se / = j <− *..=a=6UA