180 likes | 334 Views
Lenguaje de Especificación. Algoritmos y Estructuras de Datos I Especificación – Práctica 2. Especificación de problemas. Expresamos formalmente qué debe cumplir una función para ser solución al problema dado. No expresamos cómo solucionarlo
E N D
Lenguaje de Especificación Especificación – Práctica 2 Algoritmos y Estructuras de Datos I Especificación – Práctica 2
Especificación de problemas • Expresamos formalmente qué debe cumplir una función para ser solución al problema dado. • No expresamos cómo solucionarlo • Puede no haber solución al problema que planteamos. • O tal vez, no sabemos escribirla. • Recordemos que lo que queremos especificar es el contrato que debe cumplir la función para ser considerada solución del problema planteado. Especificación – Práctica 2
Especificación de problemasNotación problema nombre(parámetros) = salida{ modifica: parámetro; requiere: expresión1; asegura: expresión2; -- DEFINICIÓN DE AUX – } Especificación – Práctica 2
Ejercicios • Especificar el problema de, dados dos enteros, devolver cualquiera de ellos. • Especificar el problema de, dados dos enteros, devolver el máximo. Especificaión – Práctica 2
Operaciones con secuencias • long(a) ó |a| • indice(s,i) ó s[i] ó si • cab(s) • cola(s) • en(e,s) ó e en s ó e s • cons(e,s) ó e:s • conc(s,t) ó s++t • sub(s, e, f) ó s[e..f] • cambiar (s, i, e) Especificación – Práctica 2
Operaciones con secuencias • alguno(s) • todos(s) • sum(s) ó s • prod(s) ó s Especificación – Práctica 2
Recordando • Para todo: ( selectores, condiciones) propiedad • Equivale a todos([propiedad | selectores, condiciones]) • Existe: ( selectores, condiciones) propiedad • Equivale a alguno([propiedad | selectores, condiciones]) Nota: cuando decimos “propiedad” nos referimos a expresiones de tipo Bool. Especificación – Práctica 2
Secuencias por comprensión • Notación: [expresión | selectores, condiciones] • selectores: variable secuencia (o <-) • variable va tomando el valor de cada elemento de secuencia en orden. • condiciones: expresiones de tipo Bool • Resultado • Secuencia • el valor de la expresión • calculado para los elementos seleccionados por los selectores • que cumplen las condiciones Especificación – Práctica 2
Recordando • Contar cuántas veces aparece x en la secuencia a aux cuenta(x: T, a: [T]): Int = long([y | y <- a, y == x]); • Determinar si dos secuencias tienen los mismos elementos (sin importar el orden) aux mismos(a, b: [T]): Bool = |a| == |b| && ( c a) cuenta(c,a) == cuenta(c,b); Especificación – Práctica 2
Especificación de problemasEjercicio – solución • Especificar el problema de, dados dos enteros, devolver el máximo. problema mayor(a, b: Int) = result: Bool{ asegura: result == (if (a > b) then a else b); } problema mayor(a, b: Int) = result: Bool{ asegura: result == Beta(a > b)*a + Beta(a<=b)*b; } Especificación – Práctica 2
Especificación de problemasEjercicio – solución • Especificar el problema de, dados dos enteros, devolver cualquiera de ellos. problema dameUno(a, b: Z) = result: Z{ asegura: (result == a) || (result == b); } Especificación – Práctica 2
Usando listas por comprensión • [x | x [5,7,4,2,8,6,4,5,8,2,7,4], x4] = [4,2,4,2,4] • [x+y | x a, y b, x y], qué indica esta expresión? • Por ejemplo: a = [1,2,3] y b = [1,2,3] [3,4,3,5,4,5] • Sea a una secuencia, obtener la secuencia inversa de a: aux reverso(a:[T]):[T] = [x[|a|-i-1] | i<-[0..|a|)] • Sea a una secuencia y n un natural, obtener la secuencia que queda de eliminar los primeros n elementos de s: aux quitarN(n:Int, a:[T]) = [a[i] | i<-[0...|a|), i>=n] Especificación – Práctica 2
Más ejercicios con secuencias • Especificar el problema de, dadas dos listas de enteros, devolver la suma de las cabezas de cada una. problema sumaCabezas (a, b: [Z]) = result : Z { requiere : |a| > 0 && |b| > 0; asegura : result == cab(a) + cab(b); } Especificaión – Práctica 2
Más ejercicios con secuencias • Especificar el problema de, dadas dos listas de enteros, devolver la suma del primer elemento par de cada una. problema sumaPrimerosPares (a, b: [Z]) = result : Z { requiere : existePar(a) && existePar(b); asegura : result == primerPar(a) + primerPar(b); aux existePar(a: [Z]) : Bool = ( x <- a) a mod 2 == 0; aux primerPar(a: [Z]) : Z = cab([ x | x <- a, a mod 2 == 0]); } Especificaión – Práctica 2
Más ejercicios con secuencias • Especificar el problema de, dadas dos listas con números enteros (que posean igual longitud), devolver la suma elemento a elemento. problema sumaListas (a, b: [Z]) = result : [Z] { requiere : |a| == |b|; asegura : result == [ a[i] + b[i] | i <- [0..|a|)]; } Especificaión - Práctica 2
Más ejercicios con secuencias • Variante: no requerir que sean de igual longitud y suponer que se devuelve la suma hasta que alguna se acaba. problema sumaListas (a, b: [Z]) = result : [Z] { asegura : result == [a[i] + b[i] | i <- [0..min(|a|,|b|))]; aux min(a,b: Z) : Z = if (a < b) then a else b; } Especificaión - Práctica 2
Más ejercicios con secuencias • Encontrar el índice (la posición) del menor elemento en una secuencia de números reales distintos no negativos. problema indiceMenorDistintos(a:[Float])=result:[Z]{ requiere noNegativos: (x <- a) x 0; requiere distintos: (i <- [0..|a|), j <- [0..|a|), i ≠ j) a[i] ≠ a[j]; asegura : 0 ≤ result < |a|; asegura : (x <- a) a[result] ≤ x; } Especificaión - Práctica 2
Más ejercicios con secuencias • Especificar el problema de, dada una lista de enteros, devolver una que tenga los mismo elementos pero ordenada. problema ordenar(a:[Z])=result:[Z]{ asegura : mismos(result,a); asegura : (i <- [0..|a|-1)) result[i] ≤ result[i+1]; } Especificaión - Práctica 2