Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Introducción
En el TPEA, hemos especificado el comportamiento de un ecosistema marino a través de distintos tipos compuestos
y sus operaciones. Nuestro próximo paso será implementar este simulador respetando la especificación que presentó la
cátedra. El objetivo de este trabajo es, entonces, programar en Haskell los tipos y operaciones del TPEA. A conti-
nuación daremos cómo se ha decidido implementar cada tipo en Haskell y qué funciones exporta (interface), ninguna
de estas pueden ser modificadas en la solución que presenten. Adicionalmente, se entregarán ya resueltos los módulos
correspondientes a Tipos, Diccionario, NavegadorToroide y Relocalizador.
2. Tipo FisiologiaKrill
El tipo FisiologiaKrill se define como:
data FisiologiaKrill = FK Vision Tasa Tasa Tasa Tamanio Tasa deriving(Eq)
donde los seis argumentos del constructor indican radio de visión, tasa de alimentación equilibrada, tasa de alimen-
tación máxima, tasa de variación, lı́mite de población y tasa de descomposición de la fisiologı́a, respectivamente.
Se pide implementar:
1
El módulo queda definido de la siguiente manera:
module FisiologiaKrill ( FisiologiaKrill, nuevaFK, visionFK, cantFungusParaEquilibrioFK,
cantFungusMaximoFK, tasaAlimentacionEquilibradaFK,
tasaAlimentacionMaximaFK, tasaVariacionFK, limitePoblacionFK,
tasaDescomposicionFK, variacionTamFK )
where
import Tipos
3. Tipo Krill
El tipo Krill se define como:
data Krill = K FisiologiaKrill Id Tamanio deriving(Eq)
instance Show(Krill) where show (K fk num tam) = ’k’:show num ++ ’.’:show tam
Se pide implementar:
2
sobrePobladaK, dividirK, desaparecidaK, idK, fisiologiaK,
tasaDescomposicionK, cuantoFungusGeneraK, visionK )
where
import Tipos
import FisiologiaKrill
4. Tipo FisiologiaBallena
El tipo FisiologiaBallena se define como:
data FisiologiaBallena = FB Vision Edad Peso Peso Peso Peso Peso Tasa Tasa deriving(Eq)
donde los nueve argumentos del constructor indican radio de visión, longevidad, pérdida de peso diario, peso
mı́nimo, peso de embarazo, pérdida de peso por parto, peso del ballenato al nacer, tasa de descomposición y la tasa de
metabolización de la fisiologı́a, respectivamente.
Se pide implementar:
25. nuevaFB :: Vision →Edad →Peso →Peso →Peso →Peso →Peso → Tasa → Tasa → FisiologiaBallena
equivalente a nuevaFisiologiaFB ya especificada en el TPEA
26. visionFB :: FisiologiaBallena →Vision
∆ : Z = visionF B(f b : F isiologiaBallena)
P ≡ {True}
Q ≡ {∆ = radioV ision(f b)}
27. longevidadFB :: FisiologiaBallena →Edad
∆ : Edad = longevidadF B(f b : F isiologiaBallena)
P ≡ {True}
Q ≡ {∆ = longevidad(f b)}
28. perdidaPesoDiariaFB :: FisiologiaBallena →Peso
∆ : Peso = perdidaP esoDiariaF B(f b : F isiologiaBallena)
P ≡ {True}
Q ≡ {∆ = perdidaP esoDiaria(f b)}
29. pesoMinimoFB :: FisiologiaBallena →Peso
∆ : Peso = pesoM inimoF B(f b : F isiologiaBallena)
P ≡ {True}
Q ≡ {∆ = pesoM inimo(f b)}
30. perdidaDePesoPorPartoFB :: FisiologiaBallena →Peso, ya especificada en el TPEA
31. pesoParaEmbarazoFB :: FisiologiaBallena →Peso, ya especificada en el TPEA
32. pesoBallenatoFB :: FisiologiaBallena →Peso, ya especificada en el TPEA
33. tasaDescomposicionFB :: FisiologiaBallena →Tasa
∆ : Rl = tasaDescomposicionF B(f b : F isiologiaBallena)
P ≡ {True}
Q ≡ {∆ = tasaDescomposicion(f b)}
34. tasaMetabolizacionKrillFB :: FisiologiaBallena →Tasa
∆ : Rl = T asaM etabolizacionKrillF B(f b : F isiologiaBallena)
P ≡ {True}
Q ≡ {∆ = tasaM etabolizacionKrill(f b)}
35. cuantoFungusGeneraFB :: FisiologiaBallena →Peso →Fungus, ya especificada en el TPEA
36. cuantoEngordaFB :: FisiologiaBallena →Peso →Tamanio →Peso, ya especificada en el TPEA
import Tipos
3
data FisiologiaBallena =...
5. Tipo Ballena
El tipo Ballena se define como:
data Ballena = B FisiologiaBallena Id Peso Edad deriving(Eq)
Se pide implementar:
import Tipos
import FisiologiaBallena
import Krill
4
6. Tipo Celda
El tipo Celda se define como:
data Celda = Ag CantFungus ProdDiaria | CK Krill CantFungus ProdDiaria |
CB Ballena CantFungus ProdDiaria deriving (Eq)
instance Show(Celda) where show (Ag f d) = "|"++ show f ++ " ~~~ "
show (CK k f d) = "|" ++ show f ++ " " ++ show k
show (CB b f d) = "|" ++ show f ++ " " ++ show b
Se pide implementar:
5
∆ : Celda = ballenaP ierdeP esoDiarioC(c : Celda)
P ≡ {hayBallena(c)}
Q ≡ {prodDiaria(∆) = prodDiaria(c) ∧ cantF ungus(∆) = cantF ungus(c) ∧ hayBallena(∆) ∧
idBallena(ballena(∆)) = idBallena(ballena(c)) ∧ edad(ballena(∆)) = edad(ballena(c)) ∧
peso(ballena(∆)) = peso(ballena(c)) − perdidaDeP esoDiaria(f isiologia(ballena(c))) ∧
f isiologia(ballena(∆)) = f isiologia(ballena(c))}
67. cambiarProduccionDiariaC :: Celda →ProdDiaria →Celda
∆ : Celda = cambiarP roduccionDiariaC(c : Celda, p : P rodDiaria)
P ≡ {True}
Q ≡ {prodDiaria(∆) = p ∧ restoCeldaIgual(∆, c)}
import Tipos
import Krill
import Ballena
7. Tipo Toroide
El tipo Toroide se define como:
type Coordenada = (Int,Int)
data Toroide = T Int Int deriving(Eq, Show)
data Direccion = Norte | Sur | Este | Oeste deriving(Eq)
instance Show(Direccion) where show Norte = "N"
show Sur = "S"
show Este = "E"
show Oeste = "O"
Se pide implementar:
6
Q ≡ {∆ =↑ (tor)}
72. contieneT :: Toroide →Coordenada →Bool
∆ : B = contieneT (tor : T oroide, c : Coordenada)
P ≡ {True}
Q ≡ {∆ ⇐⇒ (0 ≤ x(c) < rodajas(tor) ∧ 0 ≤ y(c) < porciones(tor)}
73. vecinaT :: Toroide →Coordenada →Direccion →Coordenada
∆ : Coordenada = vecinaT (tor : T oroide, c : Coordenada, d : Direccion)
P ≡ {contiene(tor, c)}
Q ≡ {∆ = vecina(tor, c, d)}
where
8. Tipo Superficie
El tipo Toroide se define como:
data Superficie = S Toroide (Diccionario Coordenada Celda)
Se pide implementar:
7
Q ≡ {∆ = ¬hayBallena(celda(sup, c)) ∧ ¬hayKrill(celda(sup, c))}
84. ocupadaS :: Superficie →Coordenada →Bool
∆ : B = ocupadaS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {∆ = hayBallena(celda(sup, c)) ∨ hayKrill(celda(sup, c))}
85. cantidadFungusS :: Superficie →Coordenada →Int
∆ : Z = cantidadF ungusS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {∆ = cantF ungus(celda(sup, c))}
86. produccionDiariaS :: Superficie →Coordenada →Int
∆ : Z = produccionDiariaS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {∆ = prodDiaria(celda(sup, c))}
87. celdaS :: Superficie →Coordenada →Celda
∆ : Celda = celdaS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {∆ = celda(sup, c)}
88. reemplazarCeldaS :: Superficie →Coordenada →Celda →Superficie
∆ : Superficie = reemplazarCeldaS(sup : Superf icie, c : Coordenada, nuevaCel : Celda)
P ≡ {contiene(f orma(sup), c) ∧ hayKrill(nuevaCel) →
M ayorIdKrillQueElRestoK(sup, krill(nuevaCel)) ∧ hayBallena(nuevaCel) →
M ayorIdBallenaQueElRestoB(sup, ballena(nuevaCel))}
Q ≡ {f orma(∆) = f orma(sup) ∧ RestoIgual(sup, ∆, c) ∧ celda(∆, c) = nuevaCel}
89. krillS :: Superficie →Coordenada →Krill
∆ : Krill = krillS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c) ∧ hayKrill(celda(sup, c))}
Q ≡ {∆ = krill(celda(sup, c))}
90. ballenaS :: Superficie →Coordenada →Ballena
∆ : Ballena = ballenaS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c) ∧ hayBallena(celda(sup, c))}
Q ≡ {∆ = Ballena(celda(sup, c))}
91. cantidadKrillS :: Superficie →Coordenada →Int
∆ : Z = cantidadKrillS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {hayKrill(celda(sup, c)) → ∆ = tamanioColonia(krill(celda(sup, c))) ∧
¬hayKrill(celda(sup, c)) → ∆ = 0}
92. hayKrillS :: Superficie →Coordenada →Bool
∆ : B = hayKrillS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {∆ ⇐⇒ hayKrill(celda(sup, c))}
93. hayBallenaS :: Superficie →Coordenada →Bool
∆ : B = hayBallenaS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {∆ ⇐⇒ hayBallena(celda(sup, c))}
94. cambiarProduccionDiariaS :: Superficie →Coordenada →Int →Superficie
∆ : Superficie = cambiarP roduccionDiariaS(sup : Superf icie, c : Coordenada, nuevaP rod : Z)
P ≡ {contiene(f orma(sup), c) ∧ nuevaP rod ≥ 0}
Q ≡ {f orma(∆) = f orma(sup) ∧ RestoIgual(sup, ∆, c) ∧ prodDiaria(celda(∆, c)) =
nuevaP rod ∧ cantF ungus(celda(∆, c)) = cantF ungus(celda(sup, c)) ∧ hayKrill(celda(∆, c)) =
hayKrill(celda(sup, c)) ∧ (hayKrill(celda(sup, c)) → krill(celda(∆, c)) = krill(celda(sup, c))) ∧
hayBallena(celda(∆, c)) = hayBallena(celda(sup, c)) ∧ (hayBallena(celda(sup, c)) →
ballena(celda(sup, c)) = ballena(celda(∆, c)))}
95. desocuparS :: Superficie →Coordenada →Superficie
∆ : Superficie = desocuparS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}
Q ≡ {f orma(∆) = f orma(sup) ∧ RestoIgual(sup, ∆, c) ∧ prodDiaria(celda(∆, c)) =
prodDiaria(celda(sup, c)) ∧ cantF ungus(celda(∆, c)) = cantF ungus(celda(sup, c)) ∧
¬hayKrill(celda(∆, c)) ∧ ¬hayBallena(celda(∆, c))}
96. definidoKS :: Superficie →Id →Bool
∆ : B = def inidoKS(sup : Superf icie, id : Id)
P ≡ {True}
Q ≡ {∆ ⇐⇒ EstaIdKrillEnSup(sup, id)}
8
97. definidoBS :: Superficie →Id →Bool
∆ : B = def inidoBS(sup : Superf icie, id : Id)
P ≡ {True}
Q ≡ {∆ ⇐⇒ EstaIdBallenaEnSup(sup, id)}
98. definicionKS :: Superficie →Id →Krill
∆ : Krill = def inicionKS(sup : Superf icie, id : Id)
P ≡ {EstaIdKrillEnSup(sup, id)}
Q ≡ {idKrill(∆) = id ∧ EstaKrillEnSup(sup, ∆)}
99. definicionBS :: Superficie →Id →Ballena
∆ : Ballena = def inicionBS(sup : Superf icie, id : Id)
P ≡ {EstaIdBallenaEnSup(sup, id)}
Q ≡ {idBallena(∆) = id ∧ EstaBallenaEnSup(sup, ∆)}
100. dondeBS :: Superficie →Id →Coordenada
∆ : Coordenada = dondeBS(sup : Superf icie, id : Id)
P ≡ {EstaIdBallenaEnSup(sup, id)}
Q ≡ {(∃b : Ballena)(idBallena(b) = id ∧ EstaBallenaEnCoord(sup, b, ∆)}
101. dondeKS :: Superficie →Int →Coordenada
∆ : Coordenada = dondeKS(sup : Superf icie, id : Id)
P ≡ {EstaIdKrillEnSup(sup, id)}
Q ≡ {(∃k : Krill)(idKrill(k) = id ∧ EstaKrillEnCoord(sup, k, ∆)}
102. maximoIdBS :: Superficie →Id
∆ : Id = maximoIdBS(sup : Superf icie)
P ≡ {True}
Q ≡ { ∆ = −1 ∧ ¬(∃b : Ballena)(EstaBallenaEnSup(sup, b)) ∨ (∃b :
Ballena)(EstaBallenaEnSup(sup, b)) ∧ EsM ayorIdBallenaSup(sup,
∆) ∧ (∀otroM ax :
Id)(EsM ayorIdBallenaSup(sup, otroM ax) → ∆ ≤ otroM ax) }
103. maximoIdKS :: Superficie →Id
∆ : Id = maximoIdKS(sup : Superf icie)
P ≡ {True}
Q ≡ { ∆ = −1 ∧ ¬(∃k : Krill)(EstaKrillEnSup(sup, k)) ∨ ∃k :
Krill)(EstaKrillEnSup(sup, k)) ∧ EsM ayorIdBallenaSup(sup,
∆) ∧ (∀otroM ax :
Id)(EsM ayorIdBallenaSup(sup, otroM ax) → ∆ ≤ otroM ax) }
Adicionalmente se pide que demuestren la terminación de la función maximoIdKS :: Superficie →Id y de todas
las auxiliares que definan en este módulo que sean usadas por esta función. Pueden asumir que las funciones
pertenecientes a otros módulos terminan, pero deben ser especificadas si no lo estuvieran.
import Tipos
9
import FisiologiaKrill
import FisiologiaBallena
import Krill
import Ballena
import Celda
import Toroide
import NavegadorToroide
import Diccionario
data Superficie =
9. Tipo MadreNaturaleza
En este módulo no se define un tipo, simplemente se pide implementar tres funciones. Noten que no vamos a
implementar todas las funciones correspondientes a las etapas de la evolución de un dı́a, sino que haremos solamente
algunas.
Se pide implementar:
import Tipos
import FisiologiaKrill
import FisiologiaBallena
import Krill
import Ballena
import Celda
import Toroide
import NavegadorToroide
import Diccionario
import Superficie
import Relocalizador
10