SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Programación Declarativa
MANUAL BÁSICO DE TEORÍA
     Sergio García Mondaray
            ­ 2008 ­
        www.yakiboo.net
ÍNDICE


TEMA 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                               03

TEMA 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                  07

TEMA 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
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                       30

Anexo 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            32

Anexo 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
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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≡ 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 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 ­
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 ­
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 ­
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 ­
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 ­
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 :
                                                  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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 ­
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 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 ­
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria
Programacion declarativa manual basico de teoria

Más contenido relacionado

La actualidad más candente

Programacion Estructurada
Programacion EstructuradaProgramacion Estructurada
Programacion EstructuradaClaretiano
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructuradaJennifer Montano
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructuradaHenry Centeno
 
12 programacion modular
12 programacion modular12 programacion modular
12 programacion modularLaura Cruz
 
Programacion Estructurada
Programacion EstructuradaProgramacion Estructurada
Programacion EstructuradaJoseph Bros
 
Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacionWil Mer
 
Historia y conceptos basicos de programación estructurada
Historia y conceptos basicos de programación estructuradaHistoria y conceptos basicos de programación estructurada
Historia y conceptos basicos de programación estructuradaEn La Vereda de Mi Casaa!
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONALFredy Olaya
 
LENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACIONLENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACIONDIEGO BAROJA
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructuradaJesús Navarro
 
Fundamentos de Programación. Unidad I
Fundamentos de Programación. Unidad IFundamentos de Programación. Unidad I
Fundamentos de Programación. Unidad IFranco Guamán
 

La actualidad más candente (20)

Programacion Estructurada
Programacion EstructuradaProgramacion Estructurada
Programacion Estructurada
 
Programación modular
Programación modularProgramación modular
Programación modular
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Programacion estructurada
Programacion estructuradaProgramacion estructurada
Programacion estructurada
 
12 programacion modular
12 programacion modular12 programacion modular
12 programacion modular
 
Programacion estructurada
Programacion estructuradaProgramacion estructurada
Programacion estructurada
 
Programacion estructurada
Programacion estructuradaProgramacion estructurada
Programacion estructurada
 
Programacion Estructurada
Programacion EstructuradaProgramacion Estructurada
Programacion Estructurada
 
Programacion MODULAR
Programacion MODULARProgramacion MODULAR
Programacion MODULAR
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Paradigmas de programacion
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacion
 
Historia y conceptos basicos de programación estructurada
Historia y conceptos basicos de programación estructuradaHistoria y conceptos basicos de programación estructurada
Historia y conceptos basicos de programación estructurada
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONAL
 
LENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACIONLENGUAJES DE PROGRAMACION
LENGUAJES DE PROGRAMACION
 
Programacion Modular
Programacion ModularProgramacion Modular
Programacion Modular
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Fundamentos de Programación. Unidad I
Fundamentos de Programación. Unidad IFundamentos de Programación. Unidad I
Fundamentos de Programación. Unidad I
 
Tema6
Tema6Tema6
Tema6
 

Similar a Programacion declarativa manual basico de teoria

Libro tecnica de programacion
Libro tecnica de programacionLibro tecnica de programacion
Libro tecnica de programacionMarialix Quintero
 
Curso de algoritmos y estructura de datos unidad i y ii
Curso de algoritmos y estructura de datos unidad i y iiCurso de algoritmos y estructura de datos unidad i y ii
Curso de algoritmos y estructura de datos unidad i y iiSantiago Hernandez
 
Programacion i ing civil
Programacion i ing civilProgramacion i ing civil
Programacion i ing civilAugusto
 
Temario lenguaje ensamblador
Temario lenguaje ensambladorTemario lenguaje ensamblador
Temario lenguaje ensambladorFrancisco Cardona
 
UNIDAD 2_Tema 1.pdf
UNIDAD 2_Tema 1.pdfUNIDAD 2_Tema 1.pdf
UNIDAD 2_Tema 1.pdfjaimelovato
 
Paradigmas programacion
Paradigmas programacionParadigmas programacion
Paradigmas programacionLuis Peralta
 
El lenguaje de programación c++, apuntesprev
El lenguaje de programación c++, apuntesprevEl lenguaje de programación c++, apuntesprev
El lenguaje de programación c++, apuntesprevjtk1
 
Paradigmasdeprogramacion
ParadigmasdeprogramacionParadigmasdeprogramacion
ParadigmasdeprogramacionVictor Zapata
 
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programaciónMay Ibarra
 
Algoritmos y lenguajes de programación 9 junio final
Algoritmos y lenguajes de programación 9 junio finalAlgoritmos y lenguajes de programación 9 junio final
Algoritmos y lenguajes de programación 9 junio finalEnrique Y Ch
 
Fundamentos y Lógica de Programación
Fundamentos y Lógica de ProgramaciónFundamentos y Lógica de Programación
Fundamentos y Lógica de ProgramaciónTensor
 

Similar a Programacion declarativa manual basico de teoria (20)

Programacion%20de%20 Sistemas[1]
Programacion%20de%20 Sistemas[1]Programacion%20de%20 Sistemas[1]
Programacion%20de%20 Sistemas[1]
 
Libro tecnica de programacion
Libro tecnica de programacionLibro tecnica de programacion
Libro tecnica de programacion
 
Curso de algoritmos y estructura de datos unidad i y ii
Curso de algoritmos y estructura de datos unidad i y iiCurso de algoritmos y estructura de datos unidad i y ii
Curso de algoritmos y estructura de datos unidad i y ii
 
Programacion i ing civil
Programacion i ing civilProgramacion i ing civil
Programacion i ing civil
 
Temario lenguaje ensamblador
Temario lenguaje ensambladorTemario lenguaje ensamblador
Temario lenguaje ensamblador
 
UNIDAD 2_Tema 1.pdf
UNIDAD 2_Tema 1.pdfUNIDAD 2_Tema 1.pdf
UNIDAD 2_Tema 1.pdf
 
Paradigmas programacion
Paradigmas programacionParadigmas programacion
Paradigmas programacion
 
01 alp u2
01 alp u201 alp u2
01 alp u2
 
El lenguaje de programación c++, apuntesprev
El lenguaje de programación c++, apuntesprevEl lenguaje de programación c++, apuntesprev
El lenguaje de programación c++, apuntesprev
 
Paradigmasdeprogramacion
ParadigmasdeprogramacionParadigmasdeprogramacion
Paradigmasdeprogramacion
 
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
 
Carlp2011
Carlp2011Carlp2011
Carlp2011
 
Algoritmos y lenguajes de programación 9 junio final
Algoritmos y lenguajes de programación 9 junio finalAlgoritmos y lenguajes de programación 9 junio final
Algoritmos y lenguajes de programación 9 junio final
 
Fundamentos y Lógica de Programación
Fundamentos y Lógica de ProgramaciónFundamentos y Lógica de Programación
Fundamentos y Lógica de Programación
 
Proyecto fernando compiladores 1
Proyecto fernando compiladores 1Proyecto fernando compiladores 1
Proyecto fernando compiladores 1
 
Paradigmas
ParadigmasParadigmas
Paradigmas
 
So1 Prog
So1 ProgSo1 Prog
So1 Prog
 
Memoria PFC
Memoria PFCMemoria PFC
Memoria PFC
 
Unidad 5
Unidad 5Unidad 5
Unidad 5
 
Investigacion operativa eco
Investigacion operativa ecoInvestigacion operativa eco
Investigacion operativa eco
 

Más de Facultad de Ciencias y Sistemas

Introducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaIntroducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaFacultad de Ciencias y Sistemas
 

Más de Facultad de Ciencias y Sistemas (20)

Ejercicios HTML 5
Ejercicios HTML 5Ejercicios HTML 5
Ejercicios HTML 5
 
CSS3
CSS3CSS3
CSS3
 
09 ordenamiento-en-vectores-en-c
09 ordenamiento-en-vectores-en-c09 ordenamiento-en-vectores-en-c
09 ordenamiento-en-vectores-en-c
 
08 mas-de-vectores-en-c
08 mas-de-vectores-en-c08 mas-de-vectores-en-c
08 mas-de-vectores-en-c
 
07 vectores-en-c final
07 vectores-en-c final07 vectores-en-c final
07 vectores-en-c final
 
06 clases-en-c
06 clases-en-c06 clases-en-c
06 clases-en-c
 
05 cadenas-de-caracteres-en-c
05 cadenas-de-caracteres-en-c05 cadenas-de-caracteres-en-c
05 cadenas-de-caracteres-en-c
 
04 mas-estructuras-iterativas-en-c
04 mas-estructuras-iterativas-en-c04 mas-estructuras-iterativas-en-c
04 mas-estructuras-iterativas-en-c
 
03 estructuras-iterativas-en-c
03 estructuras-iterativas-en-c03 estructuras-iterativas-en-c
03 estructuras-iterativas-en-c
 
02 mas-de-las-estructuras-de-programacion-en-c
02 mas-de-las-estructuras-de-programacion-en-c02 mas-de-las-estructuras-de-programacion-en-c
02 mas-de-las-estructuras-de-programacion-en-c
 
01 estructuras-de-programacion-en-c
01 estructuras-de-programacion-en-c01 estructuras-de-programacion-en-c
01 estructuras-de-programacion-en-c
 
Procesamiento del lenguaje natural con python
Procesamiento del lenguaje natural con pythonProcesamiento del lenguaje natural con python
Procesamiento del lenguaje natural con python
 
Actividades de aprendizaje en Moodle
Actividades de aprendizaje en MoodleActividades de aprendizaje en Moodle
Actividades de aprendizaje en Moodle
 
Creación de grupos en Moodle
Creación de grupos en MoodleCreación de grupos en Moodle
Creación de grupos en Moodle
 
Introducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaIntroducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con Java
 
Como crear un diagrama de clases
Como crear un diagrama de clasesComo crear un diagrama de clases
Como crear un diagrama de clases
 
Diagrama de clases - Ejemplo monográfico 02
Diagrama de clases - Ejemplo monográfico 02Diagrama de clases - Ejemplo monográfico 02
Diagrama de clases - Ejemplo monográfico 02
 
Diagrama de clases - Ejemplo monográfico 01
Diagrama de clases - Ejemplo monográfico 01Diagrama de clases - Ejemplo monográfico 01
Diagrama de clases - Ejemplo monográfico 01
 
Otro ejemplo de diagrama de clases UML
Otro ejemplo de diagrama de clases UMLOtro ejemplo de diagrama de clases UML
Otro ejemplo de diagrama de clases UML
 
Un ejemplo de diagrama de clases
Un ejemplo de diagrama de clasesUn ejemplo de diagrama de clases
Un ejemplo de diagrama de clases
 

Último

Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfDaniel Ángel Corral de la Mata, Ph.D.
 
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxc3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxMartín Ramírez
 
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxPROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxEribertoPerezRamirez
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024gharce
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docxAgustinaNuez21
 
DETALLES EN EL DISEÑO DE INTERIOR
DETALLES EN EL DISEÑO DE INTERIORDETALLES EN EL DISEÑO DE INTERIOR
DETALLES EN EL DISEÑO DE INTERIORGonella
 
Los Nueve Principios del Desempeño de la Sostenibilidad
Los Nueve Principios del Desempeño de la SostenibilidadLos Nueve Principios del Desempeño de la Sostenibilidad
Los Nueve Principios del Desempeño de la SostenibilidadJonathanCovena1
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptxMonitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptxJUANCARLOSAPARCANARE
 
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxPLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxJUANSIMONPACHIN
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxYeseniaRivera50
 
Manejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsaManejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsaLuis Minaya
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptxJunkotantik
 

Último (20)

Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
 
PPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptxPPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptx
 
VISITA À PROTEÇÃO CIVIL _
VISITA À PROTEÇÃO CIVIL                  _VISITA À PROTEÇÃO CIVIL                  _
VISITA À PROTEÇÃO CIVIL _
 
Aedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptxAedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptx
 
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxc3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
 
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxPROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docx
 
Aedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptxAedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptx
 
La luz brilla en la oscuridad. Necesitamos luz
La luz brilla en la oscuridad. Necesitamos luzLa luz brilla en la oscuridad. Necesitamos luz
La luz brilla en la oscuridad. Necesitamos luz
 
DETALLES EN EL DISEÑO DE INTERIOR
DETALLES EN EL DISEÑO DE INTERIORDETALLES EN EL DISEÑO DE INTERIOR
DETALLES EN EL DISEÑO DE INTERIOR
 
Los Nueve Principios del Desempeño de la Sostenibilidad
Los Nueve Principios del Desempeño de la SostenibilidadLos Nueve Principios del Desempeño de la Sostenibilidad
Los Nueve Principios del Desempeño de la Sostenibilidad
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptxMonitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
 
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxPLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
 
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdfTema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
 
TL/CNL – 2.ª FASE .
TL/CNL – 2.ª FASE                       .TL/CNL – 2.ª FASE                       .
TL/CNL – 2.ª FASE .
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
 
Manejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsaManejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsa
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptx
 

Programacion declarativa manual basico de teoria

  • 1. Programación Declarativa MANUAL BÁSICO DE TEORÍA Sergio García Mondaray ­ 2008 ­ www.yakiboo.net
  • 2. ÍNDICE TEMA 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 03 TEMA 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 07 TEMA 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 30 Anexo 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 32 Anexo 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Ó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 ­
  • 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 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 ­
  • 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 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 ­
  • 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Ó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 ­
  • 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 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≡ 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 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 ­
  • 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 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 : 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 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 ­