Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 Trabajo Práctico 2 - Programación Lógica Fecha de entrega: Jueves 15 de junio, hasta las 21 hs. Con la cercanı́a del mundial, su tarea es desarrollar programas en Prolog para definir fixtures dados los paı́ses clasificados. Para ello se pide definir los siguientes predicados tomando en cuenta que en ningún caso se deben devolver soluciones repetidas: 1. Ejercicio 1 Definir el predicado grupos(+Ps, +Ids, -Grupos) que es verdadero si dado Ps, una lista de confederaciones (cada confederación se representa, a su vez, como una lista de paı́ses). Por ejemplo, una lista de confederaciones podrı́a ser: [[argentina, brasil], [mejico,canada], [italia, espana], [sudafrica, egipto]] Nota: De aquı́ en más, si se asume que argumento precedido con + tiene determinada forma, no hace falta verificar esto como parte de la solución. Por ejemplo, en el caso de Ps no hace falta verificar que es una lista de listas, ni que no tenga paı́ses repetidos. Ids, una lista de identificadores de grupos, Grupos es una lista de grupos, donde cada grupo está representado por el funtor grupo(Id, ListaPaises), es decir el identificador del grupo y la lista de paı́ses que la componen. Cada paı́s e identificador de grupo se representa con un átomo. La lista de paı́ses del grupo tiene que cumplir algunas restricciones con respecto a la cantidad y el orden de los paı́ses que lo componen: 1. Dada una confederación (ie. una lista de paı́ses), cada grupo tiene la misma cantidad de paı́ses de la misma (eso no quiere decir que todas las confederaciones tienen la misma cantidad de paı́ses). Puede asumir que la longitud i de cada confederación es tal que j divide a i, donde j es la cantidad de identificadores de grupos. 2. En cuanto al orden sobre confederaciones y paı́ses (y con la finalidad de reducir el número de combinaciones) se establece lo siguiente: a) Los paı́ses dentro de cada grupo, respetan el orden original dado por los paı́ses de la lista de confederaciones. Por ejemplo, dado la lista [c1, c2, c3] de confederaciones, no es posible que aparezca en un grupo un paı́s de la confederación c2 y luego uno de la confederación c1. b) En cambio, los paı́ses de cada confederación deben primero ordenarse alfabéticamente usando el predicado sort antes de ser procesados. Por ejemplo, si una de las confederaciones es [brasil, argentina, chile] y sort([brasil, argentina, chile], [argentina, brasil, chile]) Página 1 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 entonces en un grupo cualquiera no es posible que aparezca brasil antes que argentina. 3. Todos los grupos tienen igual cantidad de paı́ses. 4. La lista de paı́ses de cada confederación no necesariamente viene ordenada en relación al predicado sort 5. El orden de la lista de grupos debe respetar el orden dado por la lista de identificadores. Por ejemplo, si Ids es [1, 2, 3], primero debe estar el grupo 1, luego el 2 y finalmente el 3. 6. Los grupos deben contener todos los identificadores y los paı́ses de las distintas confederaciones. Ejemplos: Suponiendo que contamos con los hechos y reglas paises([[argentina, brasil], [mejico,canada], [italia, espana], [sudafrica, egipto]]). ids([a, b]). testGrupo(Gs) :- paises(Ps), ids(Ids), grupos(Ps, Ids, Gs). un ejemplo de interacción con el intérprete podrı́a ser ?- testGrupo(Gs) Gs = [grupo(a, [argentina, canada, espana, egipto]), grupo(b, [brasil, mejico, italia, sudafrica])] ; Gs = [grupo(a, [argentina, canada, espana, sudafrica]), grupo(b, [brasil, mejico, italia, egipto])] ; Gs = [grupo(a, [argentina, canada, italia, egipto]), grupo(b, [brasil, mejico, espana, sudafrica])] ; Gs = [grupo(a, [argentina, canada, italia, sudafrica]), grupo(b, [brasil, mejico, espana, egipto])] ; Gs = [grupo(a, [argentina, mejico, espana, egipto]), grupo(b, [brasil, canada, italia, sudafrica])] ; Gs = [grupo(a, [argentina, mejico, espana, sudafrica]), grupo(b, [brasil, canada, italia, egipto])] ; Gs = [grupo(a, [argentina, mejico, italia, egipto]), grupo(b, [brasil, canada, espana, sudafrica])] ; Gs = [grupo(a, [argentina, mejico, italia, sudafrica]), grupo(b, [brasil, canada, espana, egipto])] ; Gs = [grupo(a, [brasil, canada, espana, egipto]), grupo(b, [argentina, mejico, italia, sudafrica])] ; Gs = [grupo(a, [brasil, canada, espana, sudafrica]), grupo(b, [argentina, mejico, italia, egipto])] ; Gs = [grupo(a, [brasil, canada, italia, egipto]), grupo(b, [argentina, mejico, espana, sudafrica])] ; Gs = [grupo(a, [brasil, canada, italia, sudafrica]), Página 2 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 grupo(b, Gs = [grupo(a, grupo(b, Gs = [grupo(a, grupo(b, Gs = [grupo(a, grupo(b, Gs = [grupo(a, grupo(b, No 2. [argentina, mejico, espana, egipto])] ; [brasil, mejico, espana, egipto]), [argentina, canada, italia, sudafrica])] ; [brasil, mejico, espana, sudafrica]), [argentina, canada, italia, egipto])] ; [brasil, mejico, italia, egipto]), [argentina, canada, espana, sudafrica])] ; [brasil, mejico, italia, sudafrica]), [argentina, canada, espana, egipto])] ; Ejercicio 2 El defecto del predicado grupos del ejercicio anterior, tal como fue especificado, es que permite la generación de listas de grupos redundantes. Por ejemplo, la segunda lista de grupos, a saber Gs = [grupo(a, [argentina, canada, espana, sudafrica]), grupo(b, [brasil, mejico, italia, egipto])] ; y la anteúltima, a saber Gs = [grupo(a, [brasil, mejico, italia, egipto]), grupo(b, [argentina, canada, espana, sudafrica])] ; difieren solamente en el nombre de los grupos. El presente ejercicio propone definir un predicado que excluya a tales permutaciones de grupos. En cuanto a cuál de las dos retornar, la respuesta es cualquiera de las dos. Lo importante es que se retorne solamente una de ellas. Se pide, entonces, definir el predicado gruposSinRepetidos(+Ps, +N, -Grupos) que es verdadero si dado Ps, una lista de lista de paı́ses (de distintas confederaciones) y N, la cantidad de paı́ses por grupo, Grupos es una lista de lista de paı́ses que representa los paı́ses de cada grupo (a diferencia del predicado anterior, sin funtores grupo(Id, ListaPaises)). Los paı́ses dentro de cada grupo deben respetar las restricciones del predicado anterior, pero no deben devolverse soluciones que contengan permutaciones de grupos. Se sugiere la utilización del predicado grupos definido en el punto anterior. Ejemplo: Suponiendo que testGruposSinRepetidos(Gs) :- paises(Ps), gruposSinRepetidos(Ps, 4, Gs). un ejemplo de interacción con el intérprete serı́a: Página 3 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 ?- testGruposSinRepetidos(Gs) Gs = [[argentina, canada, espana, egipto], [brasil, mejico, italia, sudafrica]] ; Gs = [[argentina, canada, espana, sudafrica], [brasil, mejico, italia, egipto]] ; Gs = [[argentina, canada, italia, egipto], [brasil, mejico, espana, sudafrica]] ; Gs = [[argentina, canada, italia, sudafrica], [brasil, mejico, espana, egipto]] ; Gs = [[argentina, mejico, espana, egipto], [brasil, canada, italia, sudafrica]] ; Gs = [[argentina, mejico, espana, sudafrica], [brasil, canada, italia, egipto]] ; Gs = [[argentina, mejico, italia, egipto], [brasil, canada, espana, sudafrica]] ; Gs = [[argentina, mejico, italia, sudafrica], [brasil, canada, espana, egipto]] ; No 3. Ejercicio 3 Definir el predicado clasificadosGrupos(+N, +Es, +Grupo,-Clasificados) que es verdadero si dado N la cantidad de clasificados, Es, una lista con la estadı́stica de resultados posibles (ver descripción debajo) y Grupo, un grupo definido con el funtor grupo(Id, ListaPaises), Clasificados es una lista de paı́ses correspondientes a Grupo que clasifican. Es debe ser una lista de pares ganador(P1, P2) que indica el resultado entre ambos paı́ses. Tener en cuenta que se asume que no pueden haber empates cada partido ganado aporta 1 punto al ganador deben estar definidas todas la combinaciones posibles de acuerdo a los paı́ses de Grupo sólo hay un resultado posible para cada combinación Obsevar que pueden darse dos situaciones en los que puede haber más de una lista que represente el mismo conjunto de equipos clasificados de tamaño N (por empates en la cantidad de puntos obtenidos) 1. Si hay dos o más paı́ses en el conjunto de equipos clasificados de tamaño N con la misma cantidad de puntos, debe informarse una sola de las posibilidades (por ejemplo, priorizando la lista de clasificados que respeta el orden en que aparecen en el grupo). Página 4 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 2. Todas las permutaciones de los paı́ses que no figuran en el conjunto de equipos clasificados de tamaño N generan una lista diferente. Dichas permutaciones no deben tenerse en cuenta. Ejemplos: Considerando que G = (grupo(1, [argentina, mejico, italia, sudafrica]) Es = [ganador(argentina,mejico), ganador(argentina,italia), ganador(argentina,sudafrica),ganador(italia,mejico), ganador(italia,sudafrica), ganador(sudafrica,mejico)] una posible interacción con el intérprete serı́a -? clasificadosPorGrupo(2, Es, Gs = [argentina, italia] ; No G, Gs) Observar que [italia, argentina] también serı́a posible (clasifican ambas). Pero esta solución no se reporta dado que es redundante (tal como se explicó arriba se prioriza [argentina,italia] pues respeta el orden en el que estos paı́ses figuran en el grupo). Si, en cambio, alteramos las estadı́sticas del siguiente modo Es = [ganador(argentina,mejico), ganador(italia, argentina), ganador(argentina,sudafrica), ganador(mejico,italia), ganador(italia,sudafrica), ganador(sudafrica,mejico)] la interacción con el intérprete pasa a ser la siguiente -? clasificadosPorGrupo(1, Es, Gs = [argentina] ; Gs = [italia] ; No 4. G, Gs) Ejercicio 4 Definir el predicado jugarMundial(+Ps, +Ids, +N, +Es, -Grupos, -GanadoresGrupos, -Rondas, -Ganador) que es verdadero si dado Ps, una lista de listas de paı́ses (de distintas confederaciones), Ids, una lista de identificadores de grupos, N, la cantidad de clasificados por grupo, Es, una lista con la estadı́stica de resultados posibles, Página 5 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 Grupos, es una lista de Grupos, GanadoresGrupos, es una lista de lista de paı́ses con los equipos clasificados de cada grupo, Rondas, es una lista que contiene las rondas finales del mundial y Ganador, es el paı́s ganador del mundial. Una ronda está representada por el funtor ronda(N, ListaPartidos), donde N es el número que identifica una ronda (desde 1 correspondiente a la ronda subsiguiente a la etapa de los grupos hasta M la final) y ListaPartidos es una lista de partidos. Cada partido está representado por el funtor partido(Pais1, Pais2). Para generar el fixture de las rondas finales deben tenerse en cuenta las siguientes consideraciones: 1. En la primer ronda deben enfrentarse los paı́ses de grupos x consecutivos según Ids. Es decir si Ids es [id1, id2,..., idn] deben enfrentarse paı́ses de id1 con id2, id3 con id4, etc. 2. En la primer ronda, de los equipos clasificados de cada grupo, deben enfrentarse los mejores de cada grupo contra los peores del otro grupo. Es decir, dados dos grupos g1 y g2 el primero de g1 contra el último clasificado de g2, el segundo de g1 contra el antepenúltimo clasificado de g2, etc. 3. Luego de la primera ronda, ronda(1, ListaPartidos), el orden de los partidos del resto de las rondas hasta la final del mundial, está dado por los ganadores consecutivos de la ronda anterior. Es decir, en la 2da ronda ronda, si ronda(1, [p1, p2, .., pn]) deben enfrentarse el ganador de p1 contra p2, de p3 contra p4, etc. Nota: Como se hacen partidos de eliminación directa y tiene que haber un ganador, tiene que cumplirse que: La cantidad de grupos (tamaño de Ids) es mayor o igual a 2 La cantidad de grupos (tamaño de Ids) multiplicado por N (la cantidad de paı́ses clasificados por grupo) tiene que ser potencia de 2 para que en cada ronda se puedan aparear todos los equipos en los partidos correspondientes de la ronda hasta llegar a la final. Ejemplos Considerando Ps = [[argentina, brasil], [mejico,canada]] Ids = [a, b] Es = [ganador(argentina, brasil), ganador(argentina, mejico), ganador(argentina, canada), ganador(brasil, mejico), ganador(brasil, canada), ganador(canada, mejico)] podrı́amos tener la siguiente interacción con el intérprete Página 6 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 -? jugarMundial(Ps, Ids, 2, Es, Grupos, GanadoresGrupos, PartidosRondas, Ganador) Grupos = [grupo(a, [argentina, canada]), grupo(b, [brasil, mejico])] GanadoresGrupos = [[argentina, canada], [brasil, mejico]] PartidosRondas = [ronda(1, [partido(argentina, mejico), partido(canada, brasil)]), ronda(2, [partido(argentina, brasil)])] Ganador = argentina ; Grupos = [grupo(a, [argentina, mejico]), grupo(b, [brasil, canada])] GanadoresGrupos = [[argentina, mejico], [brasil, canada]] PartidosRondas = [ronda(1, [partido(argentina, canada), partido(mejico, brasil)]), ronda(2, [partido(argentina, brasil)])] Ganador = argentina ; Grupos = [grupo(a, [brasil, canada]), grupo(b, [argentina, mejico])] GanadoresGrupos = [[brasil, canada], [argentina, mejico]] PartidosRondas = [ronda(1, [partido(brasil, mejico), partido(canada, argentina)]), ronda(2, [partido(brasil, argentina)])] Ganador = argentina ; Grupos = [grupo(a, [brasil, mejico]), grupo(b, [argentina, canada])] GanadoresGrupos = [[brasil, mejico], [argentina, canada]] PartidosRondas = [ronda(1, [partido(brasil, canada), partido(mejico, argentina)]), ronda(2, [partido(brasil, argentina)])] Ganador = argentina ; No 5. Pautas de entrega Entrega en clase. Se debe entregar el código impreso con la implementación de los predicados pedidos. Además, se debe adjuntar un pequeño informe donde se explique cada predicado definido, aclarando cómo se relaciona, en caso de estarlo, con los demás predicados (por ejemplo, indicando los predicados que hacen referencia a ellos) y cómo interviene en la solución del problema. También se debe explicitar cuáles de los argumentos de los predicados auxiliares deben estar instanciados usando + y -. Entrega electrónica. Junto con el código y el informe impreso, se debe realizar un entrega electrónica. Se debe enviar un mail conteniendo el código fuente Prolog a la dirección ebonelli@dc.uba.ar. Dicho mail debe cumplir con el siguiente formato: El subject debe ser “[PLP;TP-PL]” seguido inmediatamente del nombre del grupo sin acentos. Solamente el código Prolog comentado (no debe incluirse el informe) debe acompañar el mail en forma de attachment1 . El mismo debe poder ejecutarse en SWI-Prolog 1 Notar que esto difiere de la entrega anterior en la que se pedı́a que el código formara parte del cuerpo del mail. Página 7 de 8 Paradigmas de Lenguajes de Programación 1◦ cuatrimestre de 2006 (indicar claramente cómo se debe ejecutar) y debe contar con ejemplos de prueba (debidamente señalados). Importante: Se admitirá una única submisión para la entrega electrónica, sin excepción alguna. Por favor planifiquen el trabajo para llegar a tiempo con la entrega. Página 8 de 8