Paradigma Lógico - TP 3 Plants vs. ZombiesDr. Zombossā Revenge
Y sĆ... el Dr. Zomboss no iba a quedarse con las ganas y estĆ” de vuelta por las aulas de paradigmas buscando venganza. Pero no porque venga un zombie en un robot de 10 metros nos vamos a amedrentar, porque seguimos teniendo a las protectoras plantas de nuestro lado.
Las plantas pueden ser terrestres o acuƔticas. planta(tierra,peaShooter(1)). planta(tierra,peaShooter(2)). planta(tierra,seaShooter(3)). planta(tierra,puffShroom). planta(tierra,wallNut(10)). planta(tierra,wallNut(20)). planta(tierra,cactus). planta(agua,tangleKelp). planta(agua,seaShroom).
Para poder comprar las plantas, tenemos un presupuesto dado en soles.
- Se sabe que un peaShooter cuesta 100 soles por cada disparo que hace por turno. Un peaShooter(2), por tanto, cuesta 200 soles.
- Un puffShroom cuesta 5 soles.
- Un wallNut cuesta 50 soles mƔs el valor de su resistencia.
- Una planta acuƔtica cuesta 25 soles.
- Un cactus cuesta 125 soles.
El tipo de terreno sobre el que se puede plantar puede ser tierra, agua o techo.
Por otra parte, tambiĆ©n tenemos dos plantas particulares, que vamos a modelar con functores: lilyPad/1, que es una planta acuĆ”tica que soporta a otra planta terrestre, y maceta/1 (sĆ, es una planta tambiĆ©n) que se puede plantar Ćŗnicamente sobre un techo y tambiĆ©n soporta a una planta terrestre. En definitiva:
- En tierra se puede plantar cualquier planta terrestre.
- En agua se puede plantar cualquier planta acuƔtica, mƔs una planta terrestre sobre un lilyPad.
- En techo se puede plantar cualquier planta terrestre, pero siempre debe ser sobre una maceta.
Se pide desarrollar los predicados que cumplan con las siguientes necesidades, creƔndolos en forma inversible a menos que se indique lo contrario.
1) Ā Agregar al programa las plantas que surgen de las combinaciones que se pueden dar para el lillyPad y la maceta respetando las reglas anteriores. Por ejemplo, si queremos saber las plantas que se pueden plantar en el agua: ?- planta(agua,Planta). Planta = tangleKelp <;> Planta = seaShroom <;> Planta = lilyPad(peaShooter(1)) <;> (porque peaShooter(1) es una planta terrestre que se puede plantar sobre un lilyPad y el lilyPad puede ir en el agua) Planta = lilyPad(peaShooter(2)) <;> ... Si ahora queremos saber las plantas que se pueden plantar sobre el techo: ?- planta(techo,Planta). Planta = maceta(peaShooter(2)) <;> Planta = maceta(cactus) <;> ...
2) Saber cual es el costo en soles de una planta. Tener en cuenta que el lilyPad y la maceta salen 30 soles por sà mismas mÔs lo que salga la planta que esta encima de ellas. No considerar el lilyPad ni la maceta sin nada encima como una opción vÔlida. ?- costo(maceta(peaShooter(1)), Costo).Costo = 130 <;> No
3) Relacionar un terreno con una planta que pueda ir en Ʃl y su valor en soles. Por ejemplo, se verifica la siguiente consulta: ?- puedePlantarse(agua, lilyPad(wallNut(10)), 90). Ya que el wallNut es de tierra, pero se puede plantar sobre un lilyPad en agua, y ademƔs el lilyPad cuesta 30 soles + 50 de base del wallNut + 10 por su resistencia.
4) Una lĆnea de plantas representa una fila de plantas de nuestro jardĆn con el tipo de terreno de esa fila, lo vamos a modelar con el functor linea/2, por ejemplo: linea(tierra,[cactus, peaShooter(3), puffShroom]). Sabiendo esto, se pide:
4.a) Saber si una lĆnea estĆ” bien armada, esto pasa cuando todas las plantas que tiene esa lĆnea corresponden con el tipo de terreno de la misma. Por ejemplo, la siguiente consulta NO se verifica: ?- bienArmada(linea(techo, [maceta(cactus), maceta(wallNut), puffShroom, maceta(seaShroom)])). Si bien las primeras plantas son de techo (porque estĆ”n sobre una maceta), el puffShroom no puede plantarse sobre un techo sin una maceta, ni un seaShroom puede plantarse en una maceta porque no es terrestre.
4.b) Saber si es creciente, teniendo en cuenta el costo de soles de las plantas. Ejemplo, la siguiente consulta NO se verifica, porque las primeros 2 plantas tienen costos crecientes (un cactus sale 125 y un peaShooter(3) sale 300), pero la Ćŗltima tiene un valor menor (5). ?- esCreciente(linea(tierra,[cactus, peaShooter(3), puffShroom])).
5) Dada una lĆnea de plantas, determinar su valor en soles. Por ejemplo, se verifica la siguiente consulta: ?- valor(linea(agua, [tangleKelp, lilyPad(peaShooter(2)), seaShroom]), 280).
6) Relacionar un presupuesto y un terreno con cada combinación de plantas posible que puede comprarse para plantar en ese terreno. Debe considerarse cualquier combinación que no supere este presupuesto, pero todas las plantas incluidas deben ser aptas para ese terreno. Por ejemplo, las siguientes tres consultas deben verificarse: ?- enQueInvierto(10, tierra, []). ?- enQueInvierto(10, tierra, [puffShroom]). ?- enQueInvierto(10, tierra, [puffShroom, puffShroom]). Tip: Recordar que siempre puedo no plantar nada, y también puedo plantar plantas por un valor total menor o igual al presupuesto restante.
”””Cierto que era āvs. Zombiesā!!!
Tenemos los siguientes zombies: zombie(tierra, flagZombie). zombie(tierra, footballZombie). zombie(agua, dolphinRiderZombie). zombie(agua, snorkelZombie). zombie(aire, balloonZombie).
7) Queremos saber si un zombie puede ser atacado por una planta, y esto ocurre cuando ambos son del mismo medio (ambos terrestres o ambos acuƔticos), o bien cuando el zombie es aƩreo y la planta es un cactus. Por ejemplo, se verifican las siguientes dos consultas. ?- puedeSerAtacadoPor(balloonZombie, cactus). ?- puedeSerAtacadoPor(snorkelZombie, tangleKelp).
8) Desarrollar el predicado āqueTePashaDrShombossh/2ā, que se verifica para una lista de plantas y una lista de zombies cuando cada planta de la lista puede atacar al zombie que ocupa la misma posición en la otra lista (primero con primero, segundo con segundo, etc.). La siguiente consulta, por ejemplo, se verifica: ?- queTePashaDrShombossh([cactus, puffShroom, tangleKelp], [balloonZombie, flagZombie, snorkelZombie]).
9) Desarrollar el predicado āeshtashNervioshoHumano/2ā que se verifica cuando, dados un presupuesto en soles y una lista de zombies, para cualquier combinación de plantas posible con ese presupuesto ocurre alguna de las siguientes cosas:
- hay menos plantas que zombies,
- hay mƔs zombies aƩreos que cactus,
- no hay mƔs de 2 plantas acuƔticas.
Por ejemplo, con la siguiente consulta, siempre alguna condición de las mencionadas se verifica: ?- eshtashNervioshoHumano(130, [dolphinRiderZombie, balloonZombie, snorkelZombie]). Ya que, con ese presupuesto, existen combinaciones con al menos tantas plantas como zombies y con mÔs de 2 plantas acuÔticas. Pero, si consideramos que se necesita al menos un cactus, entonces el presupuesto restante no alcanza para 3 plantas acuÔticas.
10) Desarrollar el predicado unaQueSirva/3, que relacione una lĆnea y una lista de criterios a cumplir, con una planta de la misma que cumple los criterios dados.
11) Usar el predicado del punto 10 para consultar quĆ© plantas de la lĆnea del ejemplo de 4.a sirven para el terreno del mismo (techo) y pueden atacar a un balloonZombie. No definir nuevos predicados, Ćŗnicamente hacer la consulta. ?- una consulta dónde aparezca: linea(techo, [maceta(cactus), maceta(wallNut), puffShroom, maceta(seaShroom)]) Rta.: Algo = [maceta(cactus)] |