Material de Prolog para el Laboratorio 2 de Fundamentos de Programación.pdf

March 23, 2018 | Author: Fabián Orccón | Category: Arithmetic, Mathematics, Physics & Mathematics, Science, It/Computer Sciences


Comments



Description

INF220 – Fundamentos de Programación1 Problemas de aplicación Un juego de restricciones. A continuación se presentan una serie de restricciones que debemos modelar como un programa en Prolog, de forma que se deduzca la solución a partir de una meta solicitada. Cinco hermanas nacieron en diferentes meses del año y en diferentes días de la semana. Empleando los predicados en Prolog y basados en las siguientes pistas, determine el mes y día en que nació cada una de las hermanas: - Paula nació en marzo pero no en sábado. Abigail no nació ni en viernes ni en miércoles. - La chica que nació un lunes, nació un mes que es anterior a los meses en los que nacieron Brenda y Mary. - Tara no nació ni en febrero ni en julio, pero si en fin de semana. - Mary no nació en diciembre ni en un día laborable (de lunes a viernes). - La chica que cumple años en junio nació un domingo. - Tara nació antes Brenda, la cual no nació en viernes. La solución a este acertijo tomará la siguiente forma: Sol=[[abigail,M1,D1],[brenda,M2,D2],[mary,M3,D3],[paula,M4,D4],[tara,M5,D5]] Donde cada tríada de valores identifica, en este orden, el nombre, mes y día de nacimiento de cada hermana. Además los valores posibles para mes y día son: Mes ϵ[febrero,marzo,junio,julio,diciembre] Día ϵ[domingo, lunes, miércoles, viernes, sábado] como dice el enunciado los valores que tomen las tuplas en mes y día no deben repetirse. Solución: Esta primera solución no es la más eficiente, pero nos servirá como punto de partida. Básicamente la idea consiste en proporcionar todos los valores posibles a M i y Di (en la lista Sol), para todo i entre 1 y 5. Este primer paso podemos lograrlo con el predicado built-in member(), que haciendo uso del backtracking permite ligar los distintos valores de la lista en una variable libre. Luego exigimos que estos valores sean diferentes, como lo especifican las condiciones del problema, por último verificamos que cumpla las reglas arriba descritas. Como se puede observar el corazón del problema está en construir las reglas tal como están especificadas. En todo momento debemos recordar que en Prolog las variables son locales a la regla, es decir una regla1 con la variable X no reconoce a la variable X de la regla2, a pesar de que ambas tengan el mismo nombre. Para ejecutar este programa en SWI-Porlog desde el prompt solo escriba: acertijo(L). A continuación el programa: Laboratorio 2 Prof. A. Bello INF220 – Fundamentos de Programación 2 Encontrar la respuesta le tomará a Prolog un tiempo considerable. Laboratorio 2 Prof. A. Bello Observe los valores de X.3]. Laboratorio 2 Prof.INF220 – Fundamentos de Programación 3 El predicado select(X. por ejemplo si se desea generar ternas de dígitos diferentes entre 1 y 3 podemos escribir este predicado.Resto). Por supuesto obtenemos un mejor tiempo. A. Y y Z son combinaciones diferentes de [1. Este predicado puede ser empleado en lugar de member() y de esta forma nos evitaría el predicado diferentes().2. Este predicado es útil para generar combinaciones diferentes de valores.L. Bello . Como conclusión a este primer ejercicio podemos decir que el uso eficiente de las reglas permitirá que Prolog analice menos casos. con el consiguiente ahorro de tiempo. A. Laboratorio 2 Prof.INF220 – Fundamentos de Programación 4 A continuación el programa Ahora al ejecutar el programa la respuesta toma mucho menos tiempo. eliminando varias ramas recursivas. Bello . casi es inmediata. F2. 5] Que corresponde a la siguiente figura: Como se puede observar el objetivo es rellenar las casillas vacías con valores comprendidos entre 1 y 9. 7. Esta última restricción es diferente al ejercicio anterior. A.6]. 7]. Y Prolog debe responder: F1 = [8. Bello .INF220 – Fundamentos de Programación 5 Un pequeño crucigrama de sumas Se pide un programa en Prolog para resolver el crucigrama de sumas mostrado en la figura: El objetivo debe ser invocado de la siguiente forma: ? crucigrama([11. A continuación el programa: Laboratorio 2 Prof. 9.[24. F2 = [2. Además los valores en cada fila y columna deben ser diferentes. en este ejercicio sólo por fila o por columna. 1]. F3 = [1. Anteriormente se pedía que todos los valores sean distintos.F1.8]. De modo que la suma de los valores de cada fila y de cada columna sea igual a los números colocados en las casillas sombreados.21.F3).10. Esto permitirá que el tiempo de ejecución sea mínimo. sino que se iban podando a medida que se iban obteniendo. Es decir no se esperaban a tener un juego de valores para podarlos. Bello . Laboratorio 2 Prof.INF220 – Fundamentos de Programación 6 En este caso las restricciones han sido aplicadas apenas se tenían los valores. Entiéndase por podar al hecho de aplicar las restricciones. A. Las reglas del sudoku mostrado abajo. Usted no debe resolver el sudoku.INF220 – Fundamentos de Programación 7 Sudoku simple Elabore las reglas necesarias para resolver el siguiente sudoku de nivel sencillo (1/5). Usted debe proporcionarle las reglas a Prolog y este debe resolverlo. son muy sencillas: a) Todas las filas deben tener valores diferentes. Bello . A. Solución Laboratorio 2 Prof. b) Todas las columnas deben tener valores diferentes. c) Los rectángulos de 2x3 deben tener valores diferentes. INF220 – Fundamentos de Programación 8 El tiempo de ejecución es bastante aceptable. Para ver las listas de cualquier longitud escriba lo siguiente al inicio del programa: :­set_prolog_flag(toplevel_print_options. Al volver a ejecutar el objetivo se mostrarán las listas completas.      portray(true). la demora es casi imperceptible.      priority(699)]). En este caso no es culpa de la IDE. es ver las listas incompletas.     [quoted(true). pero si constituye una molestia. apenas unas milésimas de segundo. Bello .      max_depth(120). sino de Prolog. A. Aunque no es un problema. Laboratorio 2 Prof. El primer paso hacia una solución es decidir cómo representar los números N1.O. entre los tres números N1.[R. el problema puede ser representado como: [D.E.D]. Para este propósito también es necesario mantener un conjunto de dígitos disponibles. Cuando la relación suma haya sido programada el juego puede ser solicitado a Prolog como la consulta: suma([D.B. Nosotros definiremos la relación suma(N1. tal que la suma arriba mostrada sea válida. de modo que la suma de arriba sea válida.D]. Así en general. E. nosotros tenemos que implementar las reglas comunes que se usan para llevar a cabo la adición en el sistema de números decimales.N2.N) donde N1.A. La adición se lleva a cabo dígito a dígito. A. si todas las letras son iguales a cero. 1 Los siguientes ejercicios son una traducción libre del libro Prolog Programming for Intelligence Articial de Ivan Bratko Laboratorio 2 Prof. de otra manera una solución trivial siempre es posible – por ejemplo. O.[G.2. etc. N. A todas las letras se le deben asignar diferentes dígitos. N. R. Para definir la relación suma en lista de dígitos.N) es true si hay una asignación de dígitos a las letras de modo que N = N1 + N2. Una manera de hacer esto es representar cada número como una lista de dígitos decimales. E. R.N2. el número 225 debería ser representado por la lista [2. El objetivo suma(N1. A. dígitos que aún no han sido usados por variables libres ya encontradas.R. Bello .5].A. L.L. alguna información adicional se debe considerar. N2 y N en el programa. T] + = Luego la tarea es encontrar valores para las variables D..R.N. N2 y N representan los tres números de un juego de criptografía aritmética. A. O. y siempre tomando en cuenta el dígito de acarreo de la derecha. empezando con el dígito más a la derecha. Como todos estos dígitos no son conocidos de antemano..INF220 – Fundamentos de Programación 9 Un juego de criptografía aritmética. tal como se ilustra en la Figura 1. N2 y N3. etc. una variable libre será usada por cada dígito. esto es.L. D] [R. D] [G. Usando esta idea. O. O.T]).1 Un ejemplo muy conocido de un juego de criptografía aritmética es D G R O E O N R B A A E L L R D D T + El problema aquí es asignar dígitos a las letras D. B. L. N. continuando hacia la izquierda. Por ejemplo.O. suma1(N1.[1.D2i. Digitos es la lista de dígitos que no fueron usados en la particularización de estas variables. . como en la relación suma.] Aquí el acarreo debe ser 0 Acarreo de Aquí el acarreo es 0 la derecha 0 Número1 + = Número2 Número3 C C1 0 . .5.D3i. El siguiente ejemplo lo ilustra: suma1([H. Bello .. . .Digitos) N1. D22.D1i.N):-suma1(N1.1. ..D2i. .S].8.4.] Número3 = [D31.[0.9. . . . . D12.2. A.4.N. . .C. Figura 1. . • • • • Un dígito de acarreo antes de la adición de los números. Laboratorio 2 Prof. . .0.3. .E]._). . . .D1i.3.Digitos1. . . Para formular la relación suma nosotros usaremos el principio de generalización del problema: introduciremos una relación auxiliar más general. . .[U.N.8. . Debido a que nosotros permitimos el uso de algún dígito decimal en la satisfacción de la relación suma..[6. Un dígito de acarreo después de la adición. La relación suma1 posee algunos argumentos extras.D3i.6. D32. . la definición de la relación suma en términos de suma1 es como sigue: suma(N1.1.C1. . Un conjunto de dígitos disponibles antes de la adición. . . . ..9].] Número2 = [D21.E]. . . . .9] Esto corresponde a la siguiente adición: 1 ← 8 6 4 3 3 7 ← 1 Como muestra la Figura 1.. . .Digitos).N2. y C es el acarreo de la izquierda (después de la adición). la cual corresponde a la ya mencionada información adicional. . . .7. . H E S U = = = = 8 3 7 4 Digitos = [1. . . .7. C1 es el acarreo de la derecha (antes de la adición de N1 y N2).N2. suma1.INF220 – Fundamentos de Programación 10 Número1 = [D11. N2 y N son nuestros tres números.1. N2 y N son los que satisfacen la relación suma.N2. . Digitos1 es la lista de dígitos disponibles para las variables que se particularizaran en N1. . . . N2 y N.0.. . . C1 y C tienen que ser 0 si N1. . El resto de dígitos no usados en la adición. sumadigitos(D1. D2 y D tienen que ser dígitos decimales.C.!. A. ii) Los dígitos más a la izquierda D1.C. Si D1. Esta condición será formulada en nuestro programa como la relación sumadigitos. Lista).[Item | Lista].Digitos2.Lista.[D2|N2]. D1.D2. Entonces: suma1([]. Si alguno de ellos aún no está particularizado entonces tiene que llegar a ser particularizado a uno de los dígitos de la lista Digitos2. D2 o D ya están particularizados entonces. Esta relación es.[A | Lista].C1. si no es así. Si este ítem no es una variable no se borra dígito alguno (no ocurre la particularización). %Borra Item de la cola El programa completo que resuelve el juego de criptografía aritmética será: Laboratorio 2 Prof.Lista1).Lista):-nonvar(Item). Traduciendo este caso a Prolog tenemos: suma1([D1|N1]. a la izquierda. sin embargo.N2.Digitos. D2 y D. [A | Lista1]):borra(Item.[].Digitos2).[].N.Lista. satisface esta exigencia. dando algún dígito de acarreo: C2. Asumiremos sin perdida de generalidad.Digitos1. Esto se realiza en el programa como un borrado de un ítem de una lista.Digitos). al número se le puede anteceder por ceros de modo que los tres tengan la misma longitud. Este predicado tiene éxito si su argumento ya está acotada con valor alguno.Digitos).C. y dejando algún sub conjunto de dígitos decimales no usados: Digitos2.C1. N2 y N tienen que satisfacer la relación suma1. Esto se programa como: borra(Item.[D|N]. Lo único que resta definir en Prolog es la relación sumadigitos. suficientemente genérica como para ser definida recursivamente. Hay un detalle sutil que involucra el uso del predicado nonvar. Bello .Digitos):suma1(N1. %Item ya instanciado borra(Item.D. Nuestro ejemplo. La definición de suma1 puede ser dividida en dos casos: a) Los tres números son representados por listas vacías. por supuesto ninguno de los dígitos disponibles será usado. b) Todos los números tienen algún dígito más a la izquierda y el resto de dígitos a la derecha. %Borra la cabeza borra(Item. Así ellos tienen la forma: [D1|N1] [D2|N2] [D|N] En este caso dos condiciones se deben satisfacer: i) Los tres números N1. C2.C. D1 y D2 son sumados dando como resultado D y un acarreo a la izquierda. por supuesto. y el dígito de acarreo C2 tienen que satisfacer la relación indicada en la Figura 1.C2.Digitos1. que las tres listas que representan los tres números son de igual longitud.C2. Además estos dígitos tienen que ser eliminados del conjunto de dígitos disponibles.INF220 – Fundamentos de Programación 11 El peso del problema ahora se ha desplazado a la relación suma1. R.N.L.N.D]. GERALD y ROBERT.Y]).E.[G.R. Otra posible consulta es la siguiente: puzzle([0.E.A. Laboratorio 2 Prof.E.[R.T]). Bello .N.D].M.E.O.S.INF220 – Fundamentos de Programación 12 La consulta a Prolog sobre DONALD.B.D].E]. A.O.A.[0.L.O.O.[M. usando este programa debería ser: puzzle([D.R. La solución se programará como el predicado unario solucion(Pos) el cual es verdad sí y solo sí Pos representa una posición con ocho reinas que no se atacan unas a otras... Nuestro procedimiento solucion() tendrá que buscar una adecuada acotación de las variables X1. Una elección natural es representar la posición por una lista de ocho elementos (para un tablero de 8x8. 1 2 3 4 5 6 7 8 Fig. Además cada cuadrado puede ser especificado por un par de coordenadas ( X e Y) en el tablero.3/7. 2 muestra una solución del problema de las ocho reinas y su lista de representación.X2/Y2. donde cada coordenada es un entero entre 1 y 8. por ejemplo).6/8. Bello .8/Y8] Laboratorio 2 Prof.Y1..X8.2/5.5/1.8/3] Habiendo elegido esta representación. Será interesante comparar varias ideas para programar este problema. el problema es encontrar una lista de la forma: [X1/Y1. Cada ítem en la lista especificará un cuadrado del tablero en la cual la correspondiente reina está ubicada. todas las reinas tendrán que estar en diferentes columnas para evitar el ataque vertical. cada uno de ellos correspondientes a una reina. En el programa podemos escribir tal par como: X/Y donde por supuesto..INF220 – Fundamentos de Programación 13 El problema de las N reinas En el problema de las N reinas.. De acuerdo a esto.X3/Y3..4/4.Y8.X2. dos reinas no pueden colocarse en la misma fila.7/6.. / no es el operador que indica la división. columna ni diagonal. La Fig.3/Y3.2/Y2.. Como sabemos. 2 [1/2. el objeto es colocar N reinas en un tablero de ajedrez de tal manera que dos reinas cualesquiera no puedan atacarse una con otra. .. Para esto presentaremos tres programas basados en diferentes representaciones del problema. Programa 1 Primero nosotros tenemos que elegir una representación de la posición del tablero. podemos por tanto fijar las coordenadas X de modo que la lista solución quedará como sigue: [1/Y1. A..X8/Y8] El cual satisface el requerimiento de no ataque.Y2.. 4. La parte creativa del problema es encontrar la correcta generalización del problema original. se da con frecuencia el caso en que la solución para un problema más general es más fácil de formular que para el problema original especifico. desde el momento que hemos fijado estos valores tendrá que coincidir con la plantilla en la cual la coordenadas X ya están especificadas.[1. En nuestro caso.5. Todo esto puede ser escrito en Prolog como sigue: solucion([]).Otros). nosotros no tenemos que preocuparnos acerca de los valores que X puede tomar. en la programación. entonces se muestra algo como esto: [X/Y|Otros] En el caso 2.3. De otro lado.6. Ahora solo resta definir la relación noataca(): noataca(Q. Bello . Caso 2 La lista de reinas no está vacía.6.5. (3) Una reina en un cuadrado X/Y no debe atacar a alguna de las reinas de la lista Otros.2. la primera reina está en algún cuadrado X/Y y las otras reinas están en los cuadrados especificados por la lista Otros. la clave para una solución a menudo consiste en considerar un problema más general.7.pertenece(Y.8]. Otros en sí misma debe ser una solución. La segunda condición puede ser especificada como sigue: Y tendrá que ser un miembro de la lista de enteros entre 1 y 8 –esto es [1. incluyendo 0. esto es. Para programar la primera condición nosotros podemos simplemente usar la relación solucion() en sí misma. (2) X e Y deben ser enteros entre 1 y 8. Nuevamente esto puede ser dividido en dos casos: Laboratorio 2 Prof. Podemos implementar la tercera condición como la relación noataca().Qlista). Por tanto X estará garantizada de tener un valor apropiado entre 1 y 8.2. A.3. La relación solucion() puede ser formulada considerando dos casos: Caso 1 La lista de reinas está vacía: la lista vacía es ciertamente una solución por que no hay ataque alguno. una buena idea es generalizar el número de reinas (el número de columnas en la lista) de 8 a algún número.4. El problema original entonces resulta como un caso especial del problema más general.INF220 – Fundamentos de Programación 14 Nosotros estamos interesados en la solución de un tablero de tamaño 8 por 8. Sin embargo.7. Paradójica mente. Si este va a ser una solución entonces las siguientes condiciones deben cumplirse: (1) En la lista Otros no se deben atacar entre reinas.8]). solucion([X/Y|Otros]) :solucion(Otros). noataca(X/Y. la misma columna o la misma diagonal. en la dirección Y.INF220 – Fundamentos de Programación 15 1) Si la lista Qlista es vacía entonces la relación es ciertamente verdadera por que no hay reina a ser atacada. es fácil: los dos cuadrados no deben estar en la misma fila. Bello . A. así que sólo resta especificar explícitamente que: . 2) Si Qlista es no vacía entonces tiene la forma [Q1|Qlista1] y dos condiciones deben ser satisfechas: (a) la reina en Q no debe atacar a la reina en Q1. ya sea que suban o bajen. A continuación presentamos el programa completo: La meta a ejecutar será: En este caso habrá más de una solución .Las coordenadas Y de las reinas son diferentes.) después de que Prolog presente alguna solución. esto es. la distancia entre los cuadrados en la dirección X no debe ser igual a esa. y (b) la reina en Q no debe atacar a alguna de las reinas en Qlista1 Para especificar que una reina en algún cuadrado no ataca a otra. y . Nuestra plantilla de solución garantiza que todas las reinas están en diferentes columnas.Ellas no están en la misma diagonal. Laboratorio 2 Prof. Por tanto deberá presionar punto y coma (. 1 (a) la distancia entre Queen y Others es 1.8]. Podemos dividir su definición en dos casos: (1) Si S es la lista vacía: esta es ciertamente segura.3.. En Prolog. y las x-coordenadas no están explícitamente presentes. como se ilustra en la presente figura. Esta es segura si la lista Otras es segura. segura(S). la cláusula es: segura([]). La elección que resta es determinar el orden de los ocho números.8/Y8] Porque simplemente las reinas fueron colocadas en columnas consecutivas.S).Otras). es una solución si todas las reinas son seguras. como allí no hay nada que atacar. A..7. 8. Ninguna información se pierde si las x-coordenadas se omiten.. cada solución tomaba la forma: [1/Y1.permutación([1. Y3. una permutación S. Las reinas tienen que ocupar todas las filas 1..2/Y2. Y2. y Reina no ataca a alguna reina en la lista Otras. Cada solución además puede ser representada por una permutación de la lista: [1. Fig. Este problema puede ser evitado con una pequeña generalización de la relación noataca().6.. dejando explicita sólo las ycoordenadas de las reinas: [Y1. 2. La dificultad estriba en que las posiciones de las reinas sólo están definidas por sus y-coordenadas.2. Bello . pero la relación segura() aún queda por especificar.INF220 – Fundamentos de Programación 16 Programa 2 En la representación del tablero del programa 1. De esta manera. segura([Reina|Otras]):.. Nosotros ya hemos programado las reglas para el predicado permutación().. La relación noataca() aquí es levemente complicada. 2..3/Y3. noataca(Reina.segura(Otras)...5.. Y8] Para evitar el ataque horizontal. Esto impone una restricción en las y-coordenadas. Laboratorio 2 Prof.. b) la distancia entre Queen y Others es 3. De modo que nosotros podemos escribir: solución(S):.4. 8] Como tal. 3.. dos reinas no pueden estar en la misma fila.. se encuentran en una sección anterior. se puede usar una representación más económica de las posiciones en el tablero. 3.. (2) Si S es una lista no vacía de la forma [Reina|Otras]. Lo que sí es realmente necesario es la generalización de la xdistancia entre Reina y Otras. Bello .Otras). dependiendo de la lista Otras: si Otras es vacía entonces no hay destino y ciertamente no hay ataque.Otras.1) La relación noataca() puede ser formulada de acuerdo a dos casos. si Otras es no vacía entonces Reina no debe atacar a la primera reina de la lista Otras (la cual es Xdist columnas de Reina) y tampoco al resto de Otras en Xdist+1. A. Nos está expresando la seguridad que Reina no ataca a Otras cuando la x-distancia entre Reina y Otras es igual a 1.Otras.INF220 – Fundamentos de Programación 17 El objetivo noataca(Reina.Xdist). Laboratorio 2 Prof. en este problema de las 8 reinas siempre hay más de una solución. Por supuesto. Así que añadiremos esta distancia como el tercer argumento de la relación noataca(): noataca(Reina. Por consiguiente. Esto nos conduce al siguiente programa en Prolog: En este caso el objetivo a consultar será reinas2(Tablero). el predicado noataca() en la relación segura() tiene que ser modificado a noataca(Reina. 9. alguna diagonal izquierda y alguna diagonal derecha. 5.INF220 – Fundamentos de Programación 18 Programa 3 Un tercer programa para el programa de las ocho reinas estará basado en el siguiente razonamiento. 4. Bello . 13. Y de Dy. en alguna columna. 16] El problema de las ocho reinas puede ser presentado como sigue: seleccionar 8 4. diagonales izquierda. 7. filas. fila. Por supuesto. 4. y = 4. 7] 6. v = 6. El cuadrado indicado tiene coordenadas: x = 2. una vez que X e Y son elegidos. diagonal izquierda y diagonal derecha diferente. [1. A.) nunca usando el elemento dos veces desde algunos de sus dominios. 3. 3. 5. 7. 3. 4. es: Dx Dy Du Dv = = = = [1. x y u v columnas filas diagonal izquierda diagonal derecha Las coordenadas no son independientes: dado un x e y. cada reina debe ser colocada en una columna. 2. [2. 8] -4. 7. 14. Laboratorio 2 Prof. -2. 10. es natural considerar una rica representación con cuatro coordenadas. U y V son determinados. esto es. Y. Para asegurar que todas las reinas estén seguras. -5. etc. 15. 3. -3. u = -2. diagonales derecha. El dominio. 8] 5. U. 4. 2. 0. Así. u y v son determinadas.tuplas (X. V) de los dominios (X de Dx. 11. 6. 5. 2 la relación entre columnas. -6. [-7. 6. -1. para las cuatro dimensiones. alguna fila. 12. 2. 8. 1. Cada reina tiene que estar colocada en algún cuadrado. 6. Por ejemplo: u=x–y v=x+y Fig. M is N1+1. borrar los correspondientes elementos de los cuatro dominios.N. gen(N1. Es práctico mecanizar la generación de los dominios. Todas las y-coordenadas y las correspondientes a u y v-coordenadas son tomadas de la lista Dy. como se expresa a continuación: dado cuatro dominios. El cual.N2] Tal cláusula es: gen(N.Lista). para dos enteros N1 y N2 dados.. producirá la siguiente lista: List = [N1. informalmente hablando. Un programa basado en esta idea se muestra a continuación: Como se observa las posiciones del tablero son. solución().[N1|Lista]):. gen(M. Esto causará la invocación de sol() con los dominios completos que corresponden al problema de las ocho reinas.. asumiendo que ellas están colocadas en columnas consecutivas tomadas de Dx.N2.N2–1. representados por una lista de y– coordenadas. Laboratorio 2 Prof. seleccionar la posición de la primera reina.N2. La cláusula sol() en el sentido más general.Dv).INF220 – Fundamentos de Programación 19 La solución entonces puede ser. etc. Dy. y entonces use el resto de los dominios para colocar el resto de las reinas.List).. El tipo de relación en este programa es: sol(Ylist. Para ello sólo es necesario colocar apropiadamente los dominios Dx. puede ser usada para resolver el problema de las n-reinas (en un tablero de n por n).Dy. puede ser invocado por la consulta: solucion(S). Bello . nuevamente. Du y Dv. el cual particulariza la y–coordenada (en Ylist) de las reinas.Dx.[N]).N2. El predicado principal. Para ello nosotros necesitamos un predicado gen(N1..Du. como se muestra en el programa de arriba.N2–2.N1+1.N1<N2.N1+2. A. solución() tiene que ser generalizada.Nv2.INF220 – Fundamentos de Programación 20 La relación del nivel superior. gen(Nu1.Dxy.Du.S).Dv).Dv). La relación solución() generalizada será: solucion(N.S):– gen(1. Nv2 is N+N. Laboratorio 2 Prof.N. sol(S.Dxy). Nu2 is N–1.Nu2. por tanto a: solucion(N. Donde N es el tamaño del tablero y S es una solución representada como una lista de las ycoordenadas delas n-reinas.Du). El programa completo será: Por ejemplo una solución al problema de las 12-reinas debería ser generado por la siguiente consulta: Queda claro que el primer termino del predicado reinas3 es la dimensión del tablero. A. gen(2. %Dxy – dominio para X e Y Nu1 is 1–N. Bello .Dxy. INF220 – Fundamentos de Programación 21 Programación Gráfica en Prolog En SWI-Prolog la librería XPCE implementa la programación gráfica en Prolog.org/download/xpce/doc/userguide/userguide. Los predicados que nos proporcionan XPCE para realizar gráficos en pantalla. A. El problema de las 8 reinas de forma gráfica A continuación presentamos un programa que muestra un ventana con tres botones que permite mostrar todas las soluciones de las ocho reinas de forma gráfica. siguen un paradigma orientado a objetos en lugar de programación lógica. El manual completo lo puede encontrar en: www. limpiar el tablero y terminar.swi-prolog. Bello .pdf El objetivo es adaptar una solución gráfica a algunos de los problemas expuestos en este material. Laboratorio 2 Prof. INF220 – Fundamentos de Programación 22 Al ejecutar el objetivo: Aparecerá la siguiente ventana con los botones para controlar el programa: Laboratorio 2 Prof. A. Bello . sino presionar la opción Finalizar.Analice y entienda como funciona el programa 8reinasGrafico. emplee el segundo botón.Modifique el programa de modo que se le agregue otras funcionalidades.. Para que usted pueda repetir este programa. 3. Es importante señalar que si desea acabar. Para mostrar las configuraciones una a una en su pantalla. no debe cerrar las ventanas. Bello . A.. de lo contrario Prolog no encontrará las imágenes y mostrará un mensaje de error. si no hace esto cuando vuelva a ejecutar el programa obtendrá un error.jpg y reina. El programa muestra un botón con las opciones: Limpiar. junto con este archivo se han adjuntado los archivos jpg empaquetados en un zip.pl 2.Modifique el programa para que muestre un número que indique el orden de las soluciones.INF220 – Fundamentos de Programación 23 Es importante señalar que los archivos tablero-ajedrez. Siguiente y Finalizar.jpg deben encontrarse en el directorio indicado en el predicado pce_image_directory().. TAREA 1. Laboratorio 2 Prof. _.1.4._]. A este predicado se le invoca pasándole una lista.2._]._. A._.3._]. Laboratorio 2 Prof. tal como se muestra a continuación sudokuGraf([[_.3._]._. [_._. [_._._. [_.6. [_._.4._]])._.5.INF220 – Fundamentos de Programación 24 El sudoku en forma gráfica Se pide elaborar un programa en Prolog que implemente el predicado sudokuGraf.6._._]. y debe mostrar en forma gráfica el sudoku correspondiente al que representa. [_. Bello .1._.5._.4. Laboratorio 2 Prof.. La primera debe ser la representación gráfica del sudoku aún no solucionado y en la segunda la imagen que corresponde a la solución.3._._._]. [_. [_.6.1.6._._]])._._.Modifique el programa para que determine dos comportamientos distintos._]._]._.pl 2.4.1.INF220 – Fundamentos de Programación 25 TAREA 1. [_.4. entonces solo debe mostrar la imagen que representa._. [_.3.. [_.2.Analice y entienda como funciona el programa sudoku_grafico. sudokuGraf([[_._. Bello . 3._._._. Si la lista que recibe está completa. el programa debe mostrar dos imágenes._]. A.4..5._.5.Modifique el programa de modo que se le agregue otras funcionalidades._]. Si la lista que recibe como argumento están incompletas. INF220 – Fundamentos de Programación 26 Ejercicios Escriba un predicado.4. Bello . Produce S S S S S S S S = = = = = = = = [1. Defina un predicado último(Item. Donde Conjunto y Subconjunto son dos listas representando conjuntos. para borrar los tres últimos elementos de una lista L produciendo otra lista L1. 3.L2).1] L2 = [3. Laboratorio 2 Prof. Sugerencia: L es la concatenación de L1 y una lista de tres elementos.3] [1] [2] [3] [] 6. 4.5. Escriba un predicado para borrar los primeros tres elementos y los últimos tres elementos de una lista L produciendo una lista L2. Defina la relación dividelista(Lista.Lista2). 2. Por ejemplo: subconjunto([1.3] [2.2.3] [1.Lista2) De modo que Lista2 es Lista1 desplazado rotacionalmente por un elemento por la izquierda.2] 5. 1.L) de modo que Item es el último elemento de una lista L.4. A. De modo que los elementos de Lista sean partidos entre Lista1 y Lista2. Defina la relación subconjunto(Conjunto. Escriba dos versiones: (a) usando el predicado añadir.2] [1. y Lista1 y Lista2 deben ser aproximadamente de la misma longitud. Produce L1 = [2.desplaza(L1.1. sino también para generar todos los posibles subconjuntos de un conjunto dado.3.3].L1).4.Lista1.2. Por ejemplo: desplaza([1.S). Defina la relación: desplaza(Lista1. Debería ser posible usar esta relación no sólo para chequear la relación subconjunto.5.Subconjunto).2. usando el predicado añadir().5].3. (b) sin añadir. Se dice que el siguiente problema fue escrito por Einstein en el siglo pasado.Suma.L1. las asignaturas que se imparten son: Algoritmos. Programación Lógica y Arquitectura de Computadoras y el día de la semana de las distintas clases son: lunes. 4. De modo que Conjunto sea una lista de números. El inglés vive en la casa roja. Messi y Tévez. 8.L2). todas respectivamente distintas. Además recuerda que: a) La clase de Programación Lógica. 3. día en que no se imparte Algoritmos. es posterior a la de Algoritmos. y la suma de los números en Subconjunto es Suma. 2. Defina el predicado between(N1. Un alumno de Ingeniería Informática debido al nerviosismo del primer día de clases. DATOS 1. Estas cinco personas toman alguna bebida. Subconjunto es un subconjunto de estos números.4. 6.5].N2. sólo recuerda el nombre de sus profesores: Neymar.5] 7. A. así como el día de la semana que se imparte. 9. La casa verde es la inmediata de la izquierda de la casa blanca. Bello . 10. y que las clases se dan en días diferentes. El danés bebe té. impartida por Neymar. dividelista([1. pero la lógica es la misma. 5. PREMISAS: 1. fuman cigarrillos de una marca y tienen mascota.2. Laboratorio 2 Prof. Tenemos 5 casas de colores distintos.X). 2. La persona que fuma Pall Mall cría pájaros. Defina el predicado subsuma(Conjunto.3] L2 = [4. genere a través del bactracking todos los enteros X que satisfagan la restricción N1 ≤ X ≤ N2. NOTA: Se sabe que cada profesor imparte una única asignatura. Produce L1 = [1. Hay 5 personas de diferente nacionalidad. b) A Tévez no le gusta trabajar los lunes. El dueño de la casa verde toma café. Elabore un programa en Prolog que sea capaz de relacionar cada profesor con su asignatura.Subconjunto). Ha sido traducido y mejorado desde entonces. cada una dueña de una casa distinta. siendo.3. El cual para dos números dados N1 y N2. La mascota del sueco es un perro.INF220 – Fundamentos de Programación 27 Por ejemplo. 3. miércoles y jueves.2. puzzle_einstein([L1. 15. 12. .. 9.L3. El noruego vive en la primera casa. El noruego vive junto a la casa azul. 10. El objetivo debe ser invocado como una lista ?. El hombre que vive en la casa del centro toma leche. 8.L2. El hombre que fuma Blend tiene un vecino que bebe agua. bbb ddd fff hhh jjj ]. ]. . El resultado deberá presentar la siguiente forma: L1 L2 L3 L4 L5 = = = = = [aaa. . [eee. . ]. .INF220 – Fundamentos de Programación 28 7. El hombre que tiene caballos vive junto al que fuma Dunhill. La persona que fuma Blend vive junto a la que tiene gatos. Se pide un programa en Prolog que proporcionándole las reglas correspondientes devuelva en listas los datos de los que viven en cada casa. . Laboratorio 2 Prof. Bello . 11.Elaborar un programa en Prolog para solucionar un sudoku de 3x3. Objetivos del laboratorio La evaluación del laboratorio tendrá por objetivo evaluar las siguientes : 1) El alumno es capaz de obtener una solución a problemas nuevos o semejantes (modificados) a los mostrados en esta guía. . La persona que fuma Blue Master bebe cerveza. El alemán fuma Prince 14. El dueño de la casa amarilla fuma Dunhill. . . . [ggg. . . ]. [iii. A. ]. . .L5]). 2) El alumno es capaz de implementar una solución gráfica a uno de los problemas contenidos en esta guía. 13. El tiempo que tome el programa en obtener la solución debe ser razonable. . 11.L4. . . . . [ccc. .
Copyright © 2024 DOKUMEN.SITE Inc.