programacion declarativa manual basico de teoria

38
Programación Declarativa MANUAL BÁSICO DE TEORÍA Sergio García Mondaray - 2008 - www.yakiboo.net

Upload: facultad-de-ciencias-y-sistemas

Post on 04-Jul-2015

3.248 views

Category:

Education


1 download

TRANSCRIPT

Page 1: Programacion declarativa manual basico de teoria

Programación Declarativa

MANUAL BÁSICO DE TEORÍASergio García Mondaray

­ 2008 ­

www.yakiboo.net

Page 2: Programacion declarativa manual basico de teoria

ÍNDICE

TEMA 1: Introducción 011. Computadores y lenguajes de programación convencionales 01

1.1. Organización de los computadores 011.2. Características de los lenguajes convencionales 01

2. Programación declarativa 022.1. Programación lógica 032.2. Programación funcional 03

3. Comparación y áreas de aplicación 03

TEMA 2: Preliminares y fundamentos 051. Sistemas formales 052. Lógica de predicados 053. Semántica y lenguajes de programación 05

3.1. Necesidad de definición semántica formal 053.2. Lenguajes de programación declarativa 07

TEMA 3 – De la demostración automática a la Prog. Lógica 081. Razonamiento automático 08

1.1. Aproximaciones a la DAT 081.2. Un demostrador automático genérico 081.3. Límites de la DAT 09

2. Procedimiento de prueba por refutación 093. Formas normales 10

3.1. Formas normales en la lógica proposicional 103.2. Formas normales en la lógica de predicados 10

4. La forma clausal 104.1. Forma normal de Skolem 114.2. Cláusulas 114.3. El papel de la forma clausal en los proc. de prueba 11

5. Teorema de Herbrand 125.1. Universo de Herbrand y H­interpretaciones 125.2. Modelos de Herbrand 145.3. El teorema de Herbrand y sus dificultades 14

6. El principio de resolución de Robinson 156.1. El principio de resolución en la lógica de proposic. 156.2. Sustituciones 156.3. Unificación 166.4. El principio de resolución en la lógica de predicad. 186.5. Estrategias de resolución 18

Page 3: Programacion declarativa manual basico de teoria

Tema 4 – Programación lógica 201. Sintaxis 20

1.1. Notación para las cláusulas 201.2. Cláusulas de Horn y programas definidos 21

2. Semántica operacional (Resolución SLD) 212.1. Procedimiento de prueba y objetivos definidos 212.2. Resolución SLD y respuesta computada 222.3. Árboles de búsqueda SLD procedim. de prueba 23

3. Semántica declarativa y respuesta correcta 254. Corrección y completitud de la resolución SLD 265. Significado de los programas 27

5.1. Semántica operacional 275.2. Semántica declarativa 275.3. Semántica por punto fijo 285.4. Equivalencia entre semánticas 30

Anexo 1 – Tablas 31Tabla 1. Fórmulas equivalentes de la lógica de proposiciones 31Tabla 2. Fórmulas equivalentes de la lógica de predicados 31Tabla 3. Hechos notables (Principio de resoluc. Robinson) 32Tabla 4. Clasificación de las cláusulas y objetivos 32

Anexo 2 – Algoritmos 33Algoritmo 1. Transformar fbf en forma normal conjuntiva

   (o disyuntiva) 33Algoritmo 2. Transformar fbf en forma normal prenexa 33Algoritmo 3. Skolemización 34Algoritmo 4. Términos básicos (Herbrand) 34Algoritmo 5. Conjunto insatisfacible de cláusulas (Herbrand) 35Algoritmo 6. Sustitución compuesta 35Algoritmo 7. Algoritmo de Resolución 35

Page 4: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

TEMA 1 – INTRODUCCIÓN

1. 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 ­

Page 5: Programacion declarativa manual basico de teoria

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 ­

Page 6: Programacion declarativa manual basico de teoria

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 ­

Page 7: Programacion declarativa manual basico de teoria

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 ­

Page 8: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

TEMA 2 – PELIMINARES Y FUNDAMENTOS

1. 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 ­

Page 9: Programacion declarativa manual basico de teoria

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 ­

Page 10: Programacion declarativa manual basico de teoria

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 fbf's (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 fbf's) 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 ­

Page 11: Programacion declarativa manual basico de teoria

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ÓGICA

1. 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 ­

Page 12: Programacion declarativa manual basico de teoria

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   A1∧A2∧A3∧... An∧A ? (Donde A1, A2, A3, ... , An  y  A  son fbfs de  L , y  ={A1, A2, A3,... , An} ).

­ 9 ­

Page 13: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

3. 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≡A1∨A2∨A3∨...∨An  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≡A1∧A2∧A3∧...∧An  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≡Q1 X1Q2 X2...Qn XnM ,   donde   X1, X 2 ... Xn   son   variables   diferentes   yQi≡∃   o   Qi≡∀ ,   para   cada   1 ≤ i ≤n .   M   es   una   fórmula   que   no   contiene  cuantificadores.   Al   componente   Q1X 1Q2 X2 ...Qn Xn   se   le   llama  prefijo,   y   a   M  matriz de la fórmula  A .

Una fórmula cerrada en forma prenexa   ∀ X1∀ X2 ...∀ X3M   se denomina fórmula   universal.   Del   mismo   modo,   ∃X1∃X2...∃X3M   se   denomina  fórmula existencial.

Ver Tabla 2 del Anexo 1

Ver Algoritmo 2 del Anexo 2

4. 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 ­

Page 14: Programacion declarativa manual basico de teoria

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 ... Xn} .

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≡∀ X1∀ X2...∀ XnM  una fórmula en forma normal, se puede expresar de la forma:

∀ X1... ∀ XnM 11∨M12∨M 13 ... ∧

∀ X1... ∀ XnM 21∨M 22∨M 23 ... ∧

...

∀ X1... ∀ XnMn−11∨M n−1 2∨... ∧

∀ X1... ∀ XnM 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 ­

Page 15: Programacion declarativa manual basico de teoria

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   BL  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  BL .

­ 12 ­

Page 16: Programacion declarativa manual basico de teoria

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 =f | f :U LnU L   que 

asocia a cada secuencia de términos básicos   t 1 , t2 , ...t n   el término básico f t1 , t2 ...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 =r  de n­tuplas de términos básicos de  U L

n .

Nótese que no existe restricción respecto de las relaciones de   U Ln   asignadas a 

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  BL , que es la siguiente:

  {r t1 ,t 2 ... t n | r  es un símbolo de relación n­ario de  L  y  t1 , t2 ...t n∈r } .

Una H­interpretación puede considerarse  como un subconjunto  de  la  base  de Herbrand  BL  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  BL {V , F} , por tanto, en caso de que  BL  sea de cardinalidad finita (tenga un número finito de elementos), el número de estas aplicaciones es  2∣BL∣ .

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  BL , es decir:  pBL , que es un retículo completo cuyo máximo es el conjunto BL  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 ­

Page 17: Programacion declarativa manual basico de teoria

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 , S2 , ...Sn}⊆p C .  Entonces   S1∩S2∩...∩Sn   es  el ínfimo del conjunto  S , y  S1∪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 ­

Page 18: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

6. 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 :

C1 ,C2

C 1 \ {A }∨C2 \ {¬A }si  A∈C1 ,¬A∈C2

Para   todo   par   de   cláusulas   C1   y   C2 ,   si   existe   un   literal   L1≡A   en   C1 ,   que   es  complementario de otro literal  L2≡¬A  en  C2 , entonces se eliminan  L1  y  L2  de  C1  y C2 ,   respectivamente,   y   se   construye   la   disyunción   de   las   cláusulas   restantes.   A   la  cláusula obtenida se   le   llama “resolvente de   C1   y   C2 ”.  Las cláusulas   C1   y   C2   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 , ... ,Ck  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: {X1/ t1 , X2/ t2 , ... ,X n/ tn}   donde   para   cada   i,   t i   es   un   término   diferente   de   X i .   El conjunto   {X1 ,X 2, ... Xn}   se   denomina  dominio   de   la   sustitución   Dom ,   y {t1 ,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 ­

Page 19: Programacion declarativa manual basico de teoria

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 , X2 /t 2 ...X n/ tn}  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≤E2 , si y solo si existe una sustitución   tal que  E1=E2 .

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=E1 .

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   {E1, E2 , ...Ek}   si   y   solo   si E1=E2=...=E k . Se dice que el conjunto  E1 ,E2, ... Ek  es unificable si existe un  unificador para él.

­ 16 ­

Page 20: Programacion declarativa manual basico de teoria

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 , ... tn  y  E2≡F s1 , s2 , ... sn  es una secuencia de transformaciones  ⟨G, id⟩⇒ ⟨G1,1⟩⇒ ⟨G2 ,2⟩⇒ ...⇒ ⟨Gn ,n⟩ .  ⟨G, id⟩  es el estado inicial, donde  G={t 1=s1 ,t 2=s2 , ...t n=sn}  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 t1 , t2 ,... tn=op s1 , s2 ,... sn}∪E ,⟩

⟨{t1=s1, ...t n=sn}∪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. Regla de fallo    (Nota:  op1  y  op2  pueden ser símbolos de función o de predicado):

⟨{op1t 1 ,t 2 ,... t n=op2 s1 , s2 , ... sm}∪E ,⟩

⟨Fallo ,⟩ si  op1≠op2

6. Ocurrencia de variable    (occur check):

⟨{X=t}∪E ,⟩

⟨Fallo ,⟩ si la variable  X  aparece en  t  y no se da  X≡t )

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 ­

Page 21: Programacion declarativa manual basico de teoria

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  C2  dos cláusulas (llamadas cláusulas  padres)   sin   variables   en   común.   Sean   L1   y   L2   dos   literales   de   C1   y   C2 ,  respectivamente.   Si   L1   y   ¬L2   tienen   un   u.m.g.   ,   entonces   la   cláusula C1 \ L1∪C2 \ L2  se conoce como resolvente binario de  C1  y  C2 . A los  literales  L1  y  L2  se les llama literales resueltos.

Definición – Resolvente: Un resolvente de las cláusulas (padres)   C1  y  C2  es uno de  los siguientes resolventes binarios:

1. Un resolvente binario de  C1  y  C2 .

2. Un resolvente binario de  C1  y un factor de  C2 .

3. Un resolvente binario de un factor de  C1  y  C2 .

4. Un resolvente binario de un factor de  C1  y un factor de  C2 .

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 ­

Page 22: Programacion declarativa manual basico de teoria

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  una cláusula  C0  de  , una deducción lineal de  Cn  a partir de   con cláusula inicial  C0  es una deducción de la forma mostrada en la figura,  donde:

1. Para   i=0, 1,2, ... , n−1   se   da   que   C i1   es   un   resolvente   de   Ci  (llamada cláusula central) y  B i  (llamada cláusula lateral).

2. Cada   B i ,  o  pertenece  a     o   es  una cláusula central   C j   para algún  j , siendo  ji .

­ 19 ­

C0

|C1

|C2

|…Cn­1

|Cn

B0

B1

.

.

.

Bn­1

Page 23: Programacion declarativa manual basico de teoria

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í:   ∀ X1∀ X2 ...∀ X sM 1∨M 2∨...∨Mm∨¬N1∨¬N2∨...∨¬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: ∀ X1∀ X2 ...∀ X sN1∧N2∧...∧N nM 1∨M 2∨...∨Mm .   Es   habitual   el   símbolo condicional  recíproco  ( ),   leído “si”,  y  mediante el  cual   la anterior  cláusula queda expresada así:  ∀ X1∀ X2 ...∀ X sM 1∨M 2∨...∨Mm N1∧N2∧...∧Nn .

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  Mm , hay que resolver los  problemas  N1  y   N2  y … y  N n ». Aquí    N1 ,   N2 , … y  N n  pueden considerarse como rutinas de un lenguaje de programación convencional.

­ 20 ­

Page 24: Programacion declarativa manual basico de teoria

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  Mm »

Definición – Cláusula general:  Una cláusula general es una fórmula de la forma A1∨A2∨...∨Am L1∧L2∧...∧Ln , donde   A1∨A2∨...∨Am   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∧...∧Bn , 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∧...∧Bn⇔B1∧B2∧...∧Bn⇔∀¬B1∨¬B2∨...∨¬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∧...∧Bn  y buscar una refutación (deduciendo  □  a partir de  ∪{G} ).

­ 21 ­

Page 25: Programacion declarativa manual basico de teoria

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≡ A1∧...∧A j∧...∧An  y  una cláusula   C≡A B1∧B2∧...∧Bm ,  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'≡A1∧...∧A j−1∧B1∧...∧Bm∧A j1∧...∧An .

También diremos que   G'   se deriva de   G   y   C   (en un paso) y lo representaremos, en  símbolos, mediante diferentes notaciones:   G⇒SLDG' ,  G⇒SLD

G'  o  G⇒SLD[C , ]G' .

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[C1 ,1 ] G1 ⇒SLD

[C2 , 2] G 2 ⇒SLD[C3 ,3 ] ... ⇒SLD

[Cn−1 ,n−1 ] Gn−1 ⇒SLD[Cn , n] Gn

Los pasos quedan representados en  la  figura siguiente   como un árbol  de  deducción,  donde:

1. Para   i=1,2,... , n ,   Gi   es un resolvente  de   Gi−1   y   Ci  (por resolución SLD) usando la regla de computacion 

2. Cada  Ci  es una variante de una cláusula de  .

3. Cada   i ,   es   el  u.m.g.   obtenido   en   el   correspondiente  paso i­ésimo de resolución SLD.

En ocasiones utilizaremos la notación  |−SLD  para representar una derivación SLD. Nota: si   Gn   es la última cláusula de la  secuencia   de   resolventes,   decimos   que   la   derivación   tiene 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 ­

G0

|G1

|G2

…Gn­1

|Gn

C1,ϴ1

C2,ϴ2

Cn,ϴn

Page 26: Programacion declarativa manual basico de teoria

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  Gn=□ . 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⇒SLD

1 G1⇒SLD2 ...⇒SLD

n □   una   refutación   para   ∪{G} .   Una   respuesta  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 ⟨ Q1∧Q∧Q2 , °⟩

donde  Q ,Q1 y Q2  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   ⟨G0, id⟩⇒SLD ⟨G1 ,1⟩⇒SLD ... ⇒SLD ⟨Gn ,n⟩ ,  y una  refutación SLD  es una derivación de éxito   ⟨G0 , 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 ­

Page 27: Programacion declarativa manual basico de teoria

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   Gi≡ A1∧...∧A k∧...∧An   es   un   nodo   de   ,   bajo   el   supuesto   de   que Gi=Ak 1≤k≤n , entonces para cada cláusula   C j≡A B1∧...∧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 , Ak ),   el  

resolvente  Gij≡ A1∧...∧Ak−1∧B1∧...∧Bm∧A k1∧...∧An  es un nodo de  .  Se dice que  Gi  es el nodo padre de  Gij  y que  Gij  es un nodo hijo de  Gi .

• 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 don't 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 don't 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 ­

Page 28: Programacion declarativa manual basico de teoria

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 ­

Page 29: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

ademá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 SLD

Teorema: 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 ­

Page 30: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

5. 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∈BL∧∪{ 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∈ IM i  es un modelo de Herbrand de  .

Esta propiedad sólo se cumple para cláusulas de Horn definidas. Debido a que BL  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  BL .

Teorema: Sea   un programa definido. Entonces  M ={A | A∈BL ∧ |=A} .

­ 27 ­

Page 31: Programacion declarativa manual basico de teoria

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 :LL  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 supX =sup T X

Definición – Punto fijo y menor punto fijo: Sea  L  un retículo completo y  T :LL  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 :LL  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 :LL   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 ­

Page 32: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

Proposición:  Sea   L   un   retículo   completo   y   T :LL   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   pBL   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 : pBL pBL  definida como:

T I = {A | A∈BL ∧ A A1∧A2∧...∧An∈Basicas ∧ {A1 , A2 ,... 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  {A1, A2 , ... An}  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 ­

Page 33: Programacion declarativa manual basico de teoria

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 ­

Page 34: Programacion declarativa manual basico de teoria

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 1Fórmulas equivalentes de la lógica de proposiciones

Tabla 2Fórmulas equivalentes de la lógica de predicados

­ 31 ­

Page 35: Programacion declarativa manual basico de teoria

Programación Declarativa ­ Manual básico de teoría Sergio García Mondaray

Tabla 3Hechos notables sobre el principio de resolución de Robinson

Tabla 4Clasificación de las cláusulas y objetivos

­ 32 ­

Page 36: Programacion declarativa manual basico de teoria

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

• Q1X A X ∨Q2 XC X ⇔Q1X Q2Z A X ∨C Z

• Q3 XA X ∧Q4 X C X ⇔Q3 X Q4 Z A X ∧CZ

Devolver la fórmula transformada.Fin

­ 33 ­

Page 37: Programacion declarativa manual basico de teoria

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   Qr≡∃   en   el   prefijo Q1X 1Q2 X2 ...Qn Xn , con  1≤r≤n ):

1.­ Si a  Qr  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  Qr X r  del prefijo.2.­ Si  QS1 ,Q S2 ...QSm  son todos los cuantificadores universales que preceden a  Qr  1≤S1S2...Smr ,   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 XS1 , XS2 , ..., 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  U0 , 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 t1 , t2 ...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  Un .Fin

­ 34 ­

Page 38: Programacion declarativa manual basico de teoria

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  ={X1/ t1 ... Xn/ tn}  y  ={Y 1/ s1 ...Y m /sm} .Salida: La sustitución compuesta  ° .Comienzo

Computar:1. La sustitución  1={X1/ t 1 ,... , Xn/ tn}2. La sustitución  2 : eliminando de  1  los elementos  X i / ti , 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∪2

Fin

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 ­