Document

Transcripción

Document
Paradigmas de Lenguajes de Programación
2o Cuatrimestre de 2005
Trabajo Práctico No 2 - Programación Lógica
Fecha de entrega: Jueves 03/11/2005, hasta las 21 hs.
Enigmas lógicos (Reloaded)
Su tarea es desarrollar un programa en Prolog para resolver en forma genérica algunos juegos de
ingenio aritméticos. Para ello se pide definir los siguientes predicados tomando en cuenta que en
ningún caso se deben devolver soluciones repetidas:
1. juegoTira(+Dominio, +Simbolos, -Estructura,-Resultado), donde Dominio es una lista de
enteros de Prolog sin repetidos de longitud k + 1 , Sı́mbolos ⊆ {+, −, ∗, /}, Estructura es una
lista de la forma [n1 , op1 , n2 , op2 , . . . , opk , nk+1 ] (es decir números intercalados con operadores),
donde ni ∈ Dominio y opi ∈ Sı́mbolos y Resultado es un entero de Prolog. El predicado debe
ser verdadero si
n1 op1 n2 op2 n3 . . . opk nk+1 = Resultado
y en la tira aparecen todos los elementos del dominio exactamente una sóla vez.
Figura 1: Juego de la tira
Ejemplos:
?- juegoTira([1,2,3],[*,+],[2,*,3,+,1],7).
Yes.
?- juegoTira([1,2,3],[*,+],[2,*,Y,+,Z],7).
Y=3 Z=1;
No.
?- juegoTira([1,2,3],[*,+],[2,Op1,1,Op2,3],R).
Op1 = * Op2 = * R = 6 ;
Op1 = * Op2 = + R = 5 ;
Op1 = + Op2 = * R = 9 ;
Op1 = + Op2 = + R = 6 ;
No
2. juegoMatriz(+Dominio, -Op, -Matriz, -LV, -LH) donde Dominio es una lista de enteros de
longitud n2 , Op ∈ {+, −, ∗, /}, Matriz es una matriz de n ∗ n (representada como una lista de
listas), LV y LH son listas de longitud n. El predicado da verdadero cuando:
∀f · 1 ≤ f ≤ n · (Opnc=1 Matriz[f ][c]) = LV[f ] y ∀c · 1 ≤ c ≤ n · (Opnf=1 Matriz[f ][c]) = LH[c]
o sea, la aplicación de la operación Op sobre cada fila f (resp. columna c) debe dar igual al
valor correspondiente a LV [f ] (resp. LH[c]). En Matriz deben aparecen todos los elementos del
dominio exactamente una sóla vez.
Página 1 de 3
Paradigmas de Lenguajes de Programación
2o Cuatrimestre de 2005
Figura 2: Juego de la Matriz
Ejemplos:
?- juegoMatriz([1,2,3,4], +, Matriz, [6,4], LH).
Matriz = [[2, 4], [1, 3]] LH = [3, 7] ;
Matriz = [[2, 4], [3, 1]] LH = [5, 5] ;
Matriz = [[4, 2], [1, 3]] LH = [5, 5] ;
Matriz = [[4, 2], [3, 1]] LH = [7, 3] ;
No
?- juegoMatriz([1,2,3,4], +, Matriz, [6,4], [1,1])
No
3. equivalentes(+Dominio, +Op, -Matriz, -LV, -LH, -M2) donde los primeros 5 parámetros
son idénticos al predicado anterior y M2 es una matriz de igual dimensión que Matriz. Debe ser
verdadero cuando M2 es también una solución (pero es distinta a Matriz) para el juego generado
a partir de Dominio, Op, Matriz, LV y LH.
Ejemplo:
?- equivalentes([1,2,3,4],+,[[2, 1], [3, 4]],LV,LH,M2).
LV = [3, 7] LH = [5, 5] M2 = [[1, 2], [4, 3]] ;
No
4. claseEquivalente(+Dominio, +Op, -Clase) donde Dominio y Op son los mismos parámetros
que el predicado anterior. Este predicado debe ser verdadero cuando Clase es una lista maximal
de matrices equivalentes entre sı́ (en el sentido del ı́tem anterior) considerando todos los juegos
generados a partir de un dominio Dominio y una operación Op.
Ejemplo:
?-claseEquivalente([1,2,3,4],+,Ms).
Ms=[[[1,
Ms=[[[1,
Ms=[[[2,
Ms=[[[3,
2],
4],
3],
2],
[4,
[2,
[4,
[4,
3]],
3]],
1]],
1]],
[[2,
[[2,
[[4,
[[4,
1],
3],
1],
1],
[3,
[1,
[2,
[3,
4]]];
4]]];
3]]];
2]]];
Ms=[[[1,
Ms=[[[1,
Ms=[[[2,
Ms=[[[3,
3],
4],
4],
4],
[4,
[3,
[3,
[2,
2]],
2]],
1]],
1]],
[[3,
[[3,
[[4,
[[4,
1],
2],
2],
3],
[2,
[1,
[1,
[1,
4]]];
4]]];
3]]];
2]]];
Nota: Tener en cuenta que la evaluación de este predicado puede ser muy lenta para matrices
grandes. La recomendación es optar por una solución lo más declarativa posible, independientemente de que no sea practicable testearlo.
Página 2 de 3
Paradigmas de Lenguajes de Programación
2o Cuatrimestre de 2005
Prode con ayudita
Ahora nos interesan los pronósticos deportivos. Contamos con una tabla de posiciones con los resultados de un campeonato de fútbol. Es decir, para cada equipo sabemos cuantos partidos ganó, empató,
perdió, los goles a favor, en contra y el puntaje total.
Esta información viene modelada como una lista de listas, donde cada fila representa la performance
de un equipo. Es decir, su nombre, luego sus partidos ganados, empatados, perdidos, goles a favor, en
contra y su puntaje. Por ejemplo la tabla de la figura es modelada como:
[[e1,1,2,0,4,3,5],[e2,1,1,1,1,1,4],[e3,0,3,0,0,0,3],[e4,0,2,1,3,4,2]]
Figura 3: Tabla de posiciones
1.
Definir el predicado resultados(+M,-LR) donde M, que debe estar intanciada, es una tabla de
posiciones como la descrita en el ejemplo y LR, que no debe estar instanciado, es una lista de
resultados de encuentros donde cada elemento tiene la forma res(ex,ey,gx,gy) donde ex y
ey son los nombres de cada equipo y gx y gy son los correspondientes goles (el resultado del
partido). Tomar en cuenta que todos los equipos deben jugar entre sı́, sin repetir encuentros.
Pueden asumir que la tabla de posiciones está bien confeccionada. Es decir, es completa y
consistente.
Por ejemplo, si M es la tabla dada como ejemplo:
?-resultados(M,LR).
[res(e1, e2, 1, 0), res(e1, e3, 0, 0), res(e1, e4, 3, 3), res(e2, e3, 0, 0),
res(e2, e4, 1, 0), res(e3, e4, 0, 0)];
No
Pautas de entrega
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
con los demás predicados 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.
Junto con el código y el informe impreso, se debe entregar un diskette con el código fuente. El mismo
debe poder consultarse en SWI-Prolog y debe contar con ejemplos de prueba. Indicar claramente cómo
se debe ejecutar el código presentado y los ejemplos de prueba.
Página 3 de 3

Documentos relacionados