Trabaj Práctic Prgramación Lógica Paradigmas de Lenguajes de Prgramación 1 cuat. 9 Fecha de entrega: 9 de juni 1. Intrducción Este trabaj cnsiste en prgramar en Prlg un cnjunt de predicads para reslver un rmpecabezas vagamente reminiscente al tetris al pentmin puzzle, sujet a algunas restriccines adicinales. 1.1. Descripción del prblema Se tiene una cuadrícula de n m psicines, y un cnjunt de piezas, frmadas pr cuadradits cntigus (cm piezas de tetris). Cada cuadradit de cada pieza tiene asciad un pes. Tds ls cuadradits de una pieza dada pesan l mism. Dad un cnjunt de piezas, el prblema es encntrar alguna manera de ubicarlas tdas en el tabler, sin encimarlas. Pr ejempl, si se tienen las piezas y el tabler que se muestran en la figura, 6 6 6 1 1 1 1 1 la siguiente es una manera psible de ubicarlas: 1 1 1 1 1 6 6 6 Además de usar tdas las piezas, se impne cm restricción adicinal que las filas y las clumnas del tabler tengan un ciert pes. En el ejempl, el pes de la primera fila es 6, y el pes de la tercera clumna es 8. Estas 1
restriccines frmarán parte de la entrada, de la manera que se explica más abaj. La frma sugerida de reslver el ejercici es utilizand la técnica generate and test: se generan tdas las frmas de ubicar las piezas dadas en el tabler (psibles candidatas a slución) y se filtran, devlviend slamente aquellas que cumplan las restriccines sbre el pes de las filas y de las clumnas.. Tablers y juegs Un tabler se representa cn una lista de filas. Cada fila es, a su vez, una lista de elements. Un jueg es un tabler que cntiene, además, restriccines sbre las filas y sbre las clumnas, y se representa cn un términ de la frma jueg(tabler, RF, RC), dnde Tabler es un tabler, y RF y RC sn listas. La lista RF cntiene un element pr fila, que determina cuál debe ser el pes de esa fila. La lista RC es similar, per para las clumnas. Se puede asumir que la entrada está bien frmada, es decir que tdas las filas miden l mism, y ls tamañs de RF y RC sn ls crrects. En el archiv mstrar.pl prvist pr la cátedra, se dispne de predicads mstrarjueg(+jueg) y mstrartabler(+tabler) que imprimen un jueg un tabler en la pantalla. El siguiente ejempl crrespnde a un jueg ya terminad:? mstrarjueg(jueg([[1, 1, 1], [,, ], [3, 3, 3], [4, 4, 4]], [3, 6, 9, 1], [1, 1, 1])). 1 1 1 + 3 1 1 1 6 9 3 3 3 1 4 4 4 Para indicar que una psición del tabler está vacía, se clcan variables n instanciadas en esa psición. A medida que se va llenand el tabler, estas variables se van instanciand cn ls valres finales. Inicialmente, un tabler puede estar ttalmente vací, puede cntener bstáculs, que n pueden ser cupads cn piezas. Alg similar curre cn las restriccines: pueden estar dadas de anteman (si sn númers), pueden ser variables n instanciadas si n se desea restringir el valr de la suma de la fila de la clumna. Pr ejempl, el siguiente tabler tiene ds lugares ya cupads, que n pueden pisarse cn piezas. Además, sól hay restriccines sbre la segunda fila y sbre la tercera clumna.
? mstrarjueg(jueg([[,, ], [,, ], [,, ], [,, ]], [, 7,, ], [,, 3])). 3 + 7 En Prlg, puede diferenciarse entre un valr que tdavía n fue instanciad y un valr que ya se encuentra instanciad utilizand ls predicads var (...) y nnvar (...). Ejercici 1 Escribir ls siguientes predicads: dimensin(+tabler, N, M), que es verdader si y sól si el tabler tiene N filas y M clumnas. (Puede asumirse que el tabler está bien frmad). psicin(+tabler, I, J), que es verdader si y sól si la fila I y la clumna J determinan una psición válida del tabler. Pr ejempl:? psicin([[1,, 3], [4, 5, 6]], I, J). I =, J = ; I =, J = 1 ; I =, J = ; I = 1, J = ; I = 1, J = 1 ; I = 1, J =. Ejercici Escribir el predicad subtabler(+tabler, +I, +J, Subtabler), que es verdader si y sól si Subtabler cntiene ls misms elements que Tabler, empezand desde la fila I y la clumna J. Se puede asumir que I y J están en el rang crrect. Pr ejempl: 3
? Tabler = [[1,, 3, 4], [5, 6, 7, 8], [9, 1, 11, 1], [13, 14, 15, 16]], subtabler(tabler,, 1, Subtabler), mstrartabler(subtabler). 1 11 1 14 15 16 Subtabler = [[1, 11, 1], [14, 15, 16]]. Ejercici 3 Escribir el predicad transpner(+tabler, Transpuest), que es verdader si y sól si Transpuest es el tabler Tabler transpuest. Pr ejempl:? Tabler = [[1,, 3], [4, 5, 6]], transpner(tabler, Transpuest), mstrartabler(transpuest). 1 4 5 3 6 Transpuest = [[1, 4], [, 5], [3, 6]] ; 3. Siluetas y piezas Hasta esta sección n se mencinó la psibilidad de que las piezas estén rientadas (mediante rtacines). Para simplificar la prgramación, si una pieza tiene varias rientacines, deben estar especificadas explícitamente cm parte de la entrada. Llamams silueta a un mlde que dice qué psicines están cupadas. En particular, una pieza se representa de igual manera que un tabler, cm una lista de filas. La psicines vacías se representan cn variables n instanciadas. Las psicines cupadas se representan cn algún átm (pr ejempl, x). Eventualmente el átm puede ser un númer que indica el pes del cuadradit. Pr ejempl: Se representa cn la siguiente silueta:? Silueta = [[,, x], [, x, x], [x, x, ]], mstrartabler(silueta). x 4
Ejercici 4 Escribir el predicad asignarpes(+silueta, +Pes, SiluetaCnPes), que sea verdader si y sól si SiluetaCnPes es una silueta de la misma frma que Silueta, dnde cada psición cupada se reemplaza pr el númer Pes. Pr ejempl:? Silueta = [[,, x], [, x, x], [x, x, ]], asignarpes(silueta, 1, SiluetaCnPes), mstrartabler(siluetacnpes). 1 1 1 1 1 Ejercici 5 Escribir el predicad ubicarsilueta (+Silueta, I, J, Tabler), que sea verdader si y sól si la silueta Silueta puede ubicarse en la fila I y en la clumna J del tabler Tabler, sin pasarse de ls brdes y sin pisar psicines ya cupadas. Si hay más de una psición (I, J) en la que pueda ubicarse la silueta, el predicad debe devlverlas tdas. El predicad recibe un tabler parcialmente instanciad: debe ser una lista de las dimensines adecuadas, per puede cntener algunas psicines vacías (i.e. variables n instanciadas). Además, cada vez que el predicad tenga éxit, deben instanciarse las variables del tabler que pasarn a encntrarse cupadas pr la silueta. Pr ejempl, cnsiderand las siguientes definicines, tabler1([ [,,, ], [,,, ], [,,, ], [,,, ] ]). silueta1([ [x, x], [, x] ]). que representan la silueta y el tabler en la figura: 5
x deben devlverse las siguientes slucines.? tabler1(t), silueta1(s), ubicarsilueta(s, I, J, T), mstrartabler(t). I = J = 1 I = J = x x I = 1 J = I = J = x x Observar que n puede cuparse una psición del tabler que ya se encuentre cupada, aunque el cntenid de esa psición cincida cn el cntenid del cuadradit de la silueta que se desea ubicar. Pr tra parte, una pieza es un cnjunt de siluetas. La intención es que las siluetas asciadas a una pieza representen una psible rientación de la pieza (pr ejempl, la pieza rtada 9 grads). Las piezas se representan usand una lista de rientacines. Cada element de la lista es de la frma rientacin (NmbrePieza, Silueta). Pr ejempl el siguiente predicad, algunaspiezas( Piezas): algunaspiezas([ rientacin(palit, [[x, x, x, x]]), rientacin(palit, [[x], [x], [x], [x]]), rientacin(ele, [[x, ], [x, ], [x, x]]), rientacin(ele, [[,, x], [x, x, x]]), rientacin(ele, [[x, x], [, x], [, x]]), rientacin(ele, [[x, x, x], [x,, ]]), rientacin(ese, [[, x, x], [x, x, ]]), rientacin(ese, [[x, ], [x, x], [, x]]) ]). 6
es verdader para un diccinari de piezas que representa l que se ilustra a cntinuación: palit ele ese Ejercici 6 Escribir el predicad ubicarpieza(+nmbrepieza, +Pes, +DiccPiezas, I, J, Tabler), que sea verdader si y sól si la pieza identificada pr el nmbre NmbrePieza se puede rientar de alguna manera y ubicarse en la fila I y en la clumna J del tabler Tabler, haciend que cada cuadradit de la silueta pese Pes. Si hay más de una rientación y una psición en la que se pueda ubicar, se deben devlver tdas las slucines psibles. Pr ejempl, cn esta definición de tabler, tabler([ [,,, ], [, 1,, ], [, 3, 4, ], [,, 5, ] ]). la cnsulta:? algunaspiezas(diccpiezas), tabler(tabler), ubicarpieza(ele,, DiccPiezas, I, J, Tabler), mstrartabler(tabler). debe devlver las siguientes slucines. 7
I = 1 J = I = J = I = J = 1 3 4 5 1 3 4 5 1 3 4 5 4. Slución del rmpecabezas Ejercici 7 Escribir el predicad slucinvalida ( Jueg), que sea verdader si y sól si ls númers ubicads en el tabler cumplen las restriccines de filas y clumnas. El jueg estará parcialmente instanciad: tds ls elements del tabler deben ser númers, per las restriccines de filas y clumnas pueden estar n cmpletamente instanciadas. Pr ejempl:? Jueg = jueg([[1,, 3], [4, 5, 6]], RF, RC), slucinvalida(jueg), mstrarjueg(jueg). 5 7 9 + 6 1 3 15 4 5 6 RF = [6, 15], RC = [5, 7, 9] ;? Jueg = jueg([[1,, 3], [4, 5, 6]], [6, 15], [SumaClumna1, 7, ]), slucinvalida(jueg). SumaClumna1 = 5 ;? Jueg = jueg([[1,, 3], [4, 5, 6]], [1, ], ), slucinvalida(jueg). fail. Ejercici 8 Escribir el predicad reslver (+DiccPiezas, +PiezasDispnibles, Jueg), que sea verdader si y sól si hay una manera de reslver el jueg usand las piezas dadas. El cnjunt de piezas dispnibles se recibe en PiezasDispnibles, que es una lista de elements de la frma pieza(nmbrepieza, Pes). El predicad debe instanciar las partes del tabler y las restriccines del jueg que 8
n se encuentren instanciadas. Si hay más de una slución, deben devlverse tdas las psibles. N se deben devlver slucines repetidas, aunque puede haber slucines simétricas. Pr ejempl, cn esta definición de jueg, jueg(jueg([ [1,,, 7], [,,, ], [,,, ], [,, 5, ] ], [,,, ], [4, 6, 11, 16])). la cnsulta:? jueg(jueg), algunaspiezas(diccpiezas), PiezasDispnibles = [ pieza(ese, ), pieza(ele, 3), pieza(ese, 1)], reslver(diccpiezas, PiezasDispnibles, Jueg), mstrarjueg(jueg). debería devlver ds slucines: 4 6 11 16 + 1 1 7 1 3 3 5 1 1 3 1 1 1 5 3 4 6 11 16 + 1 1 1 1 7 8 1 1 3 3 7 3 1 5 3 5. Predicads útiles var(?x) y nnvar(?x). Observar que nnvar(x) es equivalente a nt(var(x)).? var(x). true.? var(4). fail.? X = 4, var(x). fail. 9
between(+lw, +High, Value).? between(1, 1, X). X = 1 ; X = 11 ; X = 1. length(+list, Int).? length([ cer, un, ds, tres ], N). N = 4. member( Elem, +List).? member(x, [cer, un, ds, tres ]). X = cer ; X = un ; X = ds ; X = tres. nth(+index, +List, Elem).? nth(, [cer, un, ds, tres ], X). X = ds. Pautas de entrega Se debe entregar el códig impres cn la implementación de ls predicads pedids. Cada predicad debe cntar cn un cmentari dnde se explique su funcinamient. Cada predicad asciad a ls ejercicis debe cntar cn ejempls que muestren que exhibe la funcinalidad slicitada. Además, se debe enviar un e-mail cnteniend el códig fuente en Prlg a la dirección plp-dcentes@dc.uba.ar. Dich mail debe cumplir cn el siguiente frmat: El subject debe ser [PLP;TP-PL] seguid inmediatamente del nmbre del grup. El códig Prlg debe acmpañar el e-mail y l debe hacer en frma de attachment (puede adjuntarse un.zip.tar.gz). El códig debe pder ser ejecutad en SWI-Prlg. N es necesari entregar un infrme sbre el trabaj, alcanza cn que el códig esté adecuadamente cmentad. Ls bjetivs a evaluar en la implementación de ls predicads sn: 1
Crrección. Declaratividad. Reus de predicads previamente definids. Us de unificación, backtracking y reversibilidad de ls predicads que crrespndan. Salv dnde se indique l cntrari, ls predicads n deben instanciar slucines repetidas. Vale aclarar que n es necesari filtrar las slucines repetidas si la repetición prviene de las características de la entrada (pr ejempl, si hay ds piezas iguales). Imprtante: se admitirá un únic enví, sin excepción alguna. Pr favr planifiquen el trabaj para llegar a tiemp cn la entrega. 11