2do Algoritmos y Estructuras de Datos II - DC - UBA cuatrimestre de 2014 Recuperatorio del trabajo práctico 2: Diseño Normativa Límite de entrega: martes 25 de noviembre hasta las 22:00 hs. Enviar a algo2.dc@gmail.com Normas de entrega: Ver Información sobre la cursada en el sitio Web de la materia. (http://www.dc.uba.ar/materias/aed2/2014/2c/informacion) Versión: 1.2 del 22 de noviembre de 2014 (ver RTP2_Changelog) Enunciado El objetivo de este trabajo práctico es, en primer lugar, corregir todos los errores marcados en la corrección 1 del TP2, manteniendo el contexto de uso y los órdenes de complejidad requeridos en el enunciado del mismo . En segundo lugar, para este recuperatorio se modicó el TAD CiudadRobótica con respecto al TP original para poder conocer: Cuál es la característica que estuvo involucrada en la mayor cantidad de infracciones a lo largo de toda la historia de la ciudad.Más precisamente, decimos que una característica estuvo involucrada en una infracción si pertenece al conjunto de características del robot que cometió la infracción. función_ambulancia, modelo_XZ-18} Por ejemplo, si un robot tiene las características { y comete una infracción, ambas características resultan involucradas. Cuántas inspecciones se realizaron en cada estación. Estos cambios están especicados como son deseados, y debe realizarse el diseño teniendo en cuenta estos agregados. Sugerimos que confíen en la axiomatización más que en el castellano. Contexto de uso y complejidades requeridas Se requiere que las operaciones exportadas de los TADs tengan una contraparte en los módulos diseñados. Además, se debe cumplir con los mismos requerimientos de complejidad que en el TP2 original, pero con los siguientes agregados según la modicación del TAD CiudadRobótica: tagMásInvolucrado c O(1) #inspecciones e, c O(|e|) |e| mover u, e2, c O(|e1 | + |e2| + log Ne ( ) es ( ( ) es ) es . , donde es la longitud del nombre de la estación 1 + log Ne2 + CTu ), e. donde: • e1 es la estación donde se encuentra el robot antes de moverse, y e2 es la estación a la que se mueve. • CTu es el cardinal del conjunto de tags del robot con rur u en la ciudad c, es decir, CTu = #(tags(u, c)) 1 Con excepción de la función mover 1/7 2do Algoritmos y Estructuras de Datos II - DC - UBA cuatrimestre de 2014 Requisitos y consideraciones Todas las operaciones auxiliares deben ser especicadas formalmente según las herramientas vistas en clase. Agregar comentarios necesarios para entender la forma en la cual deben ser utilizadas para su correcto funcionamiento. Todos los algoritmos deben tener su desarrollo que justique los órdenes de complejidad. Si algún paso es no trivial pueden hacer notas a continuación del mismo. Cuando se formalicen los invariantes y funciones de abstracción, deben identicar cada parte de la fórmula del Rep y comentar en castellano lo que describe. Tener en cuenta que las complejidades son en peor caso. Soluciones más ecientes serán bien recibidas. Tengan en cuenta que hay estructuras que pueden servir para más de una nalidad, sobre todos los contenedores. Pueden crear módulos adicionales si así lo necesitan. Cuentan con los siguiente TADs y módulos: • Char que representan los posibles caracteres. Siendo un tipo enumerado de 256 valores. con funciones ord • • • ord−1 Char a N at. V ector(Char) y su comparación: • < • (in s1 : String, in s2 : String) → bool con costo O(mı́n(|s1 |, |s2 |)). y para la correspondencia de cada String como sinónimo de Todos los denidos en el apunte de TADs básicos. Todos los denidos en el apunte de módulos básicos. 2/7 2do Algoritmos y Estructuras de Datos II - DC - UBA cuatrimestre de 2014 Especicación Aclaraciones de nomenclatura: Las características de los robots se llaman Se usa la notación {x1 , x2 , . . . , xn } tags. para denotar el conjunto: Ag(x1 , Ag(x2 , . . ., Ag(xn , ∅) . . .)) Se respeta la siguiente convención para los nombres de las variables: 7→ 7 → 7 → 7 → 7 → 7 → 7 → 7 → e t ts u us r m c estaciones tags conjuntos de tags unidades robóticas (rurs) conjuntos de unidades robóticas restricciones mapas ciudades TAD letra es enumerado ('_', 'a', 'b', ..., 'z', '0', '1', ..., '9') TAD string es secu(letra) TAD estación es string TAD tag es string TAD rur es nat TAD Restricción exporta todos los generadores, todos los observadores géneros restricción igualdad observacional r1 =obs r2 ⇐⇒ (∀ts : conj(tag)) (∀r1, r2 : restricción) verica?(ts, r1) =obs verica?(ts, observadores básicos verica? : conj(tag) × restricción −→ bool −→ −→ −→ −→ restricción generadores h•i • AND • • OR • NOT • : tag : restricción : restricción × × restricción restricción : restricción axiomas (∀t : tag, ∀ts : conj(tag), ∀r, r1, r2 : hti) ≡ t ∈ ts verica?(ts, r1 AND r2) ≡ verica?(ts, r1) ∧ verica?(ts, r1 OR r2) ≡ verica?(ts, r1) ∨ verica?(ts, NOT r ) ≡ ¬verica?(ts, r) restricción restricción restricción restricción) verica?(ts, verica?(ts, verica?(ts, Fin TAD TAD Mapa exporta géneros todos los generadores, todos los observadores mapa 3/7 r2) r2) r2) 2do Algoritmos y Estructuras de Datos II - DC - UBA cuatrimestre de 2014 igualdad observacional m1 =obs m2 ⇐⇒ estaciones(m1) (∀m1, m2 : mapa) ∧L (∀e1, e2 : =obs estaciones(m2) estación) ({e1, e2} ⊆ estaciones(m1) ⇒L conectadas?(e1, e2, m1) =obs conectadas?(e1, e2, m2)) : estación) ({e1, e2} ⊆ estaciones(m1) ∧L conectadas?(e1, e2, m1) ⇒L restricción(e1, e2, m1) =obs restricción(e1, e2, m2) ∧L (∀e1, e2 observadores básicos estaciones −→ −→ : mapa conj(estación) conectadas? : estación e1 × estación e2 × mapa m restricción : estación e1 × estación e2 × mapa m {{e1, e2} ⊆ : −→ mapa e × mapa m −→ mapa {e 6∈ estaciones(m)} e1 × estación e2 × restricción r × mapa m −→ mapa {{e1, e2} ⊆ estaciones(m) ∧L ¬conectadas?(e1, e2, m)} bool {{e1, e2} ⊆ estaciones(m)} −→ restricción estaciones(m) ∧L conectadas?(e1, e2, m)} generadores vacío agregar : estación conectar : estación axiomas (∀m : mapa, ∀r : restricción, estaciones(vacío) estaciones(agregar(e, m)) e2, m)) estaciones(conectar(e1, conectadas?(e1, conectadas?(e1, restricción(e1, e2, e2, e2, restricción(e1, e2, agregar(e, ∀ : e, e1, e2, e10 , e20 : estación) ≡ ∅ ≡ Ag(e, estaciones(m)) ≡ estaciones(m) m)) ≡ ¬(e1 = e ∧ e2 = e) ∨L conectadas?(e1, e2, m) 0 e20 , r, m)) ≡ {e1, e2} = {e10 , e20 } ∨L conectadas?(e1, e2, m) conectar(e1 , agregar(e, m)) 0 0 conectar(e1 , e2 , r , m)) ≡ ≡ restricción(e1, if e2, m) {e1, e2} = {e10 , e20 } r then else Fin TAD restricción(e1, e2, m) TAD CiudadRobótica exporta todos los generadores, todos los observadores, estaciones, tagMásInvolucrado géneros ciudad igualdad observacional (∀c1, c2 : ciudad) c1 =obs c2 ⇐⇒ próximoRUR(c1) ∧L =obs próximoRUR(c2) ∧ mapa(c1) =obs mapa(c2) ∧ robots(c1) =obs robots(c2) ∧ tagsHistóricos(c1) =obs tagsHistóricos(c2) ∧L (∀e: estación) (e ∈ estaciones(c1) ⇒L #inspecciones(e,c1) =obs #inspecciones(e,c2)) ∧ (∀t : tag) (t ∈ tagsHistóricos(c1) ⇒L #infraccionesXtag(t,c1) =obs #infraccionesXtag(t,c2)) ∧ (∀u : rur) (u ∈ robots(c1) ⇒L estación(u, c1) =obs estación(u, c2) ∧ tags(u, c1) =obs tags(u, c2) ∧ #infracciones(u, c1) =obs #infracciones(u, c2)) 4/7 2do Algoritmos y Estructuras de Datos II - DC - UBA cuatrimestre de 2014 observadores básicos c −→ c −→ ciudad c −→ rur u × ciudad c −→ rur u × ciudad c −→ rur u × ciudad c −→ tag t × ciudad c −→ estación e × ciudad c −→ ciudad c −→ próximoRUR : ciudad rur mapa : ciudad mapa robots : conj(rur) estación : tags : #infracciones : #infraccionesXtag : #inspecciones : tagsHistóricos : ∈ ∈ {u ∈ estación conj(tag) nat {t nat ∈ nat {u robots(c)} {u robots(c)} robots(c)} tagsHistóricos(c)} {e ∈ estaciones(c)} {e ∈ estaciones(c)} conj(tag) generadores : mapa entrar : conj(tag) mover : rur inspección : −→ −→ −→ m crear ts × estación e × ciudad c u × estación e × ciudad c {u ∈ robots(c) ∧ e ∈ estaciones(c) estación e × ciudad c ∧L ciudad ciudad ciudad c), e, mapa(c))} e ∈ estaciones(c) } conectadas?(estación(u, −→ ciudad { otras operaciones −→ −→ c estaciones : ciudad robotsEn : estación e× ciudad c conj(estación) conj(rur) {e ∈ ltrarRobotsEn : conj(rur) elMásInfractor : conj(rur) másInfractor : tagMásInvolucrado : ltrarTagMásInvolucrado : axiomas (∀c : ciudad, ∀m us × us × e× estación ciudad ciudad c c −→ {e ∈ −→ estaciones(c)} conj(rur) estaciones(c) ∧ us ⊆ {¬∅?(us) ∧ us ⊆ robots(c)} rur u1 × rur u2 × ciudad c −→ rur {{u1, u2} ⊆ robots(c)} ciudad c −→ tag {∃t ∈ tagsHistóricos(c) ∧L #infraccionesXtag(t,c) > 0} ciudad c × conj(tag) ts × tag t −→ tag : mapa, ∀u, u0 , u1, u2 : rur, ≡ 0 ≡ próximoRUR(c) ≡ próximoRUR(c) ≡ próximoRUR(c) próximoRUR(crear(m)) próximoRUR(entrar(ts, e, c)) e, c)) próximoRUR(inspección(e, c)) próximoRUR(mover(u, ∀ts : conj(tag), ∀us : conj(rur)) + 1 ≡ m e, c)) ≡ mapa(c) mapa(mover(u, e, c)) ≡ mapa(c) mapa(inspección(e, c)) ≡ mapa(c) mapa(crear(m)) mapa(entrar(ts, robots(crear(m)) robots(entrar(ts, e, c)) e, c)) robots(inspección(e, c)) robots(mover(u, ≡ ∅ ≡ Ag(próximoRUR(c), robots(c)) ≡ robots(c) ≡ robots(e, c) \ if ∅?(robotsEn(e, c)) ∨L #infracciones(elMásInfractor(robotsEn(e, c), c)) ∅ = 0 then else {elMásInfractor(robotsEn(e, e, c)) ≡ e, c)) ≡ estación(u, inspección(e, c)) ≡ estación(u, entrar(ts, 0 estación(u, mover(u , tags(u, entrar(ts, 0 tags(u, mover(u , e, c)) e, c)) ≡ ≡ robots(c)} rur if c), c)} if if u = próximoRUR(c) then e else estación(u, c) u = u0 then e else estación(u, c) estación(u, c) u= tags(u, próximoRUR(c) c) 5/7 then ts else tags(u, c) 2do Algoritmos y Estructuras de Datos II - DC - UBA tags(u, inspección(e, c)) ≡ tags(u, cuatrimestre de 2014 c) ≡ ≡ #infracciones(u, entrar(ts, e, c)) #infracciones(u, mover(u , e, c)) 0 if if u = próximoRUR(c) then 0 u = u0 then β (¬ (verica?(tags(u, c), else #infracciones(u, restricción(estación(u, else c), e, c) mapa(c))))) 0 + #infracciones(u, c) 0 #infracciones(u, inspección(u , e, c)) ≡ #infraccionesXtag(t, entrar(ts, e, c)) #infracciones(u, ≡ if c) t ∈ ts ∧ ¬(t ∈ 0 tagsHistóricos(c)) then else #infraccionesXtag(t, mover(u, ≡ e, c)) if #infraccionesXtag(t, c) t ∈ tags(u, c) then β (¬ (verica?(tags(u, c), restricción(estación(u, else c), e, mapa(c))))) 0 + #infraccionesXtag(t, c) #infraccionesXtag(t, inspección(u, e, c)) ≡ #inspecciones(e, crear(m)) 0 #inspecciones(e, entrar(ts, e , c)) e0 , c)) 0 #inspecciones(e, inspección(u, e , c)) #inspecciones(e, mover(u, e, c)) tagsHistóricos(mover(u, e, c)) tagsHistóricos(inspección(u, e, c)) robotsEn(e, c) ltrarRobotsEn(us, e, c) ≡ ≡ ≡ ≡ c) ≡ 0 ≡ #inspecciones(e, c) ≡ #inspecciones(e, c) ≡ if e = e0 then 1 else 0 + #inspecciones(e, c) estaciones(mapa(c)) ltrarRobotsEn(robots(c), if ∅?(us) ∅ else if elMásInfractor(us, c) ≡ ∅ ≡ tagsHistóricos(c) ∪ts ≡ tagsHistóricos(c) ≡ tagsHistóricos(c) tagsHistóricos(crear(m)) tagsHistóricos(entrar(ts, estaciones(c) #infraccionesXtag(t, if then e , c) estación(dameUno(us), c) ltrarRobotsEn(sinUno(us), #(us) = 1 = e e, c) then {dameUno(us)} else then dameUno(us) else másInfractor(dameUno(us), elMásInfractor(sinUno(us, másInfractor(u1, u2, c) ≡ c)), c) if #infracciones(u1, ∨ then c) > #infracciones(u2, c) c) = #infracciones(u2, c) ∧ u1 < u2) (#infracciones(u1, u1 else u2 ltrarTagMásInvolucrado( c, tagMásInvolucrado(c) ≡ sinUno(tagsHistóricos(c)), dameUno(tagsHistóricos(c))) 6/7 ∅ ∪ 2do Algoritmos y Estructuras de Datos II - DC - UBA ltrarTagMásInvolucrado(c, ts, t) ≡ if ∅?(ts) t else if cuatrimestre de 2014 then #infraccionesXtag(dameUno(ts), c) > #infraccionesXtag(t, c) ∨ (#infraccionesXtag(dameUno(ts), then ∧ dameUno(ts) c) = #infraccionesXtag(t, < t) ltrarTagMásInvolucrado(c, sinUno(ts), dameUno(ts)) else Fin TAD ltrarTagMásInvolucrado(c, sinUno(ts), 7/7 t) c)