TADs en 2 niveles - Clase práctica AED II

Anuncio
TADs en 2 niveles
Clase práctica AED II
28 de Marzo de 2014
()
TADs en 2 niveles
28 de Marzo de 2014
1 / 24
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
28 de Marzo de 2014
2 / 24
La Clase
Previamente...
Clase 1:
I
I
I
I
I
Definimos observadores e igualdad observacional
Definimos generadores
Axiomatizamos
Definimos y axiomatizamos otras operaciones, en caso de haberlas
Aprendimos que los observadores y generadores deben ser un conjunto minimal
Clase 2: Ejemplos de comportamiento automático
Clase 3: Inducción estructural (no veremos nada relacionado hoy)
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.
()
TADs en 2 niveles
28 de Marzo de 2014
3 / 24
La técnica
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
28 de Marzo de 2014
4 / 24
¿Qué TADs usamos cuando trabajamos en varios niveles?
TADs básicos
TADs propios
Alguna combinación de ellos
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
28 de Marzo de 2014
5 / 24
Enunciado 1
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
28 de Marzo de 2014
6 / 24
TAD Temporada
géneros
temp
observadores básicos
jugadores : temp −→ conj(nombre)
acertados : temp t × nombre j −→ conj(nat)
iniciada : temp −→ bool
acertijos : temp −→ conj(nat)
carrera : temp t × nombre n −→ carrera
generadores
nuevaTemp : −→ temp
inscribirJugador : nombre n × carrera c × temp t
{j ∈ jugadores(t) ∧ iniciada(t)}
{n ∈ jugadores(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
28 de Marzo de 2014
7 / 24
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)
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
28 de Marzo de 2014
8 / 24
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
28 de Marzo de 2014
9 / 24
Veamos ahora otra resolución usando TADs en varios niveles...
()
TADs en 2 niveles
28 de Marzo de 2014
10 / 24
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)
generadores
initTemp : conj(jugador) js × conj(nat) as
{j ∈ jugadores(t)}
−→ temp
Q
Q
Q
Q
{(∀j, j 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
28 de Marzo de 2014
11 / 24
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
28 de Marzo de 2014
12 / 24
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...
Figura: Especificar no deberı́a ser un enredo
()
TADs en 2 niveles
28 de Marzo de 2014
13 / 24
...generalmente es señal de que podemos modularizar 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
28 de Marzo de 2014
14 / 24
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. No existen ciclos en el laberinto.
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
28 de Marzo de 2014
15 / 24
El laberinto de acertijos requerido para una temporada tiene ciertas restricciones:
Hay un único acertijo final y un único
acertijo inicial
Siguiendo un camino del laberinto no
puedo llegar a un acertijo ya resuelto
Cuadro: Ejemplo de un laberinto de acertijos
()
TADs en 2 niveles
28 de Marzo de 2014
16 / 24
Figura: El señor de los laberintos
()
TADs en 2 niveles
28 de Marzo de 2014
17 / 24
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 pasa a ser el ganador de la
temporada y ningún otro jugador puede resolver acertijos.
()
TADs en 2 niveles
28 de Marzo de 2014
18 / 24
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
agAcertijo : lab l × nat acj × nat dif × conj(nat) prev
{1 ≤ d ≤ 5}
−→ 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
28 de Marzo de 2014
19 / 24
axiomas
acertijos(nuevoLab(a, d)) ≡ Ag(a, ∅)
acertijos(agAcertijo(l, acj, dif, prev)) ≡ Ag(acj, acertijos(l))
dificultad(nuevoLab(a, d), a’) ≡ d
dificultad(agAcertijo(l, acj, dif, prev), a’) ≡ if acj = a’ thendif elsedificultad(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
28 de Marzo de 2014
20 / 24
TAD Temporada
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
Q
(∀j, j 0 : jugador)({j, j’} ⊆ js ⇒ ( 1 (j) = 1 (j’) ∧ 2 (j) 6= 2 (j’))) ∧
#(acertijosFinales(l)) = 1
anotarYproxAcertijo : temp t × jugador j × nat elec −→ temp
j ∈ jugadores(t) ∧L ¬ actual(t, j) ∈ acertijosFinales(laberinto(t)) ∧ elec
∈ opciones(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
28 de Marzo de 2014
21 / 24
axiomas
jugadores(initTemp(js, l)) ≡ js
jugadores(anotarYproxAcertijo(t, n, j)) ≡ jugadores(t)
jugadores(anotarAcertijoFinal(t, j)) ≡ jugadores(t)
acertados(initTemp(js, l), j’) ≡ ∅
acertados(anotarYproxAcertijo(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(anotarYproxAcertijo(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
28 de Marzo de 2014
22 / 24
axiomas
lab(initTemp(js, l)) ≡ l
lab(anotarYproxAcertijo(t, j, elec)) ≡ lab(t)
lab(anotarAcertijoFinal(t, j)) ≡ lab(t)
finalizada(initTemp(js, l)) ≡ false
finalizada(anotarYproxAcertijo(t, j, elec)) ≡ false
finalizada(anotarAcertijoFinal(t, j)) ≡ true
()
TADs en 2 niveles
28 de Marzo de 2014
23 / 24
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),∅)
else ∅
fi
∪ filtrarAcertijosFinales(l,sinUno(as))
)
fi
()
TADs en 2 niveles
28 de Marzo de 2014
24 / 24
Descargar