2. Programación Lógica Forma normal de una fórmula Una fórmula se dice que está en forma normal si todos los cuantificadores han sido desplazados al principio de la fórmula. Algunas equivalencias útiles para alcanzar una forma normal [ ( X) p(X) ] ( X) [ p(X) ] [ ( X) p(X) ] ( X) [ p(X) ] ( X) [ p(X) q(X) ] [ ( X) p(X) ] [ ( X) q(X) ] ( X) [ p(X) q(X) ] [ ( X) p(X) ] [ ( X) q(X) ]
3. Reglas de Inferencia: Especialización Universal: siempre es posible deducir la verificación de un caso concreto a partir de un cuantificador universal. ( X) p(X) p(a) Sustitución: permite la sustitución de cualquier proposición en una fórmula por otra biequivalente. Modus ponens: de una implicación de la verificación de la premisa se verifica la conclusión. Axioma: p q Axioma: p Teorema: q
4. Programación Lógica Modus tollens: de una implicación y de la no verificación del consecuente, se concluye la no verificación de la premisa. Axioma: p q Axioma: ¬q Teorema: ¬p Y - Introducción: la fbf p q puede ser inferida de las fbf p y q. Y- Eliminación: la fbf p puede ser inferida de la fbf p q. O - Introducción: la fbf p q puede ser inferida de la fbf p o de la fbf q. Reglas de Inferencia:
9. Programación Lógica Ejercicios. Expresar como fbf en lógica de predicados los siguientes hechos A. Marco era un hombre. B. Marco era pompeyano (de Pompeya). C. Todos los pompeyanos eran romanos. D. César era un dirigente. E. Todos los romanos o bien eran leales a César o bien le odiaban. F. Todo el mundo es fiel a alguien. G. La gente sólo trata de asesinar a aquellos dirigentes a los que no son leales. H. Marco intentó asesinar a César. I. Algún romano odia a César.
10. Programación Lógica A. hombre(marco) B. pompeyano(marco) C. ( X)(pompeyano(X) romano(X)) D. dirigente(césar) E. ( X)(romano(X) leal(X,césar) odia(X,césar)) F. ( X)(hombre(X) ( Y) leal(X,Y) G. ( X) ( Y) (hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y)) H. intenta_asesinar(marco, césar) I. ( X) (romano(X) odia(X, césar))
11. Programación Lógica Teorema + Axiomas (como fórmulas bien formadas, fbf) Teorema + Axiomas (como cláusulas) Método de resolución por refutación Unificación Demostración automática de teoremas + + Lo que queremos hacer ...
12. Programación Lógica IMPORTANTE: La demostración automática de teoremas lógicos es un procedimiento que involucra una mera actividad sintáctica, o de relación entre símbolos, ignorándose completamente el contenido semántico que resulta de la interpretación de las fórmulas.
13. Programación Lógica Fórmulas bien formadas (fbf) Son aquellas que cumplen ciertos requisitos en su estructura y definen la sintaxis del cálculo de predicados Una fórmula se dice bien formada si puede derivarse de alguna de las siguientes reglas de formación: 1. Cualquier fórmula atómica es una fbf. 2. Si p y q son fbf, entonces también serán fbf las siguientes: ¬p, p q, p q, p q 3. Si X es una variable libre en la fbf p, entonces son fbf : ( X) p(X), ( X) p(X) 4. Cualquier fórmula que no pueda formarse a partir de estas reglas no es una fbf.
14. Programación Lógica Cláusula Es una fórmula que sólo contiene operadores disyuntivos y posiblemente negaciones sobre los átomos. Este tipo de fórmulas pueden ser expresadas por una única implicación. Así la fórmula: a 1 a 2 ... a n b 1 b 2 ... b m se puede transformar en : ¬(¬ a 1 ¬ a 2 ... ¬ a n ) b 1 b 2 ... b m ¬ a 1 ¬ a 2 ... ¬ a n b 1 b 2 ... b m
15.
16. Programación Lógica Proceso de paso a cláusulas: 1. Eliminar los símbolos de implicación 2. Mover las negaciones hasta las fórmulas atómicas 3. Renombrar variables 4. Eliminar los cuantificadores existenciales. 5. Desplazar los cuantificadores universales 6. Convertir los operadores AND en los más externos 7. Eliminar los cuantificadores universales. 8. Eliminar los conectores conjuntivos (AND). 9. Renombrar las variables.
17. Programación Lógica Transformación a cláusulas Para ilustrar el proceso paso a paso emplearemos la siguiente fómula compleja como ejemplo: ( X){p(X) {( Y)[p(Y) p(f(X,Y))] ( Y)[q(X,Y) p(Y)]}} 1. Eliminar los símbolos de implicación , sustituyendo p q por p q. Tras este primer paso, nuestra fómula se transforma en: ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] ( Y)[ q(X,Y) p(Y)]}}
18. Programación Lógica 2. Mover las negaciones hasta las fórmulas atómicas , para ello se emplean las leyes de Morgan y las transformaciones de cuantificadores existenciales y universales. (p q) p q (p q) p q [ ( X) p(X) ] ( X) [ p(X) ] [ ( X) p(X) ] ( X) [ p(X) ] Aplicándolo sobre el ejemplo: ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] ( Y)[ q(X,Y) p(Y)]}} ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] ( Y)[q(X,Y) p(Y)]}}
19. Programación Lógica 3. Renombrar variables , en aquellos casos en los que varias variables se hayan nombrado de igual forma. En nuestro caso esto ocurre con la variable Y que renombramos como Z en su segunda ocurrencia. Así nuestro ejemplo se transforma en: ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] ( Y)[q(X,Y) p(Y)]}} ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] ( Z)[q(X,Z) p(Z)]}}
20. Programación Lógica 4. Eliminar los cuantificadores existenciales . Las variables cuantificadas por este tipo de cuantificadores serán sustituidas por un tipo de función comodín denominada función de Skolem (proceso de skolemización). P.e. ( Z) q(X,Z) se transforma en q(X, g(X)) en donde g(X) es la función de Skolem para este caso. Nótese que no sólo se eliminan los cuantificadores existenciales sino también las variables ligadas a los mismos. La función de Skolem introducida debe ser nueva en el universo de discurso, y además deberá ser función de todas las variables cuantificadas universalmente cuyos ámbitos incluyan el ámbito del cuantificador existencial que se pretende eliminar.
21. Programación Lógica Así nuestro ejemplo se transforma en: ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] ( Z)[q(X,Z) p(Z)]}} ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] [q(X, g(X)) p(g(X))]}} Si el cuantificador existencial no se encuentra en el ámbito de ningún cuantificador universal, se usará una función de Skolem sin argumentos. Como en el siguiente ejemplo: ( Z) q(Z) se transforma en q(a) Donde el símbolo constante a referencia a la entidad que sabemos existe. Evidentemente a debe ser un símbolo que no haya sido empeado con anterioridad.
22. Programación Lógica 5. Desplazar los cuantificadores universales, de manera que queden al comienzo de la fórmula (prenex form). Estre proceso puede ser realizado por cuanto no existen ya variables distintas con el mismo nombre. ( X){ p(X) {( Y)[ p(Y) p(f(X,Y))] [q(X, g(X)) p(g(X))]}} ( X) ( Y){ p(X) { [ p(Y) p(f(X,Y))] [q(X, g(X)) p(g(X))]}} 6. Convertir los operadores conjuntivos (AND) en los más externos , para lo que se emplean las leyes distributivas. A la forma resultante se le denomina forma normal conjuntiva. Este paso se ejecuta sobre el ejemplo en dos pasos:
24. Programación Lógica 7. Eliminar los cuantificadores universales. Se trata de una eliminación convencional, no teórica, pues se asume que toda variable que aparezca está cuantificada universalmente. La función de Skolem adquiere sentido, dado que al no aparecer otras variables que las universales, pueden eliminarse sus cuantificadores por convenio. En nuestro ejemplo: ( X)( Y){ [ p(X) p(Y) p(f(X,Y))] [ p(X) q(X, g(X)) ] [ p(X) p(g(X))]} [ p(X) p(Y) p(f(X,Y))] [ p(X) q(X, g(X)) ] [ p(X) p(g(X))]
25. Programación Lógica 8. Eliminar los conectores conjuntivos (AND). Dado que la fómula se corresponde con una conjunción de subfómulas, éstas deberán verificarse por separado para que se verifique la fórmula principal. Esto produce, en nuestro caso, el siguiente conjunto de fórmulas: [ p(X) p(Y) p(f(X,Y))] [ p(X) q(X, g(X)) ] [ p(X) p(g(X))] p(X) p(Y) p(f(X,Y)) p(X) q(X, g(X)) p(X) p(g(X))
26. Programación Lógica 9. Renombrar las variables . para que no aparezca la misma variable en dos cláusulas. p(X) p(Y) p(f(X,Y)) p(X) q(X, g(X)) p(X) p(g(X)) p(X) p(Y) p(f(X,Y)) p(U) q(U, g(U)) p(W) p(g(W)) ------ * * * ------ Mediante este proceso se termina en una representación en forma de cláusulas. Así de una una única fórmula pueden resultar varias cláusulas que son más modulares y de estructura más simple.
27. Programación Lógica A. hombre(marco) B. pompeyano(marco) C. ( X)(pompeyano(X) romano(X)) D. dirigente(césar) E. ( X)(romano(X) leal(X,césar) odia(X,césar)) F. ( X)(hombre(X) ( Y) leal(X,Y) G. ( X) ( Y) (hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y)) H. intenta_asesinar(marco, césar) I. ( X) (romano(X) odia(X, césar))
28. Programación Lógica Proceso de paso a cláusulas 1. Eliminar los símbolos de implicación A. hombre(marco) B. pompeyano(marco) C. ( X)( pompeyano(X) romano(X)) D. dirigente(césar) E. ( X)( romano(X) leal(X,césar) odia(X,césar)) F. ( X)( hombre(X) ( Y) leal(X,Y) G. ( X){ ( Y) (hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y)) } H. intenta_asesinar(marco, césar) I. ( X) (romano(X) odia(X, césar))
29. Programación Lógica Proceso de paso a cláusulas 2. Mover las negaciones hasta las fórmulas atómicas A. hombre(marco) B. pompeyano(marco) C. ( X)( pompeyano(X) romano(X)) D. dirigente(césar) E. ( X)( romano(X) leal(X,césar) odia(X,césar)) F. ( X)( hombre(X) ( Y) leal(X,Y) G. ( X)( Y) ( hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y)) H. intenta_asesinar(marco, césar) I. ( X) (romano(X) odia(X, césar)) 3.Renombrar las variables
30. Programación Lógica Proceso de paso a cláusulas 4. Eliminar los cuantificadores existenciales A. hombre(marco) B. pompeyano(marco) C. ( X)( pompeyano(X) romano(X)) D. dirigente(césar) E. ( X)( romano(X) leal(X,césar) odia(X,césar)) F. ( X)( hombre(X) leal(X, g(X)) G. ( X)( Y) ( hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y)) H. intenta_asesinar(marco, césar) I. romano(f) odia(f, césar))
31. Programación Lógica Proceso de paso a cláusulas 5. Desplazar los cuantificadores universales 6. Convertir los operadores AND en los más externos A. hombre(marco) B. pompeyano(marco) C. ( X)( pompeyano(X) romano(X)) D. dirigente(césar) E. ( X)( romano(X) leal(X,césar) odia(X,césar)) F. ( X)( hombre(X) leal(X, g(X)) G. ( X)( Y) ( hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y)) H. intenta_asesinar(marco, césar) I. romano(f) odia(f, césar))
32. Programación Lógica Proceso de paso a cláusulas 7. Eliminar los cuantificadores universales A. hombre(marco) B. pompeyano(marco) C. pompeyano(X) romano(X) D. dirigente(césar) E. romano(X) leal(X,césar) odia(X,césar) F. hombre(X) leal(X, g(X)) G. hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y) H. intenta_asesinar(marco, césar) I. romano(f) odia(f, césar))
33. Programación Lógica Proceso de paso a cláusulas 8. Eliminar los conectores AND A. hombre(marco) B. pompeyano(marco) C. pompeyano(X) romano(X) D. dirigente(césar) E. romano(X) leal(X,césar) odia(X,césar) F. hombre(X) leal(X, g(X)) G. hombre(X) dirigente(Y) intenta_asesinar(X,Y) leal(X,Y) H. intenta_asesinar(marco, césar) I1. romano(f) I2. odia(f, césar))
34. Programación Lógica Proceso de paso a cláusulas 9. Renombrar las variables A. hombre(marco) B. pompeyano(marco) C. pompeyano(X) romano(X) D. dirigente(césar) E. romano(Y) leal(Y,césar) odia(Y,césar) F. hombre(Z) leal(Z, g(Z) G. hombre(W) dirigente(K) intenta_asesinar(W,K) leal(W,K) H. intenta_asesinar(marco, césar) I1. romano(f) I2. odia(f, césar))