stringtranslate.com

Prólogo

Prolog es un lenguaje de programación lógica que tiene su origen en la inteligencia artificial y la lingüística computacional . [1] [2] [3]

Prolog tiene sus raíces en la lógica de primer orden , una lógica formal , y a diferencia de muchos otros lenguajes de programación , Prolog está pensado principalmente como un lenguaje de programación declarativo : el programa es un conjunto de hechos y reglas que definen relaciones . Un cálculo se inicia ejecutando una consulta sobre el programa. [4]

Prolog fue uno de los primeros lenguajes de programación lógica [5] y sigue siendo el lenguaje de este tipo más popular en la actualidad, con varias implementaciones comerciales y gratuitas disponibles. El lenguaje se ha utilizado para la demostración de teoremas , [6] sistemas expertos , [7] reescritura de términos , [8] sistemas de tipos , [9] y planificación automatizada , [10] así como su campo de uso original previsto, el procesamiento del lenguaje natural. . [11] [12]

Prolog es un lenguaje de programación de propósito general completo de Turing, muy adecuado para aplicaciones inteligentes de procesamiento de conocimientos.

Sintaxis y semántica

En Prolog, la lógica del programa se expresa en términos de relaciones y se inicia un cálculo ejecutando una consulta sobre estas relaciones. Las relaciones y consultas se construyen utilizando el tipo de datos único de Prolog, el término . [4] Las relaciones se definen mediante cláusulas . Dada una consulta, el motor Prolog intenta encontrar una resolución que refute la consulta negada. Si la consulta negada puede ser refutada, es decir, se encuentra una instanciación para todas las variables libres que hace que la unión de cláusulas y el conjunto singleton que consiste en la consulta negada sea falsa, se deduce que la consulta original, con la instanciación encontrada aplicada, es una consecuencia lógica del programa. Esto hace que Prolog (y otros lenguajes de programación lógica) sean particularmente útiles para aplicaciones de bases de datos, matemáticas simbólicas y análisis de lenguajes. Debido a que Prolog permite predicados impuros , verificar el valor de verdad de ciertos predicados especiales puede tener algún efecto secundario deliberado , como imprimir un valor en la pantalla. Debido a esto, al programador se le permite utilizar cierta cantidad de programación imperativa convencional cuando el paradigma lógico es inconveniente. Tiene un subconjunto puramente lógico, llamado "Prólogo puro", así como una serie de características extralógicas.

Tipos de datos

El único tipo de datos de Prolog es el término . Los términos son átomos , números , variables o términos compuestos . [nota 1]

Casos especiales de términos compuestos:

Reglas y hechos

Los programas Prolog describen relaciones, definidas mediante cláusulas. Pure Prolog está restringido a cláusulas Horn . Se utilizan dos tipos de cláusulas Horn para definir programas Prolog: hechos y reglas. Una regla es de la forma

Cabeza  :  -Cuerpo .

y se lee como "La cabeza es verdadera si el cuerpo es verdadero". El cuerpo de una regla consta de llamadas a predicados, que se denominan objetivos de la regla . El operador lógico incorporado (es decir, un operador,/2 de aridad 2 con nombre ) denota conjunción de objetivos y denota disyunción . Las conjunciones y disyunciones sólo pueden aparecer en el cuerpo, no en el encabezamiento de una regla.,;/2

Las cláusulas con cuerpo vacío se llaman hechos . Un ejemplo de un hecho es:

humano ( sócrates ).

que es equivalente a la regla:

humano ( sócrates )  :-  verdadero .

El predicado incorporado true/0siempre es verdadero.

Teniendo en cuenta el hecho anterior, cabe preguntarse:

¿Es Sócrates un ser humano?

 ?-  humano ( sócrates ).  

¿Qué cosas son los humanos?

 ?-  humano ( X ).  X  =  sócrates

Las cláusulas con cuerpo se llaman reglas . Un ejemplo de regla es:

mortal ( X )  :-  humano ( X ).

¿Si sumamos esa regla y preguntamos qué cosas son los mortales?

 ?  -mortal ( X ).  X  =  sócrates

Predicados y programas

Un predicado (o definición de procedimiento ) es una colección de cláusulas cuyos encabezados tienen el mismo nombre y aridad. Usamos la notación nombre/aridad para referirnos a predicados. Un programa lógico es un conjunto de predicados. Por ejemplo, el siguiente programa Prolog, que define algunas relaciones familiares, tiene cuatro predicados:

madre_niño ( truda ,  sally ). padre_hijo ( tom ,  sally ). padre_hijo ( tom ,  erica ). padre_hijo ( mike ,  tom ). hermano ( X ,  Y )  : -  padre_hijo ( Z ,  X ),  padre_hijo ( Z ,  Y ). padre_hijo ( X ,  Y )  : -  padre_hijo ( X ,  Y ). padre_hijo ( X ,  Y )  : -  madre_hijo ( X ,  Y ).

El predicado father_child/2tiene tres cláusulas, todas las cuales son hechos, y el predicado parent_child/2tiene dos cláusulas, ambas son reglas.

Debido a la naturaleza relacional de muchos predicados integrados, normalmente se pueden utilizar en varias direcciones. Por ejemplo, length/2se puede utilizar para determinar la longitud de una lista ( length(List, L), dada una lista List), y para generar un esqueleto de lista de una longitud determinada ( length(X, 5)), y para generar ambos esqueletos de lista y sus longitudes juntos ( length(X, L)). De manera similar, append/3se puede usar tanto para agregar dos listas ( append(ListA, ListB, X)listas dadas ListAy ListB) como para dividir una lista determinada en partes ( append(X, Y, List), dada una lista List). Por esta razón, un conjunto comparativamente pequeño de predicados de biblioteca es suficiente para muchos programas Prolog.

Como lenguaje de propósito general, Prolog también proporciona varios predicados integrados para realizar actividades rutinarias como entrada/salida , uso de gráficos y comunicación con el sistema operativo. A estos predicados no se les da un significado relacional y sólo son útiles por los efectos secundarios que presentan en el sistema. Por ejemplo, el predicado write/1muestra un término en la pantalla.

Bucles y recursividad

Los algoritmos iterativos se pueden implementar mediante predicados recursivos. [14]

Considere el parent_child/2predicado definido en el programa de relaciones familiares anterior. El siguiente programa Prolog define la relación de ancestro :

antepasado ( X ,  Y )  : -  padre_hijo ( X ,  Y ). antepasado ( X ,  Y )  : -  padre_hijo ( X ,  Z ),  antepasado ( Z ,  Y ).

Expresa que X es un antepasado de Y si X es padre de Y o X es padre de un antepasado de Y. Es recursivo porque se define en términos de sí mismo (hay un llamado a predicar ancestor/2en el cuerpo de la segunda cláusula ).

Ejecución

La ejecución de un programa Prolog se inicia cuando el usuario publica un único objetivo, denominado consulta. Lógicamente, el motor Prolog intenta encontrar una resolución que refute la consulta negada. El método de resolución utilizado por Prolog se llama resolución SLD . Si la consulta negada puede ser refutada, se deduce que la consulta, con las vinculaciones de variables apropiadas implementadas, es una consecuencia lógica del programa. En ese caso, todas las vinculaciones de variables generadas se informan al usuario y se dice que la consulta se realizó correctamente. Operacionalmente, la estrategia de ejecución de Prolog puede considerarse como una generalización de llamadas a funciones en otros lenguajes, con una diferencia que varios encabezados de cláusulas pueden coincidir con una llamada determinada. En ese caso, el sistema crea un punto de elección, unifica la meta con la cláusula principal de la primera alternativa y continúa con las metas de esa primera alternativa. Si algún objetivo falla durante la ejecución del programa, todas las vinculaciones de variables que se realizaron desde que se creó el punto de elección más reciente se deshacen y la ejecución continúa con la siguiente alternativa de ese punto de elección. Esta estrategia de ejecución se llama retroceso cronológico . Por ejemplo, dado el programa de relación familiar definido anteriormente, la siguiente consulta se evaluará como verdadera:

 ?-  hermano ( sally ,  erica ).  

Esto se obtiene de la siguiente manera: Inicialmente, el único encabezado de cláusula coincidente para la consulta sibling(sally, erica)es el primero, por lo que probar la consulta equivale a probar el cuerpo de esa cláusula con las vinculaciones de variables apropiadas en su lugar, es decir, la conjunción (parent_child(Z,sally), parent_child(Z,erica)). El próximo objetivo a demostrar es el más a la izquierda de esta conjunción, es decir, parent_child(Z, sally). Dos cabezas de cláusula coinciden con este objetivo. El sistema crea un punto de elección y prueba la primera alternativa, cuyo cuerpo es father_child(Z, sally). Este objetivo se puede probar utilizando el hecho father_child(tom, sally), por lo que se genera la vinculación Z = tomy el siguiente objetivo a demostrar es la segunda parte de la conjunción anterior parent_child(tom, erica):. Una vez más, esto puede demostrarse mediante el hecho correspondiente. Como se pudieron probar todos los objetivos, la consulta tiene éxito. Dado que la consulta no contenía variables, no se informa ningún enlace al usuario. Una consulta con variables, como:

?-  padre_hijo ( Padre ,  Hijo ).

enumera todas las respuestas válidas sobre el retroceso.

Tenga en cuenta que con el código indicado anteriormente, la consulta ?- sibling(sally, sally).también se realiza correctamente. Si se desea, se insertarían objetivos adicionales para describir las restricciones relevantes.

Negación

El predicado Prolog incorporado \+/1proporciona negación como fracaso , lo que permite un razonamiento no monótono . El objetivo \+ illegal(X)en la regla.

legal ( X )  :-  \+  ilegal ( X ).

se evalúa de la siguiente manera: Prolog intenta probar illegal(X). Si se puede encontrar una prueba para ese objetivo, el objetivo original (es decir, \+ illegal(X)) falla. Si no se pueden encontrar pruebas, el objetivo original tiene éxito. Por lo tanto, el \+/1operador de prefijo se denomina operador "no demostrable", ya que la consulta ?- \+ Goal.tiene éxito si el objetivo no es demostrable. Este tipo de negación es válida si su argumento es "fundamental" (es decir, no contiene variables). La solidez se pierde si el argumento contiene variables y el procedimiento de prueba está completo. En particular, la consulta ?- legal(X).ahora no se puede utilizar para enumerar todas las cosas que son legales.

Programación en prólogo

En Prolog, la carga de código se denomina consulta . Prolog se puede utilizar de forma interactiva ingresando consultas en el indicador de Prolog ?-. Si no hay solución, escribe Prolog no. Si existe una solución, se imprime. Si hay varias soluciones para la consulta, se pueden solicitar ingresando un punto y coma ;. Existen directrices sobre buenas prácticas de programación para mejorar la eficiencia, la legibilidad y el mantenimiento del código. [15]

A continuación se muestran algunos programas de ejemplo escritos en Prolog.

Hola Mundo

Ejemplo de una consulta básica en un par de dialectos populares de Prolog:

Esta comparación muestra que el mensaje ("?-" frente a "| ?-") y el estado de resolución ("verdadero" frente a "sí", "falso" frente a "no") pueden diferir de una implementación de Prolog a otra.

Optimización del compilador

Cualquier cálculo puede expresarse declarativamente como una secuencia de transiciones de estado. Como ejemplo, se podría implementar un compilador de optimización con tres pasos de optimización como una relación entre un programa inicial y su forma optimizada:

programa_optimizado ( Prog0 ,  Prog )  : -  optimización_pass_1 ( Prog0 ,  Prog1 ),  optimización_pass_2 ( Prog1 ,  Prog2 ),  optimización_pass_3 ( Prog2 ,  Prog ).

o de manera equivalente usando la notación DCG :

program_optimized  -->  optimización_pass_1 ,  optimización_pass_2 ,  optimización_pass_3 .

Ordenación rápida

El algoritmo de clasificación Quicksort , que relaciona una lista con su versión ordenada:

partición ([],  _ ,  [],  []). partición ([ X | Xs ],  Pivote ,  Pequeños ,  Grandes )  :-  (  X  @<  Pivote  ->  Pequeños  =  [ X | Resto ],  partición ( Xs ,  Pivote ,  Resto ,  Grandes )  ;  Grandes  =  [ X | Resto ],  partición ( Xs ,  Pivote ,  Smalls ,  Rest )  ). clasificación rápida ([])  -->  []. clasificación rápida ([ X | Xs ])  -->  {  partición ( Xs ,  X ,  Más pequeña ,  Más grande )  },  clasificación rápida ( Más pequeña ),  [ X ],  clasificación rápida ( Más grande ).

Patrones de diseño de Prolog

Un patrón de diseño es una solución general reutilizable a un problema que ocurre comúnmente en el diseño de software . Algunos patrones de diseño en Prolog son esqueletos, técnicas, [16] [17] clichés, [18] esquemas de programa, [19] esquemas de descripción lógica, [20] y programación de orden superior . [21]

Programación de orden superior

Un predicado de orden superior es un predicado que toma uno o más predicados como argumentos. Aunque el soporte para la programación de orden superior lleva a Prolog fuera del dominio de la lógica de primer orden, que no permite la cuantificación de predicados, [ 22 ] ISO Prolog ahora tiene algunos predicados de orden superior integrados como call/1,,,,, y . [23] Además, dado que se pueden construir y evaluar objetivos arbitrarios de Prolog en tiempo de ejecución, es fácil escribir predicados de orden superior como , que aplica un predicado arbitrario a cada miembro de una lista determinada, y , que filtra elementos que satisfacen un predicado dado, permitiendo también el curry . [21]call/2call/3findall/3setof/3bagof/3maplist/2sublist/3

Para convertir soluciones de representación temporal (sustituciones de respuestas al retroceder) a representación espacial (términos), Prolog tiene varios predicados de todas las soluciones que recopilan todas las sustituciones de respuestas de una consulta determinada en una lista. Esto se puede utilizar para la comprensión de listas . Por ejemplo, los números perfectos son iguales a la suma de sus divisores propios:

 perfecto ( N )  : -  entre ( 1 ,  inf ,  N ),  U  es  N  //  2 ,  findall ( D ,  ( entre ( 1 , U , D ),  N  mod  D  =:=  0 ),  Ds ),  lista de sumas ( Ds ,  N ).

Esto se puede utilizar para enumerar números perfectos y comprobar si un número es perfecto.

Como otro ejemplo, el predicado maplistaplica un predicado Pa todas las posiciones correspondientes en un par de listas:

lista de mapas ( _ ,  [],  []). lista de mapas ( P ,  [ X | Xs ],  [ Y | Ys ])  : -  llamar ( P ,  X ,  Y ),  lista de mapas ( P ,  Xs ,  Ys ).

Cuando Pes un predicado que para todos X, P(X,Y)se unifica Ycon un único valor único, maplist(P, Xs, Ys)equivale a aplicar la función map en programación funcional como Ys = map(Function, Xs).

El estilo de programación de orden superior en Prolog fue pionero en HiLog y λProlog .

Módulos

Para la programación a gran escala , Prolog proporciona un sistema de módulos , que se encuentra en el estándar ISO. [24] Sin embargo, si bien la mayoría de los sistemas Prolog admiten la estructuración del código en módulos, prácticamente ninguna implementación se adhiere a los módulos que forman parte del estándar ISO. En cambio, la mayoría de los sistemas Prolog han decidido admitir como módulo estándar de facto el sistema de módulos Quintus / SICStus . Sin embargo, solo algunas implementaciones proporcionan predicados de conveniencia adicionales relacionados con los módulos y, a menudo, tienen diferencias sutiles en su semántica. [25]

Algunos sistemas optaron por implementar conceptos de módulo como compilación de fuente a fuente en ISO Prolog base, como es el caso de Logtalk . [26] GNU Prolog inicialmente se desvió de los módulos ISO, optando en su lugar por la programación lógica contextual, en la que la carga y descarga de unidades (módulos) se puede realizar dinámicamente. [27] Ciao diseñó un estricto sistema de módulos que, si bien es básicamente compatible con el estándar de facto utilizado por otros sistemas Prolog, es susceptible de análisis estáticos precisos, admite la ocultación de términos y facilita la programación a gran escala. [28] XSB adopta un enfoque diferente y ofrece un sistema de módulos basado en átomos . [29] Los dos últimos sistemas Prolog permiten controlar la visibilidad de los términos además de la de los predicados. [30]

Analizando

Existe una notación especial llamada gramáticas de cláusulas definidas (DCG). El preprocesador expande una regla definida vía -->/2en lugar de ( , una función análoga a las macros en otros lenguajes) de acuerdo con unas pocas reglas de reescritura sencillas, lo que da como resultado cláusulas Prolog ordinarias. En particular, la reescritura equipa al predicado con dos argumentos adicionales, que pueden usarse para enhebrar implícitamente el estado, [ se necesita aclaración ] de manera análoga a las mónadas en otros lenguajes. Los DCG se utilizan a menudo para escribir analizadores o generadores de listas, ya que también proporcionan una interfaz conveniente para diferenciar listas.:-/2expand_term/2

Metaintérpretes y reflexión

Prolog es un lenguaje homoicónico y proporciona muchas facilidades para la reflexión . Su estrategia de ejecución implícita permite escribir un evaluador metacircular conciso (también llamado metaintérprete ) para código Prolog puro:

resolver ( verdadero ). resolver (( Subobjetivo1 , Subobjetivo2 ))  : -  resolver ( Subobjetivo1 ),  resolver ( Subobjetivo2 ). resolver ( Cabeza )  : -  cláusula ( Cabeza ,  Cuerpo ),  resolver ( Cuerpo ).

donde truerepresenta una conjunción vacía y clause(Head, Body)se unifica con cláusulas en la base de datos del formulario Head :- Body.

Dado que los programas Prolog son en sí mismos secuencias de términos de Prolog ( es un operador:-/2 infijo ) que se leen e inspeccionan fácilmente utilizando mecanismos integrados (como ), es posible escribir intérpretes personalizados que aumenten Prolog con características específicas de dominio. Por ejemplo, Sterling y Shapiro presentan un metaintérprete que razona con incertidumbre, reproducido aquí con ligeras modificaciones: [31] : 330 read/1

resolver ( verdadero ,  1 )  : -  !. resolver (( Subobjetivo1 , Subobjetivo2 ),  Certeza )  :-  !,  resolver ( Subobjetivo1 ,  Certeza1 ),  resolver ( Subobjetivo2 ,  Certeza2 ),  La certeza  es  mínima ( Certeza1 ,  Certeza2 ). resolver ( Objetivo ,  1 )  : -  incorporado ( Objetivo ),  !,  Objetivo . resolver ( Cabeza ,  Certeza )  : -  cláusula_cf ( Cabeza ,  Cuerpo ,  Certeza1 ),  resolver ( Cuerpo ,  Certeza2 ),  Certeza  es  Certeza1  *  Certeza2 .

Este intérprete utiliza una tabla de predicados Prolog integrados de la forma [31] : 327 

incorporado ( A  es  B ). incorporado ( leer ( X )). % etc.

y cláusulas representadas como clause_cf(Head, Body, Certainty). Teniendo en cuenta eso, se le puede llamar para solve(Goal, Certainty)ejecutar Goaly obtener una medida de certeza sobre el resultado.

integridad de turing

Pure Prolog se basa en un subconjunto de lógica de predicados de primer orden , las cláusulas de Horn , que es Turing-completa . La integridad de Turing de Prolog se puede demostrar usándolo para simular una máquina de Turing:

turing ( Tape0 ,  Tape )  : -  realizar ( q0 ,  [],  Ls ,  Tape0 ,  Rs ),  invertir ( Ls ,  Ls1 ),  agregar ( Ls1 ,  Rs ,  Tape ). realizar ( qf ,  Ls ,  Ls ,  Rs ,  Rs )  :-  !. realizar ( Q0 ,  Ls0 ,  Ls ,  Rs0 ,  Rs )  : -  símbolo ( Rs0 ,  Sym ,  RsRest ),  una vez ( regla ( Q0 ,  Sym ,  Q1 ,  NewSym ,  Action )),  acción ( Action ,  Ls0 ,  Ls1 ,  [ NewSym | RsRest ],  Rs1 ),  realizar ( Q1 ,  Ls1 ,  Ls ,  Rs1 ,  Rs ). símbolo ([],  b ,  []). símbolo ([ Sym | Rs ],  Sym ,  Rs ). acción ( izquierda ,  Ls0 ,  Ls ,  Rs0 ,  Rs )  : -  izquierda ( Ls0 ,  Ls ,  Rs0 ,  Rs ). acción ( quedarse ,  Ls ,  Ls ,  Rs ,  Rs ). acción ( derecha ,  Ls0 ,  [ Sym | Ls0 ],  [ Sym | Rs ],  Rs ). izquierda ([],  [],  Rs0 ,  [ b | Rs0 ]). izquierda ([ L | Ls ],  Ls ,  Rs ,  [ L | Rs ]).

Un ejemplo sencillo de máquina de Turing se concreta en los hechos:

regla ( q0 ,  1 ,  q0 ,  1 ,  derecha ). regla ( q0 ,  b ,  qf ,  1 ,  permanecer ).

Esta máquina realiza un incremento en uno de un número en codificación unaria: recorre cualquier número de celdas "1" y agrega un "1" adicional al final. Consulta de ejemplo y resultado:

?-  turing ([ 1 , 1 , 1 ],  Ts ). Ts  =  [ 1 ,  1 ,  1 ,  1 ]  ;

Esto ilustra cómo cualquier cálculo puede expresarse declarativamente como una secuencia de transiciones de estado, implementadas en Prolog como una relación entre sucesivos estados de interés.

Implementación

Prólogo ISO

La norma técnica Prolog de la Organización Internacional de Normalización (ISO) consta de dos partes. ISO/IEC 13211-1, [23] [32] publicada en 1995, tiene como objetivo estandarizar las prácticas existentes de las muchas implementaciones de los elementos centrales de Prolog. Ha aclarado aspectos del lenguaje que antes eran ambiguos y conduce a programas portátiles. Hay tres corrigenda: Cor.1:2007, [33] Cor.2:2012, [34] y Cor.3:2017. [35] ISO/IEC 13211-2, [23] publicada en 2000, agrega soporte para módulos al estándar. El estándar es mantenido por el grupo de trabajo ISO/IEC JTC1 / SC22 /WG17 [36] . ANSI X3J17 es el grupo asesor técnico de EE. UU. para el estándar. [37]

Compilacion

Para mayor eficiencia, el código Prolog generalmente se compila en código de máquina abstracto, a menudo influenciado por el conjunto de instrucciones Warren Abstract Machine (WAM) basado en registros . [38] Algunas implementaciones emplean interpretación abstracta para derivar información de tipo y modo de predicados en tiempo de compilación, o compilar en código de máquina real para un alto rendimiento. [39] El diseño de métodos de implementación eficientes para el código Prolog es un campo de investigación activa en la comunidad de programación lógica, y en algunas implementaciones se emplean varios otros métodos de ejecución. Estos incluyen binarización de cláusulas y máquinas virtuales basadas en pila . [ cita necesaria ]

recursividad de cola

Los sistemas Prolog generalmente implementan un método de optimización conocido llamado optimización de llamadas de cola (TCO) para predicados deterministas que exhiben recursividad de cola o, más generalmente, llamadas de cola: el marco de pila de una cláusula se descarta antes de realizar una llamada en una posición de cola. Por lo tanto, los predicados deterministas recursivos de cola se ejecutan con un espacio de pila constante, como los bucles en otros lenguajes.

indexación de términos

Encontrar cláusulas que sean unificables con un término en una consulta es lineal en el número de cláusulas. La indexación de términos utiliza una estructura de datos que permite búsquedas en tiempo sublineal . [40] La indexación solo afecta el rendimiento del programa, no afecta la semántica. La mayoría de los prólogos solo usan indexación en el primer término, ya que la indexación de todos los términos es costosa, pero las técnicas basadas en palabras codificadas por campos o palabras en código superpuestas brindan una indexación rápida en toda la consulta y el encabezado. [41] [42]

hash

Algunos sistemas Prolog, como WIN-PROLOG y SWI-Prolog, ahora implementan hash para ayudar a manejar grandes conjuntos de datos de manera más eficiente. Esto tiende a producir mejoras de rendimiento muy grandes cuando se trabaja con corpus grandes como WordNet .

Presentación

Algunos sistemas Prolog ( B-Prolog , XSB , SWI-Prolog , YAP y Ciao ) implementan un método de memorización llamado tabulación , que libera al usuario de almacenar manualmente resultados intermedios. La presentación es una compensación espacio-temporal ; El tiempo de ejecución se puede reducir utilizando más memoria para almacenar resultados intermedios: [43] [44]

Los subobjetivos encontrados en la evaluación de una consulta se mantienen en una tabla, junto con las respuestas a estos subobjetivos. Si se vuelve a encontrar un subobjetivo, la evaluación reutiliza la información de la tabla en lugar de volver a realizar la resolución según las cláusulas del programa. [45]

La presentación se puede extender en varias direcciones. Puede admitir predicados recursivos mediante resolución SLG o tabulación lineal. En un sistema Prolog de subprocesos múltiples, la presentación de resultados podría mantenerse privada para un subproceso o compartirse entre todos los subprocesos. Y en la presentación incremental, la presentación puede reaccionar a los cambios.

Implementación en hardware.

Durante el proyecto de Sistemas Informáticos de Quinta Generación , se intentó implementar Prolog en hardware con el objetivo de lograr una ejecución más rápida con arquitecturas dedicadas. [46] [47] [48] Además, Prolog tiene una serie de propiedades que pueden permitir la aceleración mediante la ejecución paralela. [49] Un enfoque más reciente ha sido compilar programas Prolog restringidos en una matriz de puertas programables en campo . [50] Sin embargo, el rápido progreso en el hardware de propósito general ha superado constantemente a las arquitecturas más especializadas.

Sega implementó Prolog para usar con Sega AI Computer, lanzado para el mercado japonés en 1986. Prolog se usó para leer entradas de lenguaje natural , en idioma japonés , a través de un panel táctil . [51]

Límites

Aunque Prolog se usa ampliamente en investigación y educación, [52] Prolog y otros lenguajes de programación lógica no han tenido un impacto significativo en la industria informática en general. [53] La mayoría de las aplicaciones son pequeñas según los estándares industriales, y pocas superan las 100.000 líneas de código. [53] [54] La programación en general se considera compleja porque no todos los compiladores de Prolog admiten módulos y existen problemas de compatibilidad entre los sistemas de módulos de los principales compiladores de Prolog. [26] La portabilidad del código Prolog entre implementaciones también ha sido un problema, pero los desarrollos desde 2007 han significado: "la portabilidad dentro de la familia de implementaciones Prolog derivadas de Edimburgo/Quintus es lo suficientemente buena como para permitir el mantenimiento de aplicaciones portátiles del mundo real". [55]

El software desarrollado en Prolog ha sido criticado por tener una penalización de alto rendimiento en comparación con los lenguajes de programación convencionales. En particular, la estrategia de evaluación no determinista de Prolog puede ser problemática al programar cálculos deterministas, o incluso cuando se utiliza "no me importa el no determinismo" (donde se hace una única elección en lugar de retroceder sobre todas las posibilidades). Es posible que sea necesario utilizar cortes y otras construcciones del lenguaje para lograr el rendimiento deseable, destruyendo uno de los principales atractivos de Prolog, la capacidad de ejecutar programas "hacia adelante y hacia atrás". [56]

Prolog no es puramente declarativo: debido a construcciones como el operador de corte , se necesita una lectura procesal de un programa Prolog para comprenderlo. [57] El orden de las cláusulas en un programa Prolog es importante, ya que de él depende la estrategia de ejecución del lenguaje. [58] Otros lenguajes de programación lógica, como Datalog , son verdaderamente declarativos pero restringen el lenguaje. Como resultado, muchos programas prácticos de Prolog están escritos para ajustarse al orden de búsqueda en profundidad de Prolog , en lugar de ser programas de lógica puramente declarativa. [56]

Extensiones

Se han desarrollado varias implementaciones desde Prolog para ampliar las capacidades de programación lógica en muchas direcciones. Estos incluyen tipos , modos, programación lógica de restricciones (CLP), programación lógica orientada a objetos (OOLP), concurrencia, lógica lineal (LLP), capacidades de programación lógica funcional y de orden superior , además de interoperabilidad con bases de conocimiento :

Tipos

Prolog es un lenguaje sin escribir. Los intentos de introducir y ampliar Prolog con tipos comenzaron en la década de 1980, [59] [60] y continúan a partir de 2008 . [61] La información de tipos es útil no sólo para la seguridad de tipos sino también para razonar sobre los programas Prolog. [62]

Modos

La sintaxis de Prolog no especifica qué argumentos de un predicado son entradas y cuáles son salidas. [63] Sin embargo, esta información es significativa y se recomienda que se incluya en los comentarios. [64] Los modos proporcionan información valiosa al razonar sobre programas Prolog [62] y también se pueden utilizar para acelerar la ejecución. [sesenta y cinco]

Restricciones

La programación lógica de restricciones extiende Prolog para incluir conceptos de satisfacción de restricciones . [66] [67] Un programa de lógica de restricciones permite restricciones en el cuerpo de cláusulas, tales como: A(X,Y) :- X+Y>0.Es adecuado para problemas de optimización combinatoria a gran escala [68] y, por lo tanto, es útil para aplicaciones en entornos industriales, como la programación automatizada de horarios. y programación de la producción . La mayoría de los sistemas Prolog se entregan con al menos un solucionador de restricciones para dominios finitos y, a menudo, también con solucionadores para otros dominios, como números racionales .

Orientación a objetos

Flora-2 es un sistema de razonamiento y representación del conocimiento orientado a objetos basado en lógica F e incorpora HiLog , lógica de transacciones y razonamiento anulable .

Logtalk es un lenguaje de programación lógica orientado a objetos que puede utilizar la mayoría de las implementaciones de Prolog como compilador back-end. Como lenguaje multiparadigma, incluye soporte tanto para prototipos como para clases.

Oblog es una extensión pequeña, portátil y orientada a objetos de Prolog creada por Margaret McDougall de EdCAAD, Universidad de Edimburgo.

Objlog era un lenguaje basado en marcos que combinaba objetos y Prolog II del CNRS, Marsella, Francia.

Prolog++ fue desarrollado por Logic Programming Associates y lanzado por primera vez en 1989 para PC con MS-DOS. Se agregó soporte para otras plataformas y se lanzó una segunda versión en 1995. Addison-Wesley publicó un libro sobre Prolog ++ de Chris Moss en 1994.

Visual Prolog es un lenguaje multiparadigma con interfaces, clases, implementaciones y expresiones de objetos.

Gráficos

Los sistemas Prolog que proporcionan una biblioteca de gráficos son SWI-Prolog , [69] Visual Prolog , WIN-PROLOG y B-Prolog .

concurrencia

Prolog-MPI es una extensión SWI-Prolog de código abierto para informática distribuida a través de la interfaz de paso de mensajes . [70] También hay varios lenguajes de programación Prolog concurrentes. [71]

programación web

Algunas implementaciones de Prolog, en particular Visual Prolog , SWI-Prolog y Ciao , admiten programación web del lado del servidor con soporte para protocolos web, HTML y XML . [72] También existen extensiones para admitir formatos web semánticos , como el Marco de descripción de recursos (RDF) y el Lenguaje de ontología web (OWL). [73] [74] Prolog también se ha sugerido como lenguaje del lado del cliente . [75] Además, Visual Prolog admite JSON-RPC y Websockets .

Adobe Flash

Cedar Archivado el 19 de octubre de 2010 en Wayback Machine es un intérprete de Prolog básico y gratuito. A partir de la versión 4 y superiores, Cedar tiene soporte FCA (Flash Cedar App). Esto proporciona una nueva plataforma para programar en Prolog a través de ActionScript .

Otro

Interfaces con otros idiomas

Existen marcos que pueden servir de puente entre Prolog y otros lenguajes:

Historia

Cronología de los primeros desarrollos en Prolog

El nombre Prolog fue elegido por Philippe Roussel, a sugerencia de su esposa, como abreviatura de programmation en logique ( programación en lógica en francés ). [76] Fue creado alrededor de 1972 por Alain Colmerauer con Philippe Roussel, basado en la interpretación procesal de Robert Kowalski de las cláusulas de Horn . Fue motivado en parte por el deseo de reconciliar el uso de la lógica como lenguaje de representación del conocimiento declarativo con la representación procedimental del conocimiento que fue popular en América del Norte a finales de los años sesenta y principios de los setenta. Según Robert Kowalski , el primer sistema Prolog fue desarrollado en 1972 por Colmerauer y Phillipe Roussel. [77] [78] [79] La primera implementación de Prolog fue un intérprete escrito en Fortran por Gerard Battani y Henri Meloni. David HD Warren llevó este intérprete a la Universidad de Edimburgo , y allí implementó una interfaz alternativa, que llegó a definir la sintaxis "Edinburgh Prolog" utilizada por la mayoría de las implementaciones modernas. Warren también implementó el primer compilador de Prolog, creando el influyente DEC-10 Prolog en colaboración con Fernando Pereira. Warren luego generalizó las ideas detrás de DEC-10 Prolog, para crear la Warren Abstract Machine .

Los investigadores europeos de IA favorecieron a Prolog, mientras que los estadounidenses favorecieron a Lisp , lo que supuestamente provocó muchos debates nacionalistas sobre los méritos de los idiomas. [80] Gran parte del desarrollo moderno de Prolog provino del impulso del proyecto de sistemas informáticos de quinta generación (FGCS), que desarrolló una variante de Prolog llamada Kernel Language para su primer sistema operativo .

Pure Prolog se restringió originalmente al uso de un demostrador de teoremas de resolución con cláusulas de Horn de la forma:

H :- B 1 , ..., B n .

La aplicación del demostrador de teoremas trata cláusulas como procedimientos:

para mostrar/resolver H, mostrar/resolver B 1 y ... y B n .

Sin embargo, pronto se amplió Pure Prolog para incluir la negación como fracaso , en la que condiciones negativas de la forma not(B i ) se muestran al intentar resolver sin éxito las correspondientes condiciones positivas B i .

Las extensiones posteriores de Prolog realizadas por el equipo original introdujeron capacidades de programación lógica de restricciones en las implementaciones.

Uso en la industria

Prolog se ha utilizado en Watson . Watson utiliza el software DeepQA de IBM y el marco Apache UIMA (Arquitectura de gestión de información no estructurada). El sistema fue escrito en varios lenguajes, incluidos Java, C++ y Prolog, y se ejecuta en el sistema operativo SUSE Linux Enterprise Server 11 utilizando el marco Apache Hadoop para proporcionar computación distribuida. Prolog se utiliza para la coincidencia de patrones en árboles de análisis de lenguaje natural. Los desarrolladores han declarado: "Necesitábamos un lenguaje en el que pudiéramos expresar convenientemente reglas de coincidencia de patrones sobre los árboles de análisis y otras anotaciones (como resultados de reconocimiento de entidades con nombre), y una tecnología que pudiera ejecutar estas reglas de manera muy eficiente. Descubrimos que Prolog Fue la elección ideal para el lenguaje por su sencillez y expresividad ." [12] Prolog se está utilizando en la plataforma de desarrollo Low-Code GeneXus , que se centra en la IA. [ cita necesaria ] La base de datos de gráficos de código abierto TerminusDB está implementada en Prolog. [81] TerminusDB está diseñado para construir y curar de forma colaborativa gráficos de conocimiento .

Ver también

Idiomas relacionados

Notas

  1. ^ La terminología de Prolog difiere de la de lógica . Un término de Prolog es (según el contexto) un término o una fórmula atómica de la lógica. Un átomo en una terminología lógica estándar significa una fórmula atómica ; un átomo de Prolog (según el contexto) es una constante, un símbolo de función o un símbolo de predicado de la lógica.

Referencias

  1. ^ Relojes sin, William F.; Mellish, Christopher S. (2003). Programación en Prolog . Berlina; Nueva York: Springer-Verlag. ISBN 978-3-540-00678-7.
  2. ^ Bratko, Iván (2012). Programación de prólogo para inteligencia artificial (4ª ed.). Harlow, Inglaterra; Nueva York: Addison Wesley. ISBN 978-0-321-41746-6.
  3. ^ Covington, Michael A. (1994). Procesamiento del lenguaje natural para programadores de Prolog . Englewood Cliffs, Nueva Jersey: Prentice Hall. ISBN 978-0-13-629213-5.
  4. ^ ab Lloyd, JW (1984). Fundamentos de la programación lógica . Berlín: Springer-Verlag. ISBN 978-3-540-13299-8.
  5. ^ Ver Programación lógica § Historia .
  6. ^ Stickel, YO (1988). "Un demostrador de teoremas de tecnología de prólogo: implementación mediante un compilador de prólogo extendido". Revista de razonamiento automatizado . 4 (4): 353–380. CiteSeerX 10.1.1.47.3057 . doi :10.1007/BF00297245. S2CID  14621218. 
  7. ^ Merritt, Dennis (1989). Construyendo sistemas expertos en Prolog . Berlín: Springer-Verlag. ISBN 978-0-387-97016-5.
  8. ^ Fieltro, Amy. "Un enfoque de programación lógica para implementar la reescritura de términos de orden superior". Extensiones de programación lógica (1992): 135-161.
  9. ^ Kent D. Lee (19 de enero de 2015). Fundamentos de los lenguajes de programación. Saltador. págs.298–. ISBN 978-3-319-13314-0.
  10. ^ Ute Schmid (21 de agosto de 2003). Síntesis inductiva de programas funcionales: planificación universal, plegado de programas finitos y abstracción de esquemas mediante razonamiento analógico. Medios de ciencia y negocios de Springer. ISBN 978-3-540-40174-2.
  11. Fernando C.N. Pereira ; Stuart M. Shieber (2005). Prólogo y análisis del lenguaje natural. Micrótomo.
  12. ^ ab Adam Lally; Paul Fodor (31 de marzo de 2011). "Procesamiento del lenguaje natural con Prolog en el sistema IBM Watson". Asociación para la Programación Lógica. Archivado desde el original el 3 de septiembre de 2014 . Consultado el 13 de junio de 2014 .Véase también Watson (ordenador) .
  13. ^ ISO/IEC 13211-1:1995 Prólogo, 6.3.7 Términos: notación de lista entre comillas dobles. Organización Internacional de Normalización , Ginebra.
  14. ^ Carlsson, Mats (27 de mayo de 2014). Manual del usuario de SICStus Prolog 4.3: documentación de referencia principal. BoD - Libros a la carta. ISBN 978-3-7357-3744-1- a través de libros de Google.
  15. ^ Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A .; Wielemaker, enero; Precio, Simón (2011). "Pautas de codificación para Prolog". Teoría y práctica de la programación lógica . 12 (6): 889–927. arXiv : 0911.2899 . doi :10.1017/S1471068411000391. S2CID  438363.
  16. ^ Kirschenbaum, M.; Libra esterlina, LS (1993). "Aplicación de técnicas a esqueletos: patrones para la programación de prólogos". Construyendo Programas Lógicos, (Ed. JMJ Jacquet) . Apuntes de conferencias sobre informática / Apuntes de conferencias sobre inteligencia artificial: 27–140. CiteSeerX 10.1.1.56.7278 . 
  17. ^ Sterling, León (2002). Lógica computacional: programación lógica y más . vol. 2407, págs. 17-26. doi :10.1007/3-540-45628-7_15. ISBN 978-3-540-43959-2.
  18. ^ D. Barker-Plummer. Programación cliché en Prolog. En M. Bruynooghe, editor, Proc. Segundo taller sobre metaprogramación en lógica, páginas 247-256. Departamento de Comp. Ciencias, Universidad Katholieke. Lovaina, 1990.
  19. ^ Gegg-harrison, TS (1995). Representación de esquemas de programas lógicos en Prolog . Procs Duodécimo Congreso Internacional sobre Programación Lógica. págs. 467–481.
  20. ^ Deville, Yves (1990). Programación lógica: desarrollo sistemático de programas . Wokingham, Inglaterra: Addison-Wesley. ISBN 978-0-201-17576-9.
  21. ^ ab Naish, Lee (1996). Programación de lógica de orden superior en Prolog (Informe). Departamento de Ciencias de la Computación, Universidad de Melbourne . CiteSeerX 10.1.1.35.4505 . 
  22. ^ "Con respecto a las variables Prolog, las variables sólo en la cabeza se cuantifican implícitamente universalmente, y las que sólo están en el cuerpo se cuantifican implícitamente existencialmente" . Consultado el 4 de mayo de 2013 .
  23. ^ abc ISO/IEC 13211: Tecnología de la información - Lenguajes de programación - Prólogo. Organización Internacional de Normalización , Ginebra.
  24. ^ ISO/IEC 13211-2: Módulos.
  25. ^ Philipp Körner; Michael Leuschel; João Barbosa; Vítor Santos Costa; Verónica Dahl; Manuel V. Hermenegildo; José F. Morales; Jan Wielemaker; Daniel Díaz; Salvador Abreu; Giovanni Ciatto (noviembre de 2022), "Cincuenta años de Prolog y más allá", Teoría y práctica de la programación lógica , 22 (6), doi : 10.1017/S1471068422000102 , hdl : 10174/33387
  26. ^ ab Moura, Paulo (agosto de 2004), "Logtalk", Asociación de Programación Lógica , 17 (3), archivado desde el original el 12 de abril de 2010 , consultado el 16 de febrero de 2010
  27. ^ Abreu; Nogueira (2005), "Uso de un lenguaje de programación lógica con persistencia y contextos", Apuntes de conferencias en Inteligencia Artificial , 4369
  28. ^ Cabeza; Hermenegildo (2000), "Un nuevo sistema de módulos para Prolog", Lecture Notes in Computer Science , 1861
  29. ^ Sagonas; Rápido; Warren (1994), "XSB como motor de base de datos deductivo eficiente", SIGMOD
  30. ^ Philipp Körner; Michael Leuschel; João Barbosa; Vítor Santos Costa; Verónica Dahl; Manuel V. Hermenegildo; José F. Morales; Jan Wielemaker; Daniel Díaz; Salvador Abreu; Giovanni Ciatto (noviembre de 2022), "Cincuenta años de Prolog y más allá", Teoría y práctica de la programación lógica , 22 (6), doi : 10.1017/S1471068422000102 , hdl : 10174/33387
  31. ^ ab Shapiro, Ehud Y.; Sterling, León (1994). El arte de Prolog: técnicas de programación avanzadas . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-19338-2.
  32. ^ Ed-Dbali, A.; Deransart, Pierre; Cervoni, L. (1996). Prólogo: el estándar: manual de referencia . Berlín: Springer. ISBN 978-3-540-59304-1.
  33. ^ "ISO/IEC 13211-1:1995/Cor 1:2007". YO ASI .
  34. ^ "ISO/IEC 13211-1:1995/Cor 2:2012". YO ASI .
  35. ^ "ISO/IEC 13211-1:1995/Cor 3:2017". YO ASI .
  36. ^ "ISO/IEC JTC1 SC22 WG17".[ enlace muerto permanente ]
  37. ^ "X3J17 y el estándar Prolog". Archivado desde el original el 23 de agosto de 2009 . Consultado el 2 de octubre de 2009 .
  38. ^ David HD Warren. "Un conjunto de instrucciones abstractas de Prolog". Nota técnica 309, SRI International , Menlo Park, CA, octubre de 1983.
  39. ^ Van Roy, P.; España, AM (1992). "Programación lógica de alto rendimiento con el compilador Aquarius Prolog". Computadora . 25 : 54–68. doi :10.1109/2.108055. S2CID  16447071.
  40. ^ Graf, Peter (1995). Indexación de términos . Saltador. ISBN 978-3-540-61040-3.
  41. ^ Sabio, Michael J.; Poderes, David MW (1986). "Indización de cláusulas de prólogo mediante palabras de código superpuestas y palabras codificadas en campos ". Simposio Internacional sobre Programación Lógica . págs. 203–210.
  42. ^ Colomb, Robert M. (1991). "Mejora de la unificación en PROLOG mediante indexación de cláusulas". La revista de programación lógica . 10 : 23–44. doi :10.1016/0743-1066(91)90004-9.
  43. ^ Rápido, T. (1999). "Presentación para programación no monótona". Anales de Matemáticas e Inteligencia Artificial . 25 (3/4): 201–240. doi :10.1023/A:1018990308362. S2CID  16695800.
  44. ^ Zhou, Neng-Fa; Sato, Taisuke (2003). "Cálculo eficiente de puntos fijos en tablas lineales" (PDF) . Actas de la Quinta Conferencia Internacional ACM SIGPLAN sobre Principios y Práctica de la Programación Declarativa : 275–283.
  45. ^ Rápido, T.; Warren, DS (2011). "XSB: Ampliación de Prolog con programación lógica tabulada". Teoría y práctica de la programación lógica . 12 (1–2): 157–187. arXiv : 1012.5123 . doi :10.1017/S1471068411000500. S2CID  6153112.
  46. ^ Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). "IPP del procesador Prolog integrado de alto rendimiento". Actas del 14º simposio internacional anual sobre arquitectura informática - ISCA '87 . pag. 100. doi : 10.1145/30350.30362. ISBN 978-0-8186-0776-9. S2CID  10283148.
  47. ^ Robinson, Ian (1986). Un procesador Prolog basado en un dispositivo de memoria de coincidencia de patrones . Tercer Congreso Internacional de Programación Lógica. Apuntes de conferencias sobre informática. vol. 225. Saltador. págs. 172-179. doi :10.1007/3-540-16492-8_73. ISBN 978-3-540-16492-0.
  48. ^ Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). "Evaluación de rendimiento y arquitectura de la máquina PSI". Avisos ACM SIGPLAN . 22 (10): 128. doi : 10.1145/36205.36195 .
  49. ^ Gupta, G.; Pontelli, E.; Ali, KAM; Carlsson, M.; Hermenegildo, MV (2001). "Ejecución paralela de programas prólogos: una encuesta". Transacciones ACM sobre lenguajes y sistemas de programación . 23 (4): 472. doi : 10.1145/504083.504085 . S2CID  2978041.
  50. ^ "Sistemas asignados estáticamente".
  51. ^ "Software que se toma los juegos en serio". Científico nuevo . Información comercial de Reed . 26 de marzo de 1987. pág. 34 - a través de Google Books .[ enlace muerto permanente ]
  52. ^ "Informática: lenguajes de programación, sintaxis, algoritmos | Britannica". www.britannica.com . Consultado el 12 de julio de 2023 .
  53. ^ ab Programación lógica para el mundo real. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Actas del taller posconferencia ILPS'95 sobre visiones para el futuro de la programación lógica.
  54. ^ "Preguntas frecuentes: Sección 1/2 de la Guía de recursos de Prolog [publicación mensual] - [1-8] La base de datos de Prolog 1000". Preguntas frecuentes.org .
  55. ^ Jan Wielemaker y Vıtor Santos Costa: Portabilidad de los programas Prolog: teoría y estudios de casos. Taller CICLOPS-WLPE 2010 Archivado el 16 de julio de 2010 en Wayback Machine .
  56. ^ ab Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Repensar el prólogo. Proc. 31ª reunión de la Sociedad Japonesa de Ciencia y Tecnología del Software.
  57. ^ Franzen, Torkel (1994), "Declarativo versus procesal", Asociación de Programación Lógica , 7 (3)
  58. ^ Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "Complejidad y poder expresivo de la programación lógica". Encuestas de Computación ACM . 33 (3): 374–425. CiteSeerX 10.1.1.616.6372 . doi :10.1145/502807.502810. S2CID  518049. 
  59. ^ Mycroft, A.; O'Keefe, RA (1984). "Un sistema de tipos polimórficos para prólogo". Inteligencia artificial . 23 (3): 295. doi :10.1016/0004-3702(84)90017-1.
  60. ^ Pfenning, Frank (1992). Tipos en programación lógica . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
  61. ^ Schrijvers, Tom; Santos Costa, Vítor; Wielemaker, enero; Demoen, Bart (2008). "Hacia el prólogo mecanografiado". En María García de la Banda ; Enrico Pontelli (eds.). Programación lógica: 24ª conferencia internacional, ICLP 2008, Udine, Italia, 9 al 13 de diciembre de 2008: actas . Apuntes de conferencias sobre informática. vol. 5366, págs. 693–697. doi :10.1007/978-3-540-89982-2_59. ISBN 978-3-540-89982-2.
  62. ^ ab apto, KR; Marchiori, E. (1994). "Razonamiento sobre programas Prolog: desde modos pasando por tipos hasta afirmaciones". Aspectos formales de la informática . 6 (T1): 743. CiteSeerX 10.1.1.57.395 . doi :10.1007/BF01213601. S2CID  12235465. 
  63. ^ O'Keefe, Richard A. (1990). El oficio de Prolog . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
  64. ^ Covington, Michael; Bagnara, Roberto; et al. (2010). "Pautas de codificación para Prolog". arXiv : 0911.2899 [cs.PL].
  65. ^ Roy, P.; Demoen, B.; Willems, YD (1987). "Mejora de la velocidad de ejecución de Prolog compilado con modos, selección de cláusulas y determinismo". Tapsoft '87 . Apuntes de conferencias sobre informática. vol. 250. págs. 111. doi : 10.1007/BFb0014976. ISBN 978-3-540-17611-4.
  66. ^ Jaffar, J. (1994). "Programación de lógica de restricciones: una encuesta". La revista de programación lógica . 19–20: 503–581. doi : 10.1016/0743-1066(94)90033-7 .
  67. ^ Colmerauer, Alain (1987). "Abriendo el Universo Prolog III". Byte . Agosto.
  68. ^ Wallace, M. (2002). "Programación de lógica de restricciones". Lógica computacional: programación lógica y más . Apuntes de conferencias sobre informática. vol. 2407, págs. 512–556. doi :10.1007/3-540-45628-7_19. ISBN 978-3-540-45628-5.
  69. ^ "XPCE: la biblioteca GUI nativa de SWI-Prolog". swi-prolog.org .
  70. ^ "prólogo-mpi". Aplicaciones.lumii.lv . Consultado el 16 de septiembre de 2010 .
  71. ^ Ehud Shapiro. La familia de lenguajes de programación lógica concurrente ACM Computing Surveys . Septiembre de 1989.
  72. ^ Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). "SWI-Prolog y la web" (PDF) . Teoría y práctica de la programación lógica . 8 (3): 363. doi :10.1017/S1471068407003237. S2CID  5404048.
  73. ^ Wielemaker, enero; Hildebrand, Michiel; van Ossenbruggen, Jacco (2007), Heymans, S.; Polléres, A.; Ruckhaus, E.; Pearse, D.; Gupta, G. (eds.), "Uso de {Prolog} como fundamento para aplicaciones en la web semántica" (PDF) , Actas del segundo taller sobre aplicaciones de programación lógica y a la Web, web semántica y servicios de web semántica , Actas del taller CEUR, Oporto, Portugal: CEUR-WS.org, vol. 287, págs. 84–98
  74. ^ Procesamiento de ontologías OWL2 utilizando Thea: una aplicación de programación lógica. Vangelis Vassiliadis, Jan Wielemaker y Chris Mungall. Actas del quinto taller internacional sobre OWL: experiencias y direcciones (OWLED 2009), Chantilly, VA, Estados Unidos, 23 y 24 de octubre de 2009
  75. ^ Loke, suroeste; Davison, A. (2001). "Código móvil seguro basado en Prolog". Teoría y práctica de la programación lógica . 1 (3): 321. arXiv : cs/0406012 . CiteSeerX 10.1.1.58.6610 . doi :10.1017/S1471068401001211. S2CID  11754347. 
  76. ^ Colmerauer, A. y Roussel, P., 1996. El nacimiento de Prolog. En Historia de los lenguajes de programación---II (págs. 331-367).
  77. ^ Kowalski, RA (1988). "Los primeros años de la programación lógica" (PDF) . Comunicaciones de la ACM . 31 : 38. doi : 10.1145/35043.35046. S2CID  12259230.
  78. ^ Colmerauer, A.; Roussel, P. (1993). «El nacimiento de Prolog» (PDF) . Avisos ACM SIGPLAN . 28 (3): 37. doi :10.1145/155360.155362.
  79. ^ "Prólogo: una breve historia" . Consultado el 21 de noviembre de 2021 .
  80. ^ Pountain, Dick (octubre de 1984). "POP y SNAP". Byte . pag. 381 . Consultado el 23 de octubre de 2013 .
  81. ^ terminusdb/terminusdb, TerminusDB, 13 de diciembre de 2020 , consultado el 15 de diciembre de 2020

Otras lecturas