1. Tipos 2. Cebra

Anuncio
A continuación se presenta la especificación de la cátedra para resolver el RTPF.
1.
Tipos
tipo
tipo
tipo
tipo
tipo
tipo
tipo
Cantidad = R ;
Distancia = Z ;
Edad = Z ;
Peso = R ;
Tasa = R ;
Posicion = (Z,Z) ;
Dia = Domingo, Lunes, Martes, Miércoles, Jueves, Viernes ;
2.
Cebra
tipo Cebra {
observador peso (c: Cebra) : Peso ;
observador edad (c: Cebra) : Edad ;
invariante pesoPositivo : peso(c) > 0 ;
invariante edadPositiva : edad(c) ≥ 1 ;
}
problema nuevaC (p: Peso, e: Edad) = result : Cebra {
requiere p > 0 ;
requiere e ≥ 1 ;
asegura peso(result) == p ;
asegura edad(result) == e ;
}
problema pesoC (c: Cebra) = result : Peso {
asegura result == peso(c) ;
}
problema edadC (c: Cebra) = result : Edad {
asegura result == edad(c) ;
}
problema estaDesnutridaC (c: Cebra, t : Tasa) = result : Bool {
requiere t > 0 ;
asegura result == estaDesnutridaCebra(c, t) ;
}
problema estaEmbarazadaC (c: Cebra, p: Peso) = result : Bool {
requiere p > 0 ;
asegura result == estaEmbarazadaCebra(c, p) ;
}
problema crecerC (c: Cebra) = result : Cebra {
asegura peso(result) == peso(c) ;
asegura edad(result) == edad(c) + 1 ;
}
problema comerC (c: Cebra, cantPasto:Cantidad) = result : Cebra {
requiere cantP asto ≥ 0 ;
asegura peso(result) == pesoDspDComer(c, cantP asto) ;
asegura edad(result) == edad(c) ;
}
problema parirC (c: Cebra, pcria: Peso, pembarazo: Peso) = result : (Cebra, Cebra) {
requiere pcria > 0 ∧ pembarazo > pcria ;
requiere estaEmbarazadaCebra(c, pembarazo) ;
asegura peso(prm(result)) == pembarazo − pcria ;
asegura edad(prm(result)) == edad(c) ;
asegura peso(sgd(result)) == pcria ;
1
asegura edad(sgd(result)) == 1 ;
}
2
3.
Leon
tipo Leon {
observador peso (l: Leon) : Peso ;
observador edad (l: Leon) : Edad ;
observador esperanzaDeVida (l: Leon) : Edad ;
invariante pesoPositivo : peso(l) > 0 ;
invariante edadPositiva : edad(l) ≥ 1 ;
invariante noSuperaEsperanzaDeVida : edad(l) ≤ esperanzaDeV ida(l) ;
}
problema nuevoL (p: Peso, e: Edad, v: Edad) = result : Leon {
requiere p > 0 ;
requiere e ≥ 1 ;
requiere e ≤ v ;
asegura peso(result) == p ;
asegura edad(result) == e ;
asegura esperanzaDeV ida(result) == v ;
}
problema pesoL (l: Leon) = result : Peso {
asegura result == peso(l) ;
}
problema edadL (l: Leon) = result : Edad {
asegura result == edad(l) ;
}
problema esperanzaDeVidaL (l: Leon) = result : Edad {
asegura result == esperanzaDeV ida(l) ;
}
problema estaDesnutridoL (l: Leon, t: Tasa) = result : Bool {
requiere t > 0 ;
asegura result == estaDesnutridoLeon(l, t) ;
}
problema estaEmbarazadoL (l: Leon, p: Peso) = result : Bool {
requiere p > 0 ;
asegura result == estaEmbarazadoLeon(l, p) ;
}
problema crecerL (l: Leon) = result : Leon {
requiere edad(l) < esperanzaDeV ida(l) ;
asegura peso(result) == peso(l) ;
asegura edad(result) == edad(l) + 1 ;
asegura esperanzaDeV ida(result) == esperanzaDeV ida(l) ;
}
problema comerL (l: Leon, pesoCebras: Peso) = result : Leon {
requiere pesoCebras ≥ 0 ;
asegura peso(result) == peso(l) + pesoCebras/2 ;
asegura edad(result) == edad(l) ;
asegura esperanzaDeV ida(result) == esperanzaDeV ida(l) ;
}
problema parirL (l: Leon, pcria: Peso, pembarazo: Peso) = result : (Leon, Leon) {
requiere pcria > 0 ∧ pembarazo > pcria ;
requiere estaEmbarazadoLeon(l, pembarazo) ;
asegura peso(prm(result)) == pembarazo − pcria ;
asegura edad(prm(result)) == edad(l) ;
asegura esperanzaDeV ida(prm(result)) == esperanzaDeV ida(l) ;
asegura peso(sgd(result)) == pcria ;
asegura edad(sgd(result)) == 1 ;
asegura esperanzaDeV ida(sgd(result)) == esperanzaDeV ida(l) + 1 ;
3
}
4
4.
Mundo Toroidal
tipo MundoToroidal {
observador dimensiones (m: MundoToroidal) : (Z, Z) ;
observador cantPasto (m: MundoToroidal, p: Posicion) : Cantidad ;
requiere enRango(m, p) ;
observador crecimientoSemanalPasto (m: MundoToroidal, p: Posicion) : Cantidad ;
requiere enRango(m, p) ;
observador cantMateriaOrganica (m: MundoToroidal, p: Posicion) : Cantidad ;
requiere enRango(m, p) ;
observador capacidadAbsorcionMateriaOrganica (m: MundoToroidal, p: Posicion) : Tasa ;
requiere enRango(m, p) ;
invariante dimensionesPositivas : prm(dimensiones(m)) > 0 ∧ sgd(dimensiones(m)) > 0 ;
invariante pastoNoNegativo : (∀p ← posicionesV alidas(m))cantP asto(m, p) ≥ 0 ;
invariante crecimientoSemanalPastoNoNegativo :
(∀p ← posicionesV alidas(m))crecimientoSemanalP asto(m, p) ≥ 0 ;
invariante materiaOrganicaNoNegativa : (
(∀p ← posicionesV alidas(m))cantM ateriaOrganica(m, p) ≥ 0 ;
invariante capAbsorcionNoNegativa :
(∀p ← posicionesV alidas(m))capacidadAbsorcionM ateriaOrganica(m, p) ≥ 0 ;
}
problema nuevoM (cantFil: Z, cantCol: Z, fact: [(Cantidad, Tasa)], pasto: Cantidad) = result : MundoToroidal {
requiere 0 < cantF il ∧ 0 < cantCol ;
requiere |f act| == cantF il × cantCol ;
requiere (∀t ← f act)(prm(t) ≥ 0 ∧ sgd(t) ≥ 0) ;
requiere pasto ≥ 0 ;
asegura dimensiones(result) == (cantF il, cantCol) ;
asegura (∀p ← posicionesV alidas(result))cantM ateriaOrganica(result, p) == 0 ∧
cantP asto(result, p) == pasto ∧
crecimientoSemanalP asto(result, p) == prm(f act[f ila(p) × cantCol + columna(p)]) ∧
capacidadAbsorcionM ateriaOrganica(result, p) == sgd(f act[f ila(p) × cantCol + columna(p)]) ;
}
problema dimensionesM (m: MundoToroidal) = result : (Z,Z) {
asegura result == dimensiones(m) ;
}
problema cantPastoM (m: MundoToroidal, pos: Posicion) = result : Cantidad {
requiere enRango(m, pos) ;
asegura result == cantP asto(m, pos) ;
}
problema crecimientoSemanalPastoM (m: MundoToroidal, pos: Posicion) = result : Cantidad {
requiere enRango(m, pos) ;
asegura result == crecimientoSemanalP asto(m, pos) ;
}
problema cantMateriaOrganicaM (m: MundoToroidal, pos: Posicion) = result : Cantidad {
requiere enRango(m, pos) ;
asegura result == cantM ateriaOrganica(m, pos) ;
}
problema capacidadAbsorcionMateriaOrganicaM (m: MundoToroidal, pos: Posicion) = result : Tasa {
requiere enRango(m, pos) ;
asegura result == capacidadAbsorcionM ateriaOrganica(m, pos) ;
}
problema quemaDePastizalesM (m: MundoToroidal) = result : MundoToriodal {
asegura dimensiones(result) == dimensiones(m) ;
asegura (∀p ← posicionesV alidas(result))
crecimientoSemanalP asto(result, p) == crecimientoSemanalP asto(m, p) ∧
cantM ateriaOrganica(result, p) == cantM ateriaOrganica(m, p) ∧
capacidadAbsorcionM ateriaOrganica(result, p) == capacidadAbsorcionM ateriaOrganica(m, p) ;
5
asegura (∀p ← posicionesV alidas(result))cantP asto(result, p) == minCantP asto(m) ;
}
problema distanciaM (m: MundoToroidal, desde: Posicion, hasta: Posicion) = result : Distancia {
requiere enRango(m, desde) ;
requiere enRango(m, hasta) ;
asegura result == distanciaM T (m, desde, hasta) ;
}
problema modificarCantMateriaOrganicaM (m: MundoToroidal, pos: Posicion, c: Cantidad) = result : MundoToriodal {
requiere enRango(m, pos) ;
requiere c ≥ 0 ;
asegura dimensiones(result) == dimensiones(m) ;
asegura (∀p ← posicionesV alidas(result))
cantP asto(result, p) == cantP asto(m, p) ∧
crecimientoSemanalP asto(result, p) == crecimientoSemanalP asto(m, p) ∧
capacidadAbsorcionM ateriaOrganica(result, p) == capacidadAbsorcionM ateriaOrganica(m, p) ;
asegura (∀p ← posicionesV alidas(result), p 6= pos)cantM ateriaOrganica(result, p) == cantM ateriaOrganica(m, p) ;
asegura cantM ateriaOrganica(result, p) == c ;
}
problema modificarCantPastoM (m: MundoToroidal, pos: Posicion, c: Cantidad) = result : MundoToriodal {
requiere enRango(m, pos) ;
requiere c ≥ 0 ;
asegura dimensiones(result) == dimensiones(m) ;
asegura (∀p ← posicionesV alidas(result))
cantM ateriaOrganica(result, p) == cantM ateriaOrganica(m, p) ∧
crecimientoSemanalP asto(result, p) == crecimientoSemanalP asto(m, p) ∧
capacidadAbsorcionM ateriaOrganica(result, p) == capacidadAbsorcionM ateriaOrganica(m, p) ;
asegura (∀p ← posicionesV alidas(result), p 6= pos)cantP asto(result, p) == cantP asto(m, p) ;
asegura cantP asto(result, pos) == c ;
}
6
5.
Ecosistema
tipo Ecosistema {
observador habitat (e: Ecosistema) : MundoToroidal ;
observador cebras (e: Ecosistema, p: Posicion) : [Cebra] ;
requiere enRango(habitat(e), p) ;
observador hayLeon (e: Ecosistema, p: Posicion) : Bool ;
requiere enRango(habitat(e), p) ;
observador leon (e: Ecosistema, p: Posicion) : Leon ;
requiere enRango(habitat(e), p) ∧ hayLeon(e, p) ;
observador diaActual (e: Ecosistema) : Dia ;
observador tasaDesnutricionCebras (e: Ecosistema) : Tasa ;
observador tasaDesnutricionLeones (e: Ecosistema) : Tasa ;
observador pesoEmbarazoCebras (e: Ecosistema) : Peso ;
observador pesoEmbarazoLeones (e: Ecosistema) : Peso ;
observador pesoInicialCebras (e: Ecosistema) : Peso ;
observador pesoInicialLeones (e: Ecosistema) : Peso ;
invariante tasaDesnutricionCebrasPositivo : tasaDesnutricionCebras(e) > 0 ;
invariante tasaDesnutricionLeonesPositivo : tasaDesnutricionLeones(e) > 0 ;
invariante pesoEmbarazoCebrasPositivo : pesoEmbarazoCebras(e) > 0 ;
invariante pesoEmbarazoLeonesPositivo : pesoEmbarazoLeones(e) > 0 ;
invariante pesoInicialCebrasPositivo : pesoInicialCebras(e) > 0 ;
invariante pesoInicialLeonesPositivo : pesoInicialLeones(e) > 0 ;
invariante noNacenCebrasEmbarazadas : pesoInicialCebras(e) < pesoEmbarazoCebras(e) ;
invariante noNacenLeonesEmbarazados : pesoInicialLeones(e) < pesoEmbarazoLeones(e) ;
invariante noHayLeonesYCebrasJuntos : (∀p ← posicionesV alidas(habitat(e)))
(hayLeon(e, p) → ¬hayCebraEnP os(e, p)) ;
invariante domingoOK : hoyEs(e, Domingo) →
noHayM ateriaOrganica(e) ∧ noHayCebrasEmbarazadas(e) ∧
noHayLeonesEmbarazados(e) ∧ noHayDesnutridos(e)) ;
invariante lunesOK : hoyEs(e, Lunes) → noHayCebrasEmbarazadas(e) ∧ noHayDesnutridos(e) ;
invariante martesOK : hoyEs(e, M artes) → noHayCebrasEmbarazadas(e) ∧ noHayDesnutridos(e) ;
invariante miercolesOK : hoyEs(e, M iercoles) → noHayDesnutridos(e) ;
invariante juevesOK : hoyEs(e, Jueves) →
noHayCebrasEmbarazadas(e) ∧ noHayLeonesEmbarazados(e) ;
invariante viernesOK : hoyEs(e, V iernes) →
noHayCebrasEmbarazadas(e) ∧ noHayLeonesEmbarazados(e) ∧ noHayDesnutridos(e) ;
}
problema bigBangE (m: MundoToroidal, cs: [(Cebra,Posicion)], ls: [(Leon,Posicion)], tDC, tDL : Tasa ,
pEC, pEL, pIC, pIL : Peso ) = result : Ecosistema {
requiere sonP osicionesV alidas(m, cs) ;
requiere sonP osicionesV alidas(m, ls) ;
requiere noHayMateriaOrganica : (∀p ← posicionesV alidas(m))cantM ateriaOrganica(m, p) == 0 ;
requiere sinCebrasDesnutridas : (∀c ← cs)¬estaDesnutridaCebra(prm(c), tDC) ;
requiere sinLeonesDesnutridos : (∀l ← ls)¬estaDesnutridoLeon(prm(l), tDL) ;
requiere unLeonPorCelda : (∀i, j ← [0..longitud(ls)), i 6= j)sgd(lsi ) 6= sgd(lsj ) ;
requiere noHayCebrasEmbarazadas : (∀c ← cs)¬estaEmbarazadaCebra(prm(c), pEC) ;
requiere noHayLeonesEmbarazados : (∀l ← ls)¬estaEmbarazadoLeon(prm(l), pEL) ;
requiere tasasYPesosPositivos : tDC > 0 ∧ tDL > 0 ∧ pEC > 0 ∧ pEL > 0 ∧ pIC > 0 ∧ pIL > 0 ;
requiere nadieNaceEmbarazado : pIC < pEC ∧ pIL < pEL ;
requiere noHayLeonesYCebrasJuntos : (∀posl ← segundas(ls))posl ∈
/ segundas(cs) ;
asegura habitat(result) == m ;
asegura (∀p ← posicionesV alidas(m))mismos(cebras(result, p), lasCebrasDe(cs, p)) ;
asegura (∀p ← posicionesV alidas(m))hayLeon(result, p) == hayLeonEn(ls, p) ;
asegura (∀p ← posicionesV alidas(m), hayLeon(ls, p))leon(result, p) == elLeonDe(ls, p) ;
asegura diaActual(result) == Domingo ;
asegura tasaDesnutricionCebras(result) == tDC ;
asegura tasaDesnutricionLeones(result) == tDL ;
asegura pesoEmbarazoCebras(result) == pEC ;
asegura pesoEmbarazoLeones(result) == pEL ;
asegura pesoInicialCebras(result) == pIC ;
asegura pesoInicialLeones(result) == pIL ;
7
aux elLeonDe (ls: [(Leon,Posicion)], pos: Posicion) : Leon = cab([prm(l)|l ← ls, sgd(l) == pos]) ;
aux hayLeonEn (ls:[(Leon, Posicion)], pos: Posicion) : Bool = (∃p ← segundas(ls))p == pos ;
aux lasCebrasDe (cs: [(Cebra,Posicion)], pos: Posicion) : [Cebra] = [prm(c)|c ← cs, sgd(c) == pos] ;
}
problema habitatE ( e: Ecosistema ) = result : MundoToroidal {
asegura result == habitat(e) ;
}
problema cebrasE ( e: Ecosistema, p: Posicion) = result : [Cebra] {
requiere enRango(habitat(e), p) ;
asegura mismos(result, cebras(e, p)) ;
}
problema hayLeonE ( e: Ecosistema, p: Posicion) = result : Bool {
requiere enRango(habitat(e), p) ;
asegura result == hayLeon(e, p) ;
}
problema leonE ( e: Ecosistema, p: Posicion) = result : Leon {
requiere enRango(habitat(e), p) ;
requiere hayLeon(e, p) ;
asegura result == leon(e, p) ;
}
problema diaActualE ( e: Ecosistema ) = result : Dia {
asegura result == diaActual(e) ;
}
problema tasaDesnutricionCebrasE ( e: Ecosistema ) = result : Tasa {
asegura result == tasaDesnutricionCebras(e) ;
}
problema tasaDesnutricionLeonesE ( e: Ecosistema ) = result : Tasa {
asegura result == tasaDesnutricionLeones(e) ;
}
problema pesoEmbarazoCebrasE ( e: Ecosistema ) = result : Peso {
asegura result == pesoEmbarazoCebras(e) ;
}
problema pesoEmbarazoLeonesE ( e: Ecosistema ) = result : Peso {
asegura result == pesoEmbarazoLeones(e) ;
}
problema pesoInicialCebrasE ( e: Ecosistema ) = result : Peso {
asegura result == pesoInicialCebras(e) ;
}
problema pesoInicialLeonesE ( e: Ecosistema ) = result : Peso {
asegura result == pesoInicialLeones(e) ;
}
problema mejorPastizalE (e: Ecosistema, pO: Posicion) = result : Posicion {
requiere enRango(habitat(e), pO) ;
asegura result == elM ejorP astizal(e, [ p | p ← posicionesAlcanzables(e, p0), ¬hayLeon(e, p) ]) ;
}
problema moverCebrasE ( e: Ecosistema ) = result : Ecosistema {
requiere diaActual(e) == Lunes ;
asegura diaActual(result) == M artes ;
asegura lasConstantesN oCambian(result, e) ;
asegura habitat(result) == habitat(e) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
mismos(cebras(result, p), cebrasEnN uevaP os(e, p)) ∧
hayLeon(result, p)) ↔ hayLeon(e, p) ∧
hayLeon(result, p)) → leon(result, p) == leon(e, p) ;
8
aux cebrasEnNuevaPos (e: Ecosistema, pos: Posicion) : [Cebra] =
concat[cebras(e, origen(p))|p ← posicionesV iejasY N uevas(e), destino(p) == pos] ;
aux posicionesViejasYNuevas (e: Ecosistema) : [(Posicion, Posicion)] =
[(p, nuevaP osicion(e, p))|p ← posicionesV alidas(habitat(e)), |cebras(e, p)| > 0] ;
aux nuevaPosicion (e: Ecosistema, pOrigen: Posicion) : Posicion =
elM ejorP astizal(e, [ p | p ← posicionesAlcanzables(e, pOrigen), ¬hayLeon(e, p) ]) ;
}
problema alimentarCebrasE ( e: Ecosistema ) = result : Ecosistema {
requiere diaActual(e) == M artes ;
asegura diaActual(result) == M iercoles ;
asegura lasConstantesN oCambian(result, e)) ;
asegura dimensiones(habitat(e)) == dimensiones(habitat(result)) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
crecimientoSemanalP asto(habitat(e), p) == crecimientoSemanalP asto(habitat(result), p) ∧
cantM ateriaOrganica(habitat(e), p) == cantM ateriaOrganica(habitat(result), p) ∧
capacidadAbsorcionM ateriaOrganica(habitat(e), p) == capacidadAbsorcionM ateriaOrganica(habitat(result), p) ;
asegura (∀p ← posicionesV alidas(habitat(result)))hayLeon(e, p) ↔ hayLeon(result, p) ;
asegura (∀p ← posicionesV alidas(habitat(result)), hayLeon(result, p))leon(result, p) == leon(e, p) ;
asegura cebrasAlimentadas(e, result)) ;
aux cebrasAlimentadas (pe, e: Ecosistema) : Bool =
((∀p ← posicionesV alidas(habitat(e)), hayCebraEnP os(pe, p))
cebrasComenP asto(pe, e, p) ∧ cantP asto(habitat(e), p) == 0) ∧
((∀p ← posicionesV alidas(habitat(e)), ¬hayCebraEnP os(pe, p))
¬hayCebraEnP os(e, p) ∧ cantP asto(habitat(pe), p) == cantP asto(habitat(e), p)) ;
aux cebrasComenPasto (pe, e: Ecosistema, p: Posicion) : Bool =
|cebras(pe, p)| == |cebras(e, p)| ∧
(∀pc ← cebras(pe, p))(∃c ← cebras(e, p))
asto(habitat(pe),p)
(peso(c) == peso(pc) + cantP
cantCebrasEnP os(pe,p) ∧ edad(c) == edad(pc) ∧
cuenta(pc, cebras(pe, p)) == cuenta(c, cebras(e, p))) ;
}
problema reproducirE ( e: Ecosistema ) = result : Ecosistema {
requiere diaActual(e) == M iercoles ;
asegura diaActual(result) == Jueves ;
asegura lasConstantesN oCambian(result, e) ;
asegura dimensiones(habitat(e)) == dimensiones(habitat(result)) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
(cantP asto(habitat(e), p) == cantP asto(habitat(result), p) ∧
crecimientoSemanalP asto(habitat(e), p) == crecimientoSemanalP asto(habitat(result), p) ∧
capacidadAbsorcionM ateriaOrganica(habitat(e), p) == capacidadAbsorcionM ateriaOrganica(habitat(result), p)) ;
asegura habitatConM asM ateriaOrganica(e, e) ;
asegura cantidadDeCebrasCorrecta :
|todasLasCebras(e)| + |todasLasCebrasEmbarazadas(e)| == |todasLasCebras(result)| ;
asegura (∀p ← posicionesV alidas(habitat(e)), ¬hayCebraEmbarazada(e, p))
mismos(cebras(e, p), cebras(result, p)) ;
asegura (∀p ← posicionesV alidas(habitat(e)), hayCebraEmbarazada(e, result))
aparecenLasCrias(e, result, p)) ∧ lasN oEmbarazadasConOtroP esoQuedan(e, result, p) ∧
lasN oEmbarazadasConP esoQuedanY AdelgazanLasEmbarazadas(e, result, p) ;
asegura cantidadDeLeonesCorrecta :
|todosLosLeones(e)| + |posLeonesEmbarazadosP uedenP arir(e)| − cantCriasExplotadas(e) −
|posLeonesEmbarazadosN oP uedenP arir(e)| == |todosLosLeones(result)| ;
asegura losLeonesNoEmbarazadosQuedanIgual :
(∀p ← posicionesV alidas(habitat(e)), hayLeon(e, p) ∧
¬estaEmbarazadoLeon(leon(e, p), pesoEmbarazoLeones(e)))hayLeon(result, p) ∧ leon(e, p) == leon(result, p) ;
asegura losEmbarazadosQueNoPudieronParirExplotan :
(∀p ← posicionesV alidas(habitat(e)), hayLeon(e, p) ∧
estaEmbarazadoLeon(leon(e, p), pesoEmbarazoLeones(e)) ∧ ¬puedeP arirL(e, p))¬hayLeon(result, p) ;
asegura losLeonesEmbarazadosQuePudieronParirTuvieronCria :
(∀p ← posLeonesEmbarazadosP uedenP arir(e))
hayLeonM asF laco(e, result, p) ∧
(((posCriaLeon(e, p) ∈
/ posConM asDeU naCria(e)) →
9
hayCriaLeon(e, result, posCriaLeon(e, p), p)) ∧
(posCriaLeon(e, p) ∈ posConM asDeU naCria(e) → ¬hayLeon(result, posCriaLeon(e, p)))) ;
asegura enElRestoDeLasPosicionesNoHayLeones :
(∀p ← posicionesV alidas(habitat(e)), ¬hayLeon(e, p) ∧ noEsP osibleLugarDeP arto(p, e))
¬hayLeon(result, p) ;
aux todasLasCebrasEmbarazadas (e: Ecosistema) : [Cebra] =
[ c | c ← todasLasCebras(e), estaEmbarazadaCebra(c, pesoEmbarazoCebras(e)) ] ;
aux noEsPosibleLugarDeParto (p: Posicion, e: Ecosistema) : =
p∈
/ [posCriaLeon(e, pos)|pos ← posLeonesEmbarazadosP uedenP arir(e)] ;
aux habitatConMasMateriaOrganica (pe, e: Ecosistema) : Bool = (∀p ← posicionesV alidas(habitat(e)))
cantM ateriaOrganica(habitat(e), p) == cantM ateriaOrganica(habitat(pe), p) +
materiaP orLeonesExplotados(pe, e, p) ;
aux hayCebraEmbarazada (e: Ecosistema, p: Posicion) : Bool =
(∃c ← cebras(e, p))estaEmbarazadaCebra(c, pesoEmbarazoCebras(e)) ;
aux hayLeonMasFlaco (pe, e: Ecosistema, p: Posicion) : Bool =
hayLeon(e, p) ∧ edad(leon(pe, p)) == edad(leon(e, p)) ∧
esperanzaDeV ida(leon(e, p)) == esperanzaDeV ida(leon(pe, p)) ∧
peso(leon(e, p)) == pesoEmbarazoLeones(e) − pesoInicialLeones(e) ;
aux materiaPorLeonesExplotados (pe, e: Ecosistema, p: Posicion) : Cantidad =
beta(p ∈ posLeonesEmbarazadosN oP uedenP arir(pe)) × peso(leon(pe, p)) +
beta(p ∈ posConM asDeU naCria(pe)) × pesosCriasExplotadas(pe, p) ;
aux beta (b : bool) : Z = if b then 1 else 0 ;
aux lasQueNoConflictuanQuedan (pe, e: Ecosistema, p: Posicion) : Bool =
mismos(noConf lictuan(pe, p), noConf lictuan(e, p)) ;
aux noConflictuan (e: Ecosistema, p : Posicion) : [Cebra] = [ c | c ← cebras(e, p), peso(c) 6= pesoInicialCebras(e) ∧
peso(c) 6= pesoEmbarazoCebra(e) − pesoInicialCebra(e) ] ;
aux aparecenLasCrias (pe, e: Ecosistema, p: Posicion) : Bool =
|[ c | c ← cebras(e, p), peso(c) == pesoInicialCebras(e) ∧ edad(c) == 1 ]| ==
cantCebrasEmbarazadas(pe, p) + |[ c | c ← cebras(pe, p), peso(c) == pesoInicialCebras(e) ∧ edad(c) == 1 ]| ;
aux lasNoEmbarazadasConOtroPesoQuedan (pe, e: Ecosistema, p: Posicion) : Bool =
(∀c ← cebras(pe, p), ¬estaEmbarazadaCebra(pe, pesoEmbarazoCebras(pe)) ∧
peso(c) 6= pesoEmbarazoCebras(e) − pesoInicialCebras(e))
c ∈ cebras(e, p) ∧ cuenta(c, cebras(e, p)) == cuenta(c, cebras(pe, p)) ;
aux lasNoEmbarazadasConPesoQuedanYAdelgazanLasEmbarazadas (pe, e: Ecosistema, p: Posicion) : Bool =
(∀pc ← cebrasEmbarazadas(pe, p) ++cebrasN oEmbarazadasConP esoF ijo(pe, p))
((∃c ← cebras(e, p))edad(c) == edad(pc) ∧ peso(c) == pesoEmbarazoCebras(e) − pesoInicialCebras(e) ∧
cuenta(c, cebras(e, p)) == cuenta(pc, cebras(pe, p))) ;
aux cebrasNoEmbarazadasConPesoFijo (e: Ecosistema, p: Posicion) : Z =
[ c | c ← cebras(e, p), ¬estaEmbarazadaCebra(e, pesoEmbarazoCebras(e)) ∧
peso(c) == pesoEmbarazoCebras(e) − pesoInicialCebras(e) ] ;
aux cebrasEmbarazadas (e: Ecosistema, p: Posicion) : [Cebra] =
[ c | c ← cebras(e, p), estaEmbarazadaCebra(e, pesoEmbarazoCebras(e)) ] ;
aux cantCebrasEmbarazadas (e: Ecosistema, p: Posicion) : Z = |cebrasEmbarazadas(e, p)| ;
aux hayCriaLeon (pe, e: Ecosistema, posHijo, posPadre: Posicion) : Bool =
hayLeon(e, posHijo) ∧ edad(leon(e, posHijo)) == 1 ∧ peso(leon(e, posHijo)) == pesoInicialLeones(e) ∧
esperanzaDeV ida(leon(e, posHijo)) == esperanzaDeV ida(leon(pe, posP adre)) + 1 ;
auxPcantCriasExplotadas (pe: Ecosistema) : Cantidad =
[ cuenta(p, posicionesT odasLasCrias(pe)) | p ← posConM asDeU naCria(pe) ] ;
aux pesosCriasExplotadas (pe: Ecosistema, p: Posicion) : Peso =
cuenta(p, posicionesT odasLasCrias(pe)) × pesoInicialLeones(pe) ;
aux posConMasDeUnaCria (pe: Ecosistema) : [Posicion] =
[ p | p ← posicionesT odasLasCrias(pe), cuenta(p, posicionesT odasLasCrias(pe)) > 1 ] ;
aux posicionesTodasLasCrias (pe: Ecosistema) : [Posicion] =
[ posCriaLeon(pe, p) | p ← posLeonesEmbarazadosP uedenP arir(pe) ] ;
aux posLeonesEmbarazadosPuedenParir (pe: Ecosistema) : [Posicion] =
[ p | p ← posicionesV alidas(habitat(pe)), hayLeon(pe, p) ∧
estaEmbarazadoLeon(leon(pe, p), pesoEmbarazoLeones(pe)) ∧ puedeP arirL(pe, p) ] ;
aux posLeonesEmbarazadosNoPuedenParir (pe: Ecosistema) : [Posicion] =
[ p | p ← posicionesV alidas(habitat(pe)), hayLeon(pe, p) ∧
estaEmbarazadoLeon(leon(pe, p), pesoEmbarazoLeones(pe)) ∧ ¬puedeP arirL(pe, p) ] ;
aux posCriaLeon (pe: Ecosistema, p: Posicion) : Posicion =
cab([ v | v ← posV ecinas(pe, p), estaLibre(pe, p) ]) ;
}
10
problema crecerAnimalesE ( e: Ecosistema ) = result : Ecosistema {
requiere diaActual(e) == Jueves ;
asegura diaActual(result) == V iernes ;
asegura lasConstantesN oCambian(result, e) ;
asegura dimension(habitat(result)) == dimension(habitat(e)) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
crecimientoSemanalP asto(habitat(e), p) == crecimientoSemanalP asto(habitat(result), p) ∧
cantP asto(habitat(e), p) == cantP asto(habitat(result), p) ∧
capacidadAbsorcionM ateriaOrganica(habitat(e), p) == capacidadAbsorcionM ateriaOrganica(habitat(result), p) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
cantM ateriaOrganica(habitat(result), p) == cantM ateriaOrganica(habitat(e), p) +
elP esoDelLeonSiEsQueM uere(e, p) +
elP esoDeLasCebrasQueM ueran(e, p) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
|cebras(result, p)| == |cebras(e, p)| − cuantasCebrasM ueren(e, p) ∧
((∀c ← cebras(e, p), ¬muereCebra(e, c))
((∃cp ← cebras(result, p))peso(cp) == peso(c) ∧ edad(cp) == edad(c) + 1 ∧
cuenta(c, cebras(e, p)) == cuenta(cp, cebras(result, p)))) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
hayLeon(result, p) ↔ hayLeon(e, p) ∧ ¬muereLeon(e, leon(e, p)) ;
asegura (∀p ← posicionesV alidas(habitat(result))), hayLeon(result, p))
peso(leon(result, p)) == peso(leon(e, p)) ∧
edad(leon(result, p)) == edad(leon(e, p)) + 1 ∧
esperanzaDeV ida(leon(result, p)) == esperanzaDeV ida(leon(e, p)) ;
aux elPesoDelLeonSiEsQueMuere (e: Ecosistema, p : Posicion) : Z =
if hayLeon(e, p) ∧ muereLeon(leon(e, p)) then peso(leon(e, p)) else 0 ;
auxPelPesoDeLasCebrasQueMueran (e: Ecosistema, p : Posicion) : Z =
[ peso(c) | c ← cebras(e, p), muereCebra(e, c) ] ;
}
11
problema posMejorPresaE (e: Ecosistema, pO: Posicion) = result : Posicion {
requiere enRango(habitat(e), pO) ;
requiere hayCebras(e) ;
asegura result ∈ posicionesV alidas(habitat(e)) ∧ hayCebraEnP os(e, result) ∧
esLaP osDeLaP resaM asCercana(e, pO, result) ;
}
problema crecerPastoE ( e: Ecosistema ) = result : Ecosistema {
requiere diaActual(e) == V iernes ;
asegura diaActual(result) == Domingo ;
asegura lasConstantesN oCambian(result, e) ;
asegura dimension(habitat(result)) == dimension(habitat(e)) ;
asegura (∀p ← posicionesV alidas(habitat(result)))
crecimientoSemanalP asto(habitat(e), p) == crecimientoSemanalP asto(habitat(result), p) ∧
capacidadAbsorcionM ateriaOrganica(habitat(e), p) == capacidadAbsorcionM ateriaOrganica(habitat(result), p) ;
asegura (∀p ← posicionesV alidas(habitat(result)))cantM ateriaOrganica(habitat(result), p) == 0 ;
asegura (∀p ← posicionesV alidas(habitat(result)))
cantP asto(habitat(result), p) == cantP asto(habitat(e), p) + incrementoP asto(habitat(e), p) ;
asegura (∀p ← posicionesV alidas(habitat(result)))mismos(cebras(result, p), cebras(e, p)) ;
asegura (∀p ← posicionesV alidas(habitat(result)))hayLeon(result, p) ↔ hayLeon(e, p) ;
asegura (∀p ← posicionesV alidas(habitat(result)), hayLeon(result, p))leon(result, p) == leon(e, p) ;
}
12
6.
Auxiliares
6.1.
aux
aux
aux
aux
aux
aux
aux
aux
aux
Tipos Básicos
min (e1, e2: Z) : Z = if e1 < e2 then e1 else e2 ;
primeras (ls: [(T1,T2)]) : [T1] = [prm(x)|x ← ls] ;
segundas (ls: [(T1,T2)]) : [T2] = [sgd(x)|x ← ls] ;
fila (p: Posicion) : Z = prm(p) ;
columna (p: Posicion) : Z = sgd(p) ;
origen (p: Posicion) : Z = prm(p) ;
destino (p: Posicion) : Z = sgd(p) ;
origen (posOyD: (Posicion, Posicion)) : Posicion = prm(posOyD) ;
destino (posOyD: (Posicion, Posicion)) : Posicion = sgd(posOyD) ;
6.2.
Tipo Cebra
aux pesoDspDComer (c:Cebra, cantPasto:Cantidad) : Peso = peso(c) + cantP asto ;
aux estaEmbarazadaCebra (c: Cebra, p: Peso) : Bool = peso(c) ≥ p ;
peso(c)
< t;
aux estaDesnutridaCebra (c: Cebra, t: Tasa) : Bool = edad(c)
6.3.
Tipo Leon
aux estaEmbarazadoLeon (l: Leon, p: Peso) : Bool = peso(l) ≥ p ;
peso(l)
aux estaDesnutridoLeon (l: Leon, t: Tasa) : Bool = edad(l)
< t;
6.4.
Tipo MundoToroidal
aux enRango (m: MundoToroidal, p: Posicion) : Bool =
0 ≤ prm(p) < prm(dimensiones(m)) ∧ 0 ≤ sgd(p) < sgd(dimensiones(m)) ;
aux posicionesValidas (m: MundoToroidal) : [Posicion] =
[ (i, j) | i ← [0..prm(dimensiones(m))), j ← [0..sgd(dimensiones(m))) ] ;
aux sonPosicionesValidas (m: MundoToroidal, ls: [(T,Posicion)]) : Bool = (∀l ← ls)enRango(m, sgd(l)) ;
aux distanciaMT (m: MundoToroidal, d: Posicion, h: Posicion) : Distancia =
distanciaF ilas(m, f ila(d), f ila(h)) + distanciaColumnas(m, columna(d), columna(h)) ;
aux distanciaFilas (m: MundoToroidal, fd, fh: Z) : Distancia =
min((f d − f h) %prm(dimensiones(m)) , (f h − f d) %prm(dimensiones(m))) ;
aux distanciaColumnas (m: MundoToroidal, cd, ch: Z) : Distancia =
min((cd − ch) %sgd(dimensiones(m)) , (ch − cd) %sgd(dimensiones(m))) ;
aux posVecinas (m: MundoToriodal, p: Posicion) : [Posicion] = [norte(m, p)] ++[este(m, p)] ++[sur(m, p)] ++[oeste(m, p)] ;
aux norte (m: MundoToriodal, p: Posicion) : Posicion = ((prm(p) − 1) %prm(dimensiones(m)), sgd(p)) ;
aux sur (m: MundoToriodal, p: Posicion) : Posicion = ((prm(p) + 1) %prm(dimensiones(m)), sgd(p)) ;
aux este (m: MundoToriodal, p: Posicion) : Posicion = (prm(p), (sgd(p) + 1) %sgd(dimensiones(m))) ;
aux oeste (m: MundoToriodal, p: Posicion) : Posicion = (prm(p), (sgd(p) − 1) %sgd(dimensiones(m))) ;
aux incrementoPasto (m: MundoToroidal, p: Posicion) : Cantidad =
crecimientoSemanalP asto(m, pos) + cantM ateriaOrganica(m, pos) × capacidadAbsorcionM ateriaOrganica(m, pos) ;
aux minCantPasto (m: MundoToroidal) : Cantidad =
cab([cantP asto(m, p)|p ← posicionesV alidas(p), esLaQueT ieneM enosP asto(m, p)]) ;
aux esLaQueTieneMenosPasto (m: MundoToroidal, pos: Posicion) : Bool =
(∀p ← posicionesV alidas(m))cantP asto(m, pos) ≤ cantP asto(m, p) ;
6.5.
Tipo Ecosistema
aux cantCebrasEnPos (e: Ecosistema, p: Posicion) : Z = |cebras(e, p)| ;
aux hayCebraEnPos (e: Ecosistema, p: Posicion) : Bool = cantCebrasEnP os(e, p) > 0 ;
aux hoyEs (e: Ecosistema, d: Dia) : Bool = (diaActual(e) == d) ;
aux noHayCebrasEmbarazadas (e: Ecosistema) : Bool =
(∀c ← todasLasCebras(e))¬estaEmbarazadaC(c, pesoEmbarazoCebras(e)) ;
aux noHayLeonesEmbarazados (e: Ecosistema) : Bool =
(∀l ← todosLosLeones(e))¬estaEmbarazadoLeon(l, pesoEmbarazoLeones(e)) ;
aux noHayDesnutridos (e: Ecosistema) : Bool = noHayCebrasDesnutridas(e) ∧ noHayLeonesDesnutridos(e) ;
aux noHayCebrasDesnutridas (e: Ecosistema) : Bool =
(∀c ← todasLasCebras(e))¬estaDesnutridaCebra(c, tasaDesnutricionCebras(e)) ;
aux noHayLeonesDesnutridos (e: Ecosistema) : Bool =
(∀l ← todosLosLeones(e))¬estaDesnutridoLeon(l, tasaDesnutricionLeones(e)) ;
13
aux noHayMateriaOrganica (e: Ecosistema) : Bool =
(∀p ← posicionesV alidas(habitat(e)))cantM ateriaOrganica(habitat(e), p) == 0 ;
aux todasLasCebras (e: Ecosistema) : [Cebra] = concat([ cebras(e, p) | p ← posicionesV alidas(habitat(e)) ]) ;
aux todosLosLeones (e: Ecosistema) : [Leon] = [ leon(e, p) | p ← posicionesV alidas(p), hayLeon(e, p) ] ;
aux hayCebras (e: Ecosistema) : Bool = (∃p ← posicionesV alidas(habitat(e)))hayCebraEnP os(e, p) ;
aux puedeParirL (e: Ecosistema, p: Posicion) : Bool = (∃v ← posV ecinas(habitat(e), p))estaLibre(e, p) ;
aux estaLibre (e:Ecosistema, p: Posicion) : Bool = |cebras(e, p)| == 0 ∧ ¬hayLeon(e, p) ;
aux esLaPosDeLaPresaMasCercana (e: Ecosistema, pLeon, pPresa: Posicion) : Bool =
(∀p ← posicionesV alidas(habitat(e)), hayCebraEnP os(e, p))
distanciaM T (habitat(e), pP resa, pLeon) ≤ distanciaM T (habitat(e), p, pLeon) ;
aux lasConstantesNoCambian (e, pe: Ecosistema) : Bool =
tasaDesnutricionCebras(e) == tasaDesnutricionCebras(pe) ∧
tasaDesnutricionLeones(e) == tasaDesnutricionLeones(pe) ∧
pesoEmbarazoCebras(e) == pesoEmbarazoCebras(pe) ∧
pesoEmbarazoLeones(e) == pesoEmbarazoLeones(pe) ∧
pesoInicialCebras(e) == pesoInicialCebras(pe) ∧
pesoInicialLeones(e) == pesoInicialLeones(pe) ;
aux posicionesAlcanzables (e: Ecosistema, pos: Posicion) : [Posicion] = posV ecinas(habitat(e), pos) ++[pos] ;
aux muereLeon (e: Ecosistema, l: Leon) : Bool = muereP orV iejo(l) ∨ muereDesnutridoL(e, l) ;
aux muerePorViejo (l: Leon) : Bool = edad(l) + 1 > esperanzaDeV ida(l) ;
peso(l)
< tasaDesnutricionLeones(e)) ;
aux muereDesnutridoL (e: Ecosistema, l: Leon) : Bool = ( edad(l)+1
peso(c)
< tasaDesnutricionCebras(e)) ;
aux muereCebra (e: Ecosistema, c: Cebra) : Bool = ( edad(c)+1
aux cuantasCebrasMueren (e: Ecosistema, p: Posicion) : Z = |[ c | c ← cebras(e, p), muereCebra(e, c) ]| ;
aux elMejorPastizal (e: Ecosistema, ps : [Posicion]) : Posicion =
[ p | p ← ps, cantP asto(e, p) == maxCantP asto(e, ps) ]0 ;
aux maxCantPasto (e: Ecosistema, ps : [Posicion]) : Cantidad = max([ cantP asto(e, p) | p ← ps ]) ;
aux edadesC (cs : [Cebra]) : [Z] = [ edad(c) | c ← cs ] ;
14
Descargar