Document

Anuncio
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
[email protected]. 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
Descargar