l enguaje de e specificaciÓn algoritmos y estructuras de datos i especificación – práctica 2...
TRANSCRIPT
LENGUAJE DE ESPECIFICACIÓNAlgoritmos y Estructuras de Datos I
Especificación – Práctica 2
AE
DI
Esp
ecifica
ción
– P
ráctica
2
1
ESPECIFICACIÓN DE PROBLEMAS
Expresamos formalmente qué debe cumplir una función para ser solución al problema dado.
No expresamos cómo solucionarloPuede 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.
AE
DI
2
Esp
ecifica
ción
– P
ráctica
2
ESPECIFICACIÓN DE PROBLEMAS NOTACIÓN
problema nombre(parámetros) = salida {
modifica: parámetro;
requiere: expresión1;
asegura: expresión2;
-- DEFINICIÓN DE AUX –
}
AE
DI
3
Esp
ecifica
ción
– P
rá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.
AE
DI
4
Esp
ecifica
ión
– P
rá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)
AE
DI
5
Esp
ecifica
ción
– P
ráctica
2
OPERACIONES CON SECUENCIAS
alguno(s) todos(s) sum(s) ó s prod(s) ó s
AE
DI
6
Esp
ecifica
ción
– P
rá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.
AE
DI
7
Esp
ecifica
ción
– P
rá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
AE
DI
8
Esp
ecifica
ción
– P
ráctica
2
RECORDANDO
Contar cuántas veces aparece x en la secuencia aaux 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);
AE
DI
9
Esp
ecifica
ción
– P
ráctica
2
ESPECIFICACIÓN DE PROBLEMAS EJERCICIO – 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; }
AE
DI
10
Esp
ecifica
ción
– P
ráctica
2
ESPECIFICACIÓN DE PROBLEMAS EJERCICIO – 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); }
AE
DI
11
Esp
ecifica
ción
– P
rá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]
AE
DI
12
Esp
ecifica
ción
– P
rá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);
}
AE
DI
13
Esp
ecifica
ión
– P
rá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]);
}
AE
DI
14
Esp
ecifica
ión
– P
rá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|)];
}
AE
DI
15
Esp
ecifica
ió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;
}
AE
DI
16
Esp
ecifica
ió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;}
AE
DI
17
Esp
ecifica
ió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];}
AE
DI
18
Esp
ecifica
ión
- Prá
ctica 2