Cursos‎ > ‎Sábados Mañana - Anual‎ > ‎

Tp3 Lógico

Paradigma Lógico - TP 3

Plants vs. Zombies

Dr. 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)]