LMF2013: Soluciones lógicas de problemas lógicos
En la clase de hoy del curso Lógica matemática y fundamentos se ha presentado una colección de problemas para mostrar cómo pueden resolverse elementalmente con Prolog.
Los problemas son
- Rompecabeza lógico.
- La banda de músicos.
- Mini sudoku.
- Criptoaritmética.
- Cuadrados mágicos.
- La sucesión de Langford.
- Coloraciones de un mapa.
- El mono y el plátano.
A continuación se muestran los problemas y sus soluciones
Rompecabeza lógico
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % En una conversación, Santiago, Cristina y Pablo descubren que tienen % distintas profesiones y que tocan diferentes intrumentos % musicales. Sus profesiones son médico, abogado e ingeniero. Los % instrumentos que tocan son piano, flauta y violín. Además, % 1. Cristina está casada con el médico. % 2. El abogado toca el piano. % 3. Cristina no es ingeniero. % 4.Santiago es paciente del violinista. % ¿Quién toca la flauta? %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solucion(Flauta) :- personas_distintas(Medico,Abogado,Ingeniero), % Tienen distintas profesiones. personas_distintas(Piano,Violin,Flauta), % Tocan distintos instrumentos. \+ cristina = Medico, % Cristina está casada con el médico. Abogado = Piano, % El abogado toca el piano. \+ Ingeniero = cristina, % Cristina no es ingeniero. Violin = Medico, % Santiago es paciente del violinista. \+ santiago = Violin. % personas_distintas(A,B,C) se verifica si A, B y C son tres personas distintas. personas_distintas(A,B,C) :- persona(A), persona(B), persona(C), \+ A=B, \+ A=C, \+ B=C. % persona(X) se verifica si X es una persona. persona(cristina). persona(santiago). persona(pablo). % Cálculo de la solución: % ?- solucion(F). % F = santiago ; % false. |
La banda de músicos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Se sabe que % 1. Una banda está compuesta por tres músicos de distintos paises y que % tocan distintos instrumentos. % 2. El pianista toca primero. % 3. Juan toca el saxo y toca antes que el australiano. % 4. Marcos es francés y toca antes que el violinista. % 5. Hay un músico japonés. % 6. Un músico se llama Saúl. % Determinar el nombre, el país y el instrumento que toca cada uno de % los músicos de la banda. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % solucion(S) :- S es una solución del problema de los músicos. solucion(S) :- componentes_de_la_banda(S), % 1 primero(X,S), % 2 instrumento(X,piano), antes(Y,Z,S), % 3 nombre(Y,juan), instrumento(Y,saxo), pais(Z,australia), antes(Y1,Z1,S), % 4 nombre(Y1,marco), pais(Y1,francia), instrumento(Z1,violin), pertenece(U,S), % 5 pais(U,japon), pertenece(V,S), % 6 nombre(V,saul). % componentes_de_la_banda(B) :- B son los componentes de la banda. componentes_de_la_banda(banda(musico(N1,P1,I1), musico(N2,P2,I2), musico(N3,P3,I3))). % primero(X,B) :- X es el primer músico de la banda B primero(X,banda(X,_,_)). % instrumento(X,I) :- el músico X toca el instrumento I. instrumento(musico(_,_,I),I). % antes(X,Y,B) :- X toca antes que Y en la banda B antes(X,Y,banda(X,Y,Z)). antes(X,Z,banda(X,Y,Z)). antes(Y,Z,banda(X,Y,Z)). % nombre(X,N) :- el nombre del músico X es N. nombre(musico(N,_,_),N). % pais(X,P) :- el país del músico X s P. pais(musico(_,P,_),P). % pertenece(X,B) :- X es un músico de la banda B. pertenece(X,banda(X,Y,Z)). pertenece(Y,banda(X,Y,Z)). pertenece(Z,banda(X,Y,Z)). % Cálculo de la solución: % ?- solucion(S). % S = banda(musico(marco, francia, piano), % musico(juan, japon, saxo), % musico(saul, australia, violin)) ; % false |
Mini sudoku
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Se tiene un tablero de 4x4, donde algunas celdas están vacías y otras % contienen números entre 1 y 4. El problema consiste en llenar todas % las celdas con números entre 1 y 4 tales que % * los números en cada una de las 4 filas sean distintos, % * los números en cada una de las 4 columnas sean distintos y % * los números en cada uno de las 4 submatrices 2x2 son distintos. % Por ejmplo, para el sudoku de la izquierda la solución es el de la % derecha: % 1 4 _ _ 1 4 3 2 % _ _ 4 _ 3 2 4 1 % 2 _ _ _ 2 3 1 4 % _ _ _ 3 4 1 2 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % sudoku(E,L) se verifica si L es la lista que representa el sudoku E. sudoku(ej1,[1,4,_,_, _,_,4,_, 2,_,_,_, _,_,_,3]). % solucion_sudoku(S,L) se verifica si L es la solución del sudoku del % ejemplo S. solucion_sudoku(S,L) :- length(L,16), sudoku(S,L), es_solucion(L). % es_solucion(L) se verifica si L es una solución del sudoku. es_solucion([R11,R12,R13,R14, R21,R22,R23,R24, R31,R32,R33,R34, R41,R42,R43,R44]) :- numeros([R11,R12,R13,R14]), numeros([R21,R22,R23,R24]), % filas 1,2 numeros([R31,R32,R33,R34]), numeros([R41,R42,R43,R44]), % filas 3,4 numeros([R11,R21,R31,R41]), numeros([R12,R22,R32,R42]), % columnas 1,2 numeros([R13,R23,R33,R43]), numeros([R14,R24,R34,R44]), % columnas 3,4 numeros([R11,R12,R21,R22]), numeros([R13,R14,R23,R24]), % NO y NE numeros([R31,R32,R41,R42]), numeros([R33,R34,R43,R44]). % SO y SE % numeros(L) se verifica si L es una lista de números distintos entre 1 % y 4. numeros([]). numeros([X|Xs]) :- numeros(Xs), numero(X), \+ member(X,Xs). % numero(X) se verifica si X es un número entre 1 y 4. numero(X):- member(X,[1,2,3,4]). % Escribe términos hasta 1000 de profundidad. :- set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(1000)]). % Cálculo de la solución: % ?- solucion_sudoku(ej1,L). % L = [1,4,3,2,3,2,4,1,2,3,1,4,4,1,2,3] ; % false. |
Criptoaritmética
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % El problema consiste en sustituir cada una de las letras por un dígito % de forma que a letras distintas les correspondan dígitos distintos y % se verifique la siguiente suma % SEND % + MORE % ------ % MONEY %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % solucion(S) se verifica si S es una solución del problema solucion([[S,E,N,D],[M,O,R,E],[M,O,N,E,Y]]) :- digito(D), digito(E), Y is (D+E) mod 10, C1 is (D+E) // 10, digito(N), digito(R), E is (N+R+C1) mod 10, C2 is (N+R+C1) // 10, digito(E), digito(O), N is (E+O+C2) mod 10, C3 is (E+O+C2) // 10, digito(S), S > 0, digito(M), M > 0, O is (S+M+C3) mod 10, M is (S+M+C3) // 10, digitos_distintos([S,E,N,D,M,O,R,Y]). % digitos_distintos(L) se verifica si L es una lista de dígitos distintos. digitos_distintos([]). digitos_distintos([X|Xs]) :- digitos_distintos(Xs), digito(X), \+ member(X,Xs). % digito(X) se verifica si X es un dígito. digito(X) :- member(X,[0,1,2,3,4,5,6,7,8,9]). % Cálculo de la solución: % ?- solucion(S). % S = [[9,5,6,7],[1,0,8,5],[1,0,6,5,2]] ; % false. |
Cuadrados mágicos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Colocar los números 1,2,3,4,5,6,7,8,9 en un cuadrado 3x3 de forma que % todas las líneas (filas, columnas y diagonales) sumen igual. % % (Idea: Buscar los valores para las variables A,B,C,D,E,F,G,H,I % +---+---+---+ % | A | B | C | % +---+---+---+ % | D | E | F | % +---+---+---+ % | G | H | I | % +---+---+---+ % tales que % {A,B,C,D,E,F,G,H,I} = {1,2,3,4,5,6,7,8,9}, % A+B+C = 15, % D+E+F = 15, % G+H+I = 15, % A+D+G = 15, % B+E+H = 15, % C+F+I = 15, % A+E+I = 15, % C+E+G = 15. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución 1 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solucion_1([A,B,C,D,E,F,G,H,I]) :- permutacion([1,2,3,4,5,6,7,8,9],[A,B,C,D,E,F,G,H,I]), A+B+C =:= 15, D+E+F =:= 15, G+H+I =:= 15, A+D+G =:= 15, B+E+H =:= 15, C+F+I =:= 15, A+E+I =:= 15, C+E+G =:= 15. % permutacion(L1,L2) se verifica si L2 es una permutación del L1. Por % ejemplo, % ?- permutacion([a,b,c],L). % L = [a,b,c] ; % L = [b,a,c] ; % L = [b,c,a] ; % L = [a,c,b] ; % L = [c,a,b] ; % L = [c,b,a] ; % false. permutacion([],[]). permutacion([X|L1],L2) :- permutacion(L1,L3), selecciona(X,L2,L3). % selecciona(X,L1,L2) se verifica si X es un elemento de L1 y L2 son los % restantes elementos. Por ejemplo, % ?- selecciona(X,[a,b,c],L). % X = a, % L = [b,c] ; % X = b, % L = [a,c] ; % X = c, % L = [a,b] ; % false. selecciona(A,[A|L1],L1). selecciona(B,[A|L1],[A|L2]) :- selecciona(B,L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución 2 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solucion_2([A,B,C,D,E,F,G,H,I]) :- selecciona(A,[1,2,3,4,5,6,7,8,9],L1), selecciona(B,L1,L2), selecciona(C,L2,L3), A+B+C =:= 15, selecciona(D,L3,L4), selecciona(G,L4,L5), A+D+G =:= 15, selecciona(E,L5,L6), C+E+G =:= 15, selecciona(I,L6,L7), A+E+I =:= 15, selecciona(F,L7,[H]), C+F+I =:= 15, D+E+F =:= 15. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Cálculo de las soluciones %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ?- solucion_1(L). % L = [6, 1, 8, 7, 5, 3, 2, 9, 4] ; % L = [8, 1, 6, 3, 5, 7, 4, 9, 2] % Yes % % ?- solucion_2(L). % L = [2, 7, 6, 9, 5, 1, 4, 3, 8] ; % L = [2, 9, 4, 7, 5, 3, 6, 1, 8] % Yes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Comparación de eficiencia %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ?- time(solucion_1(_X)). % 161,691 inferences in 0.23 seconds (703004 Lips) % Yes % % ?- time(solucion_2(_X)). % 1,097 inferences in 0.00 seconds (Infinite Lips) % Yes |
La sucesión de Langford
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % La sucesión de Lanford es una lista de longitud 27 en la cual % aparecen 3 veces cada uno de los dígitos del 1 al 9 y que además cumple % la propiedad de que entre dos "1" siempre hay un dígito, entre dos "2" % hay dos dígitos, entre dos "3" hay tres digitos, etc. % % Definir el predicado langford(L) que devuelva una sucesión de % Langford. por ejemplo % ?- langford(L). % 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] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% langford(L):- langford_aux(L), sublista([1,_,1,_,1],L), sublista([2,_,_,2,_,_,2],L), sublista([3,_,_,_,3,_,_,_,3],L), sublista([4,_,_,_,_,4,_,_,_,_,4],L), sublista([5,_,_,_,_,_,5,_,_,_,_,_,5],L), sublista([6,_,_,_,_,_,_,6,_,_,_,_,_,_,6],L), sublista([7,_,_,_,_,_,_,_,7,_,_,_,_,_,_,_,7],L), sublista([8,_,_,_,_,_,_,_,_,8,_,_,_,_,_,_,_,_,8],L), sublista([9,_,_,_,_,_,_,_,_,_,9,_,_,_,_,_,_,_,_,_,9],L). langford_aux([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). % sublista(L1,L2) se verifica si L1 es una sublista de L2. sublista(L1,L2):- append(_,L3,L2), append(L1,_,L3). |
Coloraciones de un mapa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Calcular las forma de colorear el siguiente mapa con los colores rojo, % blanco y azul de forma que las regiones vecinas tengan colores distintos. % +----------+----------+ % | A | B | % +----+-----+-----+----+ % | | | | % | C | D | E | % | | | | % +----+-----+-----+----+ % | F | G | % +----------+----------+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solucion(A,B,C,D,E,F,G) :- colores([A,B,C,D,E,F,G]), A \= B, A \= C, A \= D, B \= D, B \= E, C \= D, C \= F, D \= E, D \= F, D \= G, E \= G, F \= G. % colores(Xs) se verifica si Xs es una lista de colores. colores([]). colores([X|Xs]) :- color(X), colores(Xs). % color(X) se verifica si X es uno de los tres colores. color(rojo). color(blanco). color(azul). % Cálculo de soluciones: % ?- solucion(A,B,C,D,E,F,G). % A = rojo, % B = C, C = blanco, % D = azul, % E = F, F = rojo, % G = blanco ; % A = rojo, % B = C, C = azul, % D = blanco, % E = F, F = rojo, % G = azul ; % A = blanco, % B = C, C = rojo, % D = azul, % E = F, F = blanco, % G = rojo % ?- |
El mono y el plátano
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Enunciado %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Un mono se encuentra en la puerta de una habitación. En el centro de la % habitación hay un plátano colgado del techo. El mono está hambriento y % desea coger el plátano, pero no lo alcanza desde el suelo. En la % ventana de la habitación hay una silla que el mono puede usar. El mono % puede realizar las siguientes acciones: % * pasear de un lugar a otro de la habitación, % * empujar la silla de un lugar a otro de la habitación (si está en el % mismo lugar que la silla), % * subirse en la silla (si está en el mismo lugar que la silla) y % * coger el plátano (si está encima de la silla en el centro de la % habitación). % % Definir el predicado % solucion(E,S) % de forma que S sea una sucesión de acciones que aplicadas al estado S % permiten al mono coger el plátano. Por ejemplo, % ?- solucion(estado(puerta,suelo,ventana,sin),L). % L = [pasear(puerta, ventana), empujar(ventana, centro), subir, coger] % donde % estado(PM,EM,PS,X) % significa que el mono se encuentra en la posición PM (puerta, centro o % ventana) encima de EM (suelo o silla), la silla se encuentra en la posición % PS (puerta, centro o ventana) y el mono tiene (X=con) o no (X=sin) el % plátano. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% § Solución %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solucion(estado(_,_,_,con),[]). solucion(E1,[A|L]) :- movimiento(E1,A,E2), solucion(E2,L). % movimiento(estado(PM1,EM1,PS1,X1),A,estado(PM2,EM2,PS2,X2)) se % verifica si en el estado(PM1,EM1,PS1,X1) se puede aplicar la acción A % y se pasa al estado(PM2,EM2,PS2,X2) movimiento(estado(centro,silla,centro,sin), coger, estado(centro,silla,centro,con)). movimiento(estado(X,suelo,X,U), subir, estado(X,silla,X,U)). movimiento(estado(X1,suelo,X1,U), empujar(X1,X2), estado(X2,suelo,X2,U)). movimiento(estado(X,suelo,Z,U), pasear(X,Z), estado(Z,suelo,Z,U)). |