Articulo de referencia

Programación lógica

La programación lógica es un paradigma de programación , bases de datos y representación del conocimiento basado en la lógica formal . Un programa lógico es un conjunto de oraci...

La programación lógica es un paradigma de programación , bases de datos y representación del conocimiento basado en la lógica formal . Un programa lógico es un conjunto de oraciones en forma lógica que representan conocimiento sobre un dominio de problemas. La computación se realiza aplicando razonamiento lógico a ese conocimiento para resolver problemas en dicho dominio. Las principales familias de lenguajes de programación lógica incluyen Prolog , Programación de Conjuntos de Respuestas (ASP) y Datalog . En todos estos lenguajes, las reglas se escriben en forma de cláusulas .

A :- B1, ..., Bn.

y se leen como oraciones declarativas en forma lógica:

A if B1 and ... and Bn.

Ase llama cabeza de la regla, , ..., se llama cuerpo , y los se llaman literales o condiciones. Cuando n = 0, la regla se llama hecho y se escribe en la forma simplificada:B1BnBi

A.

Las consultas (u objetivos) tienen la misma sintaxis que los cuerpos de las reglas y suelen escribirse de la siguiente forma:

?- B1, ..., Bn.

En el caso más simple de las cláusulas de Horn (o cláusulas "definidas"), todas las A, B 1 , ..., B n son fórmulas atómicas de la forma p(t 1 ,..., t m ​​), donde p es un símbolo predicado que nombra una relación, como "maternidad", y los t i son términos que nombran objetos (o individuos). Los términos incluyen tanto símbolos constantes, como "charles", como variables, como X, que comienzan con una letra mayúscula.

Consideremos, por ejemplo, el siguiente programa de cláusulas de Horn:

madre_hijo ( elizabeth , charles ). padre_hijo ( charles , william ). padre_hijo ( charles , harry ). padre_hijo ( X , Y ) :- madre_hijo ( X , Y ). padre_hijo ( X , Y ) :- padre_hijo ( X , Y ). abuelo_hijo ( X , Y ) :- padre_hijo ( X , Z ), padre_hijo ( Z , Y ).

Dada una consulta, el programa produce respuestas. Por ejemplo, para una consulta ?- parent_child(X, william), la única respuesta es

X = Charles

Se pueden realizar diversas consultas. Por ejemplo, se puede consultar el programa para generar abuelos y nietos. Incluso se puede usar para generar todas las parejas de nietos y abuelos, o simplemente para comprobar si una pareja dada es una de ellas.

abuelo_hijo ( X , william ). X = elizabeth?- abuelo_hijo ( elizabeth , Y ). Y = william ; Y = harry .?- abuelo_hijo ( X , Y ). X = elizabeth Y = william ; X = elizabeth Y = harry .¿- abuelo/a hijo/a ( william , harry ). no ¿- abuelo/a hijo/a ( elizabeth , harry ). 

Aunque los programas lógicos de cláusulas de Horn son Turing completos , [ 1 ] [ 2 ] para la mayoría de las aplicaciones prácticas, los programas de cláusulas de Horn necesitan extenderse a programas lógicos "normales" con condiciones negativas. Por ejemplo, la definición de hermano utiliza una condición negativa, donde el predicado = se define mediante la cláusula X = X :

hermano ( X , Y ) :- padre_hijo ( Z , X ), padre_hijo ( Z , Y ), no ( X = Y ).

Los lenguajes de programación lógica que incluyen condiciones negativas tienen las capacidades de representación del conocimiento de una lógica no monótona .

En ASP y Datalog, los programas lógicos solo tienen una lectura declarativa , y su ejecución se realiza mediante un procedimiento de prueba o un generador de modelos cuyo comportamiento no está destinado a ser controlado por el programador. Sin embargo, en la familia de lenguajes Prolog, los programas lógicos también tienen una interpretación procedimental como procedimientos de reducción de objetivos. Desde este punto de vista, la cláusula A  :- B 1 ,...,B n se entiende como:

resolver A, resolver y... y resolver .B1Bn

Las condiciones negativas en el cuerpo de las cláusulas también tienen una interpretación procesal, conocida como negación por fallo : se considera que un literal negativo not Bes válido si y solo si el literal positivo Bno lo es.

Gran parte de la investigación en el campo de la programación lógica se ha centrado en desarrollar una semántica lógica para la negación como fallo, así como en desarrollar otras semánticas e implementaciones para la negación. Estos avances han sido importantes, a su vez, para respaldar el desarrollo de métodos formales para la verificación y transformación de programas basados ​​en la lógica .

Historia

El uso de la lógica matemática para representar y ejecutar programas informáticos es también una característica del cálculo lambda , desarrollado por Alonzo Church en la década de 1930. Sin embargo, la primera propuesta para utilizar la forma clausal de la lógica para representar programas informáticos fue realizada por Cordell Green . [ 3 ] Esta propuesta utilizaba una axiomatización de un subconjunto de LISP , junto con una representación de una relación de entrada-salida, para calcular dicha relación simulando la ejecución del programa en LISP. Por otro lado, Absys , de Foster y Elcock, empleaba una combinación de ecuaciones y cálculo lambda en un lenguaje de programación asertivo que no impone restricciones al orden en que se realizan las operaciones. [ 4 ]

La programación lógica, con su sintaxis actual de hechos y reglas, se remonta a los debates de finales de la década de 1960 y principios de la de 1970 sobre las representaciones declarativas frente a las procedimentales del conocimiento en inteligencia artificial . Los defensores de las representaciones declarativas trabajaban principalmente en Stanford , asociados con John McCarthy , Bertram Raphael y Cordell Green, y en Edimburgo , con John Alan Robinson (un investigador visitante de la Universidad de Syracuse ), Pat Hayes y Robert Kowalski . Los defensores de las representaciones procedimentales se concentraban principalmente en el MIT , bajo el liderazgo de Marvin Minsky y Seymour Papert . [ 5 ]

Aunque se basaba en los métodos de prueba de la lógica, Planner , desarrollado por Carl Hewitt en el MIT, fue el primer lenguaje que surgió dentro de este paradigma procedimental. [ 6 ] Planner presentaba la invocación dirigida por patrones de planes procedimentales a partir de objetivos (es decir, reducción de objetivos o encadenamiento hacia atrás ) y de aserciones (es decir, encadenamiento hacia adelante ). La implementación más influyente de Planner fue el subconjunto de Planner, llamado Micro-Planner, implementado por Gerry Sussman , Eugene Charniak y Terry Winograd . Winograd utilizó Micro-Planner para implementar el programa de comprensión del lenguaje natural SHRDLU , un hito en la historia . [ 7 ] En aras de la eficiencia, Planner utilizaba una estructura de control de retroceso, de modo que solo se almacenaba una ruta de cálculo posible a la vez. Planner dio origen a los lenguajes de programación QA4 , [ 8 ] Popler, [ 9 ] Conniver, [ 10 ] QLISP, [ 11 ] y el lenguaje concurrente Ether. [ 12 ]

Hayes y Kowalski, en Edimburgo, intentaron conciliar el enfoque declarativo basado en la lógica para la representación del conocimiento con el enfoque procedimental de Planner. Hayes (1973) desarrolló un lenguaje ecuacional, Golux, en el que se podían obtener diferentes procedimientos alterando el comportamiento del demostrador de teoremas. [ 13 ]

Mientras tanto, Alain Colmerauer, en Marsella, trabajaba en la comprensión del lenguaje natural , utilizando la lógica para representar la semántica y la resolución para responder preguntas. Durante el verano de 1971, Colmerauer invitó a Kowalski a Marsella, y juntos descubrieron que la forma clausal de la lógica podía utilizarse para representar gramáticas formales y que los demostradores de teoremas de resolución podían utilizarse para el análisis sintáctico. Observaron que algunos demostradores de teoremas, como la hiperresolución, [ 14 ] se comportan como analizadores sintácticos ascendentes y otros, como la resolución SL (1971) [ 15 ], se comportan como analizadores sintácticos descendentes.

Fue en el verano siguiente, en 1972, cuando Kowalski, trabajando nuevamente con Colmerauer, desarrolló la interpretación procedimental de las implicaciones en forma clausal. También quedó claro que tales cláusulas podían restringirse a cláusulas definidas o cláusulas de Horn , y que la resolución SL podía restringirse (y generalizarse) a la resolución SLD . La interpretación procedimental de Kowalski y la SLD se describieron en un memorando de 1973, publicado en 1974. [ 16 ]

Colmerauer, junto con Philippe Roussel, utilizó la interpretación procedimental como base de Prolog, que se implementó en el verano y otoño de 1972. El primer programa en Prolog, también escrito en 1972 e implementado en Marsella, fue un sistema francés de preguntas y respuestas. El uso de Prolog como lenguaje de programación práctico recibió un gran impulso gracias al desarrollo de un compilador por David HD Warren en Edimburgo en 1977. Los experimentos demostraron que Edinburgh Prolog podía competir con la velocidad de procesamiento de otros lenguajes de programación simbólica como Lisp . [ 17 ] Edinburgh Prolog se convirtió en el estándar de facto e influyó notablemente en la definición del estándar ISO Prolog.

La programación lógica cobró relevancia internacional durante la década de 1980, cuando el Ministerio de Comercio Internacional e Industria de Japón la seleccionó para desarrollar el software del proyecto Sistemas Informáticos de Quinta Generación (FGCS). El proyecto FGCS tenía como objetivo utilizar la programación lógica para desarrollar aplicaciones avanzadas de inteligencia artificial en supercomputadoras masivamente paralelas . Si bien inicialmente se exploró el uso de Prolog, posteriormente se adoptó la programación lógica concurrente , ya que se ajustaba mejor a la arquitectura informática del FGCS.

Sin embargo, la característica de elección comprometida de la programación lógica concurrente interfirió con la semántica lógica del lenguaje [ 18 ] y con su idoneidad para la representación del conocimiento y las aplicaciones de resolución de problemas. Además, los sistemas informáticos paralelos desarrollados en el proyecto no lograron competir con los avances que se estaban produciendo en el desarrollo de computadoras más convencionales y de propósito general. En conjunto, estos dos problemas provocaron que el proyecto FGCS no alcanzara sus objetivos. El interés tanto en la programación lógica como en la IA experimentó un declive a nivel mundial. [ 19 ]

Mientras tanto, los enfoques de programación lógica más declarativos, incluidos los basados ​​en el uso de Prolog, continuaron progresando independientemente del proyecto FGCS. En particular, aunque Prolog se desarrolló para combinar representaciones declarativas y procedimentales del conocimiento, la interpretación puramente declarativa de los programas lógicos se convirtió en el foco de las aplicaciones en el campo de las bases de datos deductivas . El trabajo en este campo cobró prominencia alrededor de 1977, cuando Hervé Gallaire y Jack Minker organizaron un taller sobre lógica y bases de datos en Toulouse. [ 20 ] El campo finalmente pasó a llamarse Datalog .

Este enfoque en la lectura lógica y declarativa de programas lógicos recibió un mayor impulso con el desarrollo de la programación lógica con restricciones en la década de 1980 y la programación de conjuntos de respuestas en la década de 1990. También está recibiendo un énfasis renovado en aplicaciones recientes de Prolog [ 21 ].

La Asociación para la Programación Lógica (ALP) se fundó en 1986 para promover la Programación Lógica. Su revista oficial hasta el año 2000 fue The Journal of Logic Programming . Su editor jefe fundador fue J. Alan Robinson . [ 22 ] En 2001, la revista pasó a llamarse The Journal of Logic and Algebraic Programming , y la revista oficial de la ALP se convirtió en Theory and Practice of Logic Programming , publicada por Cambridge University Press .

Conceptos

Los programas lógicos cuentan con una gran variedad de semánticas y métodos de resolución de problemas, así como con una amplia gama de aplicaciones en programación, bases de datos, representación del conocimiento y resolución de problemas.

Algoritmo = Lógica + Control

La interpretación procedimental de programas lógicos, que utiliza el razonamiento regresivo para reducir objetivos a subobjetivos, es un caso especial del uso de una estrategia de resolución de problemas para controlar el uso de una representación lógica declarativa del conocimiento y obtener así el comportamiento de un algoritmo . De forma más general, se pueden aplicar diferentes estrategias de resolución de problemas a la misma representación lógica para obtener diferentes algoritmos. Alternativamente, se pueden obtener diferentes algoritmos con una estrategia de resolución de problemas dada utilizando diferentes representaciones lógicas. [ 23 ]

Las dos estrategias principales para la resolución de problemas son el razonamiento hacia atrás (reducción de objetivos) y el razonamiento hacia adelante , también conocidos como razonamiento descendente y ascendente, respectivamente.

En el caso simple de un programa de cláusulas proposicionales de Horn y un objetivo atómico de nivel superior, el razonamiento hacia atrás determina un árbol "y-o" , que constituye el espacio de búsqueda para resolver el objetivo. El objetivo de nivel superior es la raíz del árbol. Dado cualquier nodo en el árbol y cualquier cláusula cuyo encabezado coincida con el nodo, existe un conjunto de nodos hijos que corresponden a los subobjetivos en el cuerpo de la cláusula. Estos nodos hijos se agrupan mediante un "y". Los conjuntos alternativos de hijos que corresponden a formas alternativas de resolver el nodo se agrupan mediante un "o".

Se puede utilizar cualquier estrategia de búsqueda para explorar este espacio. Prolog utiliza una estrategia secuencial, de último en entrar, primero en salir, con retroceso, en la que solo se considera una alternativa y un subobjetivo a la vez. Por ejemplo, los subobjetivos se pueden resolver en paralelo, y las cláusulas también se pueden probar en paralelo. La primera estrategia se llamay en paralelo y la segunda estrategia se llamao en paralelo . También son posibles otras estrategias de búsqueda, como el retroceso inteligente, [ 24 ] o la búsqueda primero en amplitud para encontrar una solución óptima, [ 25 ] .

En el caso más general y no proposicional, donde los subobjetivos pueden compartir variables, se pueden utilizar otras estrategias, como elegir el subobjetivo que esté más instanciado o que esté suficientemente instanciado para que solo se aplique un procedimiento. [ 26 ] Estas estrategias se utilizan, por ejemplo, en la programación lógica concurrente .

En la mayoría de los casos, el razonamiento hacia atrás a partir de una consulta u objetivo es más eficiente que el razonamiento hacia adelante. Sin embargo, a veces, con Datalog y la Programación de Conjuntos de Respuestas, puede que no exista una consulta independiente del conjunto de cláusulas en su totalidad, y entonces generar todos los hechos que se pueden derivar de las cláusulas es una estrategia sensata para la resolución de problemas. He aquí otro ejemplo, donde el razonamiento hacia adelante supera al razonamiento hacia atrás en una tarea de cálculo más convencional, cuyo objetivo ?- fibonacci(n, Result)es encontrar el enésimo número de Fibonacci:

Fibonacci ( 0 , 0 ). Fibonacci ( 1 , 1 ).fibonacci ( N , Resultado ) :- N > 1 , N1 es N - 1 , N2 es N - 2 , fibonacci ( N1 , F1 ), fibonacci ( N2 , F2 ), Resultado es F1 + F2 .

Aquí la relación fibonacci(N, M)representa la función fibonacci(N) = M, y el predicado N is Expressiones la notación de Prolog para el predicado que instancia la variable Nal valor de Expression.

Dado el objetivo de calcular el número de Fibonacci de n, el razonamiento hacia atrás reduce el objetivo a los dos subobjetivos de calcular los números de Fibonacci de n-1 y n-2. Reduce el subobjetivo de calcular el número de Fibonacci de n-1 a los dos subobjetivos de calcular los números de Fibonacci de n-2 y n-3, calculando redundantemente el número de Fibonacci de n-2. Este proceso de reducir un subobjetivo de Fibonacci a dos subobjetivos de Fibonacci continúa hasta que llega a los números 0 y 1. Su complejidad es del orden de 2 n . En contraste, el razonamiento hacia adelante genera la secuencia de números de Fibonacci, comenzando desde 0 y 1 sin ningún recálculo, y su complejidad es lineal con respecto a n.

Prolog no puede realizar razonamiento hacia adelante directamente. Sin embargo, puede lograr el efecto del razonamiento hacia adelante dentro del contexto del razonamiento hacia atrás mediante el uso de tablas : los subobjetivos se almacenan en una tabla, junto con sus soluciones. Si se vuelve a encontrar un subobjetivo, se resuelve directamente utilizando las soluciones que ya están en la tabla, en lugar de resolver los subobjetivos de forma redundante. [ 27 ]

Relación con la programación funcional

La programación lógica puede considerarse una generalización de la programación funcional, en la que las funciones son un caso especial de relaciones. [ 28 ] Por ejemplo, la función madre(X) = Y (cada X tiene una sola madre Y) puede representarse mediante la relación madre(X, Y). En este sentido, los programas lógicos son similares a las bases de datos relacionales , que también representan las funciones como relaciones.

En comparación con la sintaxis relacional, la sintaxis funcional es más compacta para funciones anidadas. Por ejemplo, en la sintaxis funcional la definición de abuela materna se puede escribir en la forma anidada:

abuela_materna ( X ) = madre ( madre ( X )).

La misma definición en notación relacional debe escribirse en su forma plana y sin anidar:

abuela_materna ( X , Y ) :- madre ( X , Z ), madre ( Z , Y ).

Sin embargo, la sintaxis anidada puede considerarse azúcar sintáctico para la sintaxis no anidada. Ciao Prolog, por ejemplo, transforma la sintaxis funcional en forma relacional y ejecuta el programa lógico resultante utilizando la estrategia de ejecución estándar de Prolog. [ 29 ] Además, la misma transformación puede utilizarse para ejecutar relaciones anidadas que no son funcionales. Por ejemplo:

abuelo ( X ) := padre ( padre ( X )). padre ( X ) := madre ( X ). padre ( X ) := padre ( X ).madre ( charles ) := elizabeth . padre ( charles ) := phillip . madre ( harry ) := diana . padre ( harry ) := charles .?- abuelo ( X , Y ). X = harry , Y = elizabeth . X = harry , Y = phillip .

Relación con la programación relacional

El término programación relacional se ha utilizado para abarcar diversos lenguajes de programación que tratan las funciones como un caso especial de relaciones. Algunos de estos lenguajes, como miniKanren [ 28 ] y la programación lineal relacional [ 30 ], son lenguajes de programación lógica en el sentido de este artículo.

Sin embargo, el lenguaje relacional RML es un lenguaje de programación imperativo [ 31 ] cuya construcción central es una expresión relacional, que es similar a una expresión en lógica de predicados de primer orden.

Otros lenguajes de programación relacionales se basan en el cálculo relacional [ 32 ] o el álgebra relacional. [ 33 ]

Semántica de los programas de cláusulas de Horn

Visto en términos puramente lógicos, hay dos enfoques para la semántica declarativa de los programas de lógica de cláusulas de Horn: un enfoque es la semántica de consecuencia lógica original , que entiende que resolver un objetivo es demostrar que el objetivo es un teorema que es verdadero en todos los modelos del programa.

En este enfoque, la computación es una demostración de teoremas en lógica de primer orden ; y tanto el razonamiento hacia atrás , como en la resolución SLD, como el razonamiento hacia adelante , como en la hiperresolución, son métodos de demostración de teoremas correctos y completos. A veces, estos métodos de demostración de teoremas también se consideran como una semántica teórica de la demostración (u operacional) independiente para los programas lógicos. Pero desde un punto de vista lógico, son métodos de demostración, no semántica.

El otro enfoque para la semántica declarativa de los programas de cláusulas de Horn es la semántica de satisfacibilidad , que entiende la resolución de un objetivo como la demostración de que dicho objetivo es verdadero (o satisfecho) en algún modelo previsto (o estándar) del programa. Para los programas de cláusulas de Horn, siempre existe tal modelo estándar: es el único modelo mínimo del programa.

En términos informales, un modelo mínimo es un modelo que, cuando se considera como el conjunto de todos los hechos (libres de variables) que son verdaderos en el modelo, no contiene ningún conjunto más pequeño de hechos que también sea un modelo del programa.

Por ejemplo, los siguientes hechos representan el modelo mínimo del ejemplo de relaciones familiares en la introducción de este artículo. Todos los demás hechos sin variables son falsos en el modelo:

madre_hijo ( elizabeth , charles ). padre_hijo ( charles , william ). padre_hijo ( charles , harry ). padre_hijo ( elizabeth , charles ). padre_hijo ( charles , william ). padre_hijo ( charles , harry ). abuelo_hijo ( elizabeth , william ). abuelo_hijo ( elizabeth , harry ).

La semántica de satisfacibilidad también tiene una caracterización alternativa, más matemática, como el punto fijo mínimo de la función que utiliza las reglas del programa para derivar nuevos hechos a partir de hechos existentes en un solo paso de inferencia.

Sorprendentemente, los mismos métodos de resolución de problemas de razonamiento hacia adelante y hacia atrás, desarrollados originalmente para la semántica de la consecuencia lógica, son igualmente aplicables a la semántica de la satisfacibilidad: el razonamiento hacia adelante genera el modelo mínimo de un programa de cláusulas de Horn, derivando nuevos hechos a partir de hechos existentes, hasta que no se puedan generar nuevos hechos adicionales. El razonamiento hacia atrás, que tiene éxito reduciendo un objetivo a subobjetivos, hasta que todos los subobjetivos se resuelven mediante hechos, garantiza que el objetivo sea verdadero en el modelo mínimo, sin generar el modelo explícitamente. [ 34 ]

La diferencia entre las dos semánticas declarativas se puede observar con las definiciones de suma y multiplicación en la aritmética de sucesores , que representa los números naturales 0, 1, 2, ...como una secuencia de términos de la forma 0, s(0), s(s(0)), .... En general, el término s(X)representa el sucesor de , X,es decir, X + 1.Aquí están las definiciones estándar de suma y multiplicación en notación funcional:

 X + 0 = X. X + s(Y) = s(X + Y). es decir, X + (Y + 1) = (X + Y) + 1 X × 0 = 0. X × s(Y) = X + (X × Y). es decir, X × (Y + 1) = X + (X × Y). 

Aquí están las mismas definiciones que en un programa lógico, usando add(X, Y, Z)para representar X + Y = Z,y multiply(X, Y, Z)para representar X × Y = Z:

agregar ( X , 0 , X ). agregar ( X , s ( Y ), s ( Z )) :- agregar ( X , Y , Z ).multiplicar ( X , 0 , 0 ). multiplicar ( X , s ( Y ), W ) :- multiplicar ( X , Y , Z ), sumar ( X , Z , W ).

Las dos semánticas declarativas dan las mismas respuestas para las mismas conjunciones cuantificadas existencialmente de objetivos de suma y multiplicación. Por ejemplo, 2 × 2 = Xtiene la solución X = 4; y X × X = X + Xtiene dos soluciones X = 0y X = 2:

?- multiplicar ( s ( s ( 0 )), s ( s ( 0 )), X ). X = s ( s ( s ( s ( 0 )))).?- multiplicar ( X , X , Y ), sumar ( X , X , Y ). X = 0 , Y = 0. X = s ( s ( 0 )), Y = s ( s ( s ( s ( 0 )))).

Sin embargo, con la semántica de consecuencias lógicas, existen modelos no estándar del programa, en los que, por ejemplo, add(s(s(0)), s(s(0)), s(s(s(s(s(0)))))),es 2 + 2 = 5verdadero. Pero con la semántica de satisfacibilidad, solo hay un modelo, a saber, el modelo estándar de la aritmética, en el que 2 + 2 = 5es falso.

En ambas semánticas, el objetivo falla. En la semántica de satisfacibilidad, el fallo del objetivo implica que su valor de verdad es falso. En cambio, en la semántica de consecuencia lógica, el fallo implica que se desconoce el valor de verdad del objetivo.?-add(s(s(0)),s(s(0)),s(s(s(s(s(0))))))

La negación como fracaso

La negación como fallo (NAF), como forma de concluir que una condición negativa not pse cumple demostrando que la condición positiva pno se cumple, ya era una característica de los primeros sistemas Prolog. La extensión resultante de la resolución SLD se llama SLDNF . Una construcción similar, llamada "thnot", también existía en Micro-Planner .

La semántica lógica de NAF no se resolvió hasta que Keith Clark [ 35 ] demostró que, bajo ciertas condiciones naturales, NAF es una forma eficiente, correcta (y a veces completa) de razonar con la semántica de consecuencia lógica utilizando la finalización de un programa lógico en lógica de primer orden.

La completitud equivale aproximadamente a considerar el conjunto de todas las cláusulas del programa con el mismo predicado en la cabecera, por ejemplo:

A :- Body1.
...
A :- Bodyk.

como definición del predicado:

A iff (Body1 or ... or Bodyk)

donde iffsignifica "si y solo si". La compleción también incluye axiomas de igualdad, que corresponden a la unificación . Clark demostró que las pruebas generadas por SLDNF son estructuralmente similares a las pruebas generadas por un estilo de razonamiento deductivo natural con la compleción del programa.

Consideremos, por ejemplo, el siguiente programa:

should_receive_sanction ( X , punishment ) :- is_a_thief ( X ), not should_receive_sanction ( X , rehabilitation ).debería_recibir_sanción ( X , rehabilitación ) :- es_un_ladrón ( X ), es_un_menor ( X ), no es_violento ( X ).es_un_ladrón ( Tom ).

Dado el objetivo de determinar si Tom debe recibir una sanción, la primera regla logra demostrar que Tom debe ser castigado:

?- debería_recibir_sanción ( tom , Sanción ). Sanción = castigo .

Esto se debe a que Tom es un ladrón y no se puede demostrar que deba ser rehabilitado. No se puede demostrar que Tom deba ser rehabilitado porque no se puede demostrar que sea menor de edad.

Sin embargo, si recibimos nueva información que confirma que Tom es menor de edad, la conclusión anterior de que Tom debe ser castigado se reemplaza por la nueva conclusión de que Tom debe ser rehabilitado:

es_un_menor ( tom ).?- debería_recibir_sanción ( tom , Sanción ). Sanción = rehabilitación .

Esta propiedad de retractarse de una conclusión cuando se agrega nueva información se llama no monotonicidad, y hace que la programación lógica sea una lógica no monótona .

Pero si ahora se nos dice que Tom es violento, se restablecerá la conclusión de que Tom debe ser castigado:

es_violento ( tom ).?- debería_recibir_sanción ( tom , Sanción ). Sanción = castigo .

La finalización de este programa es:

debería_recibir_sanción ( X , Sanción ) si y solo si Sanción = castigo , es_un_ladrón ( X ), no debería_recibir_sanción ( X , rehabilitación ) o Sanción = rehabilitación , es_un_ladrón ( X ), es_un_menor ( X ), no es_violento ( X ).es_un_ladrón ( X ) si y solo si X = tom . es_un_menor ( X ) si y solo si X = tom . es_violento ( X ) si y solo si X = tom .

La noción de completitud está estrechamente relacionada con la semántica de circunscripción de John McCarthy para el razonamiento por defecto, [ 36 ] y con la suposición de mundo cerrado de Ray Reiter . [ 37 ]

La semántica de completitud para la negación es una semántica de consecuencia lógica, para la cual SLDNF proporciona una implementación teórica de la demostración. Sin embargo, en la década de 1980, la semántica de satisfacibilidad se popularizó para los programas lógicos con negación. En la semántica de satisfacibilidad, la negación se interpreta según la definición clásica de verdad en un modelo estándar o previsto del programa lógico.

En el caso de programas lógicos con condiciones negativas, existen dos variantes principales de la semántica de satisfacibilidad: En la semántica bien fundada , el modelo previsto de un programa lógico es un modelo mínimo, único y trivalente, que siempre existe. La semántica bien fundada generaliza la noción de definición inductiva en lógica matemática. [ 38 ] XSB Prolog [ 39 ] implementa la semántica bien fundada utilizando la resolución SLG. [ 40 ]

En la semántica de modelos estables alternativos , puede que no existan modelos previstos o que haya varios, todos ellos mínimos y bivaluados. La semántica de modelos estables es la base de la programación de conjuntos de respuestas (ASP).

Tanto la semántica de modelo bien fundamentada como la estable se aplican a programas lógicos arbitrarios con negación. Sin embargo, ambas semánticas coinciden para programas lógicos estratificados . Por ejemplo, el programa para sancionar a los ladrones es estratificado (localmente), y las tres semánticas para el programa determinan el mismo modelo previsto:

debería_recibir_sanción ( tom , castigo ). es_un_ladrón ( tom ). es_un_menor ( tom ). es_violento ( tom ).

Los intentos de comprender la negación en la programación lógica también han contribuido al desarrollo de marcos de argumentación abstractos . [ 41 ] En una interpretación argumentativa de la negación, el argumento inicial de que Tom debe ser castigado porque es un ladrón, es atacado por el argumento de que debe ser rehabilitado porque es menor de edad. Pero el hecho de que Tom sea violento socava el argumento de que Tom debe ser rehabilitado y restablece el argumento de que Tom debe ser castigado.

Programación metalógica

La metaprogramación , en la que los programas se tratan como datos, ya era una característica de las primeras implementaciones de Prolog. [ 42 ] [ 43 ] Por ejemplo, la implementación DEC10 de Prolog de Edimburgo incluía "un intérprete y un compilador, ambos escritos en el propio Prolog". [ 43 ] El metaprograma más simple es el llamado metaintérprete " vainilla ":

resolver ( verdadero ). resolver (( B , C )):- resolver ( B ), resolver ( C ). resolver ( A ):- cláusula ( A , B ), resolver ( B ).

donde verdadero representa una conjunción vacía, y (B,C) es un término compuesto que representa la conjunción de B y C. La cláusula predicativa (A,B) significa que hay una cláusula de la forma A  :- B.

La metaprogramación es una aplicación del uso más general de una metalológica o metalenguaje para describir y razonar sobre otro lenguaje, llamado lenguaje objeto .

La programación metalógica permite combinar representaciones a nivel de objeto y a nivel meta, como en el lenguaje natural. Por ejemplo, en el siguiente programa, la fórmula atómica attends(Person, Meeting)aparece tanto como una fórmula a nivel de objeto como un argumento de los metapredicados prohibitedyapproved.

prohibido ( asiste ( Persona , Reunión )) :- no ( aprobado ( asiste ( Persona , Reunión ))).debería_recibir_sanción ( Persona , regaño ) :- asiste ( Persona , Reunión ), altivo ( Persona ), prohibido ( asiste ( Persona , Reunión )). debería_recibir_sanción ( Persona , destierro ) :- asiste ( Persona , Reunión ), humilde ( Persona ), prohibido ( asiste ( Persona , Reunión )).aprobado ( asiste ( alice , tea_party )). asiste ( mad_hatter , tea_party ). asiste ( dormouse , tea_party ).altivo ( sombrerero loco ). humilde ( lirón ).?- debería_recibir_sanción ( X , Y ). Persona = sombrerero_loco , Sanción = regaño . Persona = lirón , Sanción = destierro .

En su popular Introducción a la Ciencia Cognitiva, [ 44 ] Paul Thagard incluye la lógica y las reglas como enfoques alternativos para modelar el pensamiento humano. Argumenta que las reglas, que tienen la forma SI condición ENTONCES acción , son "muy similares" a las condicionales lógicas, pero son más simples y tienen mayor plausibilidad psicológica (página 51). Entre otras diferencias entre la lógica y las reglas, sostiene que la lógica utiliza la deducción, mientras que las reglas utilizan la búsqueda (página 45) y pueden usarse para razonar tanto hacia adelante como hacia atrás (página 47). Las oraciones en lógica "deben interpretarse como universalmente verdaderas ", pero las reglas pueden ser valores predeterminados , que admiten excepciones (página 44).

Afirma que «a diferencia de la lógica, los sistemas basados ​​en reglas también pueden representar fácilmente información estratégica sobre qué hacer» (página 45). Por ejemplo, «SI quieres ir a casa el fin de semana y tienes dinero para el autobús, ENTONCES puedes coger un autobús». No observa que la misma estrategia de reducir un objetivo a subobjetivos puede interpretarse, al estilo de la programación lógica, como la aplicación de un razonamiento inverso a una condición lógica:

can_go ( , casa ) :- have ( , tarifa_autobús ), catch ( , autobús ).

Todas estas características de los sistemas basados ​​en reglas —búsqueda, razonamiento hacia adelante y hacia atrás, razonamiento por defecto y reducción de objetivos— son también características definitorias de la programación lógica. Esto sugiere que la conclusión de Thagard (página 56) de que:

Gran parte del conocimiento humano se describe de forma natural en términos de reglas, y muchos tipos de pensamiento, como la planificación, pueden modelarse mediante sistemas basados ​​en reglas.

También se aplica a la programación lógica.

Otros argumentos que demuestran cómo la programación lógica puede utilizarse para modelar aspectos del pensamiento humano son presentados por Keith Stenning y Michiel van Lambalgen en su libro Human Reasoning and Cognitive Science. [ 45 ] Muestran cómo el carácter no monótono de los programas lógicos puede utilizarse para explicar el desempeño humano en diversas tareas psicológicas. También demuestran (página 237) que «el razonamiento de mundo cerrado, bajo la forma de programación lógica, tiene una implementación neuronal atractiva, a diferencia de la lógica clásica».

En El tratamiento adecuado de los eventos, [ 46 ] Michiel van Lambalgen y Fritz Hamm investigan el uso de la programación lógica de restricciones para codificar "nociones temporales en lenguaje natural observando la forma en que los seres humanos construyen el tiempo".

Representación del conocimiento

El uso de la lógica para representar el conocimiento procedimental y la información estratégica fue uno de los principales objetivos que impulsaron el desarrollo inicial de la programación lógica. Además, sigue siendo una característica importante de la familia de lenguajes de programación lógica Prolog en la actualidad. Sin embargo, muchas aplicaciones de la programación lógica, incluidas las de Prolog, se centran cada vez más en el uso de la lógica para representar conocimiento puramente declarativo. Estas aplicaciones abarcan tanto la representación del conocimiento general de sentido común como la representación de la experiencia específica de un dominio .

El sentido común incluye el conocimiento de causa y efecto, formalizado, por ejemplo, en el cálculo de situaciones , el cálculo de eventos y los lenguajes de acción . He aquí un ejemplo simplificado que ilustra las características principales de dichos formalismos. La primera cláusula establece que un hecho se cumple inmediatamente después de que un evento lo inicie (o lo cause). La segunda cláusula es un axioma de marco , que establece que un hecho que se cumple en un momento dado continúa cumpliéndose en el siguiente momento a menos que sea terminado por un evento que ocurra en ese momento. Esta formulación permite que ocurran varios eventos simultáneamente.

contiene ( Hecho , Tiempo2 ) :- sucede ( Evento , Tiempo1 ), Tiempo2 es Tiempo1 + 1 , inicia ( Evento , Hecho ).contiene ( Hecho , Tiempo2 ) :- sucede ( Evento , Tiempo1 ), Tiempo2 es Tiempo1 + 1 , contiene ( Hecho , Tiempo1 ), no ( terminado ( Hecho , Tiempo1 )).terminado ( Hecho , Tiempo ) :- sucede ( Evento , Tiempo ), termina ( Evento , Hecho ).

Aquí holdshay un metapredicado, similar al solveanterior. Sin embargo, mientras que solvetiene solo un argumento, que se aplica a las cláusulas generales, el primer argumento de holdses un hecho y el segundo argumento es un tiempo (o estado). La fórmula atómica holds(Fact, Time)expresa que el Factse cumple en el Time. Tales hechos que varían en el tiempo también se llaman fluentes . La fórmula atómica happens(Event, Time)expresa que el Evento ocurre en el Time.

El siguiente ejemplo ilustra cómo se pueden usar estas cláusulas para razonar sobre la causalidad en un mundo de bloques de juguete . Aquí, en el estado inicial en el tiempo 0, un bloque verde está sobre una mesa y un bloque rojo está apilado sobre el bloque verde (como un semáforo). En el tiempo 0, el bloque rojo se mueve a la mesa. En el tiempo 1, el bloque verde se mueve sobre el bloque rojo. Mover un objeto a un lugar termina el hecho de que el objeto esté en cualquier lugar e inicia el hecho de que el objeto está en el lugar al que se mueve.

contiene ( en ( green_block , tabla ), 0 ). contiene ( en ( red_block , green_block ), 0 ).sucede ( mover ( bloque_rojo , tabla ), 0 ). sucede ( mover ( bloque_verde , bloque_rojo ), 1 ).inicia ( mover ( Objeto , Lugar ), en ( Objeto , Lugar )). termina ( mover ( Objeto , Lugar2 ), en ( Objeto , Lugar1 )).?- sostiene ( Hecho , Tiempo ).Hecho = en ( green_block , tabla ), Tiempo = 0. Hecho = en ( red_block , green_block ), Tiempo = 0. Hecho = en ( green_block , tabla ), Tiempo = 1. Hecho = en ( red_block , tabla ), Tiempo = 1. Hecho = en ( green_block , red_block ), Tiempo = 2. Hecho = en ( red_block , tabla ), Tiempo = 2.

El razonamiento hacia adelante y el razonamiento hacia atrás generan las mismas respuestas al objetivo holds(Fact, Time). Pero el razonamiento hacia adelante genera fluentes progresivamente en orden temporal, y el razonamiento hacia atrás los genera regresivamente , como en el uso específico del dominio de la regresión en el cálculo de situaciones . [ 47 ]

La programación lógica también ha demostrado ser útil para representar el conocimiento especializado en sistemas expertos . [ 48 ] Pero el conocimiento humano, al igual que el sentido común general, es mayormente implícito y tácito , y a menudo resulta difícil representar dicho conocimiento implícito en reglas explícitas. Sin embargo, esta dificultad no surge cuando se utilizan programas lógicos para representar las reglas explícitas existentes de una organización empresarial o autoridad legal.

Por ejemplo, aquí se muestra una versión simplificada de la primera frase de la Ley de Nacionalidad Británica, que establece que una persona nacida en el Reino Unido se convierte en ciudadano británico en el momento del nacimiento si uno de sus padres es ciudadano británico en ese momento:

inicia ( nacimiento ( Persona ), ciudadano ( Persona , uk )):- hora_de ( nacimiento ( Persona ), Hora ), lugar_de ( nacimiento ( Persona ), uk ), padre_hijo ( Otra_Persona , Persona ), sostiene ( ciudadano ( Otra_Persona , uk ), Hora ).

Históricamente, la representación de una gran parte de la Ley de Nacionalidad Británica como un programa lógico en la década de 1980 [ 49 ] fue "enormemente influyente para el desarrollo de representaciones computacionales de la legislación, mostrando cómo la programación lógica permite representaciones intuitivamente atractivas que pueden implementarse directamente para generar inferencias automáticas". [ 50 ]

Más recientemente, el sistema PROLEG, [ 51 ] iniciado en 2009 y que consta de aproximadamente 2500 reglas y excepciones del código civil y reglas de casos de la Corte Suprema en Japón, se ha convertido posiblemente en la base de reglas legales más grande del mundo. [ 52 ]

Variantes y extensiones

Prólogo

La regla de resolución de inferencia SLD es neutral respecto al orden en que se pueden seleccionar los subobjetivos en los cuerpos de las cláusulas para su solución. En aras de la eficiencia, Prolog restringe este orden al orden en que se escriben los subobjetivos. SLD también es neutral respecto a la estrategia para buscar en el espacio de pruebas SLD. Prolog busca en este espacio de arriba hacia abajo, en profundidad, probando diferentes cláusulas para resolver el mismo (sub)objetivo en el orden en que se escriben las cláusulas.

Esta estrategia de búsqueda tiene la ventaja de que la rama actual del árbol se puede representar eficientemente mediante una pila . Cuando una cláusula objetivo en la parte superior de la pila se reduce a una nueva cláusula objetivo, esta nueva cláusula se coloca en la parte superior de la pila. Si no se puede resolver el subobjetivo seleccionado en la cláusula objetivo en la parte superior de la pila, la estrategia de búsqueda retrocede , eliminando la cláusula objetivo de la parte superior de la pila y volviendo a intentar la solución del subobjetivo seleccionado en la cláusula objetivo anterior utilizando la siguiente cláusula que coincida con el subobjetivo seleccionado.

El retroceso puede restringirse mediante el uso de un subobjetivo, llamado `cut` , escrito como  `!`, que siempre tiene éxito pero no permite el retroceso. `cut` puede usarse para mejorar la eficiencia, pero también puede interferir con el significado lógico de las cláusulas. En muchos casos, el uso de `cut` puede reemplazarse por la negación como fallo. De hecho, la negación como fallo puede definirse en Prolog, usando `cut` junto con cualquier literal, por ejemplo `fail` , que se unifique con el núcleo de la cláusula `no`:

no ( P ) :- P , !, falla . no ( P ).

Prolog ofrece otras funciones, además de `cut`, que no tienen una interpretación lógica. Entre ellas se incluyen los predicados integrados `assert` y `retract`, que permiten actualizar de forma destructiva el estado del programa durante su ejecución.

Por ejemplo, el ejemplo del mundo de bloques de juguete anterior se puede implementar sin axiomas de marco utilizando un cambio de estado destructivo:

en ( bloque_verde , tabla ). en ( bloque_rojo , bloque_verde ).mover ( Objeto , Lugar2 ) :- retraer ( en ( Objeto , Lugar1 )), afirmar ( en ( Objeto , Lugar2 ).

La secuencia de eventos de movimiento y las ubicaciones resultantes de los bloques se pueden calcular ejecutando la consulta:

?- mover ( bloque_rojo , mesa ), mover ( bloque_verde , bloque_rojo ), en ( Objeto , Lugar ).Objeto = bloque_rojo , Lugar = mesa . Objeto = bloque_verde , Lugar = bloque_rojo .

Se han desarrollado varias extensiones de la programación lógica para proporcionar un marco lógico para dicho cambio de estado destructivo. [ 53 ] [ 54 ] [ 55 ]

La amplia gama de aplicaciones de Prolog, tanto de forma aislada como en combinación con otros lenguajes, se destaca en el libro Year of Prolog, [ 21 ] que celebra el 50 aniversario de Prolog en 2022.

Prolog también ha contribuido al desarrollo de otros lenguajes de programación, como ALF , Fril , Gödel , Mercury , Oz , Ciao , Visual Prolog , XSB y λProlog .

Programación lógica con restricciones

La programación lógica con restricciones (PLC) combina la programación lógica con cláusulas de Horn con la resolución de restricciones . Extiende las cláusulas de Horn permitiendo que ciertos predicados, declarados como predicados de restricción, aparezcan como literales en el cuerpo de una cláusula. Los predicados de restricción no se definen mediante los hechos y las reglas del programa, sino que están predefinidos por alguna estructura o teoría de modelos específica del dominio.

En términos procedimentales, los subobjetivos cuyos predicados están definidos por el programa se resuelven mediante reducción de objetivos, como en la programación lógica convencional, pero las restricciones se simplifican y se comprueba su satisfacibilidad mediante un solucionador de restricciones específico del dominio, que implementa la semántica de los predicados de restricción. Un problema inicial se resuelve reduciéndolo a una conjunción satisfacible de restricciones.

Curiosamente, la primera versión de Prolog ya incluía un predicado de restricción dif(término1, término2), de la tesis doctoral de Philippe Roussel de 1972, que tiene éxito si ambos argumentos son términos diferentes, pero que se retrasa si alguno de los términos contiene una variable. [ 52 ]

El siguiente programa de lógica de restricciones representa una base de datos temporal de john'shistoria de juguete que actúa como profesor:

enseña ( john , hardware , T ) : 1990 T , T < 1999. enseña ( john , software , T ) : 1999 T , T < 2005. enseña ( john , lógica , T ) : 2005 T , T 2012. rango ( john , instructor , T ) : 1990 T , T < 2010. rango ( john , profesor , T ) : 2010 T , T < 2014.

Aquí y <son predicados de restricción, con su semántica habitual prevista. La siguiente cláusula de objetivo consulta la base de datos para averiguar cuándo johnse enseñó logicy fue un professor:

?- enseña ( john , lógica , T ), rango ( john , profesor , T ).

La solución 2010 ≤ T, T ≤ 2012 resulta de simplificar las restricciones. 2005 ≤ T, T ≤ 2012, 2010 ≤ T, T < 2014.

La programación lógica con restricciones se ha utilizado para resolver problemas en campos como la ingeniería civil , la ingeniería mecánica , la verificación de circuitos digitales , la elaboración automatizada de horarios , el control del tráfico aéreo y las finanzas. Está estrechamente relacionada con la programación lógica abductiva .

Registro de datos

Datalog es un lenguaje de definición de bases de datos que combina una visión relacional de los datos, como en las bases de datos relacionales , con una visión lógica, como en la programación lógica.

Las bases de datos relacionales utilizan un cálculo relacional o álgebra relacional, con operaciones relacionales como unión , intersección , diferencia de conjuntos y producto cartesiano para especificar consultas que acceden a la base de datos. Datalog utiliza conectores lógicos como OR y NOT en el cuerpo de las reglas para definir relaciones como parte de la propia base de datos.

Se reconoció desde el principio del desarrollo de las bases de datos relacionales que las consultas recursivas no pueden expresarse ni en álgebra relacional ni en cálculo relacional, y que esta deficiencia puede subsanarse introduciendo un operador de punto fijo mínimo. [ 56 ] [ 57 ] En cambio, las relaciones recursivas pueden definirse de forma natural mediante reglas en programas lógicos, sin necesidad de nuevos conectores u operadores lógicos.

Datalog se diferencia de la programación lógica más general al utilizar únicamente constantes y variables como términos. Además, todos los hechos están libres de variables y las reglas están restringidas, de modo que si se ejecutan de abajo hacia arriba, los hechos derivados también están libres de variables.

Por ejemplo, consideremos la base de datos familiar:

madre_hijo ( elizabeth , charles ). padre_hijo ( charles , william ). padre_hijo ( charles , harry ). padre_hijo ( X , Y ) :- madre_hijo ( X , Y ). padre_hijo ( X , Y ) :- padre_hijo ( X , Y ). ancestro_descendiente ( X , Y ) :- padre_hijo ( X , X ). ancestro_descendiente ( X , Y ) :- ancestro_descendiente ( X , Z ), ancestro_descendiente ( Z , Y ).

La ejecución ascendente obtiene el siguiente conjunto de hechos adicionales y finaliza:

padre_hijo ( elizabeth , charles ). padre_hijo ( charles , william ). padre_hijo ( charles , harry ).ancestro_descendiente ( Elizabeth , Charles ). ancestro_descendiente ( Charles , William ). ancestro_descendiente ( Charles , Harry ).ancestro_descendiente ( elizabeth , william ). ancestro_descendiente ( elizabeth , harry ).

La ejecución de arriba hacia abajo obtiene las mismas respuestas a la consulta:

?- ancestro_descendiente ( X , Y ).

Pero entonces entra en un bucle infinito. Sin embargo, la ejecución de arriba hacia abajo con tabulación da las mismas respuestas y termina sin bucle.

Programación de conjuntos de respuestas

Al igual que Datalog, la programación de conjuntos de respuestas (ASP) no es Turing-completa. Además, en lugar de separar los objetivos (o consultas) del programa que se utilizará para resolverlos, ASP trata todo el programa como un objetivo y lo resuelve generando un modelo estable que lo hace verdadero. Para ello, utiliza la semántica de modelos estables , según la cual un programa lógico puede tener cero, uno o más modelos previstos. Por ejemplo, el siguiente programa representa una variante degenerada del problema de colorear dos países de rojo o verde:

país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( C , rojo ) :- país ( C ), no ( color ( C , verde )). color ( C , verde ) :- país ( C ), no ( color ( C , rojo )).

El problema tiene cuatro soluciones representadas por cuatro modelos estables:

país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( oz , rojo ). color ( iz , rojo ).país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( oz , verde ). color ( iz , verde ).país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( oz , rojo ). color ( iz , verde ).país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( oz , verde ). color ( iz , rojo ).

Para representar la versión estándar del problema de coloración de mapas, necesitamos agregar una restricción que impida que dos países adyacentes tengan el mismo color. En ASP, esta restricción se puede escribir como una cláusula de la forma:

:- país ( C1 ), país ( C2 ), adyacente ( C1 , C2 ), color ( C1 , X ), color ( C2 , X ).

Con la adición de esta restricción, el problema ahora tiene solo dos soluciones:

país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( oz , rojo ). color ( iz , verde ).país ( oz ). país ( iz ). adyacente ( oz , iz ). color ( oz , verde ). color ( iz , rojo ).

La adición de restricciones de la forma :- Body.elimina los modelos en los que Bodyes verdadero.

Resulta confuso que las restricciones en ASP sean diferentes de las restricciones en CLP . En CLP, las restricciones son predicados que califican las respuestas a las consultas (y las soluciones a los objetivos). En ASP, las restricciones son cláusulas que eliminan modelos que, de otro modo, satisfarían los objetivos. Las restricciones en ASP son similares a las restricciones de integridad en las bases de datos.

Esta combinación de cláusulas de programación lógica ordinarias y cláusulas de restricción ilustra la metodología de generación y prueba para la resolución de problemas en ASP: las cláusulas ordinarias definen un espacio de búsqueda de posibles soluciones, y las restricciones filtran las soluciones no deseadas. [ 58 ]

La mayoría de las implementaciones de ASP proceden en dos pasos: primero, instancian el programa de todas las maneras posibles, reduciéndolo a un programa de lógica proposicional (conocido como puesta en tierra ). Luego, aplican un solucionador de problemas de lógica proposicional, como el algoritmo DPLL o un solucionador SAT booleano . Sin embargo, algunas implementaciones, como s(CASP) [ 59 ], utilizan un procedimiento de resolución SLD descendente y orientado a objetivos, sin puesta en tierra.

Programación lógica abductiva

La programación lógica abductiva [ 60 ] (ALP), al igual que la programación lógica condicional (CLP), extiende la programación lógica normal al permitir que los cuerpos de las cláusulas contengan literales cuyos predicados no están definidos por las cláusulas. En ALP, estos predicados se declaran como abducibles (o presumibles ) y se utilizan, como en el razonamiento abductivo, para explicar observaciones o, de forma más general, para añadir nuevos hechos al programa (como supuestos) para resolver objetivos.

Por ejemplo, supongamos que se nos da un estado inicial en el que un bloque rojo está sobre un bloque verde sobre una mesa en el instante 0:

contiene ( en ( green_block , tabla ), 0 ). contiene ( en ( red_block , green_block ), 0 ).

Supongamos que también se nos da el siguiente objetivo:

?- contiene ( en ( bloque_verde , bloque_rojo ), 3 ), contiene ( en ( bloque_rojo , tabla ), 3 ).

El objetivo puede representar una observación, en cuyo caso una solución es una explicación de dicha observación. O bien, el objetivo puede representar un estado futuro deseado, en cuyo caso una solución es un plan para alcanzar dicho objetivo. [ 61 ]

Podemos utilizar las reglas de causa y efecto presentadas anteriormente para resolver el objetivo, tratando el happenspredicado como abducible:

contiene ( Hecho , Tiempo2 ) :- sucede ( Evento , Tiempo1 ), Tiempo2 es Tiempo1 + 1 , inicia ( Evento , Hecho ).contiene ( Hecho , Tiempo2 ) :- sucede ( Evento , Tiempo1 ), Tiempo2 es Tiempo1 + 1 , contiene ( Hecho , Tiempo1 ), no ( terminado ( Hecho , Tiempo1 )).terminado ( Hecho , Tiempo ) :- sucede ( Evento , Tiempo ), termina ( Evento , Hecho ).inicia ( mover ( Objeto , Lugar ), en ( Objeto , Lugar )). termina ( mover ( Objeto , Lugar2 ), en ( Objeto , Lugar1 )).

ALP resuelve el objetivo razonando hacia atrás y añadiendo supuestos al programa para resolver subobjetivos abducibles. En este caso, existen muchas soluciones alternativas, entre ellas:

sucede ( mover ( bloque_rojo , tabla ), 0 ). sucede ( tick , 1 ). sucede ( mover ( bloque_verde , bloque_rojo ), 2 ).
sucede ( tick , 0 ). sucede ( move ( red_block , table ), 1 ). sucede ( move ( green_block , red_block ), 2 ).
sucede ( mover ( bloque_rojo , tabla ), 0 ). sucede ( mover ( bloque_verde , bloque_rojo ), 1 ). sucede ( tick , 2 ).

Aquí tickhay un evento que marca el paso del tiempo sin iniciar ni terminar ningún flujo.

También existen soluciones en las que ambos moveeventos ocurren simultáneamente. Por ejemplo:

sucede ( mover ( bloque_rojo , tabla ), 0 ). sucede ( mover ( bloque_verde , bloque_rojo ), 0 ). sucede ( tick , 1 ). sucede ( tick , 2 ).

Si no se desean dichas soluciones, se pueden eliminar añadiendo una restricción de integridad, que es similar a una cláusula de restricción en ASP:

:- sucede ( mover ( Bloque1 , Lugar ), Tiempo ), sucede ( mover ( Bloque2 , Bloque1 ), Tiempo ).

La programación lógica abductiva se ha utilizado para el diagnóstico de fallos, la planificación, el procesamiento del lenguaje natural y el aprendizaje automático. También se ha utilizado para interpretar la negación como un fallo, como una forma de razonamiento abductivo. [ 62 ]

Programación lógica inductiva

La programación lógica inductiva (PLI) es un enfoque de aprendizaje automático que genera programas lógicos como generalizaciones hipotéticas de ejemplos positivos y negativos. Dado un programa lógico que representa el conocimiento previo y ejemplos positivos, junto con restricciones que representan ejemplos negativos, un sistema de PLI genera un programa lógico que generaliza los ejemplos positivos y excluye los negativos.

La PLI es similar a la PLA, ya que ambas pueden considerarse generadoras de hipótesis para explicar las observaciones y empleando restricciones para excluir hipótesis indeseables. Sin embargo, en la PLA las hipótesis son hechos independientes de variables, mientras que en la PLI son reglas generales. [ 63 ] [ 64 ]

Por ejemplo, dado únicamente el conocimiento previo de las relaciones madre_hijo y padre_hijo, y ejemplos adecuados de la relación abuelo_hijo, los sistemas ILP actuales pueden generar la definición de abuelo_hijo, inventando un predicado auxiliar, que puede interpretarse como la relación padre_hijo: [ 65 ]

abuelo_hijo ( X , Y ):- auxiliar ( X , Z ), auxiliar ( Z , Y ). auxiliar ( X , Y ):- madre_hijo ( X , Y ). auxiliar ( X , Y ):- padre_hijo ( X , Y ).

Stuart Russell [ 66 ] se ha referido a dicha invención de nuevos conceptos como el paso más importante necesario para alcanzar la IA a nivel humano.

Los trabajos recientes en programación lógica inductiva (PLI), que combinan programación lógica, aprendizaje y probabilidad, han dado lugar a los campos del aprendizaje relacional estadístico y la programación lógica inductiva probabilística .

Programación lógica concurrente

La programación lógica concurrente integra conceptos de programación lógica con programación concurrente . Su desarrollo recibió un gran impulso en la década de 1980 al ser elegida como lenguaje de programación de sistemas del Proyecto de Quinta Generación japonés (FGCS) . [ 67 ]

Un programa lógico concurrente es un conjunto de cláusulas de Horn protegidas de la forma:

H :- G1, ..., Gn | B1, ..., Bn.

La conjunción se denomina guardia de la cláusula, y | es el operador de compromiso. Declarativamente, las cláusulas de Horn con guardia se leen como implicaciones lógicas ordinarias:G1, ... , Gn

H if G1 and ... and Gn and B1 and ... and Bn.

Sin embargo, desde el punto de vista procedimental, cuando varias cláusulas tienen como cabeza Hun objetivo determinado, todas se ejecutan en paralelo, comprobando si sus condiciones se cumplen. Si se cumplen las condiciones de más de una cláusula, se elige una de ellas y la ejecución continúa con los subobjetivos de la cláusula seleccionada. Estos subobjetivos también pueden ejecutarse en paralelo. De este modo, la programación lógica concurrente implementa una forma de "no determinismo indiferente", en lugar de un "no determinismo desconocido".G1, ... , GnB1, ..., Bn

Por ejemplo, el siguiente programa lógico concurrente define un predicado shuffle(Left, Right, Merge)que puede usarse para mezclar dos listas Lefty Right, combinándolas en una sola lista Mergeque conserva el orden de las dos listas Lefty Right:

shuffle([],[],[]).shuffle(Left,Right,Merge):-Left=[First|Rest]|Merge=[First|ShortMerge],shuffle(Rest,Right,ShortMerge).shuffle(Left,Right,Merge):-Right=[First|Rest]|Merge=[First|ShortMerge],shuffle(Left,Rest,ShortMerge).

Here, [] represents the empty list, and [Head | Tail] represents a list with first element Head followed by list Tail, as in Prolog. (Notice that the first occurrence of | in the second and third clauses is the list constructor, whereas the second occurrence of | is the commitment operator.) The program can be used, for example, to shuffle the lists [ace, queen, king] and [1, 4, 2] by invoking the goal clause:

shuffle([ace,queen,king],[1,4,2],Merge).

The program will non-deterministically generate a single solution, for example Merge = [ace, queen, 1, king, 4, 2].

Carl Hewitt has argued[68] that, because of the indeterminacy of concurrent computation, concurrent logic programming cannot implement general concurrency. However, according to the logical semantics, any result of a computation of a concurrent logic program is a logical consequence of the program, even though not all logical consequences can be derived.

Concurrent constraint logic programming

Concurrent constraint logic programming[69] combines concurrent logic programming and constraint logic programming, using constraints to control concurrency. A clause can contain a guard, which is a set of constraints that may block the applicability of the clause. When the guards of several clauses are satisfied, concurrent constraint logic programming makes a committed choice to use only one.

Higher-order logic programming

Varios investigadores han extendido la programación lógica con características de programación de orden superior derivadas de la lógica de orden superior , como las variables de predicado. Dichos lenguajes incluyen las extensiones de Prolog HiLog [ 70 ] y λProlog [ 71 ] .

Programación lógica lineal

Basar la programación lógica en la lógica lineal ha dado como resultado el diseño de lenguajes de programación lógica considerablemente más expresivos que los basados ​​en la lógica clásica. Los programas de cláusulas de Horn solo pueden representar el cambio de estado mediante el cambio de argumentos de los predicados. En la programación lógica lineal, se puede utilizar la lógica lineal ambiental para admitir el cambio de estado. Algunos diseños iniciales de lenguajes de programación lógica basados ​​en la lógica lineal incluyen LO, [ 72 ] Lolli, [ 73 ] ACL, [ 74 ] y Forum. [ 75 ] Forum proporciona una interpretación orientada a objetivos de toda la lógica lineal.

Programación lógica orientada a objetos

F-logic [ 76 ] extiende la programación lógica con objetos y la sintaxis de marcos.

Logtalk [ 77 ] extiende el lenguaje de programación Prolog con soporte para objetos, protocolos y otros conceptos de POO. Es compatible con la mayoría de los sistemas Prolog que cumplen con el estándar como compiladores de backend.

Programación lógica de transacciones

La lógica transaccional [ 53 ] es una extensión de la programación lógica con una teoría lógica de actualizaciones que modifican el estado. Posee una semántica tanto de teoría de modelos como procedimental. Una implementación de un subconjunto de la lógica transaccional está disponible en el sistema Flora-2 [ 78 ] . También existen otros prototipos .

Véase también

Citas

  1. Tärnlund, S.Å. (1977). "Computabilidad de la cláusula Horn". BIT Numerical Mathematics . 17 (2): 215– 226. doi : 10.1007/BF01932293 . S2CID 32577496 . 
  2. Andréka, H.; Németi, I. (1978). "La completitud generalizada de la lógica de predicados de Horn como lenguaje de programación" . Acta Cybernetica . 4 (1): 3– 10.
  3. Green, Cordell. Aplicación de la demostración de teoremas a la resolución de problemas (PDF) . IJCAI 1969.
  4. Foster, JM; Elcock, EW (1969). ABSYS 1: Un compilador incremental para aserciones: una introducción . Cuarto taller anual de inteligencia artificial. Inteligencia artificial. Vol. 4. Edimburgo, Reino Unido: Edinburgh University Press . págs. 423–429 .  
  5. Kowalski, RA (1988). "Los primeros años de la programación lógica" (PDF) . Communications of the ACM . 31 : 38–43 . doi : 10.1145/35043.35046 . S2CID 12259230 . 
  6. Hewitt, Carl . Planner: Un lenguaje para demostrar teoremas en robots (PDF) . IJCAI 1969.
  7. Winograd, Terry (1972). "Understanding natural language". Cognitive Psychology . 3 (1): 1– 191. doi : 10.1016/0010-0285(72)90002-3 .
  8. Jeff Rulifson ; Jan Derksen; Richard Waldinger (noviembre de 1973). QA4, un cálculo procedimental para el razonamiento intuitivo (PDF) (Informe técnico). Nota técnica 73 del Centro de IA del SRI.
  9. Davies, JM, 1971. POPLER: un planificador POP-2. Universidad de Edimburgo, Departamento de Inteligencia Artificial y Percepción.
  10. McDermott, DV ; Sussman, GJ (mayo de 1972). El manual de referencia de Conniver (Informe técnico). Memorando de Inteligencia Artificial n.° 259.
  11. Reboh, R.; Sacerdoti, ED (agosto de 1973). Un manual preliminar de QLISP (Informe técnico). Centro de Inteligencia Artificial, SRI International.
  12. Kornfeld, WA; Hewitt, CE (1981). "La metáfora de la comunidad científica". IEEE Transactions on Systems, Man, and Cybernetics . 11 (1): 24– 33. Bibcode : 1981ITSMC..11...24K . doi : 10.1109/TSMC.1981.4308575 . hdl : 1721.1/5693 . S2CID 1322857 . 
  13. Hayes, Pat (1973). "Computación y deducción". Actas del 2.º Simposio MFCS . Academia Checoslovaca de Ciencias . págs. 105–118 . 
  14. Robinson, J. (1965). "Deducción automática con hiperresolución". International Journal of Computer Mathematics . 1 (3): 227– 234. doi : 10.2307/2272384 . JSTOR 2272384 . 
  15. Kowalski, Robert; Kuehner, Donald (1971). "Resolución lineal con función de selección" (PDF) . Inteligencia artificial . 2 ( 3–4 ): 227–260 . doi : 10.1016/0004-3702(71)90012-9 .
  16. Kowalski, Robert (1973). "Lógica de predicados como lenguaje de programación" (PDF) . Departamento de Inteligencia Artificial, Universidad de Edimburgo . Memorando 70.También en Actas del Congreso IFIP, Estocolmo, North Holland Publishing Co., 1974, págs.  569–574.
  17. Warren, DH; Pereira, LM; Pereira, F. (1977). "Prolog: el lenguaje y su implementación comparados con Lisp". ACM SIGPLAN Notices . 12 (8): 109– 115. doi : 10.1145/872734.806939 .
  18. Ueda, K., 2018. Programación lógica/con restricciones y concurrencia: Las lecciones aprendidas con esfuerzo del proyecto informático de quinta generación. Science of Computer Programming, 164, pp.3-17.
  19. HP Newquist, 2020. Los creadores de cerebros: La historia de la inteligencia artificial. The Relayer Group.
  20. ^ Gallaire, Hervé; Minker, John 'Jack', eds. (1978), "Lógica y bases de datos, Simposio sobre lógica y bases de datos, Centre d'études et de recherches de Toulouse, 1977", Avances en la teoría de las bases de datos , Nueva York: Plenum Press, ISBN 978-0-306-40060-5.
  21. 1 2 Warren, DS (2023). "Introducción a Prolog". En Warren, DS; Dahl, V.; Eiter, T.; Hermenegildo, MV; Kowalski, R.; Rossi, F. (eds.). Prolog: Los próximos 50 años . Lecture Notes in Computer Science(). Vol. 13900. Springer, Cham. pp. 3–19 . doi : 10.1007/978-3-031-35254-6_1 . ISBN   978-3-031-35253-9.
  22. Robinson, J. Alan (2001). "Editorial invitada" . Teoría y práctica de la programación lógica . 1 (1). Cambridge University Press : 1. doi : 10.1017/s1471068400000028 .
  23. RAKowalski (julio de 1979). "Algoritmo = lógica + control" . Communications of the ACM . 22 (7): 424– 436. doi : 10.1145/359131.359136 . S2CID 2509896 . 
  24. Bruynooghe, M.; Pereira, LM (1984). "Revisión de deducciones mediante retroceso inteligente". Implementaciones de Prolog . Chichester, Inglaterra: Ellis Horwood. pp. 194–215 . 
  25. Nakamura, K. (julio de 1985). Heuristic Prolog: ejecución de programas lógicos mediante búsqueda heurística . Conferencia sobre Programación Lógica. Berlín, Heidelberg: Springer Berlin Heidelberg. págs. 148–155 . 
  26. Genesereth, MR; Ginsberg, ML (1985). "Programación lógica" . Communications of the ACM . 28 (9): 933– 941. doi : 10.1145/4284.4287 . S2CID 15527861 . 
  27. Swift, T.; Warren, DS (enero de 2012). "XSB: Extendiendo Prolog con programación lógica tabulada". Theory and Practice of Logic Programming . 12 ( 1–2 ): 157–187 . arXiv : 1012.5123 . doi : 10.1017/S1471068411000500 . S2CID 6153112 . 
  28. 1 2 Daniel Friedman; William Byrd; Oleg Kiselyov; Jason Hemann (2018). El estratega razonado, segunda edición . The MIT Press.
  29. A. Casas, D. Cabeza, MV Hermenegildo. Un enfoque sintáctico para combinar la notación funcional, la evaluación perezosa y el orden superior en sistemas de programación lógica. VIII Simposio Internacional sobre Programación Funcional y Lógica (FLOPS'06), páginas 142-162, abril de 2006.
  30. Kersting, K., Mladenov, M. y Tokmakov, P., 2017. Programación lineal relacional. Inteligencia Artificial, 244, pp.188-216.
  31. Beyer, D., 2006, mayo. Programación relacional con CrocoPat. En Actas de la 28.ª Conferencia Internacional sobre Ingeniería de Software (págs. 807-810).
  32. MacLennan, Bruce James (marzo de 1983). Wexelblat, Richard L. (ed.). "Descripción general de la programación relacional" . ACM SIGPLAN Notices . 18 (3). Nueva York, NY: Association for Computing Machinery: 36–45 . doi : 10.1145/988209.988213 . hdl : 10945/29034 . ISSN 0362-1340 . OCLC 25073822. Consultado el 8 de mayo de 2025 .  
  33. Behnke, R., Berghammer, R., Meyer, E. y Schneider, P., 1998. RELVIEW: Un sistema para calcular con relaciones y programación relacional. En Enfoques fundamentales de la ingeniería de software: Primera Conferencia Internacional, FASE'98, celebrada como parte de las Conferencias Europeas Conjuntas sobre Teoría y Práctica del Software, ETAPS'98, Lisboa, Portugal, del 28 de marzo al 4 de abril de 1998. Actas 1 (págs. 318-321). Springer Berlin Heidelberg.
  34. Van Emden, MH; Kowalski, RA (octubre de 1976). "La semántica de la lógica de predicados como lenguaje de programación" . Journal of the ACM . 23 (4): 733– 742. doi : 10.1145/321978.321991 . S2CID 11048276 . 
  35. Clark, KL (1977). «La negación como fracaso». Lógica y bases de datos . Boston, MA: Springer US. págs. 293–322 . doi : 10.1007/978-1-4684-3384-5_11 . ISBN  978-1-4684-3386-9.
  36. Gelfond, M.; Przymusinska, H.; Przymusinski, T. (1989). "Sobre la relación entre circunscripción y negación como fallo". Inteligencia Artificial . 38 (1): 75– 94. doi : 10.1016/0004-3702(89)90068-4 .
  37. Shepherdson, JC (1984). "La negación como fallo: una comparación de la base de datos completa de Clark y la suposición del mundo cerrado de Reiter". The Journal of Logic Programming . 1 (1): 51– 79. doi : 10.1016/0743-1066(84)90023-2 .
  38. Denecker, M.; Ternovska, E. (2008). "Una lógica de definiciones inductivas no monótonas" . ACM Transactions on Computational Logic . 9 (2): 14:1–14:52. arXiv : cs/0501025 . doi : 10.1145/1342991.1342998 . S2CID 13156469 . 
  39. Rao, P.; Sagonas, K.; Swift, T.; Warren, DS; Freire, J. (28–31 de julio de 1997). XSB: Un sistema para calcular eficientemente la semántica bien fundamentada . Programación lógica y razonamiento no monótono: 4.ª Conferencia Internacional, LPNMR'97. Castillo de Dagstuhl, Alemania: Springer Berlin Heidelberg. págs. 430–440 . doi : 10.1007/3-540-63255-7_33 . 
  40. W. Chen; DS Warren (enero de 1996). "Evaluación tabulada con demora para programas lógicos generales" . Journal of the ACM . 43 (1): 20–74 . doi : 10.1145/227595.227597 . S2CID 7041379 . 
  41. Phan Minh Dung (1995). "Sobre la aceptabilidad de los argumentos y su papel fundamental en el razonamiento no monótono, la programación lógica y los juegos de n personas" . Inteligencia Artificial . 77 (2): 321– 357. doi : 10.1016/0004-3702(94)00041-X .
  42. Colmerauer, A. y Roussel, P., 1996. El nacimiento de Prolog. En Historia de los lenguajes de programación---II (págs. 331-367).
  43. 1 2 Warren, DH, Pereira, LM y Pereira, F., 1977. Prolog: el lenguaje y su implementación comparados con Lisp. ACM SIGPLAN Notices, 12(8), pp.109-115.
  44. Thagard, Paul (2005). Mente: Introducción a la ciencia cognitiva . The MIT Press. pág. 11. ISBN  9780262701099.https://www.google.co.uk/books/edition/Mind_second_edition/gjcR1U2HT7kC?hl=en&gbpv=1&pg=PP11&printsec=frontcover
  45. ^ Stenning, Keith; van Lambalgen, Michiel (2008). Razonamiento humano y ciencia cognitiva . Prensa del MIT . ISBN 978-0-262-19583-6.https://philpapers.org/archive/STEHRA-5.pdf
  46. Van Lambalgen, M. y Hamm, F., 2008. El tratamiento adecuado de los eventos. John Wiley & Sons. https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=3126320bb6e37ca3727fed404828b53fc56ff063
  47. Reiter, R., 1991. El problema del marco en el cálculo de situaciones: una solución simple (a veces) y un resultado de completitud para la regresión de objetivos. Teoría artificial y matemática de la computación, 3.
  48. Merritt, D., 2012. Building expert systems in Prolog. Springer Science & Business Media. https://ds.amu.edu.et/xmlui/bitstream/handle/123456789/4434/%28Text%20Book%29%20Building%20Expert%20Systems%20in%20Prolog.pdf?sequence=1&isAllowed=y
  49. Sergot, MJ; Sadri, F.; Kowalski, RA; Kriwaczek, F.; Hammond, P; Cory, HT (1986). "La Ley de Nacionalidad Británica como un programa lógico" (PDF) . Communications of the ACM . 29 (5): 370– 386. doi : 10.1145/5689.5920 . S2CID 5665107 . 
  50. Prakken, H.; Sartor, G. (octubre de 2015). "Derecho y lógica: una revisión desde una perspectiva de argumentación" (PDF) . Inteligencia Artificial . 227 : 214–245 . doi : 10.1016/j.artint.2015.06.005 . S2CID 4261497 . 
  51. Satoh, K., 2023. PROLEG: Sistema práctico de razonamiento jurídico. En Prolog: Los próximos 50 años (pp. 277-283). Cham: Springer Nature Suiza.
  52. 1 2 Körner, Philipp; Leuschel, Michael; Barbosa, João; Costa, Vítor Santos; Dahl, Verónica; Hermenegildo, Manuel V.; Morales, José F.; Wielemaker, enero; Díaz, Daniel; Abreu, Salvador; Ciatto, Giovanni (noviembre de 2022). "Cincuenta años de prólogo y más allá" . Teoría y práctica de la programación lógica . 22 (6): 776–858 . arXiv : 2201.10816 . doi : 10.1017/S1471068422000102 . ISSN 1471-0684 . 
  53. 1 2 Bonner, AJ y Kifer, M., 1993, febrero. Programación lógica de transacciones. En ICLP (Vol. 93, págs. 257-279).
  54. Genesereth, M., 2023. Programación lógica dinámica. En Prolog: Los próximos 50 años (pp. 197-209). Cham: Springer Nature Suiza.
  55. Kowalski, R., Sadri, F., Calejo, M. y Dávila, J., 2023. Combinación de programación lógica y programación imperativa en LPS. En Prolog: Los próximos 50 años (pp. 210-223). Cham: Springer Nature Suiza.
  56. Aho, AV y Ullman, JD, 1979, enero. Universalidad de los lenguajes de recuperación de datos. En Actas del 6.º simposio ACM SIGACT-SIGPLAN sobre principios de lenguajes de programación (págs. 110-119).
  57. Maier, D., Tekle, KT, Kifer, M. y Warren, DS, 2018. Datalog: conceptos, historia y perspectivas. En Programación lógica declarativa: teoría, sistemas y aplicaciones (págs. 3-100).
  58. Eiter, T., Ianni, G. y Krennwallner, T., 2009. Programación de conjuntos de respuestas: una introducción. En Reasoning Web. Tecnologías semánticas para sistemas de información: 5.ª Escuela Internacional de Verano 2009, Brixen-Bressanone, Italia, 30 de agosto - 4 de septiembre de 2009, Conferencias tutoriales (págs. 40-110).
  59. Arias, J.; Carro, M.; Salazar, E.; Marple, K.; Gupta, G. (2018). "Programación de conjuntos de respuestas con restricciones sin fundamentación" . Teoría y práctica de la programación lógica . 18 ( 3–4 ): 337–354 . arXiv : 1804.11162 . doi : 10.1017/S1471068418000285 . S2CID 13754645 . 
  60. Denecker, M.; Kakas, AC (julio de 2000). "Número especial: programación lógica abductiva" . Journal of Logic Programming . 44 ( 1–3 ): 1–4 . doi : 10.1016/S0743-1066(99)00078-3 .
  61. Eshghi, K., 1988, agosto. Planificación abductiva con cálculo de eventos. En ICLP/SLP (págs. 562-579).
  62. Eshghi, K. y Kowalski, RA, 1989, junio. La abducción comparada con la negación por fracaso. En ICLP (Vol. 89, págs. 234-255).
  63. Nienhuys-Cheng, Shan-hwei; Wolf, Ronald de (1997). Fundamentos de la programación lógica inductiva . Notas de clase en informática. Notas de clase en inteligencia artificial. Berlín Heidelberg: Springer. pág. 173. ISBN  978-3-540-62927-6.
  64. Flach, PA y Kakas, AC, 2000. Sobre la relación entre abducción y aprendizaje inductivo. En Razonamiento y aprendizaje abductivo (págs. 1-33). Dordrecht: Springer Netherlands.
  65. Cropper, A. y Dumančić, S., 2022. Programación lógica inductiva a los 30 años: una nueva introducción. Journal of Artificial Intelligence Research, 74, pp.765-850.
  66. Russell, S., 2019. Human compatible: Inteligencia artificial y el problema del control. Penguin.
  67. Shunichi Uchida y Kazuhiro Fuchi. Actas del Taller de Evaluación de Proyectos FGCS . Instituto de Tecnología Informática de Nueva Generación (ICOT). 1992.
  68. Hewitt, Carl (27 de abril de 2016). "Robustez ante inconsistencias para programas lógicos" . Hal Archives. pp. 21–26 . Recuperado el 7 de noviembre de 2016 . 
  69. Saraswat, VA y Rinard, M., diciembre de 1989. Programación con restricciones concurrentes. En Actas del 17.º simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación (págs. 232-245).
  70. Chen, Weidong; Kifer, Michael; Warren, David S. (febrero de 1993). "HiLog: Una base para la programación lógica de orden superior" . Journal of Logic Programming . 15 (3): 187– 230. doi : 10.1016/0743-1066(93)90039-J .
  71. Miller, DA y Nadathur, G., 1986, julio. Programación lógica de orden superior. En Conferencia Internacional sobre Programación Lógica (págs. 448-462). Berlín, Heidelberg: Springer Berlin Heidelberg.
  72. Andreoli, Jean-Marc (1 de junio de 1992). "Programación lógica con pruebas de enfoque en lógica lineal". Journal of Logic and Computation . 2 (3): 297– 347. doi : 10.1093/logcom/2.3.297 .
  73. Hodas, Joshua; Miller, Dale (1994). "Programación lógica en un fragmento de lógica lineal intuicionista" . Information and Computation . 110 (2): 327– 365. doi : 10.1006/inco.1994.1036 .
  74. Kobayashi, Naoki; Yonezawa, Akinori (1994). Modelo de comunicación asíncrona basado en lógica lineal . Taller EE. UU./Japón sobre computación simbólica paralela. págs. 279–294 . CiteSeerX 10.1.1.42.8749 .  
  75. Miller, Dale (30 de septiembre de 1996). "Forum: Una lógica de especificación de conclusión múltiple" . Theoretical Computer Science . 165 (1): 201– 232. doi : 10.1016/0304-3975(96)00045-X .
  76. Kifer, M. y Lausen, G., 1989, junio. F-logic: un lenguaje de orden superior para razonar sobre objetos, herencia y esquemas. En Actas de la conferencia internacional ACM SIGMOD de 1989 sobre gestión de datos (págs. 134-146).
  77. ^ de Moura, PJL, 2003. Diseño de un lenguaje de programación lógica orientado a objetos (Tesis doctoral, Universidade da Beira Interior).
  78. Yang, G. y Kifer, M., 2000, julio. FLORA: Implementación de un sistema DOOD eficiente mediante un motor de lógica tabuladora. En Conferencia Internacional sobre Lógica Computacional (págs. 1078-1093). Berlín, Heidelberg: Springer Berlin Heidelberg.

Fuentes

Presentaciones generales

  • Baral, C.; Gelfond, M. (1994). "Programación lógica y representación del conocimiento" (PDF) . The Journal of Logic Programming . 19–20 : 73–148 . doi : 10.1016/0743-1066(94)90025-6 .
  • Kowalski, RA (1988). "Los primeros años de la programación lógica" (PDF) . Communications of the ACM . 31 : 38–43 . doi : 10.1145/35043.35046 . S2CID 12259230 . 
  • Lloyd, JW (1987). Fundamentos de la programación lógica (2ª  ed.). Springer-Verlag.

Otras fuentes

  • John McCarthy. "Programas con sentido común" . Simposio sobre la mecanización de los procesos de pensamiento . Laboratorio Nacional de Física. Teddington, Inglaterra. 1958.
  • Miller, Dale; Nadathur, Gopalan; Pfenning, Frank; Scedrov, Andre (1991). "Pruebas uniformes como fundamento para la programación lógica" . Annals of Pure and Applied Logic . 51 ( 1–2 ): 125–157 . doi : 10.1016/0168-0072(91)90068-W .
  • Ehud Shapiro (Editor). Prólogo concurrente . MIT Press. 1987.
  • James Slagle. "Experimentos con un programa deductivo de preguntas y respuestas" . CACM. Diciembre de 1965.
  • Gabbay, Dov M.; Hogger, Christopher John; Robinson, JA, eds. (1993–1998). Manual de lógica en inteligencia artificial y programación lógica . Vols. 1–5, Oxford University Press.

Lecturas adicionales

  • Carl Hewitt. " Incorporación procedimental del conocimiento en Planner ". IJCAI 1971.
  • Carl Hewitt. " La desaparición repetida de la programación lógica y por qué se reencarnará ". Simposio de primavera de la AAAI: Qué salió mal y por qué: Lecciones de la investigación y las aplicaciones de la IA 2006: 2–9.
  • Evgeny Dantsin, Thomas Eiter , Georg Gottlob, Andrei Voronkov: Complejidad y poder expresivo de la programación lógica . ACM Comput. Surv. 33(3): 374–425 (2001)
  • Ulf Nilsson y Jan Maluszynski, Lógica, programación y Prolog
  • Entrada a la biblioteca virtual de programación lógica
  • Bibliografías sobre programación lógica archivadas el 4 de diciembre de 2008 en Wayback Machine.
  • Asociación para la Programación Lógica (ALP)
  • Teoría y práctica de la programación lógica (revista)
  • Programación lógica en C++ con Castor
  • Programación lógica. Archivado el 3 de septiembre de 2011 en la Wayback Machine de Oz.
  • Centro de Desarrollo de Prolog
  • Racklog: Programación lógica en Racket