1. Cola de Prioridad

Anuncio
1.
Cola de Prioridad
TAD Cola de Prioridad(α)
observadores básicos
vacı́a? : colaPrior(α) −→ bool
próximo : colaPrior(α)p −→ α
desencolar : colaPrior(α)p −→ colaPrior(α)
{(¬ vacı́a(p))}
{(¬ vacı́a(p))}
generadores
vacı́a : −→ colaPrior(α)
encolar : α × colaPrior(α) −→ colaPrior(α)
∀c: colaPrior(α), ∀e: α
axiomas
vacı́a?(vacı́a)
≡ true
vacı́a?(encolar(e, c))
≡ false
próximo(encolar(e, c))
≡ if vacı́a?(c) ∨L proximo(c) < e then e else próximo(c) fi
desencolar(encolar(e, c)) ≡ if vacı́a?(c) ∨L proximo(c) < e then c else encolar(e, desencolar(c)) fi
Fin TAD
1.1.
Dos ejemplos de la Interfaz
Push(in/out c:colaPrioridadNat, in e:nat)
{cprev = c}
{c = encolar(cprev , e)}
Pre
Pos
Pop(in/out c:colaPrioridadNat) → res:nat
Pre {¬vacı́a(c) ∧ cprev = c}
Pos {res = proximo(cprev ) ∧ c = desencolar(cprev )}
1.2.
Representación con Vector
colaPrioridadNat se representa con estr, donde
estr es vector(nat)
ˆ = secu(nat)
Recordemos que vector se representa con secu, por lo tanto estr
1.2.1.
Sin mantener un orden
ˆ → boolean
Rep : estr
ˆ Rep(s) ≡ true
(∀s : estr)
ˆ s → colaPrior(nat)
Abs : estr
ˆ Abs(s) ≡ c:colaPrior(nat) |
(∀s : estr)
vacı́a?(c) = vacı́a?(s)∧
próximo(c) = máximo(s)∧
desencolar(c) = Abs(eliminar(s, máximo(s)))
{Rep(s)}
maximo : secu(nat) s −→ nat
maximo(s) ≡ if vacia?(fin(s)) then prim(s) else max(prim(s), maximo(fin(s))) fi
eliminar : nat n × secu(nat) s −→ secu(nat)
eliminar(n,s) ≡ if prim(s) = n then fin(s) else prim(s) • eliminar(n,fin(s)) fi
1
{¬(vacı́a?(s))}
{está?(n, s)}
1.2.2.
Manteniendo el orden
ˆ → boolean
Rep : estr
ˆ Rep(s) ≡ vacia?(s)∨L
(∀s : estr)
prim(s) = máximo(s)∧
Rep(s)
ˆ s → colaPrior(nat)
Abs : estr
ˆ Abs(s) ≡ c:colaPrior(nat) |
(∀s : estr)
vacı́a?(c) = vacı́a?(s)∧
próximo(c) = prim(s)∧
desencolar(c) = Abs(f in(s))
1.3.
{Rep(s)}
Representación con punteros
colaPrioridadNat se representa con puntero(estr), donde
estr es tupla hprox : nat,
siguientes: puntero(estr) i
ˆ → boolean
Rep : puntero(estr)
ˆ
(∀p : puntero(estr))
Rep(p) ≡ p = NULL ∨
(∃ a:array de puntero(estr)) ((∀i : nat) 0 ≤ long(a) − 2 ⇒L
a[i] → siguientes = a[i + 1] ∧ a[long(a) − 1] = N U LL ∧ a[0] = p) ∧L
(p → siguientes = N U LL) ∨L ((p → prox) ≥ (p → siguentes → prox)) ∧L
Rep(p → siguientes)
ˆ p → colaPrior(nat)
Abs : puntero(estr)
ˆ
(∀p : puntero(estr))
Abs(p) ≡ c:colaPrior(nat) |
vacı́a?(c) = (p = N U LL)∧
próximo(c) = (p → prox)∧
desencolar(c) = (Abs(p → siguientes))
{Rep(p)}
2
2.
Autobús Mágico
En este ejercicio modelaremos el conocido sistema de viajes educativos Autobús Mágico. Estos se organizan en una
escuela que tiene ciertos estudiantes inscriptos, que son quienes pueden hacer los viajes. Cada viaje tiene un nivel de
aprendizaje asociado. Los estudiantes tienen un nivel de sabidurı́a, que es la suma del aprendizaje obtenido en cada
viaje que hacen. Este aprendizaje se mide en naturales.
En todo momento se pueden agregar nuevos viajes para hacer, en los que los estudiantes pueden embarcarse de a
grupos. Estos grupos no deben ser de más de 8 personas, para no sobrepasar la capacidad del Autobús. Además, cada
viaje se puede hacer sólo una vez.
Se quiere conocer los viajes hechos por cada estudiante, cuánta sabidurı́a tienen, y el mayor nivel de sabidurı́a exitente.
TAD autobús
generadores
Nuevo : conj(estudiante) ce −→ autobús
{(¬∅?(e))}
agregarViaje : viaje e × nat × autobús am −→ autobús
{(e ∈
/ viajesT otales(am))}
viajar : viaje v × conj(estudiantes) c × autobús am −→ autobús
{(v ∈ viajesDisponibles(am)) ∧ (¬∅?(c)) ∧ (#(c) ≤ 8) ∧ (c ⊆ estudiantes(am))}
observadores básicos
estudiantes : autobús −→ conj(estudiantes)
viajesHechos : estudiante e × autobús am −→ conj(viajes)
viajesDisponibles : autobús am −→ conj(viajes)
aprendizaje : viaje v × autobús am −→ nat
{e ∈ estudiantes(am)}
{v ∈ viajesT otales(am)}
otras operaciones
sabiduria : estudiante e × autobús am −→ nat
viajesTotales : autobús −→ conj(viajes)
mayor sabiduria : autobús −→ nat
{e ∈ estudiantes(am)}
Fin TAD
2.1.
Representación
autobusMágico se representa con estr, donde
estr es tupla hdisponibles: conj(viaje),
realizados: dicc(viaje, conj(estudiante)),
valor didactico: dicc(viaje, nat),
sabiduria: dicc(estudiante, nat),
mayor sab: nat i
disponibles son todos los viajes disponibles actualmente
realizados es un diccionario con los viajes realizados como claves, y quienes lo hicieron como significado
valor didactico define para cada viaje, su valor de aprendizaje
sabidurı́a define para cada estudiante, su sabidurı́a
mayor sab es el mayor valor de sabidurı́a existente
2.1.1.
Rep en castellano
Las claves de valor didáctico son la unión entre las claves de realizados y los elementos de disponibles
Todos los estudiantes que aparezcan en un significado de realizados está definido en sabidurı́a
mayor sab es el mayor significado de sabidurı́a
La sabidurı́a de cada estudiante (su significado en el diccionario) es equivalente a la suma del valor didáctico de
todos los viajes que realizó.
Las claves de realizados y disponibles son disjuntas.
Todos los significados de realizados tienen cardinal mayor o igual a 0 y menor o igual a 8.
3
2.1.2.
Rep en lógica
ˆ → boolean
Rep : estr
ˆ Rep(s) ≡ claves(e.valor didactico) = claves(e.realizados) ∪ e.disponibles ∧
(∀s : estr)
(∀v : viaje) def ?(v, e.realizados) ⇒L obtener(v, e.realizados) ⊆ claves(e.sabiduria) ∧
(∃e : est) def ?(est, e.sabiduria) ∧L obtener(est, e.sabiduria) = e.mayor sab
∧(∀e : est) def ?(est, e.sabiduria) ⇒L obtener(est, e.sabiduria) ≤ e.mayor sab ∧
(∀e : est) def ?(est, e.sabiduria) ⇒L obtener(est, e.sabiduria) =
sumarSabiduria(cuantoV iajo(est, e.realizados), e.valor didáctico) ∧
(claves(e.realizados) ∩ e.disponibles) = ∅ ∧
(∀v : viaje) def ?(v, e.realizados) ⇒L (0 ≤ #(obtener(v, e.realizados)) ≤ 8)
2.1.3.
Abs
ˆ e → autobus
Abs : estr
{Rep(e)}
ˆ Abs(e) ≡ a:autobus |
(∀s : estr)
estudiantes(a) = claves(e.sabiduria) ∧L
(∀est : estudiante) e ∈ estudiantes(a) ⇒L viajesHechos(e, a) = cuantoV iajo(est, e.realizados) ∧
viajesDisponibles(a) = e.disponibles ∧L
(∀v : viaje) v ∈ viajesT otales(a) ⇒L aprendizaje(v, a) = obtener(v, e.valor didáctico)
4
cuantoViajo : estudiante e × dicc(viaje × conj(estudiante))v −→ conj(viaje)
cuantoViajo(est, d) ≡ if ∅?(claves(d)) then ∅ else
if est ∈ obtener(dameUno(claves(d))) then
Ag(dameUno(claves(d)), cuantoViajo(est, borrar(dameUno(claves(d))))
else
cuantoViajo(est, borrar(dameUno(claves(d))) fi
fi
sumarSabiduria : conj(viaje) c × dicc(viaje × nat) d −→ nat
{c ⊆ claves(d)}
sumarSabiduria(c,d) ≡ if ∅?(c) then 0 else
obtener(dameUno(c), d) + sumarSabiduria(sinUno(c), d) fi
5
Descargar