{"id":3385,"date":"2013-06-04T16:23:04","date_gmt":"2013-06-04T16:23:04","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3385"},"modified":"2013-06-10T05:12:23","modified_gmt":"2013-06-10T05:12:23","slug":"lmf2013-soluciones-logicas-de-problemas-logicos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/lmf2013-soluciones-logicas-de-problemas-logicos\/","title":{"rendered":"LMF2013: Soluciones l\u00f3gicas de problemas l\u00f3gicos"},"content":{"rendered":"<p>En la clase de hoy del curso <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/lmf-12\">L\u00f3gica matem\u00e1tica y fundamentos<\/a> se ha presentado una colecci\u00f3n de problemas para mostrar c\u00f3mo pueden resolverse elementalmente con Prolog.<\/p>\n<p>Los problemas son <\/p>\n<ol>\n<li><a href=\"#Rompecabeza\">Rompecabeza l\u00f3gico<\/a>.\n<li><a href=\"#Musicos\">La banda de m\u00fasicos.<\/a>\n<li><a href=\"#Sudoku\">Mini sudoku.<\/a>\n<li><a href=\"#Criptoaritmetica\">Criptoaritm\u00e9tica.<\/a>\n<li><a href=\"#Cuadrados\">Cuadrados m\u00e1gicos.<\/a>\n<li><a href=\"#Langford\">La sucesi\u00f3n de Langford.<\/a>\n<li><a href=\"#Mapa\">Coloraciones de un mapa.<\/a>\n<li><a href=\"#Mono\">El mono y el pl\u00e1tano.<\/a>\n<\/ol>\n<p>A continuaci\u00f3n se muestran los problemas y sus soluciones<br \/>\n<!--more--><\/p>\n<h2><a name=\"Rompecabeza\">Rompecabeza l\u00f3gico<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% En una conversaci\u00f3n, Santiago, Cristina y Pablo descubren que tienen\r\n% distintas profesiones y que tocan diferentes intrumentos\r\n% musicales. Sus profesiones son m\u00e9dico, abogado e ingeniero. Los\r\n% instrumentos que tocan son piano, flauta y viol\u00edn. Adem\u00e1s,\r\n%    1. Cristina est\u00e1 casada con el m\u00e9dico.\r\n%    2. El abogado toca el piano.\r\n%    3. Cristina no es ingeniero.\r\n%    4.Santiago es paciente del violinista.\r\n% \u00bfQui\u00e9n toca la flauta?\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nsolucion(Flauta) :-\r\n   personas_distintas(Medico,Abogado,Ingeniero), % Tienen distintas profesiones.\r\n   personas_distintas(Piano,Violin,Flauta),      % Tocan distintos instrumentos.\r\n   \\+ cristina = Medico,                         % Cristina est\u00e1 casada con el m\u00e9dico.\r\n   Abogado = Piano,                              % El abogado toca el piano.\r\n   \\+ Ingeniero = cristina,                      % Cristina no es ingeniero.\r\n   Violin = Medico,                              % Santiago es paciente del violinista.\r\n   \\+ santiago = Violin.     \r\n\r\n% personas_distintas(A,B,C) se verifica si A, B y C son tres personas distintas.\r\npersonas_distintas(A,B,C) :-\r\n   persona(A), persona(B), persona(C),  \r\n   \\+ A=B, \\+ A=C, \\+ B=C. \r\n\r\n% persona(X) se verifica si X es una persona.\r\npersona(cristina).\r\npersona(santiago).\r\npersona(pablo).\r\n\r\n% C\u00e1lculo de la soluci\u00f3n:\r\n%    ?- solucion(F).\r\n%    F = santiago ;\r\n%    false.\r\n<\/pre>\n<h2><a name=\"Musicos\">La banda de m\u00fasicos<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% Se sabe que\r\n% 1. Una banda est\u00e1 compuesta por tres m\u00fasicos de distintos paises y que\r\n%    tocan distintos instrumentos. \r\n% 2. El pianista toca primero.\r\n% 3. Juan toca el saxo y toca antes que el australiano.\r\n% 4. Marcos es franc\u00e9s y toca antes que el violinista.\r\n% 5. Hay un m\u00fasico japon\u00e9s.\r\n% 6. Un m\u00fasico se llama Sa\u00fal.\r\n% Determinar el nombre, el pa\u00eds y el instrumento que toca cada uno de\r\n% los m\u00fasicos de la banda. \r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% solucion(S) :- S es una soluci\u00f3n del problema de los m\u00fasicos.\r\nsolucion(S) :-\r\n   componentes_de_la_banda(S),  % 1\r\n   primero(X,S),                % 2\r\n   instrumento(X,piano),\r\n   antes(Y,Z,S),                % 3\r\n   nombre(Y,juan),\r\n   instrumento(Y,saxo),\r\n   pais(Z,australia),\r\n   antes(Y1,Z1,S),              % 4\r\n   nombre(Y1,marco),\r\n   pais(Y1,francia),\r\n   instrumento(Z1,violin),\r\n   pertenece(U,S),              % 5\r\n   pais(U,japon),\r\n   pertenece(V,S),              % 6\r\n   nombre(V,saul).\r\n\r\n% componentes_de_la_banda(B) :- B son los componentes de la banda.\r\ncomponentes_de_la_banda(banda(musico(N1,P1,I1),\r\n\t\t\t      musico(N2,P2,I2),\r\n\t\t\t      musico(N3,P3,I3))).\r\n\r\n% primero(X,B) :- X es el primer m\u00fasico de la banda B\r\nprimero(X,banda(X,_,_)).\r\n\r\n% instrumento(X,I) :- el m\u00fasico X toca el instrumento I.\r\ninstrumento(musico(_,_,I),I).\r\n\r\n% antes(X,Y,B) :- X toca antes que Y en la banda B\r\nantes(X,Y,banda(X,Y,Z)).\r\nantes(X,Z,banda(X,Y,Z)).\r\nantes(Y,Z,banda(X,Y,Z)).\r\n\r\n% nombre(X,N) :- el nombre del m\u00fasico X es N.\r\nnombre(musico(N,_,_),N).\r\n\r\n% pais(X,P) :- el pa\u00eds del m\u00fasico X s P.\r\npais(musico(_,P,_),P).\r\n\r\n% pertenece(X,B) :- X es un m\u00fasico de la banda B.\r\npertenece(X,banda(X,Y,Z)).\r\npertenece(Y,banda(X,Y,Z)).\r\npertenece(Z,banda(X,Y,Z)).\r\n\r\n% C\u00e1lculo de la soluci\u00f3n:\r\n% ?- solucion(S).\r\n% S = banda(musico(marco, francia,   piano),\r\n%           musico(juan,  japon,     saxo),\r\n%           musico(saul,  australia, violin)) ;\r\n% false\r\n<\/pre>\n<h2><a name=\"Sudoku\">Mini sudoku<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% Se tiene un tablero de 4x4, donde algunas celdas est\u00e1n vac\u00edas y otras\r\n% contienen n\u00fameros entre 1 y 4. El problema consiste en llenar todas\r\n% las celdas con n\u00fameros entre 1 y 4 tales que\r\n% * los n\u00fameros en cada una de las 4 filas sean distintos,\r\n% * los n\u00fameros en cada una de las 4 columnas sean distintos y\r\n% * los n\u00fameros en cada uno de las 4 submatrices 2x2 son distintos.\r\n% Por ejmplo, para el sudoku de la izquierda la soluci\u00f3n es el de la\r\n% derecha:\r\n%    1 4 _ _                1 4 3 2\r\n%    _ _ 4 _                3 2 4 1\r\n%    2 _ _ _                2 3 1 4\r\n%    _ _ _ 3                4 1 2 3\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% sudoku(E,L) se verifica si L es la lista que representa el sudoku E.\r\nsudoku(ej1,[1,4,_,_,\r\n            _,_,4,_,\r\n            2,_,_,_,\r\n            _,_,_,3]).\r\n\r\n% solucion_sudoku(S,L) se verifica si L es la soluci\u00f3n del sudoku del\r\n% ejemplo S.\r\nsolucion_sudoku(S,L) :-\r\n   length(L,16),\r\n   sudoku(S,L),\r\n   es_solucion(L).\r\n\r\n% es_solucion(L) se verifica si L es una soluci\u00f3n del sudoku.\r\nes_solucion([R11,R12,R13,R14,\r\n             R21,R22,R23,R24,\r\n             R31,R32,R33,R34,\r\n             R41,R42,R43,R44]) :-\r\n   numeros([R11,R12,R13,R14]), numeros([R21,R22,R23,R24]), % filas 1,2   \r\n   numeros([R31,R32,R33,R34]), numeros([R41,R42,R43,R44]), % filas 3,4\r\n   numeros([R11,R21,R31,R41]), numeros([R12,R22,R32,R42]), % columnas 1,2\r\n   numeros([R13,R23,R33,R43]), numeros([R14,R24,R34,R44]), % columnas 3,4\r\n   numeros([R11,R12,R21,R22]), numeros([R13,R14,R23,R24]), % NO y NE\r\n   numeros([R31,R32,R41,R42]), numeros([R33,R34,R43,R44]). % SO y SE\r\n\r\n% numeros(L) se verifica si L es una lista de n\u00fameros distintos entre 1\r\n% y 4.\r\nnumeros([]).\r\nnumeros([X|Xs]) :-\r\n   numeros(Xs),\r\n   numero(X),\r\n   \\+ member(X,Xs).\r\n\r\n% numero(X) se verifica si X es un n\u00famero entre 1 y 4.\r\nnumero(X):-\r\n   member(X,[1,2,3,4]).\r\n\r\n% Escribe t\u00e9rminos hasta 1000 de profundidad.\r\n:- set_prolog_flag(toplevel_print_options, \r\n                   [quoted(true), portray(true), max_depth(1000)]).\r\n\r\n% C\u00e1lculo de la soluci\u00f3n:\r\n%   ?- solucion_sudoku(ej1,L).\r\n%   L = [1,4,3,2,3,2,4,1,2,3,1,4,4,1,2,3] ;\r\n%   false.\r\n<\/pre>\n<h2><a name=\"Criptoaritmetica\">Criptoaritm\u00e9tica<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% El problema consiste en sustituir cada una de las letras por un d\u00edgito\r\n% de forma que a letras distintas les correspondan d\u00edgitos distintos y\r\n% se verifique la siguiente suma\r\n%     SEND\r\n%   + MORE\r\n%   ------\r\n%    MONEY\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% solucion(S) se verifica si S es una soluci\u00f3n del problema\r\nsolucion([[S,E,N,D],[M,O,R,E],[M,O,N,E,Y]]) :-\r\n   digito(D), digito(E), \r\n   Y is (D+E) mod 10, C1 is (D+E) \/\/ 10, \r\n   digito(N), digito(R), \r\n   E is (N+R+C1) mod 10, C2 is (N+R+C1) \/\/ 10,\r\n   digito(E), digito(O), \r\n   N is (E+O+C2) mod 10, C3 is (E+O+C2) \/\/ 10,\r\n   digito(S), S > 0, digito(M), M > 0, \r\n   O is (S+M+C3) mod 10, M is (S+M+C3) \/\/ 10,\r\n   digitos_distintos([S,E,N,D,M,O,R,Y]).\r\n\r\n% digitos_distintos(L) se verifica si L es una lista de d\u00edgitos distintos.\r\ndigitos_distintos([]).\r\ndigitos_distintos([X|Xs]) :-\r\n   digitos_distintos(Xs),\r\n   digito(X), \r\n   \\+ member(X,Xs).\r\n\r\n% digito(X) se verifica si X es un d\u00edgito.\r\ndigito(X) :-\r\n   member(X,[0,1,2,3,4,5,6,7,8,9]).\r\n\r\n% C\u00e1lculo de la soluci\u00f3n:\r\n%    ?- solucion(S).\r\n%    S = [[9,5,6,7],[1,0,8,5],[1,0,6,5,2]] ;\r\n%    false.\r\n<\/pre>\n<h2><a name=\"Cuadrados\">Cuadrados m\u00e1gicos<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% Colocar los n\u00fameros 1,2,3,4,5,6,7,8,9 en un cuadrado 3x3 de forma que\r\n% todas las l\u00edneas (filas, columnas y diagonales) sumen igual.\r\n%\r\n% (Idea: Buscar los valores para las variables A,B,C,D,E,F,G,H,I\r\n%    +---+---+---+\r\n%    | A | B | C |\r\n%    +---+---+---+      \r\n%    | D | E | F |\r\n%    +---+---+---+\r\n%    | G | H | I |\r\n%    +---+---+---+\r\n% tales que\r\n%    {A,B,C,D,E,F,G,H,I} = {1,2,3,4,5,6,7,8,9},\r\n%    A+B+C = 15,\r\n%    D+E+F = 15,\r\n%    G+H+I = 15,\r\n%    A+D+G = 15,\r\n%    B+E+H = 15,\r\n%    C+F+I = 15,\r\n%    A+E+I = 15,\r\n%    C+E+G = 15.\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n 1                                                       %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nsolucion_1([A,B,C,D,E,F,G,H,I]) :-\r\n   permutacion([1,2,3,4,5,6,7,8,9],[A,B,C,D,E,F,G,H,I]),\r\n   A+B+C =:= 15,\r\n   D+E+F =:= 15,\r\n   G+H+I =:= 15,\r\n   A+D+G =:= 15,\r\n   B+E+H =:= 15,\r\n   C+F+I =:= 15,\r\n   A+E+I =:= 15,\r\n   C+E+G =:= 15.\r\n\r\n% permutacion(L1,L2) se verifica si L2 es una permutaci\u00f3n del L1. Por\r\n% ejemplo,\r\n%    ?- permutacion([a,b,c],L).\r\n%    L = [a,b,c] ;\r\n%    L = [b,a,c] ;\r\n%    L = [b,c,a] ;\r\n%    L = [a,c,b] ;\r\n%    L = [c,a,b] ;\r\n%    L = [c,b,a] ;\r\n%    false.\r\npermutacion([],[]).\r\npermutacion([X|L1],L2) :-\r\n   permutacion(L1,L3),\r\n   selecciona(X,L2,L3).\r\n\r\n% selecciona(X,L1,L2) se verifica si X es un elemento de L1 y L2 son los\r\n% restantes elementos. Por ejemplo,\r\n%    ?- selecciona(X,[a,b,c],L).\r\n%    X = a,\r\n%    L = [b,c] ;\r\n%    X = b,\r\n%    L = [a,c] ;\r\n%    X = c,\r\n%    L = [a,b] ;\r\n%    false.\r\nselecciona(A,[A|L1],L1).\r\nselecciona(B,[A|L1],[A|L2]) :-\r\n   selecciona(B,L1,L2).\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n 2                                                       %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nsolucion_2([A,B,C,D,E,F,G,H,I]) :-\r\n   selecciona(A,[1,2,3,4,5,6,7,8,9],L1),\r\n   selecciona(B,L1,L2),\r\n   selecciona(C,L2,L3),\r\n   A+B+C =:= 15,\r\n   selecciona(D,L3,L4),\r\n   selecciona(G,L4,L5),\r\n   A+D+G =:= 15,\r\n   selecciona(E,L5,L6),\r\n   C+E+G =:= 15,\r\n   selecciona(I,L6,L7),\r\n   A+E+I =:= 15,\r\n   selecciona(F,L7,[H]),\r\n   C+F+I =:= 15,\r\n   D+E+F =:= 15.   \r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 C\u00e1lculo de las soluciones                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% ?- solucion_1(L).\r\n% L = [6, 1, 8, 7, 5, 3, 2, 9, 4] ;\r\n% L = [8, 1, 6, 3, 5, 7, 4, 9, 2] \r\n% Yes\r\n% \r\n% ?- solucion_2(L).\r\n% L = [2, 7, 6, 9, 5, 1, 4, 3, 8] ;\r\n% L = [2, 9, 4, 7, 5, 3, 6, 1, 8] \r\n% Yes\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Comparaci\u00f3n de eficiencia                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% ?- time(solucion_1(_X)).\r\n% 161,691 inferences in 0.23 seconds (703004 Lips)\r\n% Yes\r\n% \r\n% ?- time(solucion_2(_X)).\r\n% 1,097 inferences in 0.00 seconds (Infinite Lips)\r\n% Yes\r\n<\/pre>\n<h2><a name=\"Langford\">La sucesi\u00f3n de Langford<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% La sucesi\u00f3n de Lanford es una lista de longitud 27 en la cual \r\n% aparecen 3 veces cada uno de los d\u00edgitos del 1 al 9 y que adem\u00e1s cumple\r\n% la propiedad de que entre dos \"1\" siempre hay un d\u00edgito, entre dos \"2\"\r\n% hay dos d\u00edgitos, entre dos \"3\" hay tres digitos, etc.\r\n%\r\n% Definir el predicado langford(L) que devuelva una sucesi\u00f3n de\r\n% Langford. por ejemplo\r\n%   ?- langford(L).\r\n%   L = [1,9,1,2,1,8,2,4,6,2,7,9,4,5,8,6,3,4,7,5,3,9,6,8,3,5,7] \r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nlangford(L):-\r\n   langford_aux(L),\r\n   sublista([1,_,1,_,1],L),\r\n   sublista([2,_,_,2,_,_,2],L),\r\n   sublista([3,_,_,_,3,_,_,_,3],L),\r\n   sublista([4,_,_,_,_,4,_,_,_,_,4],L),\r\n   sublista([5,_,_,_,_,_,5,_,_,_,_,_,5],L),\r\n   sublista([6,_,_,_,_,_,_,6,_,_,_,_,_,_,6],L),\r\n   sublista([7,_,_,_,_,_,_,_,7,_,_,_,_,_,_,_,7],L),\r\n   sublista([8,_,_,_,_,_,_,_,_,8,_,_,_,_,_,_,_,_,8],L),\r\n   sublista([9,_,_,_,_,_,_,_,_,_,9,_,_,_,_,_,_,_,_,_,9],L).\r\n\r\nlangford_aux([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]).\r\n\r\n% sublista(L1,L2) se verifica si L1 es una sublista de L2.\r\nsublista(L1,L2):-\r\n   append(_,L3,L2),\r\n   append(L1,_,L3).\r\n<\/pre>\n<h2><a name=\"Mapa\">Coloraciones de un mapa<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Enunciado                                                        %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% Calcular las forma de colorear el siguiente mapa con los colores rojo,\r\n% blanco y azul de forma que las regiones vecinas tengan colores distintos.\r\n%       +----------+----------+       \r\n%       |    A     |     B    |       \r\n%       +----+-----+-----+----+       \r\n%       |    |           |    |       \r\n%       | C  |     D     | E  |       \r\n%       |    |           |    |       \r\n%       +----+-----+-----+----+       \r\n%       |    F     |     G    |       \r\n%       +----------+----------+\r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nsolucion(A,B,C,D,E,F,G) :-\r\n   colores([A,B,C,D,E,F,G]),\r\n   A \\= B, A \\= C, A \\= D,\r\n   B \\= D, B \\= E,\r\n   C \\= D, C \\= F,\r\n   D \\= E, D \\= F, D \\= G,\r\n   E \\= G,\r\n   F \\= G.\r\n\r\n% colores(Xs) se verifica si Xs es una lista de colores.\r\ncolores([]).\r\ncolores([X|Xs]) :-\r\n   color(X),\r\n   colores(Xs).\r\n\r\n% color(X) se verifica si X es uno de los tres colores.\r\ncolor(rojo).\r\ncolor(blanco).\r\ncolor(azul).\r\n\r\n% C\u00e1lculo de soluciones:\r\n%    ?- solucion(A,B,C,D,E,F,G).\r\n%    A = rojo,\r\n%    B = C, C = blanco,\r\n%    D = azul,\r\n%    E = F, F = rojo,\r\n%    G = blanco ;\r\n%    A = rojo,\r\n%    B = C, C = azul,\r\n%    D = blanco,\r\n%    E = F, F = rojo,\r\n%    G = azul ;\r\n%    A = blanco,\r\n%    B = C, C = rojo,\r\n%    D = azul,\r\n%    E = F, F = blanco,\r\n%    G = rojo \r\n%    ?- \r\n<\/pre>\n<h2><a name=\"Mono\">El mono y el pl\u00e1tano<\/a><\/h2>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% Enunciado                                                             %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% Un mono se encuentra en la puerta de una habitaci\u00f3n. En el centro de la\r\n% habitaci\u00f3n hay un pl\u00e1tano colgado del techo. El mono est\u00e1 hambriento y\r\n% desea coger el pl\u00e1tano, pero no lo alcanza desde el suelo. En la\r\n% ventana de la habitaci\u00f3n hay una silla que el mono puede usar. El mono\r\n% puede realizar las siguientes acciones:\r\n% * pasear de un lugar a otro de la habitaci\u00f3n,\r\n% * empujar la silla de un lugar a otro de la habitaci\u00f3n (si est\u00e1 en el\r\n%   mismo lugar que la silla),\r\n% * subirse en la silla (si est\u00e1 en el mismo lugar que la silla) y\r\n% * coger el pl\u00e1tano (si est\u00e1 encima de la silla en el centro de la\r\n%   habitaci\u00f3n).  \r\n%\r\n% Definir el predicado\r\n%    solucion(E,S)\r\n% de forma que S sea una sucesi\u00f3n de acciones que aplicadas al estado S\r\n% permiten al mono coger el pl\u00e1tano. Por ejemplo,\r\n%    ?- solucion(estado(puerta,suelo,ventana,sin),L).\r\n%    L = [pasear(puerta, ventana), empujar(ventana, centro), subir, coger]\r\n% donde \r\n%    estado(PM,EM,PS,X)\r\n% significa que el mono se encuentra en la posici\u00f3n PM (puerta, centro o\r\n% ventana) encima de EM (suelo o silla), la silla se encuentra en la posici\u00f3n\r\n% PS (puerta, centro o ventana) y el mono tiene (X=con) o no (X=sin) el\r\n% pl\u00e1tano. \r\n\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n%% \u00a7 Soluci\u00f3n                                                         %%\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\nsolucion(estado(_,_,_,con),[]).\r\nsolucion(E1,[A|L]) :-\r\n   movimiento(E1,A,E2),\r\n   solucion(E2,L).\r\n  \r\n% movimiento(estado(PM1,EM1,PS1,X1),A,estado(PM2,EM2,PS2,X2)) se\r\n% verifica si en el estado(PM1,EM1,PS1,X1) se puede aplicar la acci\u00f3n A\r\n% y se pasa al estado(PM2,EM2,PS2,X2) \r\nmovimiento(estado(centro,silla,centro,sin),\r\n           coger,\r\n           estado(centro,silla,centro,con)).\r\nmovimiento(estado(X,suelo,X,U),\r\n           subir,\r\n           estado(X,silla,X,U)).\r\nmovimiento(estado(X1,suelo,X1,U),\r\n           empujar(X1,X2),\r\n           estado(X2,suelo,X2,U)).\r\nmovimiento(estado(X,suelo,Z,U),\r\n           pasear(X,Z),\r\n           estado(Z,suelo,Z,U)).\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso L\u00f3gica matem\u00e1tica y fundamentos se ha presentado una colecci\u00f3n de problemas para mostrar c\u00f3mo pueden resolverse elementalmente con Prolog. Los problemas son Rompecabeza l\u00f3gico. La banda de m\u00fasicos. Mini sudoku. Criptoaritm\u00e9tica. Cuadrados m\u00e1gicos. La sucesi\u00f3n de Langford. Coloraciones de un mapa. El mono y el pl\u00e1tano. A continuaci\u00f3n&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[1],"tags":[202,294],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3385"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=3385"}],"version-history":[{"count":8,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3385\/revisions"}],"predecessor-version":[{"id":3395,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3385\/revisions\/3395"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}