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