Está en la página 1de 4

Paradigmas de Lenguajes de Programacin o 1 cuatrimestre de 2008

Trabajo Prctico 2 - Programacin Lgica a o o Comequesos


Fecha de entrega: jueves 5 de junio, hasta las 21 hs. En este trabajo prctico se debe denir un conjunto de hechos y reglas que nos permitan a conocer propiedades sobre laberintos. Los laberintos slo pueden contener un ratn, gatos y o o pedacitos de queso. El ratn recorre el laberinto comiendo los pedacitos de queso y evitando o encontrarse con los gatos. Si el ratn llega a encontrarse con un gato, muere. Adems, el ratn o a o no puede continuar su recorrido si llega a salirse de los l mites del laberinto. El objetivo de este trabajo prctico es escribir predicados que nos permitan averiguar a propiedades sobre los recorridos que realiza el ratn en el laberinto. o

1.

Laberintos y recorridos

Todos los laberintos deben ser rectangulares y tener al menos una casilla. Cada posicin del o laberinto puede tener de cero a tres paredes a los costados; no se permiten casillas totalmente cerradas. Observar que un laberinto donde algunas de las casillas no tienen paredes tambin e es un laberinto vlido. a Las posiciones en el laberinto se representan mediante un par de nmeros naturales, u comenzando desde cero. Si se considera al laberinto como una matriz, la primera coordenada corresponde al nmero de la la, y la segunda a nmero de la columna. La casilla (0, 0) es la u u esquina noroeste del laberinto y est representada por el primer elemento de la primer lista a del laberinto. Cada posicin del laberinto puede contener un gato o un pedacito de queso, o puede estar o vac La posicin donde comienza el recorrido el ratn se especicar en forma separada a la a. o o a estructura del laberinto.

Figura 1: Un laberinto de ejemplo. Un laberinto se representar con una lista de las. Cada la ser una lista de casillas. Una a a casilla se representar con la siguiente estructura: a casilla(Izq, Arr, Der, Aba, Personaje)
Pgina 1 de 4 a

Paradigmas de Lenguajes de Programacin o 1 cuatrimestre de 2008

Las direcciones Izq, Arr, Der y Aba indican la presencia de paredes en cada una de esas direcciones. La presencia de una pared se indica mediante un 1, y su ausencia, mediante un 0. En Personaje se debe indicar si en la casilla hay un gato o un pedacito de queso, o si est vac Por lo tanto, los valores posibles para Personaje son: gato, queso, vacio. a a. Por ejemplo, si queremos denir el laberinto de la gura anterior, ser a: [[casilla(1,1,0,0,queso), casilla(0,1,1,1,vacio), casilla(1,1,0,0,vacio), ...], ...] El ratn comienza el recorrido desde una posicin dada y a partir de all trata de avanzar o o por el laberinto mientras no se encuentre con un gato o salga del laberinto (en cualquiera de estos casos, naliza el recorrido del ratn). Durante el recorrido, el ratn puede moverse o o hacia arriba, abajo, izquierda o derecha, respetando la estructura del laberinto. Si el ratn se o encuentra en una posicin en la que hay un pedacito de queso, se lo come. o Los recorridos se representan con una lista de posiciones por las que pasa el ratn. El o recorrido incluye la posicin inicial del ratn y la posicin nal. Si el ratn se encuentra con o o o o un gato en una posicin del laberinto, el recorrido concluye en dicha posicin. Un recorrido o o tampoco puede continuar si el ratn sale del laberinto. o Por ejemplo, los siguientes son algunos de los recorridos vlidos en el laberinto de la gura: a [(2,2),(3,2),(4,2)] [(2,2),(3,2),(3,3),(3,4)] [(2,2),(2,3),(2,2),(2,3)] Sale del laberinto Come un queso y lo mata un gato Avanza y vuelve sobre sus pasos

2.

Predicados pedidos

Se pide denir los siguientes predicados, respetando la instanciacin pedida y de tal manera o que no se cuelguen ni se devuelvan soluciones repetidas: 1. esLaberinto(+Laberinto) Este predicado verica que el argumento sea un laberinto vlido. Notar que esto incluye a la vericacin de coherencia entre las paredes de las casillas y que las casillas estn o e vac tengan gatos o pedacitos de queso. as, 2. recorrido(+Laberinto, +PosicionInicial, -Recorrido, -CantQueso) Este predicado verica que el ratn puede realizar un recorrido en un laberinto vlido o a desde la posicin inicial consumiendo exactamente la cantidad de queso indicada. Obo servar que una vez que el ratn consume el queso de una casilla, si vuelve a pasar por o ella ya no hay ms queso que comer en la misma. a Recordar que un recorrido no puede continuar si el ratn sale del laberinto o lo come o un gato.
Pgina 2 de 4 a

Paradigmas de Lenguajes de Programacin o 1 cuatrimestre de 2008

Por otra parte observar que los recorridos pueden ser arbitrariamente largos y eventualmente se deben devolver todos. En otras palabras, este predicado podr tener innitas a soluciones distintas. 3. recorridoSinRepetidos(+Laberinto, +PosicionInicial, -Recorrido, -CantQueso) Igual al predicado anterior pero el ratn no puede pasar dos veces por la misma casilla o en el transcurso del recorrido. En este caso no hay innitos recorridos distintos, por lo tanto el intrprete debe devolver e No cuando ya se hayan presentado todos ellos. 4. comeMucho(+Laberinto, +PosicionInicial, -Recorrido) Este predicado verica que el ratn puede realizar un recorrido sin repetidos en un o laberinto vlido desde la posicin inicial consumiendo la mayor cantidad posible de a o queso. Tal como en el ejercicio anterior, observar que no hay innitos recorridos ya que el ratn o no puede pasar dos veces por el mismo casillero. 5. comeTodo(+Laberinto, +PosicionInicial, -Recorrido) Igual al predicado anterior pero verica adems que el ratn consuma todo el queso del a o laberinto. Nuevamente el ratn no tiene permitido repetir casilleros. o 6. sale(+Laberinto, +PosicionInicial, -Recorrido) Este predicado verica que el ratn puede realizar un recorrido en un laberinto vlido o a desde la posicin inicial hasta salir del mismo. o Tal como en el ejercicio 2, se permite que el ratn repita casilleros, con lo cual puede o haber innitas soluciones. Observar que si el ratn no tiene niguna forma de salir del o laberinto, se debe programar el predicado de forma tal que el intrprete diga no. e

2.1.

Juego adicional (opcional)

meJuegoPor(-N) Este predicado es verdadero si N es el nmero entero por el que se juega el grupo. El grupo u que elija el nmero que resulte ms cercano a la mediana de todos los nmeros elegidos por u a u todos los grupos ser ganador de un premio sorpresa. En caso de empate se eligir al menor a a de ellos y de seguir habiendo empate se sortear un ganador usando una moneda (en caso de a que consigamos una). Por ejemplo: ?- meJuegoPor(N). N = 4 No

Pgina 3 de 4 a

Paradigmas de Lenguajes de Programacin o 1 cuatrimestre de 2008

3.

Condiciones de aprobacin o

El principal objetivo de este trabajo es evaluar el correcto uso del lenguaje PROLOG de forma declarativa para resolver el problema planteado. Se pedir un pequeo informe donde a n se explique cada predicado denido, aclarando cmo se relaciona, en caso de hacerlo, con los o dems predicados (por ejemplo, indicando los predicados que hacen referencia a ellos) y cmo a o interviene en la solucin del problema. Tambin se debe explicitar cules de los argumentos o e a de los predicados auxiliares deben estar instanciados usando + y -. Observar que el ejercicio opcional es opcional.

4.

Pautas de entrega

Se debe entregar el cdigo impreso con la implementacin de los predicados pedidos. Cada o o predicado debe contar con un comentario donde se explique su funcionamiento. Asimismo, se debe enviar un mail conteniendo el cdigo fuente Prolog a la direccin de correo electrnio o o co plp-docentes@dc.uba.ar. Solamente el cdigo Prolog comentado (no debe incluirse o el informe) debe acompaar el mail en forma de archivo adjunto. El mismo debe poder n ejecutarse en SWI-Prolog (indicar claramente cmo se debe ejecutar). o

A.

Algunos predicados y metapredicados denidos en SWIProlog

Esta seccin contiene algunos predicados y metapredicados ya denidos en la actual impleo mentacin de SWI-Prolog que pueden ser de utilidad para el desarrollo de trabajo prctico. o a La descripcin de los mismos la pueden hallar en la ayuda de SWI-Prolog (invocada con el o predicado help). nth0(-N, -List, -Elem) member(-Elem, -List) append(-List1, -List2, -List3) sublist(+Pred, +List1, -List2) subset(+Subset, -Set) maplist(+Pred, -List) maplist(+Pred, -List1, -List2) maplist(+Pred, -List1, -List2, -List3) setof(+Template, +Goal, -Set) not(+Goal)

Pgina 4 de 4 a

También podría gustarte