Está en la página 1de 10

TPFA - Ecosistema Marino

Algoritmos y Estructuras de Datos I


Segundo cuatrimestre de 2004

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. nuevaFK :: Vision →Tasa →Tasa →Tasa →Tamanio →Tasa →FisiologiaKrill


equivalente a nuevaFisiologiaKrill ya especificada en el TPEA
2. visionFK :: FisiologiaKrill →Int
equivalente a radioVisionFK ya especificada en el TPEA
3. tasaAlimentacionEquilibradaFK :: FisiologiaKrill →Tasa
∆ : Rl = tasaAlimentacionEquilibradaF K(f k : F isiologiaKrill)
P ≡ {True}
Q ≡ {∆ = tasaAlimentacionEquilibrada(f k)}
4. tasaAlimentacionMaximaFK :: FisiologiaKrill →Tasa
∆ : Rl = tasaAlimentacionM aximaF K(f k : F isiologiaKrill)
P ≡ {True}
Q ≡ {∆ = tasaAlimentacionM axima(f k)}
5. tasaVariacionFK :: FisiologiaKrill →Tasa
∆ : Rl = tasaV ariacionF K(f k : F isiologiaKrill)
P ≡ {True}
Q ≡ {∆ = tasaV ariacion(f k)}
6. limitePoblacionFK :: FisiologiaKrill →Tamanio
∆ : TamanioColonia = limiteP oblacionF K(f k : F isiologiaKrill)
P ≡ {True}
Q ≡ {∆ = limiteP oblacion(f k)}
7. tasaDescomposicionFK :: FisiologiaKrill →Tasa
∆ : Rl = tasaDescomposicionF K(f k : F isiologiaKrill)
P ≡ {True}
Q ≡ {∆ = tasaDescomposicion(f k)}
8. cantFungusParaEquilibrioFK :: FisiologiaKrill →Tamanio →Fungus, ya especificada en el
TPEA
9. cantFungusMaximoFK :: FisiologiaKrill →Tamanio →Fungus, ya especificada en el TPEA
10. variacionTamFK :: FisiologiaKrill →Tamanio →Fungus →Tamanio
equivalente a variacionTamColoniaFK ya especificada en el TPEA

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

data FisiologiaKrill =...

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:

11. nuevaK :: FisiologiaKrill →Id →Tamanio →Krill


equivalente a nuevaColoniaK ya especificada en el TPEA
12. idK :: Krill →Id
∆ : Id = idK(k : Krill)
P ≡ {True}
Q ≡ {∆ = idKrill(k)}
13. fisiologiaK :: Krill →FisiologiaKrill
∆ : FisiologiaKrill = f isiologiaK(k : Krill)
P ≡ {True}
Q ≡ {∆ = f isiologia(k)}
14. tamanioK :: Krill →Tamanio
∆ : TamanioColonia = tamanioColoniaK(k : Krill)
P ≡ {True}
Q ≡ {∆ = tamanioColonia(k)}
15. visionK :: Krill →Vision
∆ : Z = visionK(k : Krill)
P ≡ {True}
Q ≡ {∆ = visionK(f isiologia(k))}
16. tasaDescomposicionK :: Krill →Tasa
∆ : Rl = tasaDescomposicionK(k : Krill)
P ≡ {True}
Q ≡ {∆ = tasaDescomposicion(f isiologia(k))}
17. cuantoFungusGeneraK :: Krill →Fungus
∆ : CantFungus = cuantoF ungusGeneraK(k : Krill)
P ≡ {True}
Q ≡ {∆ = btasaDescomposicion(k) ∗ tamanioColonia(k)c}
18. desaparecidaK :: Krill →Bool
∆ : CantFungus = desaparecidaK(k : Krill)
P ≡ {True}
Q ≡ {∆ = tamanioColonia(k) = 0}
19. alcanzaFungusK :: Krill →Fungus →Bool, ya especificada en el TPEA
20. comerFungusK :: Krill →Fungus →(Krill, Fungus), ya especificada en el TPEA
21. fusionarK :: Krill →Krill →Id →Krill, ya especificada en el TPEA
22. sobrePobladaK :: Krill →Bool, ya especificada en el TPEA
23. dividirK :: Krill →Id →Id →(Krill, Krill), ya especificada en el TPEA
24. cuantoFungusGeneraK :: Krill →Fungus, ya especificada en el TPEA

El módulo queda definido de la siguiente manera:


module Krill ( Krill, tamanioK, nuevaK, alcanzaFungusK, comerFungusK, fusionarK,

2
sobrePobladaK, dividirK, desaparecidaK, idK, fisiologiaK,
tasaDescomposicionK, cuantoFungusGeneraK, visionK )
where

import Tipos
import FisiologiaKrill

data Krill =...

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

El módulo queda definido de la siguiente manera:


module FisiologiaBallena ( FisiologiaBallena, nuevaFB, visionFB, longevidadFB, perdidaPesoDiariaFB,
pesoMinimoFB, perdidaDePesoPorPartoFB, pesoBallenatoFB,
tasaDescomposicionFB, tasaMetabolizacionKrillFB, cuantoFungusGeneraFB,
cuantoEngordaFB, pesoParaEmbarazoFB )
where

import Tipos

3
data FisiologiaBallena =...

5. Tipo Ballena
El tipo Ballena se define como:
data Ballena = B FisiologiaBallena Id Peso Edad deriving(Eq)

instance Show(Ballena) where show (B fb id p e) = ’b’:show id ++ ’.’:show p ++ ’.’:show e

Se pide implementar:

37. nuevaB :: FisiologiaBallena →Id →Ballena


equivalente a nuevaBallenaB ya especificada en el TPEA
38. idB :: Ballena →Id
∆ : Id = idBallenaB(b : Ballena)
P ≡ {True}
Q ≡ {∆ = idBallena(b)}
39. pesoB :: Ballena →Peso
∆ : Peso = pesoB(b : Ballena)
P ≡ {True}
Q ≡ {∆ = peso(b)}
40. edadB :: Ballena →Edad
∆ : Edad = edadB(b : Ballena)
P ≡ {True}
Q ≡ {∆ = edad(b)}
41. fisiologiaB :: Ballena →FisiologiaBallena
∆ : FisiologiaBallena = f isiologiaB(b : Ballena)
P ≡ {True}
Q ≡ {∆ = f isiologia(b)}
42. visionB :: Ballena →Vision
∆ : Z = radioV isionB(b : Ballena)
P ≡ {True}
Q ≡ {∆ = radioV ision(f isiologia(b))}
43. envejecerB :: Ballena →Ballena, ya especificada en el TPEA
44. perdidaPesoDiarioB :: Ballena →Ballena, ya especificada en el TPEA
45. estaMuertaB :: Ballena →Bool, ya especificada en el TPEA
46. comerB :: Ballena →Krill →Ballena, ya especificada en el TPEA
47. estaEmbarazadaB :: Ballena →Bool, ya especificada en el TPEA
48. parirB :: Ballena →Id →(Ballena, Ballena), ya especificada en el TPEA
49. cuantoFungusGeneraB :: Ballena →Fungus
∆ : CantFungus = cuantoF ungusGeneraB(b : Ballena)
P ≡ {True}
Q ≡ {∆ = cuantoF ungusGenera(f isiologia(b), peso(b))}

El módulo queda definido de la siguiente manera:


module Ballena ( Ballena, envejecerB, perdidaPesoDiarioB, estaMuertaB, comerB, estaEmbarazadaB,
parirB, nuevaB, idB, pesoB, edadB, fisiologiaB, cuantoFungusGeneraB,
visionB)
where

import Tipos
import FisiologiaBallena
import Krill

data Ballena =...

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:

50. celdaVaciaC :: CantFungus →ProdDiaria →Celda, ya especificada en el TPEA


51. hayKrillC :: Celda →Bool
∆ : B = hayKrillC(c : Celda)
P ≡ {True}
Q ≡ {∆ = hayKrill(c)}
52. hayBallenaC :: Celda →Bool
∆ : B = hayBallenaC(c : Celda)
P ≡ {True}
Q ≡ {∆ = hayBallena(c)}
53. krillC :: Celda →Krill
∆ : Krill = krillC(c : Celda)
P ≡ {hayKrill(c)}
Q ≡ {∆ = krill(c)}
54. ballenaC :: Celda →Ballena
∆ : Ballena = ballenaC(c : Celda)
P ≡ {hayBallena(c)}
Q ≡ {∆ = ballena(c)}
55. cantFungusC :: Celda →CantFungus
∆ : CantFungus = cantF ungusC(c : Celda)
P ≡ {True}
Q ≡ {∆ = cantF ungus(c)}
56. agregarFungusC :: Celda →CantFungus →Celda, ya especificada en el TPEA
57. ponerKrillC :: Celda →Krill →Celda, ya especificada en el TPEA
58. ponerBallenaC :: Celda →Ballena →Celda, ya especificada en el TPEA
59. desocuparC :: Celda →Celda
∆ : Celda = desocuparC(c : Celda)
P ≡ {hayKrill(c) ∨ hayBallena(c)}
Q ≡ {prodDiaria(∆) = prodDiaria(c)∧cantF ungus(∆) = cantF ungus(c)∧¬(hayBallena(∆))∧
¬(hayKrill(∆))}
60. libreC :: Celda →Bool
∆ : B = libreC(c : Celda)
P ≡ {True}
Q ≡ {∆ = ¬hayBallena(c) ∧ ¬hayKrill(c)}
61. ocupadaC :: Celda →Bool
∆ : B = ocupadaC(c : Celda)
P ≡ {True}
Q ≡ {∆ = hayBallena(c) ∨ hayKrill(c)}
62. prodDiariaC :: Celda →ProdDiaria
∆ : CantFungus = prodDiariaC(c : Celda)
P ≡ {True}
Q ≡ {∆ = prodDiaria(c)}
63. producirFungusC :: Celda →Celda, ya especificada en el TPEA
64. krillComeFungusC :: Celda →Celda, ya especificada en el TPEA
65. ballenaEnvejeceC :: Celda →Celda
∆ : Celda = ballenaEnvejeceC(c : Celda)
P ≡ {hayBallena(c)}
Q ≡ {prodDiaria(∆) = prodDiaria(c) ∧ cantF ungus(∆) = cantF ungus(c) ∧ hayBallena(∆) ∧
edad(ballena(∆)) = edad(ballena(c)) + 1 ∧ idBallena(ballena(∆)) = idBallena(ballena(c)) ∧
f isiologia(ballena(∆)) = f isiologia(ballena(c)) ∧ peso(ballena(∆)) = peso(ballena(c))}
66. ballenaPierdePesoDiarioC :: Celda →Celda

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)}

restoCeldaIgual(c1 : Celda, c2 : Celda) ≡


{cantF ungus(c1) = cantF ungus(c2) ∧ (hayKrill(c2) → hayKrill(c1) ∧ Krill(c1) =
Krill(c2)) ∧ (hayBallena(c2) → hayBallena(c1) ∧ Ballena(c1) = Ballena(c2))}

El módulo queda definido de la siguiente manera:


module Celda (Celda, celdaVaciaC, hayKrillC, hayBallenaC, krillC, ballenaC, cantFungusC,
ponerKrillC, ponerBallenaC, desocuparC, agregarFungusC, libreC, ocupadaC,
prodDiariaC, producirFungusC, krillComeFungusC, ballenaEnvejeceC,
ballenaPierdePesoDiarioC,cambiarProduccionDiariaC)
where

import Tipos
import Krill
import Ballena

type CantFungus = Int


type ProdDiaria = Int

data Celda =...

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:

68. nuevoT :: Int →Int →Toroide


∆ : Toroide = nuevoT (rod, porc : Z)
P ≡ {rod > 0 ∧ porc > 0}
Q ≡ {rodajas(∆) = rod ∧ porciones(∆) = porc ∧ x(↑ (∆)) = 0 ∧ y(↑ (∆)) = 0}
69. rodajasT :: Toroide →Int
∆ : Z = rodajasT (tor : T oroide)
P ≡ {True}
Q ≡ {∆ = rodajas(tor)}
70. porcionesT :: Toroide →Int
∆ : Z = porcionesT (tor : T oroide)
P ≡ {True}
Q ≡ {∆ = porciones(tor)}
71. origenT :: Toroide →Int
∆ : Z = porcionesT (tor : T oroide)
P ≡ {True}

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)}

El módulo queda definido de la siguiente manera:


module Toroide (Direccion(..), Coordenada(..), Toroide, nuevoT, rodajasT, porcionesT, contieneT, origenT,
vecinaT, distanciaMinimaT, direccionesQueMeAcercanT, primeraDirecQueMeAcercaT)

where

8. Tipo Superficie
El tipo Toroide se define como:
data Superficie = S Toroide (Diccionario Coordenada Celda)

Se pide implementar:

74. nuevaS :: Toroide →Superficie


∆ : Superficie = nuevaS(tor : T oroide)
P ≡ {True}
Q ≡ {f orma(∆) = tor ∧ (∀c : Coordenada) contiene(tor, c) → (cantF ungus(celda(∆,  c)) =
0 ∧ prodDiaria(celda(∆, c)) = 0 ∧ ¬hayKrill(celda(∆, c)) ∧ ¬hayBallena(celda(∆, c))) }
75. ponerBallenaS :: Superficie →Coordenada →Ballena →Superficie
∆ : Superficie = ponerBallenaS(sup : Superf icie, c : Coordenada, b : Ballena)
P ≡ {contiene(f orma(sup), c) ∧ ¬hayKrill(celda(sup, c)) ∧ ¬hayBallena(celda(sup, c)) ∧
M ayorIdBallenaQueElRestoB(sup, b)}
Q ≡ {f orma(∆) = f orma(sup) ∧ RestoIgual(sup, ∆, c) ∧ hayBallena(celda(∆, c)) ∧
ballena(celda(∆, c)) = b}
76. ponerKrillS :: Superficie →Coordenada →Krill →Superficie
∆ : Superficie = ponerKrillS(sup : Superf icie, c : Coordenada, k : Krill)
P ≡ {contiene(f orma(sup), c) ∧ ¬hayKrill(celda(sup, c)) ∧ ¬hayBallena(celda(sup, c)) ∧
M ayorIdKrillQueElRestoK(sup, k)}
Q ≡ {f orma(∆) = f orma(sup) ∧ RestoIgual(sup, ∆, c) ∧ hayKrill(celda(∆, c)) ∧
krill(celda(∆, c)) = k}
77. agregarFungusS :: Superficie →Coordenada →Fungus →Superficie
∆ : Superficie = ponerKrillS(sup : Superf icie, c : Coordenada, k : Krill)
P ≡ {contiene(f orma(sup), c) ∧ F ungus ≥ 0}
Q ≡ {f orma(∆) = f orma(sup) ∧ RestoIgual(sup, ∆, c) ∧ cantF ungus(celda(∆, c)) =
cantF ungus(celda(sup, c)) + cant ∧ 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))) ∧ prodDiaria(celda(∆, c)) = prodDiaria(celda(sup, c))}
78. producirFungusS :: Superficie →Coordenada →Superficie, ya especificada en el TPEA
79. krillComeFungusS :: Superficie →Coordenada →Superficie, ya especificada en el TPEA
80. ballenaEnvejeceS :: Superficie →Coordenada →Superficie, ya especificada en el TPEA
81. ballenaConsumeEnergiasS :: Superficie →Coordenada →Superficie, ya especificada en el TPEA
82. formaS :: Superficie →Toroide
∆ : Toroide = f ormaS(sup : Superf icie)
P ≡ {True}
Q ≡ {∆ = f orma(sup)}
83. libreS :: Superficie →Coordenada →Bool
∆ : B = libreS(sup : Superf icie, c : Coordenada)
P ≡ {contiene(f orma(sup), c)}

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) }

EsM ayorIdBallenaSup(sup : Superf icie, id : Id) ≡


{(∀b : Ballena)(EstaBallenaEnSup(sup, b) → id > idBallena(b)}

EsM ayorIdKrillSup(sup : Superf icie, id : Id) ≡


{(∀k : Krill)(EstaKrillEnSup(sup, b) → id > idKrill(k)}

M ayorIdKrillQueElRestoK(sup : Superf icie, k : Krill) ≡


{(∀otraK : Krill)(EstaKrillEnSup(otraK, sup) → idKrill(otraK) < idKrill(k))}

M ayorIdBallenaQueElRestoB(sup : Superf icie, b : Ballena) ≡


{(∀otraB : Ballena)(EstaBallenaEnSup(otraB, sup) → idBallena(otraB) < idBallena(b))}

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.

El módulo queda definido de la siguiente manera:


module Superficie ( Superficie, nuevaS, ponerBallenaS, ponerKrillS, agregarFungusS, producirFungusS,
krillComeFungusS, ballenaEnvejeceS, ballenaConsumeEnergiasS, formaS, libreS,
ocupadaS, cantidadFungusS, produccionDiariaS, celdaS, reemplazarCeldaS, krillS,
ballenaS, cantidadKrillS, hayKrillS, hayBallenaS, cambiarProduccionDiariaS,
desocuparS, definidoBS, definidoKS, definicionBS, definicionKS, dondeBS,
dondeKS, maximoIdBS, maximoIdKS )
where

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:

104. producidFungusMN :: Superficie →Superficie


∆ : Superficie = producidF ungusM N (sup : Superf icie)
P ≡ {True}
Q ≡ {f orma(∆) = f orma(sup) ∧ CrecerF ungus(sup, ∆)}
105. moverUnaVezBallenaYKrillMN::Superficie→Superficie
∆ : Superficie = moverU naV ezBallenaY KrillM N (sup : Superf icie)
P ≡ {True}
Q ≡ {f orma(∆) = f orma(sup) ∧ moverBichos(sup, ∆)}
106. sinCadaveresMN::Superficie→Superficie
∆ : Superficie = SinCadaveresM N (sup : Superf icie)
P ≡ {True}
Q ≡ {f orma(∆) = f orma(sup) ∧ SinCadaveres(sup, ∆)}

Adicionalmente se pide que demuestren la terminación de la función producidFungusMN :: Superficie →Superficie


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.
Dentro del módulo Relocalizador deberán especificar y demostrar la terminación de la función
limpiarKrillesR:: Relocalizador →DondeQuiereIr →Superficie →Superficie, asumiendo que todas las auxi-
liares utilizadas terminan, pero deberán especificar aquellas funciones que no lo estuviesen.

El módulo queda definido de la siguiente manera:


module MadreNaturaleza (producidFungusMN, moverUnaVezBallenaYKrillMN, sinCadaveresMN)
where

import Tipos
import FisiologiaKrill
import FisiologiaBallena
import Krill
import Ballena
import Celda
import Toroide
import NavegadorToroide
import Diccionario
import Superficie
import Relocalizador

10

También podría gustarte