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