LMF2013: Introducción a la programación lógica con Prolog
En la clase de hoy del curso Lógica matemática y fundamentos se ha realizado una introducción a la programación lógica con Prolog como aplicación de la resolución en la lógica de primer orden.
Se ha presentado el sistema deductivo de Prolog en tres fases: proposicional, relacional y funcional. En cada una se ha comentado cómo representar el conocimiento, cómo realizar consultas y cómo es el razonamiento de Prolog para calcular las respuestas.
Los apuntes de esta clase son Introducción a la programación lógica con Prolog (páginas 1-26).
Las transparencias de esta clase son las páginas 1 a 18 del tema 13
Como ejemplo de aplicación de la programación lógica a la solución de problemas lógicos hemos comentado el rompecabeza de Lewis Carroll
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 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % En este ejercicio vamos a resolver el siguiente rompecabezas lógico propuesto % por Lewis Carroll: % % Cinco hombres de distintas nacionalidades viven en las cinco primeras casa % de una calle. Cada uno tiene una profesión, un animal favorito y una bebida % favorita (todas distintas de la de los otros). Sabemos que % 1. El inglés vive en la casa roja. % 2. El español tiene un perro. % 3. El propietario de la casa verde bebe café. % 4. El italiano bebe té. % 5. La casa verde está a la derecha de la blanca. % 6. El escultor cría caracoles. % 7. El diplomático vive en la casa amarilla. % 8. En la casa central beben leche. % 9. El Noruego vive en la primera casa de la izquierda. % 10. El zorro está en la casa vecina de la del médico. % 11. El caballo está en la casa vecina de la del diplomático. % 12. El violinista bebe zumo de fruta. % 13. El japonés es pintor. % 14. La casa del noruego está al lado de la casa azul. % Determinar dónde está la cebra y quién bebe agua. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % presolución(?L) % se verifica si L es una presolución; es decir, una lista de 5 elementos % de la forma casa(E1,E2,E3,E4,E5) donde E1 es el color de la casa, E2 la % nacionalidad del que vive en la casa, E3 el animal que hay en la casa, E4 % la bebida favorita del que vive en la casa y E5 la profesión del que vive % en la casa. presolución([casa(_,_,_,_,_), casa(_,_,_,_,_), casa(_,_,_,_,_), casa(_,_,_,_,_), casa(_,_,_,_,_)]). % vecina_derecha(A,B,L) % se verifica si A está a la derecha de B en la lista L; es decir, B es el % siguiente elemento de A en L. Por ejemplo, % ?- vecina_derecha(X,Y,[a,b,c]). % X = b Y = a ; % X = c Y = b ; % No % ?- length(L,3), vecina_derecha(a,b,L). % L = [b, a, _G384] ; % L = [_G378, b, a] ; % No vecina_derecha(A,B,[B,A|_]). vecina_derecha(A,B,[_|RL]) :- vecina_derecha(A,B,RL). % vecina(A,B,L) % se verifica si A y B son vecinas en L; es decir, son elementos % consecutivos en L. Por ejemplo, % ?- vecina(X,Y,[a,b,c]). % X = a Y = b ; % X = b Y = a ; % X = b Y = c ; % X = c Y = b ; % No % ?- length(L,3), vecina(a,b,L). % L = [a, b, _G336] ; % L = [b, a, _G336] ; % L = [_G330, a, b] ; % L = [_G330, b, a] ; % No % vecina(A,B,[A,B|_]). vecina(A,B,[B,A|_]). vecina(A,B,[_|RL]) :- vecina(A,B,RL). % solución_carroll(L) % se verifica si L es una solución al rompecabezas; esto es, L debe ser una % presolución que verifique todas las condiciones del enunciado. solución_carroll(L) :- presolución(L), % 1. El inglés vive en la casa roja: member(casa(roja,inglés,_,_,_),L), % 2. El español tiene un perro: member(casa(_,español,perro,_,_),L), % 3. El propietario de la casa verde bebe café: member(casa(verde,_,_,café,_),L), % 4. El italiano bebe té: member(casa(_,italiano,_,té,_),L), % 5. La casa verde está a la derecha de la blanca: vecina_derecha(casa(verde,_,_,_,_),casa(blanca,_,_,_,_),L), % 6. El escultor cría caracoles: member(casa(_,_,caracol,_,escultor),L), % 7. El diplomático vive en la casa amarilla: member(casa(amarilla,_,_,_,diplomático),L), % 8. En la casa central beben leche: L = [_,_,casa(_,_,_,leche,_),_,_], % 9. El Noruego vive en la primera casa de la izquierda: L = [casa(_,noruego,_,_,_)|_], % 10. El zorro está en la casa vecina de la del médico: vecina(casa(_,_,_,_,médico),casa(_,_,zorro,_,_),L), % 11. El caballo está en la casa vecina de la del diplomático: vecina(casa(_,_,_,_,diplomático),casa(_,_,caballo,_,_),L), % 12. El violinista bebe zumo de fruta: member(casa(_,_,_,zumo,músico),L), % 13. El japonés es pintor: member(casa(_,japonés,_,_,pintor),L), % 14. La casa del noruego está al lado de la casa azul: vecina(casa(_,noruego,_,_,_),casa(azul,_,_,_,_),L), % La cebra está en alguna casa: member(casa(_,_,cebra,_,_),L), % Alguien bebe agua: member(casa(_,_,_,agua,_),L). /* Cálculo de las soluciones del rompecabeza. ?- solución_carroll(L). L = [casa(amarilla, noruego, zorro, agua, diplomático), casa(azul, italiano, caballo, té, médico), casa(roja, inglés, caracol, leche, escultor), casa(blanca, español, perro, zumo, músico), casa(verde, japonés, cebra, café, pintor)] ; No Por tanto, la cebra está en la casa verde y bebe agua el diplomático. */ |