stringtranslate.com

Prólogo

Prolog es un lenguaje de programación lógica que tiene sus orígenes en la inteligencia artificial , la demostración automatizada de teoremas 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 más popular en la actualidad, con varias implementaciones gratuitas y comerciales disponibles. El lenguaje se ha utilizado para demostrar 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, Turing-completo, muy adecuado para aplicaciones de procesamiento de conocimiento inteligente.

Sintaxis y semántica

En Prolog, la lógica del programa se expresa en términos de relaciones, y un cálculo se inicia ejecutando una consulta sobre estas relaciones. Las relaciones y las 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 refutación de resolución de la consulta negada. Si la consulta negada puede refutarse, 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) sea particularmente útil para aplicaciones de bases de datos, matemáticas simbólicas y análisis de lenguaje. 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. Por este motivo, al programador se le permite utilizar cierta cantidad de programación imperativa convencional cuando el paradigma lógico no le resulta conveniente. Tiene un subconjunto puramente lógico, llamado "Prolog 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 pueden ser á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 por medio de cláusulas. Prolog puro está restringido a cláusulas Horn . Se utilizan dos tipos de cláusulas Horn para definir programas Prolog: reglas y hechos. Una regla tiene la forma

Cabeza  :-  Cuerpo .

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

Las cláusulas con cuerpos vacíos se denominan hechos . Un ejemplo de un hecho es:

humano ( sócrates ).

lo que equivale a la regla:

humano ( sócrates )  :-  verdadero .

El predicado incorporado true/0siempre es verdadero.

Dado el hecho anterior, uno puede preguntarse:

¿Es Sócrates un humano?

 ?-  humano ( sócrates ).  

¿Que cosas son los humanos?

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

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

mortal ( X )  :-  humano ( X ).

Si añadimos esa regla y preguntamos ¿qué cosas son mortales?

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

Predicados y programas

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

madre_hijo ( trude ,  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_hija ( 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, estos pueden usarse típicamente en varias direcciones. Por ejemplo, length/2puede usarse para determinar la longitud de una lista ( length(List, L), dada una lista List), y para generar un esqueleto de lista de una longitud dada ( length(X, 5)), y para generar ambos esqueletos de lista y sus longitudes juntos ( length(X, L)). De manera similar, append/3puede usarse tanto para anexar dos listas ( append(ListA, ListB, X)dadas las listas ListAy ListB), como para dividir una lista dada 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 otras formas de comunicación con el sistema operativo. Estos predicados no tienen un significado relacional y solo son útiles para los efectos secundarios que presentan en el sistema. Por ejemplo, el predicado write/1muestra un término en la pantalla.

Bucles y recursión

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

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

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

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

Ejecución

La ejecución de un programa Prolog se inicia cuando el usuario envía un único objetivo, denominado consulta. Lógicamente, el motor Prolog intenta encontrar una refutación de la resolución de la consulta negada. El método de resolución utilizado por Prolog se denomina resolución SLD . Si la consulta negada se puede refutar, se deduce que la consulta, con las vinculaciones de variables adecuadas en su lugar, es una consecuencia lógica del programa. En ese caso, se informan al usuario todas las vinculaciones de variables generadas y se dice que la consulta ha tenido éxito. Operativamente, la estrategia de ejecución de Prolog puede considerarse como una generalización de las llamadas de función en otros lenguajes, con una diferencia que es posible que varias cabezas de cláusula coincidan con una llamada determinada. En ese caso, el sistema crea un punto de elección, unifica el objetivo con la cabeza de cláusula de la primera alternativa y continúa con los objetivos de esa primera alternativa. Si algún objetivo falla durante la ejecución del programa, se deshacen todas las vinculaciones de variables que se realizaron desde que se creó el punto de elección más reciente y la ejecución continúa con la siguiente alternativa de ese punto de elección. Esta estrategia de ejecución se denomina retroceso cronológico . Por ejemplo, dado el programa de relación familiar definido anteriormente, la siguiente consulta se evaluará como verdadera:

 ?-  Hermanos ( 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 es equivalente a probar el cuerpo de esa cláusula con los enlaces de variables apropiados en su lugar, es decir, la conjunción (parent_child(Z,sally), parent_child(Z,erica)). El siguiente objetivo a probar es el más a la izquierda de esta conjunción, es decir, parent_child(Z, sally). Dos encabezados 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 Z = tomse genera el enlace y el siguiente objetivo a probar es la segunda parte de la conjunción anterior: parent_child(tom, erica). Nuevamente, esto se puede probar con el hecho correspondiente. Dado que todos los objetivos se pueden probar, la consulta tiene éxito. Dado que la consulta no contenía variables, no se informan enlaces al usuario. Una consulta con variables, como:

?-  padre_hijo ( Padre ,  Hijo ).

enumera todas las respuestas válidas al retroceder.

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

Negación

El predicado Prolog incorporado \+/1proporciona negación como falla , lo que permite un razonamiento no monótono . El objetivo \+ illegal(X)de 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 puede encontrar ninguna prueba, el objetivo original tiene éxito. Por lo tanto, el \+/1operador de prefijo se llama operador "no demostrable", ya que la consulta ?- \+ Goal.tiene éxito si el objetivo no es demostrable. Este tipo de negación es sólida si su argumento es "fundamento" (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 Prolog

En Prolog, cargar código se denomina consultar . Prolog se puede utilizar de forma interactiva introduciendo consultas en el indicador de Prolog ?-. Si no hay una solución, Prolog escribe no. Si existe una solución, se imprime. Si hay varias soluciones para la consulta, se pueden solicitar introduciendo un punto y coma ;. Existen directrices sobre buenas prácticas de programación para mejorar la eficiencia, la legibilidad y la capacidad de 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 ("?-" vs "| ?-") y el estado de resolución ("verdadero" vs "sí", "falso" vs "no") pueden diferir de una implementación de Prolog a otra.

Optimización del compilador

Cualquier cálculo puede expresarse de forma declarativa como una secuencia de transiciones de estado. Por ejemplo, un compilador optimizador con tres pasos de optimización podría implementarse 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 equivalentemente utilizando la notación DCG :

programa_optimizado  -->  paso_optimización_1 ,  paso_optimización_2 ,  paso_optimización_3 .

Ordenación rápida

El algoritmo de ordenamiento 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 ,  Pequeños ,  Resto )  ).ordenación rápida ([])  -->  []. ordenación rápida ([ X | Xs ])  -->  {  partición ( Xs ,  X ,  Menor ,  Mayor )  },  ordenación rápida ( Menor ),  [ X ],  ordenación rápida ( Mayor ).

Patrones de diseño de Prolog

Un patrón de diseño es una solución general reutilizable para un problema que ocurre con frecuencia en el diseño de software . Algunos patrones de diseño en Prolog son esqueletos, técnicas, [16] [17] clichés, [18] esquemas de programas, [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 programación de orden superior lleva a Prolog fuera del dominio de la lógica de primer orden, que no permite la cuantificación sobre predicados, [22] ISO Prolog ahora tiene algunos predicados de orden superior integrados como call/1, call/2, call/3, findall/3, setof/3, y bagof/3. [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 maplist/2, que aplica un predicado arbitrario a cada miembro de una lista dada, y sublist/3, que filtra elementos que satisfacen un predicado dado, lo que también permite currar . [21]

Para convertir soluciones de representación temporal (sustituciones de respuestas al volver atrás) a representación espacial (términos), Prolog tiene varios predicados de todas las soluciones que recopilan todas las sustituciones de respuestas de una consulta dada 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 ),  listasum ( Ds ,  N ).

Esto se puede utilizar para enumerar números perfectos y para 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:

maplist ( _ ,  [],  []). maplist ( P ,  [ X | Xs ],  [ Y | Ys ])  :-  llamar ( P ,  X ,  Y ),  maplist ( 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)es equivalente 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 iniciado en HiLog y λProlog .

Módulos

Para la programación en grandes sistemas , Prolog proporciona un sistema de módulos , que se encuentra en el estándar ISO. [24] Sin embargo, mientras que 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 la parte de módulos del estándar ISO. En cambio, la mayoría de los sistemas Prolog han decidido admitir como estándar de módulos de facto el sistema de módulos Quintus / SICStus . Sin embargo, 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 optan por implementar conceptos de módulos como compilación de fuente a fuente en el Prolog ISO 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 hacer dinámicamente. [27] Ciao diseñó un sistema de módulos estricto que, si bien es básicamente compatible con el estándar de facto utilizado por otros sistemas Prolog, es susceptible de análisis estático preciso, admite el ocultamiento 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. [25]

Analizando

Existe una notación especial llamada gramática de cláusulas definidas (DCG, por sus siglas en inglés). Una regla definida mediante -->/2en lugar de :-/2se expande por el preprocesador ( expand_term/2, 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 comunes. En particular, la reescritura equipa al predicado con dos argumentos adicionales, que se pueden usar para enhebrar implícitamente el estado, [ aclaración necesaria ] de manera análoga a las mónadas en otros lenguajes. Las DCG se usan a menudo para escribir analizadores sintácticos o generadores de listas, ya que también proporcionan una interfaz conveniente para las listas de diferencias.

Meta-intérpretes y reflexión

Prolog es un lenguaje homoicónico y ofrece muchas facilidades para la programación reflexiva (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 de la forma Head :- Body.

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

solve ( true ,  1 )  :-  !. solve (( Subobjetivo1 , Subobjetivo2 ),  Certidumbre )  :-  !,  solve ( Subobjetivo1 ,  Certidumbre1 ),  solve ( Subobjetivo2 ,  Certidumbre2 ),  Certidumbre  es  min ( Certidumbre1 ,  Certidumbre2 ). solve ( Objetivo ,  1 )  :-  builtin ( Objetivo ),  !,  Objetivo . solve ( Cabeza ,  Certidumbre )  :-  cláusula_cf ( Cabeza ,  Cuerpo ,  Certidumbre1 ),  solve ( Cuerpo ,  Certidumbre2 ),  Certidumbre  es  Certidumbre1  *  Certidumbre2 .

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

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

y cláusulas representadas como clause_cf(Head, Body, Certainty). Dados estos, se puede llamar solve(Goal, Certainty)a ejecutar Goaly obtener una medida de certeza sobre el resultado.

Completitud de Turing

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

turing ( Tape0 ,  Tape )  :-  ejecutar ( q0 ,  [],  Ls ,  Tape0 ,  Rs ),  revertir ( 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 ,  Acción )),  acción ( Acción ,  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 quieto ,  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 ,  quedarse ).

Esta máquina realiza un incremento de uno en uno de un número en codificación unaria: recorre cualquier cantidad de celdas "1" y agrega un "1" adicional al final. Ejemplo de consulta 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 estados, implementada en Prolog como una relación entre estados sucesivos 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. La ISO/IEC 13211-1, [23] [31] publicada en 1995, tiene como objetivo estandarizar las prácticas existentes de las numerosas implementaciones de los elementos centrales de Prolog. Ha aclarado aspectos del lenguaje que antes eran ambiguos y conduce a programas portables. Hay tres correcciones: Cor.1:2007, [32] Cor.2:2012, [33] y Cor.3:2017. [34] La ISO/IEC 13211-2, [23] publicada en 2000, añade soporte para módulos a la norma. La norma es mantenida por el grupo de trabajo ISO/IEC JTC1 / SC22 /WG17 [35] . ANSI X3J17 es el grupo asesor técnico de EE. UU. para la norma. [36]

Compilación

Para lograr una mayor eficiencia, el código Prolog se compila normalmente en código de máquina abstracto, a menudo influenciado por el conjunto de instrucciones de la máquina abstracta de Warren (WAM) basada en registros. [37] Algunas implementaciones emplean una interpretación abstracta para derivar información de tipo y modo de predicados en tiempo de compilación, o compilan en código de máquina real para un alto rendimiento. [38] 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 la binarización de cláusulas y las máquinas virtuales basadas en pilas . [ cita requerida ]

Recursión de cola

Los sistemas Prolog suelen implementar un método de optimización conocido llamado optimización de llamadas de cola (TCO) para predicados deterministas que presentan recursión de cola o, de manera más general, 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 con recursión de cola se ejecutan con un espacio de pila constante, como los bucles en otros lenguajes.

Indexación de términos

La búsqueda de cláusulas que se puedan unificar con un término en una consulta es lineal en cuanto al número de cláusulas. La indexación de términos utiliza una estructura de datos que permite búsquedas en tiempo sublineal . [39] La indexación solo afecta el rendimiento del programa, no afecta la semántica. La mayoría de Prologs solo utilizan la indexación en el primer término, ya que la indexación en todos los términos es costosa, pero las técnicas basadas en palabras codificadas en campos o palabras de código superpuestas proporcionan una indexación rápida en toda la consulta y el encabezado. [40] [41]

Hash (hash)

Algunos sistemas Prolog, como WIN-PROLOG y SWI-Prolog, ahora implementan algoritmos hash para ayudar a manejar conjuntos de datos grandes de manera más eficiente. Esto tiende a producir grandes mejoras de rendimiento 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 tener que almacenar manualmente los resultados intermedios. La tabulación es una compensación de espacio-tiempo ; el tiempo de ejecución se puede reducir utilizando más memoria para almacenar los resultados intermedios: [42] [43]

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 en relación con las cláusulas del programa. [44]

La tabulación se puede ampliar en varias direcciones. Puede admitir predicados recursivos a través de la resolución SLG o la tabulación lineal. En un sistema Prolog multiproceso, los resultados de la tabulación se pueden mantener privados para un subproceso o compartir entre todos los subprocesos. Y en la tabulación incremental, la tabulación puede reaccionar a los cambios.

Implementación en hardware

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

En 1982, los ordenadores operaban a una velocidad de entre 10.000 y 100.000 LIPS [inferencias lógicas por segundo]. El FGCS planeó producir ordenadores que operaran a una velocidad de entre 0,1 y 1 GLIPS. [50] Los documentos del Instituto de Tecnología Informática de Nueva Generación estimaron que 1 LIP requería unas 100 operaciones en un ordenador convencional. El plan era producir al final del proyecto (en 1992) una máquina con 1000 procesadores que alcanzaran 1 GLIPS, lo que implicaba al menos 1 MLIPS por procesador. [51]

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

Límites

Aunque Prolog se utiliza ampliamente en investigación y educación, [53] Prolog y otros lenguajes de programación lógica no han tenido un impacto significativo en la industria informática en general. [54] 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. [54] [55] La programación a gran escala se considera compleja porque no todos los compiladores Prolog admiten módulos y existen problemas de compatibilidad entre los sistemas de módulos de los principales compiladores Prolog. [26] La portabilidad del código Prolog entre implementaciones también ha sido un problema, pero los avances desde 2007 han significado que: "la portabilidad dentro de la familia de implementaciones Prolog derivadas de Edinburgh/Quintus es lo suficientemente buena como para permitir el mantenimiento de aplicaciones portátiles en el mundo real". [56]

El software desarrollado en Prolog ha sido criticado por tener una gran pérdida de 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 cuando se programan cálculos deterministas, o incluso cuando se utiliza el "no determinismo sin importancia" (donde se realiza una única elección en lugar de retroceder sobre todas las posibilidades). Es posible que se deban utilizar cortes y otras construcciones del lenguaje para lograr el rendimiento deseado, destruyendo uno de los principales atractivos de Prolog, la capacidad de ejecutar programas "hacia atrás y hacia adelante". [57]

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

Extensiones

Se han desarrollado varias implementaciones a partir de Prolog para ampliar las capacidades de programación lógica en muchas direcciones. Estas 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 tipos. Los intentos de introducir y ampliar Prolog con tipos comenzaron en la década de 1980, [60] [61] y continúan hasta 2008. [ 62] La información de tipos es útil no solo para la seguridad de tipos sino también para razonar sobre los programas Prolog. [63]

Modos

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

Restricciones

La programación lógica de restricciones extiende Prolog para incluir conceptos de satisfacción de restricciones . [67] [68] Un programa de lógica de restricciones permite restricciones en el cuerpo de cláusulas, como: A(X,Y) :- X+Y>0.Es adecuado para problemas de optimización combinatoria a gran escala [69] y, por lo tanto, es útil para aplicaciones en entornos industriales, como la elaboración de horarios automatizados y la 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 los números racionales .

Orientación a objetos

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

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 de 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ó compatibilidad con otras plataformas y se lanzó una segunda versión en 1995. Addison-Wesley publicó un libro sobre Prolog++ escrito por 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 , [70] Visual Prolog , WIN-PROLOG y B-Prolog .

Concurrencia

Prolog-MPI es una extensión SWI-Prolog de código abierto para computación distribuida sobre la interfaz de paso de mensajes . [71] También existen varios lenguajes de programación Prolog concurrentes. [72]

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 . [73] También hay extensiones para admitir formatos web semánticos como Resource Description Framework (RDF) y Web Ontology Language (OWL). [74] [75] Prolog también se ha sugerido como un lenguaje del lado del cliente . [76] Además, Visual Prolog admite JSON-RPC y Websockets .

Adobe Flash

Cedar es un intérprete Prolog básico y gratuito. A partir de la versión 4, Cedar tiene compatibilidad con FCA (Flash Cedar App). Esto proporciona una nueva plataforma para programar en Prolog a través de ActionScript .

Otro

Interfaces con otros lenguajes

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, por sugerencia de su esposa, como abreviatura de programmation en logique ( en francés, programación en lógica ). [78] Fue creado alrededor de 1972 por Alain Colmerauer con Philippe Roussel, basándose en la interpretación procedimental de las cláusulas de Horn de Robert Kowalski . Fue motivado en parte por el deseo de reconciliar el uso de la lógica como lenguaje de representación de conocimiento declarativo con la representación procedimental del conocimiento que era popular en América del Norte a fines de la década de 1960 y principios de la de 1970. Según Robert Kowalski , el primer sistema Prolog fue desarrollado en 1972 por Colmerauer y Phillipe Roussel. [79] [80] [81] 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 , donde implementó un front-end alternativo que llegó a definir la sintaxis de "Edinburgh Prolog" utilizada por la mayoría de las implementaciones modernas. Warren también implementó el primer compilador para 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 Prolog mientras que los estadounidenses favorecieron Lisp , lo que al parecer causó muchos debates nacionalistas sobre los méritos de los lenguajes. [82] Gran parte del desarrollo moderno de Prolog provino del impulso del proyecto Fifth Generation Computer Systems (FGCS), que desarrolló una variante de Prolog llamada Kernel Language para su primer sistema operativo .

Originalmente, Prolog puro estaba restringido al uso de un demostrador de teoremas de resolución con cláusulas de Horn de la forma:

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

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

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

Sin embargo, el Prolog puro pronto se amplió para incluir la negación como fracaso , en el que las condiciones negativas de la forma not(B i ) se muestran al intentar y fallar en la resolución de las condiciones positivas correspondientes B i .

Las extensiones posteriores de Prolog realizadas por el equipo original introdujeron capacidades de programación de 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 (Unstructured Information Management Architecture). El sistema fue escrito en varios lenguajes, incluyendo 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 sobre á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 los resultados de reconocimiento de entidades nombradas), y una tecnología que pudiera ejecutar estas reglas de manera muy eficiente. Descubrimos que Prolog era la opción ideal para el lenguaje debido a su simplicidad y expresividad ". [12] Prolog se está utilizando en la plataforma de desarrollo de bajo código GeneXus , que se centra en la IA. [ cita requerida ] La base de datos de gráficos de código abierto TerminusDB se implementa en Prolog. [83] TerminusDB está diseñado para construir y curar de forma colaborativa gráficos de conocimiento .

Véase también

Idiomas relacionados

Notas

  1. ^ La terminología de Prolog difiere de la de la 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 la 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, Ivan (2012). Programación Prolog para inteligencia artificial (4.ª ed.). Harlow, Inglaterra; Nueva York: Addison Wesley. ISBN 978-0-321-41746-6.
  3. ^ Covington, Michael A. (1994). Procesamiento de lenguaje natural para programadores de Prolog . Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-629213-5.
  4. ^ de Lloyd, JW (1984). Fundamentos de programación lógica . Berlín: Springer-Verlag. ISBN 978-3-540-13299-8.
  5. ^ Véase Programación lógica § Historia .
  6. ^ Stickel, ME (1988). "Un demostrador de teoremas de tecnología prolog: Implementación mediante un compilador prolog extendido". Journal of Automated Reasoning . 4 (4): 353–380. CiteSeerX 10.1.1.47.3057 . doi :10.1007/BF00297245. S2CID  14621218. 
  7. ^ Merritt, Dennis (1989). Construcción de sistemas expertos en Prolog . Berlín: Springer-Verlag. ISBN 978-0-387-97016-5.
  8. ^ Felty, 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 lenguajes de programación. Springer. pp. 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. Springer Science & Business Media. ISBN 978-3-540-40174-2.
  11. ^ Fernando CN Pereira ; Stuart M. Shieber (2005). Prolog y análisis del lenguaje natural. Microtomo.
  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 (computadora) .
  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 básica. BoD – Libros a pedido. ISBN 978-3-7357-3744-1– a través de Google Books.
  15. ^ Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A .; Wielemaker, Jan; Price, Simon (2011). "Directrices 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.; Sterling, LS (1993). "Aplicación de técnicas a esqueletos: patrones para la programación en Prolog". Construcción de programas lógicos (ed. JMJ Jacquet) . Apuntes de clases de informática / Apuntes de clases de inteligencia artificial: 27–140. CiteSeerX 10.1.1.56.7278 . 
  17. ^ Sterling, Leon (2002). Lógica computacional: programación lógica y más allá . 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 Ciencias de la Computación, Universidad Católica de Lovaina, 1990.
  19. ^ Gegg-Harrison, TS (1995). Representación de esquemas de programas lógicos en Prolog . Duodécima Conferencia Internacional sobre Programación Lógica de Procs. 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 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 de Prolog, las variables que están sólo en la cabeza están implícitamente cuantificadas universalmente, y aquellas que están sólo en el cuerpo están implícitamente cuantificadas existencialmente" . Consultado el 4 de mayo de 2013 .
  23. ^ abc ISO/IEC 13211: Tecnología de la información – Lenguajes de programación – Prolog. Organización Internacional de Normalización , Ginebra.
  24. ^ ISO/IEC 13211-2: Módulos.
  25. ^ ab 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): 776–858, doi : 10.1017/S1471068422000102 , hdl : 10174/33387
  26. ^ ab Moura, Paulo (agosto de 2004), "Logtalk", Association of Logic Programming , 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", Lecture Notes in Artificia Intelligence , 4369
  28. ^ Cabeza; Hermenegildo (2000), Un nuevo sistema de módulos para Prolog , Lecture Notes in Computer Science, vol. 1861
  29. ^ Sagonas; Swift; Warren (1994), "XSB como un motor de base de datos deductivo eficiente", SIGMOD
  30. ^ ab Shapiro, Ehud Y.; Sterling, Leon (1994). El arte de Prolog: técnicas avanzadas de programación . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-19338-2.
  31. ^ 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.
  32. ^ "ISO/IEC 13211-1:1995/Cor 1:2007". ISO .
  33. ^ "ISO/IEC 13211-1:1995/Cor 2:2012". ISO .
  34. ^ "ISO/IEC 13211-1:1995/Cor 3:2017". ISO .
  35. ^ "Norma ISO/IEC JTC1 SC22 WG17".[ enlace muerto permanente ]
  36. ^ "X3J17 y el estándar Prolog". Archivado desde el original el 23 de agosto de 2009. Consultado el 2 de octubre de 2009 .
  37. ^ David HD Warren. "Un conjunto de instrucciones Prolog abstracto". Nota técnica 309, SRI International , Menlo Park, CA, octubre de 1983.
  38. ^ Van Roy, P.; Despain, AM (1992). "Programación lógica de alto rendimiento con el compilador Aquarius Prolog". Computer . 25 : 54–68. doi :10.1109/2.108055. S2CID  16447071.
  39. ^ Graf, Peter (1995). Indexación de términos . Springer. ISBN 978-3-540-61040-3.
  40. ^ Wise, Michael J.; Powers, David MW (1986). Indexación de cláusulas de prólogo mediante palabras de código superpuestas y palabras codificadas en campo . Simposio internacional sobre programación lógica . págs. 203–210.
  41. ^ Colomb, Robert M. (1991). "Mejora de la unificación en PROLOG mediante la indexación de cláusulas". The Journal of Logic Programming . 10 : 23–44. doi :10.1016/0743-1066(91)90004-9.
  42. ^ Swift, T. (1999). "Tabling for non-monotonic programming" (Tablas 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.
  43. ^ Zhou, Neng-Fa; Sato, Taisuke (2003). "Cálculo eficiente de puntos fijos en tablas lineales" (PDF) . Actas de la 5.ª Conferencia internacional ACM SIGPLAN sobre principios y prácticas de programación declarativa : 275–283.
  44. ^ Swift, T.; Warren, DS (2011). "XSB: Extendiendo Prolog con programación lógica en tablas". 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.
  45. ^ Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). "Procesador Prolog integrado de alto rendimiento IPP". Actas del 14º simposio internacional anual sobre arquitectura informática - ISCA '87 . p. 100. doi :10.1145/30350.30362. ISBN 978-0-8186-0776-9.S2CID10283148  .​
  46. ^ Robinson, Ian (1986). Un procesador Prolog basado en un dispositivo de memoria de coincidencia de patrones . Tercera Conferencia Internacional sobre Programación Lógica. Notas de clase en Ciencias de la Computación. Vol. 225. Springer. págs. 172–179. doi :10.1007/3-540-16492-8_73. ISBN 978-3-540-16492-0.
  47. ^ 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 .
  48. ^ Gupta, G.; Pontelli, E.; Ali, KAM; Carlsson, M.; Hermenegildo, MV (2001). "Ejecución paralela de programas prolog: una encuesta". ACM Transactions on Programming Languages ​​and Systems . 23 (4): 472. doi : 10.1145/504083.504085 . S2CID  2978041.
  49. ^ "Sistemas asignados estáticamente".
  50. ^ Bramer, MA; Bramer, Dawn (1984). La quinta generación: una bibliografía comentada. Wokingham, Inglaterra; Reading, Mass: Addison-Wesley. pág. 6. ISBN 978-0-201-14427-7.
  51. ^ Feigenbaum, Edward; Shrobe, Howard (1993-07-01). "El proyecto nacional japonés de quinta generación: Introducción, estudio y evaluación". Future Generation Computer Systems . Conferencia FGCS. 9 (2): 105–117. doi : 10.1016/0167-739X(93)90003-8 . ISSN  0167-739X.
  52. ^ "Software que se toma los juegos en serio". New Scientist . Reed Business Information . 26 de marzo de 1987. pág. 34 – vía Google Books .[ enlace muerto permanente ]
  53. ^ "Ciencia informática - Lenguajes de programación, sintaxis, algoritmos | Britannica". www.britannica.com . Consultado el 12 de julio de 2023 .
  54. ^ ab Programación lógica para el mundo real. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Actas del taller posterior a la conferencia ILPS'95 sobre visiones para el futuro de la programación lógica.
  55. ^ "Preguntas frecuentes: Guía de recursos de Prolog 1/2 [Publicación mensual] Sección - [1-8] La base de datos Prolog 1000". Faqs.org .
  56. ^ Jan Wielemaker y Vıtor Santos Costa: Portabilidad de programas Prolog: teoría y estudios de casos. Taller CICLOPS-WLPE 2010 Archivado el 16 de julio de 2010 en Wayback Machine .
  57. ^ ab Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Re-thinking Prolog. Proc. 31.ª reunión de la Sociedad Japonesa de Ciencia y Tecnología del Software.
  58. ^ Franzen, Torkel (1994), "Declarativo vs procedimental", Asociación de Programación Lógica , 7 (3)
  59. ^ Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "Complejidad y poder expresivo de la programación lógica". Encuestas de computación de ACM . 33 (3): 374–425. CiteSeerX 10.1.1.616.6372 . doi :10.1145/502807.502810. S2CID  518049. 
  60. ^ Mycroft, A.; O'Keefe, RA (1984). "Un sistema de tipos polimórficos para prolog". Inteligencia Artificial . 23 (3): 295. doi :10.1016/0004-3702(84)90017-1.
  61. ^ Pfenning, Frank (1992). Tipos en programación lógica . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
  62. ^ 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.
  63. ^ ab Apt, KR; Marchiori, E. (1994). "Razonamiento sobre programas Prolog: desde los modos hasta los tipos y las aserciones". Aspectos formales de la informática . 6 (S1): 743. CiteSeerX 10.1.1.57.395 . doi :10.1007/BF01213601. S2CID  12235465. 
  64. ^ O'Keefe, Richard A. (1990). El arte de Prolog . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
  65. ^ Covington, Michael; Bagnara, Roberto; et al. (2010). "Directrices de codificación para Prolog". arXiv : 0911.2899 [cs.PL].
  66. ^ 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 . Lecture Notes in Computer Science. Vol. 250. págs. 111. doi :10.1007/BFb0014976. ISBN . 978-3-540-17611-4.
  67. ^ Jaffar, J. (1994). "Programación lógica de restricciones: una encuesta". The Journal of Logic Programming . 19–20: 503–581. doi : 10.1016/0743-1066(94)90033-7 .
  68. ^ Colmerauer, Alain (1987). "Abriendo el universo Prolog III". Byte . Agosto.
  69. ^ Wallace, M. (2002). "Programación lógica de restricciones". Lógica computacional: programación lógica y más allá . Apuntes de clase en informática. Vol. 2407. págs. 512–556. doi :10.1007/3-540-45628-7_19. ISBN 978-3-540-45628-5.
  70. ^ "XPCE: la biblioteca GUI nativa de SWI-Prolog". swi-prolog.org .
  71. ^ "prolog-mpi". Apps.lumii.lv . Consultado el 16 de septiembre de 2010 .
  72. ^ Ehud Shapiro. La familia de lenguajes de programación lógica concurrente ACM Computing Surveys . Septiembre de 1989.
  73. ^ 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.
  74. ^ Wielemaker, Jan; Hildebrand, Michiel; van Ossenbruggen, Jacco (2007), Heymans, S.; Polleres, A.; Ruckhaus, E.; Pearse, D.; Gupta, G. (eds.), "Uso de {Prolog} como base para aplicaciones en la web semántica" (PDF) , Actas del 2º Taller sobre aplicaciones de programación lógica y para la Web, Web semántica y servicios web semánticos , Actas del Taller CEUR, vol. 287, Porto, Portugal: CEUR-WS.org, pp. 84–98
  75. ^ Procesamiento de ontologías OWL2 con Thea: una aplicación de programación lógica. Vangelis Vassiliadis, Jan Wielemaker y Chris Mungall. Actas del 5.º taller internacional sobre OWL: experiencias y direcciones (OWLED 2009), Chantilly, VA, Estados Unidos, 23 y 24 de octubre de 2009
  76. ^ Loke, SW; 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. 
  77. ^ Andersen, C. y Swift, T., 2023. El sistema Janus: un puente hacia nuevas aplicaciones de Prolog. En Prolog: Los próximos 50 años (págs. 93-104). Cham: Springer Nature Suiza.
  78. ^ Colmerauer, A. y Roussel, P., 1996. El nacimiento de Prolog. En Historia de los lenguajes de programación---II (pp. 331-367).
  79. ^ 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.
  80. ^ Colmerauer, A.; Roussel, P. (1993). "El nacimiento de Prolog" (PDF) . ACM SIGPLAN Notices . 28 (3): 37. doi :10.1145/155360.155362.
  81. ^ "Prolog: una breve historia" . Consultado el 21 de noviembre de 2021 .
  82. ^ Pountain, Dick (octubre de 1984). «POP y SNAP». Byte . pág. 381 . Consultado el 23 de octubre de 2013 .
  83. ^ terminusdb/terminusdb, TerminusDB, 13 de diciembre de 2020 , consultado el 15 de diciembre de 2020

Lectura adicional