TADs en 2 niveles - Clase práctica AED II

Anuncio
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
TADs en 2 niveles
Clase práctica AED II
Extras
30 de agosto de 2013
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
1 Introducción
La clase
La técnica
2 Ejercicio 1
Enunciado
Resolución 1
Resolución 2
3 Ejercicio 2
Enunciado
TAD inferior
TAD superior
4 Extras
TADs en 2
niveles
La Clase
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Previamente...
• Sintáctica del lenguaje (cómo escribir)
• Semántica del lenguaje (qué es lo que escribı́)
• Motivación del lenguaje (porqué modelamos)
Objetivos
• Presentar la técnica de modelado en varios niveles de TADs. No
tiene porqué ser algo novedoso.
• Analizar cuándo y porqué sirve esta técnica ası́ como el modo de
usarla.
Después...
• Si no se reconocı́a la técnica, tenerla presente en futuras
especificaciones.
• Si se la conocı́a, tener una mejor comprensión de la misma.
TADs en 2
niveles
La técnica
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Hablamos de TADs en varios niveles cuando definimos TADs que
usan otros TADs internamente. En general, hablamos de TADs en
múltiples niveles. Esto se hace principalmente para:
• Agrupar información
• Simplificar TADs mediante el uso de otros y sus propiedades
En resumen, hacer que el TAD sea lo más simple y conciso posible,
expresando todo lo que debe expresar.
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
¿Qué TADs usamos cuando trabajamos en varios niveles?
• TADs básicos
• TADs propios
• Alguna combinación de ellos
Extras
Si nuestra idea es ahorrarnos trabajo y hacer nuestro TAD intuitivo,
es conveniente usar TADs básicos: dado que ya están hechos y son
conocidos por todos. No obstante, esto no siempre es posible.
La clase de hoy muestra ejemplos para ver cuándo y cómo usamos
varios niveles, y qué TADs nos conviene usar.
TADs en 2
niveles
Enunciado 1
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
En la facultad de exactas se decidieron organizar competencias de acertijos
matemáticos. Nos fue encargada la tarea de especificar como funciona el sistema
informático que maneja la parte administrativa del mismo. Las competencias se
organizarı́an periódicamente. Los jugadores que vayan a participar deben
inscribirse previo al inicio de la temporada. Los datos de la inscripción son nombre
y carrera y no puede haber dos jugadores con el mismo nombre. Al comenzar la
temporada se cierran las inscripciones a la competencia y se publican los acertijos.
Durante el transcurso de la misma nuevos acertijos pueden ser publicados. Estos
se identifican con un número y no existe distinción relacionada a cuando fueron
publicados. Los jugadores deberán encontrar respuesta a la mayor cantidad de
acertijos posible.
Se pide especificar un TAD que modele el comportamiento de una temporada de
esta competencia. Como solo nos incumben las cuestiones administrativas, solo
nos importará registrar cuando un jugador acierta un acertijo, no ası́ los intentos
fallidos. Se pide además conocer en cada momento la cantidad de acertijos
acertados por jugador.
TADs en 2
niveles
Introducción
TAD Temporada
La clase
La técnica
géneros
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
temp
observadores básicos
jugadores : temp −→ conj(nombre)
acertados : temp t × nombre j −→ conj(nat)
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
{j ∈ jugadores(t) ∧ iniciada(t)}
iniciada : temp −→ bool
acertijos : temp −→ conj(nat)
carrera : temp t × nombre n −→ carrera
{n ∈ jugadores(t)}
generadores
nuevaTemp : −→ temp
inscribirJugador : nombre n × carrera c × temp t −→ temp
{¬ n ∈ jugadores(t) ∧¬ iniciada(t)}
initTemp : temp t −→ temp
{¬ iniciada(t)}
agregarAcertijo : temp t × nat n −→ temp
{¬ n ∈ acertijos(t)}
anotarAcertijo : temp t × nat n × nombre j −→ temp
iniciada(t) ∧ j ∈ jugadores(t) ∧L n ∈ (acertijos(t) - acertados(t, j))
Fin TAD
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
axiomas
jugadores(nuevaTemp) ≡ ∅
jugadores(inscribirJugador(n,c,t)) ≡ Ag(n, jugadores(t))
jugadores(initTemp(t)) ≡ jugadores(t)
jugadores(agregarAcertijo(t, n)) ≡ jugadores(t)
jugadores(anotarAcertijo(t, n, j)) ≡ jugadores(t)
Extras
acertados(initTemp(t), n’) ≡ ∅
acertados(agregarAcertijo(t, n), n’) ≡ acertados(t, n’)
acertados(anotarAcertijo(t, n, j), n’) ≡ if n’ = j then Ag(n, ∅) else ∅ fi ∪
acertados(t, n’)
iniciada(nuevaTemp) ≡ false
iniciada(inscribirJugador(n, c, t)) ≡ false
iniciada(initTemp(t)) ≡ true
iniciada(agregarAcertijo(t, n)) ≡ iniciada(t)
iniciada(anotarAcertijo(t, n, j) ≡ true
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
axiomas
acertijos(nuevaTemp) ≡ ∅
acertijos(inscribirJugador(n,c,t)) ≡ acertijos(t)
acertijos(initTemp(t)) ≡ acertijos(t)
acertijos(agregarAcertijo(t, n)) ≡ Ag(n, acertijos(t))
acertijos(anotarAcertijo(t, n, j)) ≡ acertijos(t)
carrera(inscribirJugador(n, c, t), n’) ≡ if n = n’ then
c
else
carrera(t, n’)
fi
carrera(initTemp(t), n’) ≡ carrera(t, n’)
carrera(agregarAcertijo(t, n), n’) ≡ carrera(t, n’)
carrera(anotarAcertijo(t, n, j), n’) ≡ carrera(t, n’)
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Veamos ahora otra resolución usando TADs en varios niveles...
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
TAD jugador es tupla(nombre, carrera)
TAD Temporada
géneros
temp
observadores básicos
jugadores : temp −→ conj(jugador)
acertados : temp t × jugador j −→ conj(nat)
acertijos : temp −→ conj(nat)
{j ∈ jugadores(t)}
generadores
initTemp : conj(jugador) js × conj(nat) as −→ temp
Q
Q
Q
(∀j,Qj 0 : jugador)({j, j’} ⊆ js ⇒ ¬( 1 (j) = 1 (j’) ∧ 2 (j)
6= 2 (j’)))
anotarAcertijo : temp t × nat n × jugador j −→ temp
{j ∈ jugadores(t) ∧L n ∈ (acertijos(t) - acertados(t, j))}
agregarAcertijo : temp t × nat n −→ temp
{¬ n ∈ acertijos(t)}
Fin TAD
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
axiomas
jugadores(initTemp(js, as)) ≡ js
jugadores(agregarAcertijo(t, n)) ≡ jugadores(t)
jugadores(anotarAcertijo(t, n, j)) ≡ jugadores(t)
acertados(initTemp(js, as), n’) ≡ ∅
acertados(agregarAcertijo(t, n), n’) ≡ acertados(t, n’)
acertados(anotarAcertijo(t, n, j), n’) ≡ if n’ = j then
Ag(n, acertados(t, n’))
else
acertados(t, n’)
fi
acertijos(initTemp(js, as)) ≡ as
acertijos(agregarAcertijo(t, n)) ≡ Ag(n, acertijos(t))
acertijos(anotarAcertijo(t, n, j)) ≡ acertijos(t)
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Recién vimos que usar TADs básicos puede simplificar bastante el
modelado del problema... ¿siempre va a alcanzar con hacer esto?
A veces los TADs básicos y su composición no llegan a expresar todo
el comportamiento: aparecen restricciones complicadas a los TADs
básicos usados como parámetro, y operaciones que parecen tener
poca relación entre sı́, perdiendo claridad en la especificación...
Enunciado
TAD inferior
TAD superior
Extras
Figura: Especificar no deberı́a ser un enredo
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
...generalmente es señal de que podemos factorizar el problema en
más de un TAD, modelando ciertas restricciones presentes y/o
relaciones entre los datos involucrados en un TAD a medida que los
encapsule.
Veámoslo mejor con el siguiente ejercicio...
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
A pesar del éxito que fueron las competencias matemáticas, la facultad
decidió condimentar las mismas con un nuevo sistema. En esta nueva
competencia, los acertijos son categorizados con un número de complejidad del 1
al 5 y los mismos se organizan de forma laberı́ntica. En este caso, los acertijos
están fijos desde el inicio de la temporada.
El objetivo de la competencia es ser el primero en atravesar el laberinto (ver
Cuadro). Todos los jugadores comienzan con un acertijo inicial. Al resolverlo
tienen la posibilidad de avanzar en el laberinto. Cuando se resuelve un acertijo el
jugador obtiene acceso a uno o más acertijos nuevos. No obstante, el jugador
debe elegir con cuál de estos nuevos acertijos quiere enfrentarse. Esta decisión lo
restringe a un camino en el laberinto. Todos los caminos posibles terminan en un
acertijo final.
Los jugadores tienen completo conocimiento de las relaciones entre los acertijos y
sus dificultades. La temporada solo termina al ser resuelto el acertijo final y el
ganador es quién lo haga.
TADs en 2
niveles
El laberinto de acertijos tiene ciertas restricciones:
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
• Hay un único acertijo final y un
único acertijo inicial
• Siguiendo un camino del laberinto
no puedo llegar a un acertijo ya
resuelto
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Cuadro: Ejemplo de un laberinto de
acertijos
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Figura: El señor de los laberintos
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Se pide modificar el TAD Temporada para que maneje la nueva información
administrativa. Se debe conocer los acertijos y la relación entre ellos, ası́ como sus
dificultades. Además debe mantener la información sobre los jugadores, en
qué acertijo se encuentran y cuáles resolvieron, e imponer las restricciones del
laberinto a la hora de moverse por él. La temporada debe finalizar cuando un
jugador resuelve el acertijo final, luego de esto el jugador pasar a ser el ganador
de la temporada y ningún otro jugador puede resolver acertijos.
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
TAD jugador es tupla(nombre, carrera)
TAD Laberinto
géneros
lab
observadores básicos
acertijos : lab −→ conj(nat)
dificultad : lab l × nat a −→ nat
opciones : lab l × nat a −→ conj(nat)
{a ∈ acertijos(l)}
{a ∈ acertijos(l)}
generadores
nuevoLab : nat a × nat d −→ lab
{1 ≤ d ≤ 5}
agAcertijo : lab l × nat acj × nat dif × conj(nat) prev −→ lab
prev ⊆ acertijos(l) ∧ 1 ≤ dif ≤ 5 ∧¬ acj ∈ acertijos(l) ∧
#(prev) ≥ 1
otras operaciones
acertijoInicial : lab −→ nat
acertijosFinales : lab −→ conj(nat)
filtrarAcertijosFinales : lab l × conj(nat) as −→ conj(nat)
{as ⊆ acertijos(l)}
Fin TAD
TADs en 2
niveles
Introducción
La clase
La técnica
axiomas
acertijos(nuevoLab(a, d)) ≡ Ag(a, ∅)
acertijos(agAcertijo(l, acj, dif, prev)) ≡ Ag(acj, acertijos(l))
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
dificultad(nuevoLab(a, d), a’) ≡ d
dificultad(agAcertijo(l, acj, dif, prev), a’) ≡ if acj = a’ then
dif
else
dificultad(l, a’)
fi
opciones(nuevoLab(a, d), a’) ≡ ∅
opciones(agAcertijo(l, acj, dif, prev), a’) ≡ if a’ ∈ prev then
Ag(acj, ∅)
else
∅
fi ∪ if a’ ∈ acertijos(l) then
opciones(l, a’)
else
∅
fi
acertijoInicial(nuevoLab(a,d)) ≡ a
acertijoInicial(agAcertijo(l, acj, dif, prev)) ≡ acertijoInicial(l)
acertijosFinales(l) ≡ filtrarAcertijosFinales(l, acertijos(l))
TADs en 2
niveles
TAD Temporada
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
géneros
temp
observadores básicos
jugadores : temp −→ conj(jugador)
acertados : temp t × jugador j −→ conj(nat)
actual : temp t × jugador j −→ nat
lab : temp −→ lab
{j ∈ jugadores(t)}
{j ∈ jugadores(t)}
generadores
initTemp : conj(jugador) js × lab l −→ temp
Q
Q
Q
(∀j,Qj 0 : jugador)({j, j’} ⊆ js ⇒ ( 1 (j) = 1 (j’) ∧ 2 (j)
6= 2 (j’))) ∧ #(acertijosFinales(l)) = 1
anotarAcertijo : temp t × jugador j × nat elec −→ temp


∈
jugadores(t)
∧L
¬
actual(t,
j)
∈
j
acertijosFinales(laberinto(t))
∧
elec
∈
op

ciones(laberinto(t), actual(t, j)) ∧ ¬ finalizada(t)
anotarAcertijoFinal : temp t × jugador j −→ temp
j ∈ jugadores(t) ∧ actual(t, j) ∈ acertijosFinales(laberinto(t))
otras operaciones
finalizada : temp −→ bool
Fin TAD
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
axiomas
jugadores(initTemp(js, l)) ≡ js
jugadores(anotarAcertijo(t, n, j)) ≡ jugadores(t)
jugadores(anotarAcertijoFinal(t, j)) ≡ jugadores(t)
acertados(initTemp(js, l), j’) ≡ ∅
acertados(anotarAcertijo(t, j, elec), j’) ≡ if j’ = j then
Ag(actual(t, j), acertados(t, j’))
else
acertados(t, j’)
fi
acertados(anotarAcertijoFinal(t, j), j’) ≡ if j’ = j then
Ag(actual(t, j), acertados(t, j’))
else
acertados(t, j’)
fi
actual(initTemp(js, l), j’) ≡ acertijoInicial(l)
actual(anotarAcertijo(t, j, elec), j’) ≡ if j = j’ then
elec
else
actual(t, j’)
fi
actual(anotarAcertijoFinal(t, j), j’) ≡ actual(t, j’)
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
axiomas
lab(initTemp(js, l)) ≡ l
lab(anotarAcertijo(t, j, elec)) ≡ lab(t)
lab(anotarAcertijoFinal(t, j)) ≡ lab(t)
finalizada(initTemp(js, l)) ≡ false
finalizada(anotarAcertijo(t, j, elec)) ≡ false
finalizada(anotarAcertijoFinal(t, j)) ≡ true
TADs en 2
niveles
Introducción
La clase
La técnica
Ejercicio 1
Enunciado
Resolución 1
Resolución 2
Ejercicio 2
Enunciado
TAD inferior
TAD superior
Extras
Axiomas de los acertijos finales del Laberinto
acertijosFinales(l) ≡ filtrarAcertijosFinales(l, acertijos(l))
filtrarAcertijosFinales(l, as) ≡ if ∅?(as) then as else
if ∅?(opciones(dameUno(as), l)) then
Ag(dameUno(as),
filtrarAcertijosFinales(sinUno(as)))
else
filtrarAcertijosFinales(sinUno(as))
fi
fi
Descargar