Source: http://www.slideshare.net/uni_fcys_sistemas/programacion-declarativa-manual-basico-de-teoria
Timestamp: 2015-01-26 01:32:10+00:00

Document:
Programacion declarativa manual basico de teoria
Loading... Programacion declarativa manual basico de teoria
by Reina Rodriguez
Como Se Hace La Sal
by guest547258
60268 views
by yamy matin
71800 views
Programación Orientada a Objetos vs...
by Michael de la Cruz
by María Elena Alvarez
Practicas prolog
by maxsp5566
Linea del tiempo de la computacion ...
by Javier Madrid
158800 views
12 programacion modular
by guestb97266b9
by lexar4203
by Lisbet-santana-eren
guest547258
Programación Orientada a Objetos vs Programación Estructurada
María Elena Alvarez
maxsp5566
158,800 views
guestb97266b9
lexar4203
Lisbet-santana-eren
guestefc95b
samirchalare
Fredy Olaya
ResolucióN Ministerial Nº 155 2008 Ed.
Percy Javier Flores Mamani
M O D U L A R I D A D
Ciclos de repeticion
jesusmitesoro
Programación modular estructurada.ppt
Modelo top down
niazuluaga
Metodologia topdownespañol
Jesus Calixto Tello
oharenas
DIEGO BAROJA
Programación Modular y Estructyrada
Israel Calderón
Programacion Orientada Objetos
liliandrade
vnslgars
May Ibarra
0000261 programacion estructurada
Clases abstractas e interfaces (AlexandraPerez)
Libro tecnica de programacion
Marialix Quintero
Programación en Prolog para Inteligencia Artificial
Egdares Futch
Tecnicas de programacion
Jose Luis Vega Farfan
Tutorialgamemaker
Gamemakeruno
Makegamessapresso
Gamemakeriii
Presentacion gamemaker
Tutorialgamemaker2
Creandojuegoscongamemaker8
Introducción a la ingeniería de software(segunda parte)
Formas normales de Skolem para lógica proposicional y de predicados
Guiones o scripts en la representación del conocimiento
Árboles de decisión y listas
Lógica de predicado de primer orden y orden
Sistemas expertos y sus aplicaciones
Metodología CommonKADS
ingenieria del conocimiento
Enunciados de casos para Bases de Datos
Diagramadeclase
Uml diagrama clase objeto
Desarollo de sofware con algoritmos genéticos
Alcances de la IA: Resumen.
Common kads
Interfaces de usuario inteligente
La IA y la ley de Moore
Mejoras de la publicidad en web con la I. A.
Oportunidades de negocios desde la I. A.
Desarrollo de software con bases de datos inteligentes
Programación automática - grupo 9
Ejercicios de lógica proposicional y de predicados - grupo 8
La I. A. en la agricultura
Ejercicios de logica proposicional y de predicados - grupo 7
Ejercicios de logica proposicional y de predicados - grupo 6
La I. A. y el reconocimiento de voz
Programación DeclarativaMANUAL BÁSICO DE TEORÍA Sergio García Mondaray ­ 2008 ­ www.yakiboo.net 2.
ÍNDICETEMA 1: Introducción 01 1. Computadores y lenguajes de programación convencionales 01 1.1. Organización de los computadores 01 1.2. Características de los lenguajes convencionales 01 2. Programación declarativa 02 2.1. Programación lógica 03 2.2. Programación funcional 03 3. Comparación y áreas de aplicación 03TEMA 2: Preliminares y fundamentos 05 1. Sistemas formales 05 2. Lógica de predicados 05 3. Semántica y lenguajes de programación 05 3.1. Necesidad de definición semántica formal 05 3.2. Lenguajes de programación declarativa 07TEMA 3 – De la demostración automática a la Prog. Lógica 08 1. Razonamiento automático 08 1.1. Aproximaciones a la DAT 08 1.2. Un demostrador automático genérico 08 1.3. Límites de la DAT 09 2. Procedimiento de prueba por refutación 09 3. Formas normales 10 3.1. Formas normales en la lógica proposicional 10 3.2. Formas normales en la lógica de predicados 10 4. La forma clausal 10 4.1. Forma normal de Skolem 11 4.2. Cláusulas 11 4.3. El papel de la forma clausal en los proc. de prueba 11 5. Teorema de Herbrand 12 5.1. Universo de Herbrand y H­interpretaciones 12 5.2. Modelos de Herbrand 14 5.3. El teorema de Herbrand y sus dificultades 14 6. El principio de resolución de Robinson 15 6.1. El principio de resolución en la lógica de proposic. 15 6.2. Sustituciones 15 6.3. Unificación 16 6.4. El principio de resolución en la lógica de predicad. 18 6.5. Estrategias de resolución 18 3.
Tema 4 – Programación lógica 20 1. Sintaxis 20 1.1. Notación para las cláusulas 20 1.2. Cláusulas de Horn y programas definidos 21 2. Semántica operacional (Resolución SLD) 21 2.1. Procedimiento de prueba y objetivos definidos 21 2.2. Resolución SLD y respuesta computada 22 2.3. Árboles de búsqueda SLD procedim. de prueba 23 3. Semántica declarativa y respuesta correcta 25 4. Corrección y completitud de la resolución SLD 26 5. Significado de los programas 27 5.1. Semántica operacional 27 5.2. Semántica declarativa 27 5.3. Semántica por punto fijo 28 5.4. Equivalencia entre semánticas 30Anexo 1 – Tablas 31 Tabla 1. Fórmulas equivalentes de la lógica de proposiciones 31 Tabla 2. Fórmulas equivalentes de la lógica de predicados 31 Tabla 3. Hechos notables (Principio de resoluc. Robinson) 32 Tabla 4. Clasificación de las cláusulas y objetivos 32Anexo 2 – Algoritmos 33 Algoritmo 1. Transformar fbf en forma normal conjuntiva (o disyuntiva) 33 Algoritmo 2. Transformar fbf en forma normal prenexa 33 Algoritmo 3. Skolemización 34 Algoritmo 4. Términos básicos (Herbrand) 34 Algoritmo 5. Conjunto insatisfacible de cláusulas (Herbrand) 35 Algoritmo 6. Sustitución compuesta 35 Algoritmo 7. Algoritmo de Resolución 35 4.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray TEMA 1 – INTRODUCCIÓN1. COMPUTADORES Y LENGUAJES DE PROGRAMACIÓN CONVENCIONALES Los lenguajes de programación convencionales son una abstracción de alto nivel de la estructura de la máquina para la que se han desarrollado. Muchos de sus defectos provienen de esta estrecha relación. 1.1. Organización de los computadores: Los computadores que siguen el modelo de Von Neumann constan de: • CPU: Unidad Central de Proceso. Está compuesta por los registros, la UC (trata las instrucciones), la ALU (trata los datos), y un reloj. • MC: Memoria Central. Conjunto de celdas, que pueden considerarse numeradas, donde se almacenan datos e instrucciones. • Bus del sistema: conjunto de conductores paralelos a través de los cuales transcurren las señales eléctricas que se intercambian los componentes del sistema. La organización en torno a un único bus es la menos costosa, pero produce un cuello de botella. Además gran parte del tráfico no es útil para el cómputo (son direcciones de las instrucciones y los datos). • Periféricos. Esta organización conduce a un modelo de cómputo en el que los procesadores ejecutan las instrucciones secuencialmente, por lo que los lenguajes convencionales son difíciles de paralelizar. Otra característica de esta organización que repercute en el diseño de los lenguajes de programación convencionales es el hecho de que se realiza una completa separación entre instrucciones y datos. Por otro lado, el uso de registros y la visión de la MC como conjunto de celdas nos lleva al concepto de estado de la computación. 1.2. Características de los lenguajes convencionales: Los recursos que los lenguajes convencionales proporcionan pueden verse como abstracciones de los componentes de la arquitectura, donde las variables equivalen a registros o celdas de memoria, los arrays equivalen a un conjunto contiguo de celdas, las instrucciones de control son los saltos del lenguaje máquina, y las asignaciones corresponden a instrucciones LOAD/STORE. Las instrucciones de asignación resultan ser representativas del cuello de botella, y nos obliga a pensar en términos de trasiego de información entre celdas de memoria. En las tareas de programación podemos distinguir dos aspectos fundamentales: • Aspectos lógicos : Qué debe computarse. • Aspectos de control : En qué orden y qué memoria debe usarse. Según Kowalski estos dos aspectos deben ser independientes. Atendiendo a esta independencia, podemos elevar algunas críticas sobre los lenguajes imperativos: ­ 1 ­ 5.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 1. Las instrucciones de control de flujo y gestión de memoria oscurecen el contenido lógico del programa. 2. La asignación utiliza las variables de un modo matemáticamente impuro (con expresiones como x=x+1). 3. No es lo más indicado dejar en manos del programador las cuestiones de control y memoria. Para entender un programa hecho en un lenguaje imperativo debemos ejecutarlo mentalmente, siguiendo el modelo de computación de Von Neumann. Además esta imperatividad causa una rigidez del lenguaje a la hora de definir nuevos tipos de datos, rigidez que en muchas ocasiones hace que los programas acusen falta de generalidad, es decir: un programa creado para concatenar listas de caracteres no servirá para concatenar listas de otros datos. A pesar de todos estos puntos débiles, los lenguajes imperativos reúnen muchas ventajas como: eficiencia en la ejecución, modularidad, herramientas para la compilación separada y depuración de errores, etc. lo que los convierte en los lenguajes preferidos en amplias áreas de aplicación (computación numérica, gestión y tratamiento de la información, programación de sistemas...).2. PROGRAMACIÓN DECLARATIVA La programación declarativa es un estilo de programación en el que el programador especifica qué debe computarse y no cómo debe hacerse. Según este principio Kowalski define un programa como la unión de lógica y control (programa = lógica + control), donde el componente lógico determina el significado, mientras que el de control sólo su eficiencia. Así la tarea de programar se centra en la lógica, puesto que se asume el control automático a la máquina. La característica fundamental de la programación declarativa es el uso de la lógica como lenguaje de programación. En este caso un programa es una teoría formal en una cierta lógica, es decir, un conjunto de fórmulas lógicas que resultan ser la especificación del problema a resolver. Así la computación se entiende como una forma de inferencia o deducción en dicha lógica. Los requisitos que debe cumplir la lógica empleada son:1) Un lenguaje suficientemente expresivo.2) Una semántica operacional (mecanismos de cómputo que permiten la ejecución de programas).3) Una semántica declarativa que permita dar significado a los programas de forma independiente a su ejecución.4) Corrección y completitud, para asegurar que aquello que se computa coincide con lo considerado verdadero. No obstante, dependiendo del tipo de lógica existen varios estilos de programación declarativa: funcional (lógica ecuacional), relacional (lógica clausal), de tipos (lógica heterogénea), etc. ­ 2 ­ 6.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 2.1. Programación lógica: La programación lógica se basa en fragmentos de la lógica de predicados: lógica de cláusulas de Horn. En ésta no hay ninguna referencia explícita a la representación en memoria. Un lenguaje declarativo conlleva la gestión automática de la memoria. Se utiliza un mecanismo que permite una búsqueda indeterminista (built­in search) de soluciones, por tanto: 1. El programa puede responder a diferentes objetivos sin efectuar cambios. 2. Se permite el cómputo de datos parcialmente definidos. 3. La relación de entrada/salida no está fijada de antemano. 2.2. Programación funcional: Los lenguajes funcionales se basan en el concepto de función matemática y su definición mediante ecuaciones (generalmente recursivas) que constituyen el programa. Con estos lenguajes existe la necesidad de fijar el perfil de la función => tipo de datos. Las características de estos lenguajes son: 1. Transparencia referencial: la salida depende exclusivamente de la entrada. 2. Capacidad de composición: de cualquier otro tipo de funciones, además la composción refuerza la modularidad. 3. Orden superior: tratar las funciones como unidades simples.3. COMPARACIÓN CON LOS LENGUAJES CONVENCIONALES Y ÁREAS DE APLICACIÓN Realizaremos la comparación entre los lenguajes declarativos y los convencionales estudiando una serie de atributos útiles para medir la calidad de los lenguajes de programación: 1) Diseño del lenguaje y escritura de los programas: sintaxis sencilla, modularidad y compilación separada, reutilización del software, facilidades de análisis, y entornos de programación. Los lenguajes declarativos son lenguajes de especificación, por lo que son muy adecuados en las fases de análisis y rápido prototipado. Sin embargo, estos lenguajes tienen uno de sus puntos débiles en los entornos de programación. Por otro lado, los lenguajes convencionales requieren pseudocódigo y una técnica de diseño que después será traducido al lenguaje elegido, por tanto necesita herramientas de ayuda al diseño. Estas utilidades les colocan por encima de los lenguajes declarativos en la depuración, edición, etc. ­ 3 ­ 7.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 2) Verificación de programas: verificación de la corrección (si la semántica es la esperada), terminación (un programa siempre debe terminar), y depuración de programas. En este criterio los dos tipos de lenguajes andan igualados (salvo en la tarea de depurar), puesto que se trata de realizar baterías de prueba que no aseguran el buen funcionamiento a no ser que sean muy grandes, lo que supondría un gasto elevado de tiempo. 3) Mantenimiento: facilidad de uso y lectura (del código fuente), modularidad y compilación separada. Tanto los lenguajes convencionales como los declarativos satisfacen este criterio, exceptuando la compilación separada, de la cual no gozan los lenguajes declarativos. 4) Coste y eficiencia: coste de ejecución y coste de desarrollo. En los lenguajes declarativos el coste de ejecución es otro punto débil, dada su ineficiencia. La causa es la dificultad de implementar las operaciones de unificación, emparejamiento y los mecanismos de búsqueda de soluciones en las arquitecturas actuales. Sin embargo los costes de desarrollo son muy bajos, por ejemplo la relación de líneas de código entre C y PROLOG es de 10 a 1. De estos puntos se desprende la idea de que no existe un lenguaje óptimo para todos los casos, sino que cada lenguaje tiene su dominio de aplicación. Así el ámbito de los lenguajes declarativos es muy variado y, aunque generalmente se ha aplicado a los campos de la computación simbólica (de ahí que se les llame también lenguajes de computación simbólica), algunas otras aplicaciones son: • Representación del conocimiento, resolución de problemas, desarrollo de sistemas de producción, sistemas expertos y procesamiento del lenguaje natural. • Metaprogramación. • Prototipado de aplicaciones, bases de datos educativas, servidores y buceadores de información inteligentes. • Química y biología molecular. • Diseño de sistemas VLSI. ­ 4 ­ 8.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray TEMA 2 – PELIMINARES Y FUNDAMENTOS1. SISTEMAS FORMALES Según Carnap, el estudio de un sistema abarca la sintaxis, la semántica y las relaciones entre ambas, luego un sistema formal sería algo más que un lenguaje formal y un cálculo deductivo.Definición ­ Sistema formal es un modelo de razonamiento matemático formado por dos componentes: 1) Sintaxis: constituida por un lenguaje formal (conjunto de símbolos y fórmulas sintácticamente correctas, compuesto por un alfabeto y unas reglas) y un cálculo deductivo (conjunto de reglas que permiten obtener fórmulas nuevas atendiendo sólo a la sintaxis). 2) Semántica: estudia el significado de los símbolos, por lo que se introduce el concepto de interpretación (conjunto de reglas precisas que permiten asignar objetos de un dominio a ciertas expresiones de un lenguaje formal).Los sistemas formales tienen una serie de propiedades: consistencia (no se puede dar A y ¬A), corrección (todo lo demostrable es cierto), completitud (todo lo cierto es demostrable) y decidibilidad (se puede decir si A es verdadero o falso).2. LÓGICA DE PREDICADOS La lógica de predicados es susceptible de caracterizarse como un sistema formal con las siguientes propiedades: consistente, correcta, completa y semidecidible.3. SEMÁNTICA Y LENGUAJES DE PROGRAMACIÓN Un lenguaje de programación puede considerarse que es un sistema formal. Según esto la definición consta de dos partes: definición sintáctica (que se encarga de las reglas que describen las estructuras correctas de los programas) y definición semántica (que asigna un significado a cada una de esas construcciones sintácticas). 3.1. Necesidad de una definición semántica formal La definición sintáctica de un lenguaje de programación mediante una gramática formal facilita su análisis sintáctico, pero no es suficiente para la comprensión de sus estructuras sintácticas. A) Semántica informal: se define la sintaxis de una construcción y después se pasa a dar el significado indicando sus características de funcionamiento mediante un lenguaje natural. (Propio de manuales de programación). B) Semántica por traducción: consiste en definir el significado de un lenguaje por medio de la traducción de sus construcciones sintácticas a un lenguaje más conocido. (Por ejemplo, un compilador transforma programas de lenguaje fuente al lenguaje de una máquina cuyo funcionamiento conocemos previamente). ­ 5 ­ 9.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray La semántica por traducción presenta una serie de problemas: 1. Un grado de complejidad que no está presente en el propio lenguaje, lo que le conduce a una falta de abstracción en la descripción semántica, por lo que un programador puede verse sometido a un nivel de detalle innecesario. 2. Falta de portabilidad, puesto que la definición semántica depende de la máquina escogida. 3. Una de las aplicaciones de las definiciones semánticas es servir de ayuda a la construcción de traductores de lenguajes, con lo que se destruye uno de sus objetivos. C) Semántica formal: el objetivo es asegurar que las definiciones del lenguaje sean claras y evitar ambigüedades en su interpretación. Las semánticas formales se definen mediante: 1) una especificación (formal) de la clase de objetos que pueden ser manipulados por los programas del lenguaje (es el universo de discurso) y 2) unas reglas que describen las formas en que las expresiones del lenguaje pueden adquirir significado y combinarse para dar la salida. Algunas semánticas formales de los lenguajes de programación son: • Semántica operacional : proporciona una definición del lenguaje en términos de una máquina abstracta (de estados). La semántica se define indicando cuál es el efecto de las construcciones sintácticas del lenguaje sobre el estado actual de la máquina. • Semántica axiomática es el enfoque típico de los trabajos sobre verificación : formal de programas imperativos. Con lo que el significado de un programa es la relación entre las propiedades de entrada (precondiciones) y las de salida (postcondiciones). Estas condiciones son fórmulas que especifican el significado del programa. Como se ha dicho, la semántica axiomática se emplea principalmente en la verificación de programas, y se suele utilizar la notación {A}I{B}, que significa “si el enunciado A es verdadero antes de la ejecución de la instrucción I, entonces B es verdadero después de su ejecución”. • Semántica declarativa : el significado de cada construcción sintáctica se define en términos de los elementos y estructuras de un dominio matemático conocido. ­ La semántica por teoría de modelos está basada en la teoría de modelos de la lógica. Esta teoría se formaliza mediante la noción de modelo, que es una entidad junto con las propiedades comunes a los elementos de esa entidad. ­ La semántica algebraica está basada en la teoría de álgebras libres (F­ Álgebras). Con esta idea se ha definido la semántica de lenguajes ecuacionales de primer orden (un tipo de lenguajes funcionales) y de lenguajes de especificación de TADs (tipos abstractos de datos). ­ La semántica del punto fijo está basada en la teoría de funciones recursivas, y se utiliza como enlace para demostrar la equivalencia entre ­ 6 ­ 10.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray diferentes caracterizaciones semánticas de un mismo lenguaje. En ella se asocia al programa un operador (generalmente continuo) que opera sobre el dominio de interpretación, de manera que el significado del programa se define como el (menor) punto fijo de dicho operador. ­ La semántica denotacional está basada en la teoría de dominios de Scott. La idea es interpretar las construcciones sintácticas de un lenguaje como valores de un determinado dominio matemático. Se centra en lo esencial de la computación: el resultado final obtenido, sin reparar en estados intermedios, por lo que implica mayor abstracción. Técnicamente, la semántica denotacional es la más compleja, además de muy rica, ya que permite dar cuenta de computaciones que no terminan y de orden superior. Para la definición de esta semántica se requiere i) por cada una de las construcciones sintácticas (identificadores, constantes, operadores, expresiones, instrucciones y programas) un dominio sintáctico; ii) un dominio semántico para cada dominio sintáctico identificado; iii) las funciones de evaluación semántica, de los dominios sintácticos a los semánticos (y definidas por inducción), que asocian a cada construcción sintáctica su valor semántico; iv) un conjunto de ecuaciones semánticas. Con esta estructura se ha definido la semántica declarativa de la mayoría de los lenguajes funcionales. 3.2. Lenguajes de programación declarativa Los lenguajes de programación declarativa son los que mejor se adaptan al concepto de sistema formal. Es posible definir un lenguaje de programación declarativa como un sistema constituido por tres componentes: 1. Sintaxis : las construcciones del lenguaje son fbfs (fórmulas bien formadas) de algún sistema lógico, con reglas que describen cómo combinar los símbolos para formar nuevas fbfs del lenguaje; y los programas son teorías (conjuntos de fbfs) en esa lógica. 2. Semántica operacional : una forma de deducción en esa lógica. Se corresponde con el cálculo deductivo de los sistemas formales tradicionales, por lo que tiene un carácter sintáctico. 3. Semántica declarativa : definida en términos de un modelo lo más simple posible del programa. Deben existir resultados de corrección y completitud que pongan en correspondencia la semántica operacional y la declarativa, de forma que las definiciones semánticas del lenguaje coincidan, es decir, se asigne a un programa un significado único. ­ 7 ­ 11.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray TEMA 3 – DE LA DEMOSTRACIÓN AUTOMÁTICA A LA PROGRAM.LÓGICA1. RAZONAMIENTO AUTOMÁTICO El razonamiento automático es un campo de la Inteligencia Artificial. Estudia la implementación de programas que verifiquen un razonamiento mediante una serie de pasos de inferencia. También denominada deducción automática, puesto que se hace énfasis en el razonamiento como proceso deductivo. Cuando el trabajo se centra en la obtención de algoritmos que permitan encontrar pruebas de teoremas matemáticos, recibe el nombre de demostración automática de teoremas (DAT). 1.1. Aproximaciones a la demostración automática de teoremas Existen diversas aproximaciones, que pueden clasificarse atendiendo a 2 características esenciales: 1) La forma en la que se simula el razonamiento: Históricamente una primera orientación consistió en la simulación de la forma de razonamiento del ser humano (llegando a utilizar de manera excesiva la regla de inferencia de instanciación, muy usada por las personas), pero estas técnicas fueron abandonadas debido a su fracaso al afrontar problemas complejos (poco poder de deducción, conduce a la aparición de la explosión combinatoria). Por los problemas mencionados, la orientación dominante en la actualidad ha sido la de desarrollar técnicas que se adapten a su automatización en un computador. Aquí entra el principio de resolución de Robinson, que permite la obtención de conclusiones generales a partir de premisas generales (aplicando lo menos posible la regla de instanciación). 2) La cantidad de información intermedia retenida: encontramos tres alternativas: • Almacenar toda la información derivada intermedia, con el consiguiente crecimiento del espacio de búsqueda. • No almacenar ninguna información intermedia, con la consiguiente pérdida de potencia deductiva. • Almacenar sólo información que cumpla ciertos requisitos. Ejemplos de esta alternativa son la estrategia de resolución semántica y los métodos para el tratamiento de la información intermedia (Wos). 1.2. Un demostrador automático genérico Un demostrador automático de teoremas puede verse como un programa que imita a los matemáticos en la forma de abordar un problema. Y al igual que los matemáticos, el demostrador tiene que llegar a resultados intermedios (lemas). Así pues, es imprescindible retener cierta información intermedia. Los D.A.T. (demostradores automáticos de teoremas) hacen uso de una representación especial de las fórmulas: la forma clausal. En la deducción se emplean reglas de inferencia alejadas del razonamiento humano, como resolución y paramodulación. Por último, destacar que en la mayoría de los casos, los demostradores automáticos de teoremas realizan pruebas por contradicción (o refutación). ­ 8 ­ 12.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Las acciones típicas que lleva a cabo un demostrador de teoremas, son: 1. Aplicación de las reglas de inferencia para obtener conclusiones. 2. Cuando se obtiene una conclusión, el programa la reescribe a una forma canónica para ver si es un corolario trivial de información que el programa ya posee y, por consiguiente, debe desecharse. 3. Si la conclusión obtenida entra en contradicción con alguna de las informaciones mantenidas por el demostrador, entonces la prueba concluye con éxito (recordemos que hablamos de pruebas por refutación), en caso contrario se vuelve a repetir el proceso. 1.3. Límites de la demostración automática de teoremas a) Límites teóricos: • La lógica de predicados es indecidible: no existe un procedimiento general que permita determinar si una fórmula A es o no un teorema (lógicamente válida en el lenguaje de primer orden L ). Sin embargo existen métodos de semidecisión, donde lo introducido es falso si el procedimiento no acaba. • Otro límite viene impuesto por la complejidad computacional de los problemas objeto de estudio y los algoritmos utilizados en su solución. b) Límites prácticos: • Crecimiento exponencial del espacio de búsqueda (conocido como explosión combinatoria). Este problema obliga a una necesidad creciente de memoria para el almacenamiento de estructuras intermedias utilizadas en los cómputos, que sobrepasa las posibilidades de las máquinas actuales. • Ineficiencia: alto coste temporal de los algoritmos utilizados en el proceso de la demostración. 2. PROCEDIMIENTO DE PRUEBA POR REFUTACIÓN Este tipo de procedimiento consiste en: i) suponemos la falsedad de la conclusión (negamos lo que queremos probar); ii) a partir de esa suposición tratamos de obtener una contradicción; iii) si llegamos a una contradicción, se rechaza el supuesto en vista del resultado, iv) como consecuencia, se afirma la conclusión deseada. Justificación: Se trata de contestar a la pregunta ¿  ∣= A ? . Donde A es una fbf de L y  un conjunto de fbfs de L .  ∣= A ⇔ ∪{ A} es insatisfacible. ∪{ A} es inconsistente. ∪{ A} |- □ (se desprende contradicción). Punto de interés: La pregunta se puede plantear como: ¿Es insatisfacible  A 1∧ A2 ∧A 3∧... A n∧ A  ? (Donde A1, A2, A3, ... , A n y  A son fbfs de L , y ={ A1, A 2, A 3, ... , A n } ). ­ 9 ­ 13.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray3. FORMAS NORMALES Esencialmente, el proceso de obtener una forma normal a partir de una fbf dada, consiste en sustituir partes de dicha fórmula por fórmulas lógicamente equivalentes.Definición – Fórmulas lógicamente equivalentes: Dos fbfs cerradas A y B son lógicamente equivalentes, denotado por A ⇔ B , si y solo si {A } |= B y {B} |= A . 3.1. Formas normales en la lógica de enunciados (proposicional) La idea detrás de las formas normales en esta lógica es el deseo de representar cualquier fórmula mediante conjuntos adecuados de conectivas, como puede ser el conjunto { , ∨ , ∧} . Restringiéndonos a este conjunto, es posible obtener dos clases de formas normales: la forma normal conjuntiva y la forma normal disyuntiva. Definición – Forma normal disyuntiva: Una fbf A está en forma normal disyuntiva si y solo si A≡ A 1∨ A2∨ A 3∨...∨ A n con n≥1 , y cada Ai es una conjunción de literales. Ejemplo: q∧p ∨r ∧s ∨q . Definición – Forma normal conjuntiva: Una fbf A está en forma normal conjuntiva si y solo si A≡ A 1∧ A2∧ A 3∧...∧ A n con n≥1 , y cada Ai es una disyunción de literales. Ejemplo: q∨p ∧r ∨s ∧q . Ver Tabla 1 del Anexo 1 Ver Algoritmo 1 del Anexo 2 3.2. Formas normales en la lógica de predicados En esta lógica, cualquier fbf puede ser transformada en una fórmula equivalente en lo que se denomina forma normal prenexa. Lo que caracteriza a la forma normal prenexa es la disposición de los cuantificadores, que se sitúan todos al principio de la fórmula. Definición – Forma normal prenexa: Una fbf A está en forma normal prenexa si y solo si A≡Q 1 X 1 Q 2 X 2 ...Q n X n  M , donde X 1, X 2 ... X n son variables diferentes y Qi≡∃ o Qi≡∀ , para cada 1 ≤ i ≤n . M es una fórmula que no contiene cuantificadores. Al componente Q 1 X 1Q2 X 2 ...Q n X n  se le llama prefijo, y a M matriz de la fórmula A . Una fórmula cerrada en forma prenexa ∀ X 1 ∀ X 2 ...∀ X 3  M se denomina fórmula universal. Del mismo modo, ∃ X 1∃ X 2 ...∃ X 3  M se denomina fórmula existencial. Ver Tabla 2 del Anexo 1 Ver Algoritmo 2 del Anexo 24. LA FORMA CLAUSAL La mayoría de procedimientos de prueba operan por refutación. Estas pruebas se aplican a fórmulas en una forma denominada forma clausal. ­ 10 ­ 14.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 4.1. Forma normal de Skolem Sea A una fórmula en forma normal prenexa, en la que la matriz se ha expresado en forma normal conjuntiva. Una forma normal de Skolem es una fórmula obtenida a partir de A , reemplazando por funciones de Skolem las variables ligadas por los cuantificadores existenciales y eliminando después los cuantificadores existenciales, siguiendo las pautas del Algoritmo 3 (Anexo 2). En la forma normal de Skolem, todos los cuantificadores son universales: ∀ X j1 ∀ X j2 ...∀ X jn  M  X j1 , X j2 , ... X jn  , donde {X j1 ... X jn }⊆{X 1 ... X n } . Ver algoritmo 3 del Anexo 2 A partir de ahora usaremos el término “forma normal” o “forma estándar” para referirnos a la forma normal de Skolem. 4.2. Cláusulas Definición – Cláusula: Una cláusula es una disyunción finita de cero o más literales. Cuando la cláusula está compuesta de un solo literal diremos que es una cláusula unitaria. Sea A≡∀ X 1 ∀ X 2 ...∀ X n  M una fórmula en forma normal, se puede expresar de la forma: ∀ X 1 ... ∀ X n  M 11∨M 12∨M 13 ... ∧ ∀ X 1 ... ∀ X n  M 21∨M 22∨M 23 ... ∧ ... ∀ X 1 ... ∀ X n  M  n−1 1∨M n−1 2∨... ∧ ∀ X 1 ... ∀ X n  M n1∨M n2∨M n3 ... Por ello, A también puede expresarse como un conjunto  de cláusulas, de la siguiente manera: ={ M 11∨M 12∨... , M 21∨M 22∨... ,... , M n1∨M n2∨...} Por consiguiente, un conjunto de cláusulas  debe verse como la representación de una fórmula que es la conjunción de todas esas cláusulas del conjunto, donde cada variable que aparece en cada cláusula está cuantificada universalmente. Las variables de las cláusulas pueden renombrarse. En ocasiones conviene representar una cláusula  L1∨L2∨... como un conjunto de literales {L1 , L2 , ...} para poder manejarla como si fuese un conjunto, y aplicar operaciones como “” (diferencia de conjuntos). Una contradicción se representa con el conjunto vacío: □≡ L∧¬L . 4.3. El papel de la forma clausal en los procedimientos de prueba Teorema: Sea un conjunto de cláusulas  que representa una forma estándar de una fórmula A. La fórmula A es insatisfacible si y sólo si  es insatisfacible. Es decir: la eliminación de los cuantificadores existenciales de una fórmula no afecta a su inconsistencia. ­ 11 ­ 15.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Por tanto, dado un conjunto de cláusulas  que representa una forma normal estándar de una fórmula ¬A , la fórmula A será válida si y solo si  es insatisfacible. Además, la equivalencia entre una fórmula A y su forma normal representada por un conjunto  , sólo se mantiene cuando A es insatisfacible, debido a que A no es semánticamente equivalente a  . El anterior teorema es la razón de que la forma clausal tenga un lugar de privilegio en las DAT, ya que las pruebas se hacen por refutación y dicho teorema nos dice que basta comprobar la insatisfacibilidad del conjunto de cláusulas que representan a A para demostrar la insatisfacibilidad de A .5. TEOREMA DE HERBRAND Se ha visto que una fórmula (o el conjunto de cláusulas que de ella puede extraerse) es insatisfacible si y solo si es falsa para toda interpretación sobre cualquier dominio. Sin embargo no es posible comprobar todas las interpretaciones sobre todos los posibles dominios, ya que hay infinitos. Por ello surge el Universo de Herbrand, un dominio de interpretación en el que explorar la insatisfacibilidad de una fórmula supone probar la falsedad de dicha fórmula sobre cualquier interpretación. 5.1. Universo de Herbrand e interpretaciones de Herbrand Un conjunto de fórmulas  genera un lenguaje de primer orden cuyo alfabeto está constituido por símbolos de constante, variable, función y relación. Supondremos que nuestro lenguaje de primer orden dispone de al menos una constante, por lo que si no existe ninguna otra, se añadirá una constante artificial a . Definición – Universo de Herbrand: Dado un lenguaje de primer orden L , el universo de Herbrand U L de L es el conjunto de todos los términos básicos de L . Nota: Para hacer explícito el conjunto de fórmulas  que genera el lenguaje de primer orden L escribiremos U L   . Recordemos que U L≠∅ ya que suponemos al menos la existencia de una constante. Ver algoritmo 4 del Anexo 2 Definición – Base de Herbrand: Dado un lenguaje de primer orden L , la base de Herbrand B L de L es el conjunto de todos los átomos básicos de L (aquellos que se pueden formar con todos los símbolos de predicado del alfabeto de L y todos los términos básicos de U L ). Nota: Si queremos hacer explícito en la base de Herbrand el conjunto de fórmulas  que genera el lenguaje de primer orden L , escribiremos B L   . ­ 12 ­ 16.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Definición – Interpretación de Herbrand: Una interpretación de Herbrand de L (o H­interpretación) es una interpretación I =D , J  de L , definida en los siguientes términos: 1. D es el propio universo de Herbrand para L , U L . 2. J es la aplicación que asigna: ­ A cada símbolo de constante ai de L él mismo. J a=a ­ A cada functor n­ario f de L una función J  f = |  : U n U L que f f L asocia a cada secuencia de términos básicos t 1 , t 2 , ...t n el término básico f t 1 , t 2 ...t n  de U L . ­ Si r es un símbolo de relación n­ario de L , entonces se le puede asignar cualquier subconjunto J r = de n­tuplas de términos básicos de U n . r L Nótese que no existe restricción respecto de las relaciones de U n asignadas a L cada uno de los símbolos de relación n­arios de L . Así pues, puede haber varias interpretaciones de Herbrand para L . Una H­interpretación queda determinada unívocamente dando la interpretación de sus símbolos de relación. Además, hay una correspondencia uno a uno entre las distintas H­interpretaciones y los subconjuntos de la base de Herbrand B L , que es la siguiente: {r t 1 ,t 2 ... t n  | r es un símbolo de relación n­ario de L y t 1 , t 2 ...t n ∈  } . r Una H­interpretación puede considerarse como un subconjunto de la base de Herbrand B L mediante el cual se representa el conjunto de átomos básicos evaluados al valor de verdad V, por tanto, todos los átomos que no están, se suponen falsos. Podemos considerar el conjunto de todas las H­interpretaciones de L como todas las aplicaciones posibles B L  {V , F} , por tanto, en caso de que B L sea de cardinalidad finita (tenga un número finito de elementos), el número de estas aplicaciones es 2∣B ∣ . L El conjunto potencia, o conjunto de las partes de un conjunto, junto con la operación ⊆ (que impone un orden parcial) es un retículo completo −recordemos que un conjunto parcialmente ordenado se dice que es un retículo completo si todo subconjunto suyo tiene un supremo y un ínfimo−. Por como se ha definido, el conjunto de todas las H­interpretaciones de un lenguaje de primer orden L coincide con el conjunto de las partes de B L , es decir: p B L  , que es un retículo completo cuyo máximo es el conjunto B L y cuyo mínimo es el conjunto vacío. Teorema: Sea  un conjunto de cláusulas.  es insatisfacible si y solo si  es falsa bajo todas las H­interpretaciones de  . Definición – Instancia básica: Sea  un conjunto de cláusulas de un lenguaje de primer orden L . Una instancia básica de una cláusula C de  es la cláusula obtenida sustituyendo cada una de las variables de C por elementos de U L  . ­ 13 ­ 17.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Proposición: Sea  un conjunto de cláusulas e I una H­interpretación para  . 1. Sea C una instancia básica de una cláusula C de  . Entonces C es verdadera en I si y solo si: a) O existe un literal positivo L 1 de C | L 1 ∈I b) O bien existe uno negativo L 2 de C | ¬L 2 ∉I 2. Sea C una cláusula de  , C es verdadera en I si y solo si para toda instancia básica C de C se cumple que C es verdadera en I . 3. Sea C una cláusula de  , C es falsa en I si y solo si existe al menos una instancia básica C de C que no existe en I . 5.2. Modelos de Herbrand Definición – Modelo de Herbrand: Un modelo de Herbrand para un conjunto de fórmulas  es una H­interpretación I de  que es modelo de  (es decir, que cada una de las fórmulas del conjunto  es verdadera en I ). Sea un conjunto C y S={S1 , S 2 , ... S n }⊆p C . Entonces S 1∩S2 ∩...∩Sn es el ínfimo del conjunto S , y S 1∪S2 ∪...∪Sn el supremo. 5.3. El teorema de Herbrand y las dificultades de su implementación El método general para probar la insatisfacibilidad de un conjunto  de cláusulas se basa en generar todas las posibles H­interpretaciones y comprobar si alguna hace falsa alguna instancia básica de una cláusula perteneciente al conjunto. Pero existe un problema: el número de H­interpretaciones puede ser infinito. Para resolverlo podemos generar un conjunto finito de H­interpretaciones parciales. Teorema – Teorema de Herbrand: Un conjunto de cláusulas  es insatisfacible si y solo si existe un conjunto de instancias básicas de  que sea insatisfacible. Ver algoritmo 5 del Anexo 2 Como  i puede considerarse una conjunción de cláusulas básicas, se puede utilizar cualquier método de la lógica proposicional para comprobar su insatisfacibilidad. El método de la multiplicación consiste en considerar la conjunción de las cláusulas que formarán  i y “multiplicarla” hasta alcanzar una forma normal disyuntiva. Entonces, cada conjunción que contiene un par de literales complementarios es eliminada. Si al seguir este proceso  i puede transformarse en la cláusula vacía □ entonces,  i es insatisfacible. Debemos añadir, que el método de la multiplicación es altamente ineficiente y conduce a lo que se denomina explosión combinatoria. ­ 14 ­ 18.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray6. EL PRINCIPIO DE RESOLUCIÓN DE ROBINSON Para evitar las ineficiencias de las implementaciones directas del teorema de Herbrand (producida por la generación sistemática de conjuntos de cláusulas básicas y la posterior comprobación de su insatisfacibilidad) introducimos el principio de resolución de Robinson, que permite deducir consecuencias universales de enunciados universales, alejándose de los métodos basados en el teorema de Herbrand, lo que reduce las instanciaciones. El principio de resolución es una regla de inferencia que se aplica a fórmulas en forma clausal y que, junto con el procedimiento de unificación, constituye un sistema de inferencia completo. Es más adecuado para la mecanización que los sistemas de inferencia tradicionales. 6.1. El principio de resolución de la lógica de proposiciones El principio de resolución de Robinson para la lógica de proposiciones puede verse como una generalización de la regla de Modus Tollens ¬p∨q∧¬q ⇒¬p : C 1 ,C 2 si A∈C1 , ¬ A∈C2 C 1 {A }∨C2 {¬ A } Para todo par de cláusulas C1 y C 2 , si existe un literal L1≡ A en C1 , que es complementario de otro literal L2≡¬ A en C 2 , entonces se eliminan L1 y L2 de C1 y C 2 , respectivamente, y se construye la disyunción de las cláusulas restantes. A la cláusula obtenida se le llama “resolvente de C1 y C 2 ”. Las cláusulas C1 y C 2 se denominan “cláusulas padres”. A y ¬ A reciben el nombre de “literales resueltos”. Ver Tabla 3 del Anexo 1 Definición – Deducción: Dado un conjunto de cláusulas  , una deducción (o resolución) de C a partir de  es una secuencia finita C1 , C2 , ... ,C k de cláusulas tal que Ci es una cláusula de  o un resolvente de cláusulas que le preceden, y C k =C . Una deducción de □ a partir de  se denomina “refutación” o “prueba de  ”. Teorema: Sea  un conjunto de cláusulas.  es insatisfacible si y solo si existe una deducción de la cláusula vacía, □ , a partir de  . 6.2. Sustituciones Definición – Sustitución: Una sustitución  es una aplicación que asigna, a cada variable X del conjunto de variables V de un lenguaje de primer orden L , un término  X  del conjunto de los términos T de L .  : V T X   X  Es habitual representar las sustituciones como conjuntos finitos de la forma: {X 1 /t 1 , X 2 / t 2 , ... , X n /t n } donde para cada i, t i es un término diferente de X i . El conjunto {X 1 , X 2 , ... X n } se denomina dominio de la sustitución Dom  , y {t 1 ,t 2 ,... t n} se denomina rango de la sustitución Ran   . Los elementos X i /t i reciben el nombre de enlaces. La sustitución identidad se representa por el conjunto vacío de elementos {} . ­ 15 ­ 19.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Definición – Instancia: La aplicación de una sustitución ={X 1 /t 1 , X 2 /t 2 ... X n /t n } a una expresión E se denota por  E , y se obtiene reemplazando simultáneamente (no sucesivamente) cada ocurrencia de X i en la expresión E por el correspondiente término t i . Se dice que  E es una instancia de E . La relación “ser instancia de” induce un (pre)orden entre las expresiones del lenguaje de primer orden L . Definición – (pre)orden de máxima generalidad: Sean E1 y E2 dos expresiones de L . E1 es más general que E2 , denotado por E1≤E 2 , si y solo si existe una sustitución  tal que  E 1=E 2 . Definición – Composición de sustituciones: Dadas dos sustituciones  y  , la composición de ambas es la aplicación  ° tal que °  E= E . Ver Algoritmo 6 del Anexo 2 La composición de sustituciones es asociativa, y la sustitución identidad es el elemento neutro. Además, cuando dos sustituciones  y  no comparten variables Var ∩Var =∅ la composición de sustituciones se concreta en una operación de unión:  °=∪ . Definición – Sustitución idempotente: Una sustitución  se dice idempotente si y solo si  °= . Nota: El principio de resolución de Robinson sólo computa sustituciones idempotentes. Definición – Renombramiento: Una sustitución  se denomina sustitución de renombramiento (o símplemente renombramiento) si existe la sustitución inversa −1 |  °−1 =−1 °=id . Definición – Variante: Dadas dos expresiones E1 y E2 , decimos que son variantes si existen dos sustituciones de renombramiento  y  , tales que E1=  E2  y E2= E 1 . Definición – Orden de máxima generalidad: Dadas dos sustituciones  y  , decimos que  es más general que  , denotado por ≤ , si y solo si existe una sustitución  tal que =° . Definición – Sustituciones equivalentes: Dadas dos sustituciones  y  , decimos que  es equivalente a  , denotado ~ , si y solo si ≤ y ≤ . 6.3. Unificación Informalmente, unificar es el proceso por el cual dos o más expresiones se convierten en idénticas mediante una sustitución: la sustitución unificadora. Definición – Unificador: Una sustitución  es un unificador (o sustitución unificadora) del conjunto de expresiones {E 1 , E2 , ... E k } si y solo si  E1 =E 2=...=E k  . Se dice que el conjunto E1 , E 2 , ... Ek es unificable si existe un unificador para él. ­ 16 ­ 20.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Definición – Unificador más general (u.m.g.): Un unificador  de un conjunto de expresiones S es un unificador más general (o de máxima generalidad) para S si y solo si para cualquier unificador  de S se cumple que ≤ . Algoritmo de unificación de Martelli y Montanari: La unificación de dos expresiones E1≡F t 1 , t 2 , ... t n  y E2≡F  s1 , s 2 , ... s n  es una secuencia de transformaciones 〈G, id〉⇒ 〈G1, 1 〉⇒ 〈G2 , 2 〉 ⇒ ...⇒ 〈Gn , n 〉 . 〈G, id〉 es el estado inicial, donde G={t 1=s 1 ,t 2=s2 , ...t n=s n} es un conjunto de ecuaciones e id es la sustitución identidad. Si 〈 Gn, n 〉≡〈∅ , 〉 diremos que las expresiones son unificables con u.m.g.  . Si 〈 Gn, n 〉≡〈 Fallo , 〉 diremos que las dos expresiones no son unificables. Definición – Relación de unificación “ ⇒ ”: La relación de unificación “ ⇒ ” es la mínima relación, definida por el siguiente conjunto de reglas de transición: 1. Descomposición en términos (Nota: op puede ser un símbolo de función o de predicado): 〈{op t 1 , t 2 ,... t n=op s1 , s 2 ,... s n }∪E ,〉 〈{t 1=s 1 , ...t n=s n}∪ E ,〉 2. Eliminación de ecuaciones triviales : 〈{X =X }∪E , 〉 〈 E ,〉 3. Ordenación de pares (si t no es una variable): 〈{t=X }∪E , 〉 〈{X =t}∪E , 〉 4. Eliminación de la variable (si la variable X no aparece en t ): 〈{X =t }∪E ,〉 〈{X /t } E, {X /t}° 〉 5. (Nota: op1 y op 2 pueden ser símbolos de función o de predicado): Regla de fallo 〈{op1 t 1 ,t 2 ,... t n=op2  s1 , s 2 , ... s m }∪E , 〉 si op1 ≠op2 〈 Fallo , 〉 6. Ocurrencia de variable (occur check): 〈{X =t}∪E , 〉 si la variable X aparece en t y no se da X ≡t ) 〈Fallo , 〉 Teorema de unificación: Dadas dos expresiones unificables E1 y E2 , la secuencia de transformaciones a partir del estado inicial 〈 G, id〉⇒ 〈G1, 1 〉⇒ 〈G2 , 2 〉 ⇒ ...⇒ 〈∅ , 〉 termina obteniendo el u.m.g.,  , de las expresiones E1 y E2 , que es único, salvo renombramientos de variables. ­ 17 ­ 21.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 6.4. El principio de resolución en la lógica de predicados Una vez definidos los conceptos de unificador y unificador más general, podemos formular el principio de resolución para la lógica de predicados. Comenzamos definiendo el concepto de factor de una cláusula. Definición – Factor de una cláusula: Si dos o más literales (con el mismo signo) de una cláusula C tienen un unificador de máxima generalidad  , entonces se dice que C  es un factor de C . Si C  es una cláusula unitaria, entonces se dice que es un factor unitario de C . Definición – Resolvente binario: Sean C1 y C 2 dos cláusulas (llamadas cláusulas padres) sin variables en común. Sean L1 y L2 dos literales de C1 y C 2 , respectivamente. Si L1 y ¬L2 tienen un u.m.g.  , entonces la cláusula  C 1   L1 ∪ C 2  L2  se conoce como resolvente binario de C1 y C 2 . A los literales L1 y L2 se les llama literales resueltos. Definición – Resolvente: Un resolvente de las cláusulas (padres) C1 y C 2 es uno de los siguientes resolventes binarios: 1. Un resolvente binario de C1 y C 2 . 2. Un resolvente binario de C1 y un factor de C 2 . 3. Un resolvente binario de un factor de C1 y C 2 . 4. Un resolvente binario de un factor de C1 y un factor de C 2 . Teorema: Sea  un conjunto de cláusulas. 1. Corrección : Si existe una deducción de la cláusula vacía, □ , a partir de  y utilizando la regla de resolución (es decir,  |−□ ), entonces  es insatisfacible. 2. Completitud : Si  es insatisfacible, entonces existe  |−□ (una deducción de la cláusula vacía, □ , a partir de  , utilizando la regla de resolución). 6.5. Estrategias de resolución El teorema anterior nos dice que si un conjunto de cláusulas es insatisfacible de él podrá deducirse la cláusula vacía, pero no nos dice cómo encontrarla. El siguiente algoritmo es un esquema para sistematizar la búsqueda de la cláusula vacía. Ver Algoritmo 7 del Anexo 2 Este algoritmo genera nuevas cláusulas a partir de las anteriores sin ninguna restricción. El único inconveniente es que pueden generarse cláusulas redundantes o irrelevantes. Posee demasiada libertad. Una estrategia de resolución es una instancia del Algoritmo 7, donde el objetivo es lograr eficiencia en el número de resoluciones y cantidad de almacenamiento. Es importante que una estrategia continúe siendo completa. Las diferentes estrategias de resolución son las siguientes: ­ 18 ­ 22.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 1. Estrategia de resolución por saturación de niveles : es una estrategia de búsqueda a ciegas. Para encontrar una refutación a partir de un conjunto inicial de cláusulas  se generan todos los resolventes de pares de cláusulas del conjunto y se añaden al conjunto. El proceso se repite en cada iteración, hasta encontrar la cláusula vacía □ . Es una estrategia completa, pero sumamente ineficiente. 2. Estrategia de borrado se basa en la estrategia de resolución por : saturación de niveles, pero incorpora procedimientos para comprobar si los resolventes Rij de Ci y C j son una tautología o están subsumidos por otra cláusula del conjunto CLAUSULAS. Esta estrategia es completa. Definición – Subsumir: Una cláusula C subsume a otra C si y solo si existe una sustitución  | C ⊆C  . Se dice que C es la cláusula subsumida. 3. Estrategia de resolución semántica esencialmente, esta estrategia : intenta limitar el número de resoluciones, dividiendo en dos subconjuntos disjuntos el conjunto CLAUSULAS, cuya insatisfacibilidad se desea probar. La idea es que no pueden resolverse entre sí las cláusulas de un mismo subconjunto. Esta estrategia, también completa, sigue unos pasos: 1. Divide CLAUSULAS en dos, utilizando una interpretación de I : • 1={C∈CLAUSULAS | I es modelo de C} • 2={C∈CLAUSULAS | I no es modelo de C} 2. Halla el conjunto de todos los resolventes que pueden formarse a partir de las cláusulas de 1 y 2 :  ={Rij | R ij es un resolvente de Ci ∈1 y C j ∈2 } 3. CLAUSULAS = CLAUSULAS ∪ . 4. Estrategia de resolución lineal : La idea de resolución lineal se asemeja al razonamiento encadenado, cuando para demostrar una identidad aplicamos sucesivas reglas de inferencia al término de la izquierda hasta obtener el término de la derecha. Esta estrategia comienza con una cláusula, se resuelve dicha cláusula con otra para producir un resolvente que, a su vez, se resuelve con otra cláusula, etc. hasta obtener la cláusula vacía. Definición – Deducción lineal: Dado un conjunto de cláusulas  y C0 B0 | una cláusula C 0 de  , una deducción lineal de C n a partir de  con C1 B1 cláusula inicial C 0 es una deducción de la forma mostrada en la figura, | . donde: C2 . | . 1. Para i=0, 1,2, ... , n−1 se da que C i1 es un resolvente de Ci … (llamada cláusula central) y B i (llamada cláusula lateral). Cn­1 Bn­1 2. Cada B i , o pertenece a  o es una cláusula central C j para | Cn algún j , siendo ji . ­ 19 ­ 23.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray TEMA 4 – PROGRAMACIÓN LÓGICA Comenzaremos realizando una breve discusión de las similitudes y diferencias que unen y separan la programación lógica (PL) de la demostración automática de teoremas (DAT), con el fin de delimitar la frontera entre ambos campos.Similitudes: 1. El empleo de un lenguaje basado en la forma clausal 2. El empleo de pruebas por refutación 3. El tipo de regla de inferencia empleado: el principio de resolución 4. Comparten ciertos aspectos en el empleo de estrategias.Diferencias: 1. Ambos campos poseen objetivos diferentes: la DAT persigue la construcción de sistemas de deducción que permitan atacar problemas para los que no existe un algoritmo efectivo, la PL se orienta a conseguir la ejecución eficiente de programas lógicos que resuelvan problemas para los que generalmente hay un algoritmo conocido. 2. Mientras que en la DAT no se impone restricción alguna respecto al tipo de cláusulas a utilizar en la formalización de un problema, la programación lógica se restringe a un tipo de cláusulas llamado cláusulas de Horn. 3. En la PL no existe retención de información intermedia, mientras que para la DAT es esencial. 4. La PL hace un uso muy limitado de las estrategias, en comparación con el amplio uso que de ellas hace la DAT. 5. La PL destierra el uso del predicado de igualdad, mientras que en la DAT el tratamiento de la igualdad es uno de los puntos clave.1. SINTAXIS 1.1. Notación para las cláusulas Una cláusula no vacía puede escribirse agrupando los literales positivos y negativos, así: ∀ X 1 ∀ X 2 ...∀ X s  M 1∨M 2∨...∨M m∨¬N 1 ∨¬N 2∨...∨¬N n  , donde M i (para i=1, 2,... , m ) y N j (para j=1,2, ... , n ) representan átomos. Es posible transformar la cláusula anterior mediante una sencilla manipulación (aplicando las equivalencias de la Tabla 1 del Anexo 1) y dejarla de la siguiente manera: ∀ X 1 ∀ X 2 ...∀ X s  N 1 ∧N 2∧...∧N n  M 1∨M 2 ∨...∨M m  . Es habitual el símbolo condicional recíproco (  ), leído “si”, y mediante el cual la anterior cláusula queda expresada así: ∀ X 1 ∀ X 2 ...∀ X s  M 1∨M 2∨...∨M m  N 1∧N 2∧...∧N n  . La última notación se adapta a una visión operacional (procedimental), que es muy adecuada para utilizar un lenguaje de programación. En tal caso, la expresión se leería así: «para resolver el problema M 1 o el M 2 , o … o el M m , hay que resolver los problemas N 1 y N 2 y … y N n ». Aquí N 1 , N 2 , … y N n pueden considerarse como rutinas de un lenguaje de programación convencional. ­ 20 ­ 24.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray También es posible una visión declarativa, de forma que la última expresión se leería como: «si se cumplen N 1 y N 2 y … y N n , entonces debe cumplirse M 1 o M 2 , o … o M m » Definición – Cláusula general: Una cláusula general es una fórmula de la forma A1∨ A 2∨...∨ A m  L1∧L2∧...∧Ln , donde A1∨ A 2∨...∨ A m es la cabeza (o conclusión, o consecuente) de la cláusula general, y L1∧L2∧...∧Ln es el cuerpo (o condición, o antecedente). Cada Ai (con i=1, 2,... , m ) es un átomo, y cada L j (con j=1,2, ... , n ) es un literal (átomo positivo o negativo). Todas las variables se suponen cuantificadas universalmente. Si m=0 la cláusula general se dice que es un objetivo. 1.2. Cláusulas de Horn y programas definidos La programación lógica deja de lado las cláusulas generales para ocuparse de las denominadas cláusulas de Horn y de las cláusulas normales. Definición – Cláusula de Horn: Una cláusula de Horn (o cláusula definida) es una disyunción de literales de los cuales uno, como mucho, es positivo. Ver Tabla 4 del Anexo 1 Las cláusulas de Horn tienen el mismo poder de cómputo que la máquina de Turing o el −cálculo . Permiten, por tanto, programar cualquier función computable. Muchos de los problemas que pueden expresarse mediante un formalismo de primer orden pueden transformarse sin mucha dificultad en un conjunto de cláusulas de Horn. Definición – Programa definido: Un programa definido es un conjunto o secuencia de cláusulas definidas  . La definición de un símbolo de predicado p que aparece en  es el subconjunto de cláusulas de  cuyas cabezas tienen como símbolo de predicado el predicado p .2. SEMÁNTICA OPERACIONAL (Resolución SLD) La semántica operacional se basa en la estrategia de resolución SLD, que es un refinamiento del procedimiento de refutación por resolución. Las siglas “SLD” hacen mención a las iniciales inglesas de “resolución lineal con función de selección para programas definidos” 2.1. Procedimientos de prueba y objetivos definidos La programación lógica intenta comprobar, dado un programa  y una fórmula B≡∃ B1∧B2∧...∧B n , si se cumple que existe un valor de las variables de B tal que  |−B . Al igual que en los procedimientos de prueba de la DAT, esta pregunta se contesta mediante refutación. Así pues, la pregunta es si ∪{¬B} |− □ . Nótese que ¬B⇔ ¬∃ B1∧B2∧...∧B n⇔  B 1∧B 2∧...∧Bn ⇔∀ ¬B1∨¬B 2∨...∨¬Bn  . Por tanto, la forma de responder si la fórmula ∃ B1∧B2∧...∧Bn  se sigue del programa  es añadirle al programa la negación de dicha fórmula en forma de objetivo G≡ B1∧B2∧...∧B n y buscar una refutación (deduciendo □ a partir de ∪{G} ). ­ 21 ­ 25.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 2.2. Resolución SLD y respuesta computada La estrategia de resolución SLD es un caso particular de resolución lineal (dado un programa  y un objetivo G ) para probar la inconsistencia de ∪{G} partiendo del objetivo G como cláusula inicial, y resolviendo ésta con alguna cláusula de  . Esto se hace de tal forma que, en cada paso, siempre obtenemos una cláusula objetivo como cláusula central. Basta con seleccionar uno de los literales del objetivo que se está resolviendo en cada momento para mantener la completitud del procedimiento de refutación. Definición – Regla de computación: Llamamos regla de computación (o función de selección)  a una función que, cuando se aplica a un objetivo G , selecciona uno y solo uno de los átomos de G . Definición – Paso de resolución SLD: Dado un objetivo G≡ A 1∧...∧A j ∧...∧ An y una cláusula C≡ A  B1∧B2∧...∧B m , entonces G es un resolvente de G y C (por resolución SLD) usando la regla de computación  si se cumple que: 1. A j=G es el átomo de G seleccionado por  . 2. =u.m.g. A , A j  . 3. G≡  A 1∧...∧ A j−1∧B1∧...∧B m∧ A j1∧...∧ A n . También diremos que G se deriva de G y C (en un paso) y lo representaremos, en símbolos, mediante diferentes notaciones: G⇒ SLD G , G⇒ G o G⇒[C , ] G . SLD SLD Definición – Derivación SLD: Sea  un programa definido y G un objetivo definido. Una derivación SLD para ∪{G} , usando la regla de computación  , consiste en una secuencia de pasos de resolución SLD: Go ⇒[SLD, ] G1 ⇒[C ,  ] G 2 ⇒[C , ] ... C ,n−1 ] 1 1 SLD 2 2 SLD 3 3 ⇒[C SLD n−1 Gn−1 ⇒[C ,  ] Gn SLD n n Los pasos quedan representados en la figura siguiente como un árbol de deducción, donde: G0 C 1,ϴ1 1. Para i=1, 2,... , n , Gi es un resolvente de G i−1 y Ci | (por resolución SLD) usando la regla de computacion  G1 C2,ϴ2 2. Cada Ci es una variante de una cláusula de  . | 3. Cada i , es el u.m.g. obtenido en el correspondiente G2 paso i­ésimo de resolución SLD. … En ocasiones utilizaremos la notación | −SLD para representar G n­1 C n,ϴn una derivación SLD. Nota: si Gn es la última cláusula de la | secuencia de resolventes, decimos que la derivación tiene Gn longitud n . Los nombres de las variables de las cláusula de programa Ci se eligen de forma que no haya conflicto con ninguna de las variables que hayan aparecido previamente. ­ 22 ­ 26.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Podemos distinguir los siguientes tipos de derivaciones SLD: • Derivación infinita : cuando en cualquier objetivo Gi de la secuencia, el átomo A j seleccionado por la regla de computación unifica con una cláusula del programa  (es decir, es una variante suya). • Derivación finita : la derivación termina en un número finito de pasos. A su vez, las derivaciones finitas se diferencian en: • De fallo: ninguna cláusula de  unifica con el átomo A j seleccionado por la regla de computación  en el objetivo Gn . • De éxito: si G n=□ . Esto es, una derivación de éxito es una refutación. Definición – Refutación SLD: Sea  un programa definido y G un objetivo definido. Una refutación SLD para ∪{G} es una derivación SLD finita cuyo último objetivo es la cláusula vacía. Definición – Respuesta computada: Sea  un programa definido y G un objetivo definido. Sea G⇒ G 1 ⇒ ... ⇒ □ una refutación para ∪{G} . Una respuesta 1 SLD 2 SLD n SLD computada para ∪{G} es la sustitución  que resulta de la composición, restringida a las variables de G , de la secuencia de u.m.g.s 1 ,  2 , ... n . En símbolos, =n ° n−1 °...  1| Var G  . Si G≡ Q , se dice que Q es una instancia computada de G. SLD como un sistema de transición de estados Resulta interesante resaltar que la semántica operacional de un lenguaje lógico puede definirse en términos de un sistema de transición de estados. Definido el término estado E como un par 〈 G, 〉 formado por una cláusula objetivo G y una sustitución  , definimos resolución SLD (usando la regla de computación  ) como un sistema de transición cuya relación de transición ⇒SLD ⊆  E×E es la relación más pequeña que satisface: G≡ Q1∧ A ∧Q2  , G= A , C≡ A Q≪ , =u.m.g  A , A  〈G , 〉⇒SLD 〈  Q 1∧Q∧Q2  , ° 〉 donde Q ,Q 1 y Q 2 representan conjunciones de átomos cualesquiera, y el símbolo ≪ expresa que C es una cláusula, o una variante de una cláusula, de  (que se toma estandarizada). Así, una derivación SLD es una secuencia 〈 G 0 , id〉 ⇒ SLD 〈G 1 , 1 〉 ⇒SLD ... ⇒SLD 〈 G n , n 〉 , y una refutación SLD es una derivación de éxito 〈 G 0 , id〉 ⇒ SLD∗〈 □ , 〉 , donde  es la respuesta computada en la derivación, en "∗" pasos. 2.3. Árboles de búsqueda SLD y procedimiento de prueba Un proceso de prueba por refutación puede entenderse como un proceso de búsqueda en un espacio de estados, constituidos por los propios objetivos que se generan en cada paso de resolución. En el caso concreto de un programa definido  y un objetivo definido G , el conjunto de todas las posibles derivaciones SLD para ∪{G} se puede representar como un árbol. ­ 23 ­ 27.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Definición – Árbol de búsqueda SLD: Sea un programa definido  y un objetivo definido G . Un árbol de búsqueda SLD  para ∪{G} (y usando la regla de computación  ) es un conjunto de nodos que cumplen las siguientes restricciones: 1. El nodo raíz del árbol  es el objetivo inicial G . 2. Si G i≡ A 1∧...∧ A k ∧...∧ A n es un nodo de  , bajo el supuesto de que Gi = A k 1≤k ≤n , entonces para cada cláusula C j≡ A  B 1∧...∧Bm de  (con sus variables renombradas si es necesario) tal que su cabeza A unifica con Ak , con  como unificador más general (es decir, =u.m.g  A , A k  ), el resolvente G ij ≡ A 1∧...∧ A k−1 ∧B1 ∧...∧Bm∧ A k1∧...∧ A n es un nodo de  . Se dice que Gi es el nodo padre de G ij y que G ij es un nodo hijo de G i . • Los nodos hojas son o bien □ o nodos de fallo. • Cada rama del árbol SLD es una derivación SLD para ∪{G} . • Cada regla de computación  da lugar a un árbol SLD para ∪{G} distinto. • En general, el conjunto de respuestas computadas para distintos árboles SLD para e mismo programa  y objetivo G es siempre el mismo. Teorema – Independencia de la Regla de Computación: Sea  un programa definido y G≡ Q un objetivo definido. Si existe una refutación SLD para ∪{G} con respuesta computada  , usando una regla de computación  , entonces existirá también una refutación SLD para ∪{G} con respuesta computada  , usando cualquier otra regla de computación  , y tal que  Q es una variante de Q . Este resultado justifica que la selección de un literal en un objetivo se pueda realizar arbitrariamente sin que afecte al resultado: indeterminismo dont care. Contrariamente a lo que ocurre con la regla de computación, la selección de la cláusula del programa que se utiliza en un paso de resolución es determinante a la hora de alcanzar el éxito en la derivación: indeterminismo dont know. El orden en el que se eligen las cláusulas de un programa influye en la forma del árbol SLD. Además, para una misma regla de computación, distintos órdenes de elección para las cláusulas producen árboles SLD diferentes con sus ramas permutadas. Definición – Regla de ordenación de cláusulas: Una regla de ordenación es un criterio por el que se fija el orden en que las cláusulas del programa se intentan resolver con un nodo del árbol SLD, para generar sus correspondientes nodos hijo. Definición – Regla de búsqueda: Una regla de búsqueda es una estrategia para recorrer un árbol SLD en busca de una rama de éxito. Una vez fijadas unas reglas de computación y de ordenación concretas, en lugar de generar el árbol de búsqueda SLD explícitamente y luego buscar en él la cláusula vacía usando una regla de búsqueda, lo que se suele proporcionar es una representación implícita y solamente se generan explícitamente aquellas partes por las que avanza la estrategia de búsqueda. Existen dos estrategias de búsqueda principales: ­ 24 ­ 28.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 1. Búsqueda en anchura (breadth­first) : En este caso el árbol se recorre por niveles, visitando primero el nodo menos profundo y a la izquierda (de entre los no visitados). La implementación se realiza mediante exploración (significa que en cada iteración del procedimiento de refutación se construye el nivel siguiente del árbol de búsqueda SLD, generando todos los hijos de los estados objetivo que componen el nivel actual; si en el nivel siguiente se encuentra la cláusula vacía, se termina con éxito, si no, se repite el proceso). Dado que se exploran todas las posibilidades de resolución de los estados objetivo de un nivel con las cláusulas del programa, esta estrategia mantiene la completitud del procedimiento de refutación SLD, aunque es muy costosa, ya que el crecimiento del espacio de estados es exponencial con respecto al nivel de profundidad del árbol. 2. Búsqueda en profundidad (depth­first) Esta estrategia recorre el árbol SLD : visitando primero el nodo más profundo y a la izquierda (de entre los no visitados). El interés de esta estrategia radica en su eficiente implementación, ya que sólo mantiene información sobre los estados de la rama que se está inspeccionando en el momento. Normalmente se implementa mediante exploración o mediante back­tracking. 3. SEMÁNTICA DECLARATIVA Y RESPUESTA CORRECTA La semántica declarativa de los lenguajes de programación lógica se fundamenta en la semántica de la lógica de predicados (teoría de modelos). Teniendo esto en cuenta, y como nuestro interés consiste en probar la insatisfacibilidad de un conjunto de cláusulas, para dar significado a las construcciones de nuestro lenguaje basta con que nos restrinjamos a las interpretaciones de Herbrand (H­interpretaciones). Por otro lado, uno de los objetivos primordiales de la programación lógica es computar, de ahí el papel que juega el concepto de respuesta computada. La contrapartida declarativa de dicho concepto es el de respuesta correcta.Definición – Respuesta: Sea  un programa definido y G un objetivo definido. Una respuesta  para ∪{G} es cualquier sustitución para las variables de G .Definición – Respuesta correcta: Sea  un programa definido y G≡ Q un objetivo definido. Sea  una respuesta para ∪{G} . Entonces,  es una respuesta correcta para ∪{G} si y solo si  |= ∀ Q (es decir, ∀ Q es una consecuencia lógica de  ). De manera análoga, podemos decir que  es una respuesta correcta si y solo si ∪{¬∀ Q} es insatisfacible. Para comprobar que  es una respuesta correcta no es suficiente, como se podría pensar, con comprobar que ¬∀ Q es falsa para todo modelo de Herbrand del programa  . ¿Por qué no?, es sencillo: el hecho de que ∪{¬∀ Q} no tenga modelos de Herbrand no implica que sea insatisfacible. Esto es porque ¬∀ Q en general no es una cláusula, y el teorema que dice “Sea un conjunto de cláusulas  , que representa una forma estándar de una fórmula A ; la fórmula A es insatisfacible si y solo si  lo es” no es aplicable. Por tanto no podemos restringirnos sólo a las interpretaciones de Herbrand, sino que debemos considerar ­ 25 ­ 29.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondarayademás las interpretaciones generales. Sin embargo, cuando nos limitamos a respuestas  tales que la instancia Q es una expresión básica, puede establecerse el siguiente resultado:Proposición: Sea  una respuesta para ∪{G≡ Q} tal que Q es una expresión básica. Entonces  es una respuesta correcta para ∪{G} si y solo si Q es verdadera para todo modelo de Herbrand del programa  . Luego, en resumen, existe una discrepancia entre el concepto de respuesta correcta y respuesta computada: 1. Respuesta computada: Plantear un objetivo G≡ Q para un programa  ⇒ comprobar si  |− ∃Q . 2. Respuesta correcta: Preguntar si una respuesta  es correcta ⇒ comprobar si  |=∀ Q . Pero esta discrepancia desaparece cuando la sustitución  conduce a una instancia Q básica (es decir, una única instancia).4. CORRECCIÓN Y COMPLETITUD DE LA RESOLUCIÓN SLDTeorema: Sean  un programa definido y G un objetivo definido: a) (Corrección): si existe una refutación SLD para ∪{G} (es decir, G⇒ SLD∗ □ ) entonces ∪{G} es insatisfacible. b) (Completitud): si ∪{G} es insatisfacible entonces existe una refutación SLD para ∪{G} (es decir, G⇒ SLD∗ □ ).Teorema de la corrección: Sea  un programa definido y G un objetivo definido. Toda respuesta computada para ∪{G} es una respuesta correcta para ∪{G} .Teorema de la completitud: Sea  un programa definido y G un objetivo definido. Para cada respuesta correcta  para ∪{G} , existe una respuesta computada  para ∪{G} que es más general que  cuando nos restringimos a las variables de G (en símbolos, ≤[Var G] ).Dado que, por definición, una respuesta correcta está restringida a las variables de G (en caso contrario lo siguiente no se cumpliría), escribir ≤[Var G] es lo mismo que decir que existe una sustitución  tal que = °| G  .Proposición: Sea  un programa definido y G un objetivo definido. Si ∪{G} es insatisfacible, entonces cada árbol SLD para ∪{G} contiene, al menos, una rama de éxito.Proposición: Sea  un programa definido y G un objetivo definido. Si ∪{G} es insatisfacible, entonces para cada átomo A∈G existe una refutación SLD para ∪{G} con A como primer átomo seleccionado. ­ 26 ­ 30.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray5. SIGNIFICADO DE LOS PROGRAMAS Las semánticas formales, además de dar cuenta del significado de las construcciones generales de un lenguaje, también deben asignar significado a los programas. Una forma de hacerlo es asociar a cada programa ciertas propiedades que denominaremos observables: • El conjunto de éxitos básicos (átomos básicos que son derivables a partir del programa mediante resolución SLD). • Las derivaciones de éxito. • Las derivaciones de fallo finito. • Las respuestas computadas, etc. Elegida una propiedad observable O , ésta induce una relación de equivalencia, =O , sobre los programas, que se define así: Sean  1 y  2 dos programas;  1=O 2 si y solo si  1 y  2 son indistinguibles con respecto a la propiedad observable O . 5.1. Semántica operacional La semántica operacional de un programa definido  se caracteriza mediante el denominado conjunto de éxitos básicos de  . Definición – Conjunto de éxitos básicos: Sea  un programa definido. El conjunto de éxitos básicos de  , denotado como EB  , es el conjunto de todos los átomos básicos A de la base de Herbrand de  tales que, cuando se lanzan como objetivos  A , existe una refutación SLD para ∪{ A} . Es decir: EB ={A |  A∈ B L  ∧∪{ A} | −SLD □} 5.2. Semántica declarativa La semántica declarativa de un lenguaje lógico está asociada al concepto de interpretación de Herbrand; por lo tanto, podemos asignar significado declarativo a un programa seleccionando uno de sus modelos de Herbrand. Naturalmente, nuestra preferencia es decantarnos por el modelo más simple. Proposición (Propiedad de Intersección de Modelos): Sea  un programa definido. Sea I un conjunto de índices y {M i | i∈I ∧M i |=} un conjunto no vacío de modelos de Herbrand de  . Entonces, el conjunto ∩ i∈ I M i es un modelo de Herbrand de  . Esta propiedad sólo se cumple para cláusulas de Horn definidas. Debido a que B L  es un modelo de Herbrand de  , el conjunto de modelos de Herbrand de  no es vacío. Además la intersección de todos los modelos de Herbrand de  es su modelo de Herbrand mínimo. Denotaremos este modelo como M  y lo denominaremos modelo mínimo de Herbrand de B L  . Teorema: Sea  un programa definido. Entonces M ={ A | A ∈B L ∧ |= A} . ­ 27 ­ 31.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 5.3. Semántica por punto fijo Daremos una visión constructiva del significado de un programa siguiendo la teoría del punto fijo. La idea es asociar a cada programa un operador continuo que permita, mediante sucesivas aplicaciones, construir el modelo mínimo del programa. Definición – Retículo completo: Un conjunto parcialmente ordenado L es un retículo completo si y solo si para todo subconjunto X de L existe inf  X  y sup  X  . Denotaremos sup  L por ⊤ y inf  L por ⊥. Definición – Conjunto inductivo: Sea L un retículo completo y X un subconjunto de L . X es un conjunto inductivo si todo subconjunto finito de X tiene una cota superior en X . Definición – Monotonía y continuidad: Sea L un retículo completo y T : L  L una aplicación. Decimos que T es: 1. Monótona si y solo si, siempre que x≤ y entonces T  x≤T  y  . 2. Continua si y solo si para todo conjunto dirigido X ∈L , T sup X =sup T  X  Definición – Punto fijo y menor punto fijo: Sea L un retículo completo y T : L  L una aplicación. Decimos que a∈ L es un punto fijo de T si T a=a . Si a∈ L es un punto fijo de T , decimos que a es un menor punto fijo de T si y solo si a≤b para todo punto fijo b de T . El menor punto fijo de T lo denotamos por mpf T  Proposición – Teorema del punto fijo: Sea L un retículo completo y T : L  L una aplicación monótona. Entonces T tiene un menor punto fijo mpf T  . Además, se cumple que mpf T =inf {x | T  x =x}=inf {x | T  x≤x } . A continuación introduciremos el concepto de potencias ordinales de T . Los números ordinales son aquellos que utilizamos para contar. Los ordinales finitos son los números naturales, mientras que los ordinales transfinitos son aquellos que suceden a los números naturales. El primer ordinal transfinito lo representamos mediante el símbolo  (de forma burda podríamos decir que  es el primer infinito). Para todo ordinal finito n se cumple que n , pero  no es el sucesor de ningún número ordinal finito, por lo que decimos que  es un ordinal límite. Los ordinales que son los sucesores de otro ordinal se denominan ordinales sucesores (como son todos los ordinales finitos, excepto el 0) Definición – Potencias ordinales: Sea L un retículo completo y T : L  L una aplicación monótona. Entonces, definimos las potencias ordinales de T inductivamente como: • T 0 = ⊥ • T   = T T −1 , si  es un ordinal sucesor. • T   = inf {T   | } , si  es un ordinal límite. ­ 28 ­ 32.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Proposición: Sea L un retículo completo y T : L  L una aplicación continua. Entonces, mpf T =T   . Dado un programa  , es posible asociarle un retículo completo sobre el que definir un operador continuo. El objetivo es lograr una caracterización del modelo mínimo de Herbrand. Pues bien, el retículo sobre el que definiremos el llamado operador de consecuencias lógicas inmediatas, que definiremos a continuación, es el formado por el conjunto p B L   con el orden ⊆ (este par constituye un retículo completo). Definición – Operador de consecuencias lógicas inmediatas: Sea  un programa definido. El operador de consecuencias lógicas inmediatas T  es una aplicación T  : p B L   p BL  definida como: T  I  = { A | A ∈B L  ∧  A  A 1∧A 2∧...∧A n ∈Basicas  ∧ {A1 , A 2 ,... An }⊆I } donde I es una interpretación de Herbrand para el programa  y Basicas  es el conjunto de instancias básicas de las cláusulas de  . La definición anterior nos dice que, para cada instancia básica de una cláusula del programa  , si los átomos que forman su cuerpo {A 1 , A2 , ... A n} están contenidos en la interpretación I , entonces la cabeza A de dicha cláusula pertenecerá a la interpretación T  I  . La interpretación T  I  está formada por todos los átomos de la base de Herbrand que son consecuencia lógica inmediata del programa  . Las H­ interpretaciones que son modelo del programa  pueden caracterizarse en términos del operador T  . Proposición: Sea  un programa definido e I una H­interpretación del mismo. Entonces I es modelo de  si y solo si T  I ⊆I . Teorema – Caracterización por Punto Fijo de M   : Sea  un programa definido. Entonces, M =m.p.f T  =T    . Esto nos proporciona un procedimiento constructivo para el cómputo del modelo mínimo de Herbrand de un programa: 1. Añadir (todas las instancias básicas de) los hechos al conjunto de partida. 2. Aplicar las reglas a los hechos para generar nuevos hechos e incluirlos al conjunto anterior. (Desde el punto de vista práctico, esto equivale a obtener inferencias inmediatas aplicando modus ponens a partir de los hechos obtenidos en la última iteración y de las instancias de las cláusulas del programa). 3. Repetir (1) y (2) hasta que no se obtengan hechos nuevos. ­ 29 ­ 33.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray 5.4. Equivalencia entre semánticas La corrección de la resolución SLD asegura que un hecho básico que se derive de un programa  es una consecuencia lógica del mismo. Además, por lo visto anteriormente, queda asegurado que el conjunto de éxitos de un programa definido está contenido en el modelo mínimo de Herbrand del programa. El resultado inverso confirma la equivalencia entre la semántica operacional y la semántica declarativa por modelo mínimo de un programa  . Teorema: Sea  un programa definido. EB = M  . * * * ­ 30 ­ 34.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray ANEXO 1 – TABLAS Nota: □ representa a una fórmula insatisfacible (una contradicción en el caso de la lógica de proposiciones), y ◊ representa una fórmula siempre verdadera (tautología, en la lógica de proposiciones). Tabla 1 Fórmulas equivalentes de la lógica de proposiciones Tabla 2 Fórmulas equivalentes de la lógica de predicados ­ 31 ­ 35.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Tabla 3 Hechos notables sobre el principio de resolución de Robinson Tabla 4 Clasificación de las cláusulas y objetivos ­ 32 ­ 36.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray ANEXO 2 – ALGORITMOS Algoritmo 1 – Transformar fbf en forma normal conjuntiva o disyuntiva:Entrada: una fbf A de L.Salida: una fórmula en forma normal conjuntiva (o disyuntiva) B.Comienzo PASO 1: Eliminar las conectivas “↔” y “→” de A, usando las reglas: • (A↔B) ⇔ (A→B) ∧ (B→A) • (A→B) ⇔ (  A ∨ B) PASO 2: Llevar la negación a los átomos, empleando las reglas: •  A ⇔ A •  A∨B⇔ A∧ B •  A∧B⇔ A∨ B PASO 3: Emplear repetidamente, hasta obtener una forma normal conjuntiva (o disyuntiva), las reglas siguientes: • A ∨ (B ∧ C) ⇔ (A ∨ B) ∧ (A ∨ C) • A ∧ (B ∨ C) ⇔ (A ∧ B) ∨ (A ∧ C) • Se pueden utilizar también el resto de reglas de equivalencia de la lógica de proposiciones (ver tabla 1 del Anexo 1). Devolver la fórmula transformada.Fin Algoritmo 2 ­ Transformar fbf en forma normal prenexa:Entrada: fbf A de LSalida: fórmula en forma normal prenexaComienzo PASO 1: Eliminar las conectivas “↔” y “→” de A, usando las reglas: • (A↔B) ⇔ (A→B) ∧ (B→A) • (A→B) ⇔ (  A ∨ B) PASO 2: Llevar la negación a los átomos, empleando las reglas: •  A ⇔ A •  A∨B⇔ A∧ B •  A∧B⇔ A∨ B • ∀ X  A  X ⇔∃ X  A  X  • ∃ X  A  X ⇔∀ X  A  X  PASO 3: Renombrar las variables ligadas, si es necesario. PASO 4: Mover los cuantificadores a la izquierda para obtener la forma normal prenexa, empleando las reglas (todas las reglas en la tabla 2 del Anexo 1): • Q X  A  X∨B ⇔QX  A  X ∨B • Q X  A  X∧B ⇔QX  A  X ∧B • ∀ X  A  X ∧∀ X  C X ⇔∀ X  A  X∧C  X  • ∃ X A  X ∨∃ X C  X ⇔∃ X  A  X ∨C  X  • Q1 X  A  X ∨Q2 X C  X ⇔Q1 X Q2 Z  A  X ∨C  Z • Q3 X A  X ∧Q4 X C  X ⇔Q3 X Q4 Z A X ∧C Z  Devolver la fórmula transformada.Fin ­ 33 ­ 37.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Algoritmo 3 – Skolemización:Entrada: una fbf A de L.Salida: una fórmula B, en forma normal de Skolem.Comienzo PASO 1: Usar el algoritmo 2 para obtener una forma normal prenexa. PASO 2: Usar el algoritmo 1 para obtener la forma normal conjuntiva de M. PASO 3 (Skolemización): Eliminar los cuantificadores existenciales aplicando reiteradamente los siguientes pasos (suponemos que Q r ≡∃ en el prefijo Q1 X 1Q2 X 2 ...Qn X n  , con 1≤r ≤n ): 1.­ Si a Q r no le precede ningún cuantificador universal, sustituir cada aparición de X r por una constante c, que sea diferente de cualquier otra constante que aparezca en M. Después borrar Q r X r  del prefijo. 2.­ Si Q S1 ,Q S2 ... QSm son todos los cuantificadores universales que preceden a Q r 1≤S1S 2...Sm r  , elegir un nuevo símbolo de función m­ario, f, que no aparezca en M y reemplazar todas las apariciones de X r en M por f  X S1 , X S2 , ..., X Sm . Después borrar Qr X r  del prefijo. Devolver la fórmula transformada B.Fin Algoritmo 4 – Términos básicos (Herbrand)Entrada: Un conjunto de fórmulas de  y un valor límite n .Salida: El conjunto de términos básicos de profundidad n de  , es decir: U n   .Comienzo PASO 1: Construir el conjunto U 0   , compuesto por todos los símbolos de constante que aparecen en  . Si no aparecen símbolos de constante, entonces U 0  ={a} . PASO 2: para i=1, hasta n, hacer: 1. Construir el conjunto T i   , compuesto por todos los términos básicos, f t 1 , t 2 ...t n  , que pueden formarse combinando todos los símbolos de función k que aparecen en  con los términos generados en la anterior iteración, es decir, pertenecientes a U i−1   . 2. U i  =T i  ∪U i−1   . Devolver U n   .Fin ­ 34 ­ 38.
Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray Algoritmo 5 – Conjunto insatisfacible de cláusulas (Herbrand)Entrada: Un conjunto de cláusulas  .Salida: Un conjunto insatisfacible  de cláusulas básicas (instancias de las cláusulas de  )Comienzo Repetir, desde i=0 hasta que  i sea insatisfacible. 1. Generar un conjunto de cláusulas básicas  i a partir de  :  i es el conjunto de todas las instancias básicas que pueden construirse a partir de cláusulas de  sustituyendo sus variables por términos del conjunto U i  (conjunto de términos básicos de profundidad i ). 2. Comprobar la insatisfacibilidad de  i : utilizando algún método de demostración de insatisfacibilidad de la lógica de proposiciones. 3. Si  i no es insatisfacible, entonces i=i+1. Devolver  = iFin Algoritmo 6 – Sustitución compuestaEntrada: Dos sustituciones ={X 1 /t 1 ... X n /t n } y ={Y 1 / s1 ...Y m /s m } .Salida: La sustitución compuesta  ° .Comienzo Computar: 1. La sustitución 1={X 1 / t 1 ,... , X n / t n } 2. La sustitución  2 : eliminando de  1 los elementos X i / t i  , con X i≡t i , que aparecen en  1 . 3. La sustitución  2 : eliminando de  los elementos Y i /s i , con Y i ∈Dom  , que aparecen en  . Devolver:  °=2∪ 2Fin Algoritmo 7 – Algoritmo de ResoluciónEntrada: Un conjunto de cláusulas Salida: Una condición de éxito.Comienzo Inicialización: CLAUSULAS =  Repetir hasta que □ aparezca en CLAUSULAS: 1. Seleccionar dos cláusulas distintas, Ci y C j , del conjnto CLAUSULAS, que sean resolubles. 2. Hallar el resolvente Rij de Ci y C j . 3. CLAUSULAS = CLAUSULAS ∪{R ij } Devolver éxito.Fin ­ 35 ­ English

References: ResolucióN 
 resolución 
 resolución 
 resolución 
 resolución 
 Resolución 
 resolución 
 Resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 RESOLUCIÓN 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 Resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 RESOLUCIÓN 
 resolución 
 resolución 
 resolución