Articulo de referencia

Prólogo

Part 2: Modules-Edition 1 ({{Start date and age|2000|06}}) Part 3: Definite clause grammar rules ({{Start date and age|2025|06}})"},"latest release date":{"wt":""},"typing":{"wt...

Prolog es un lenguaje de programación lógica que tiene sus orígenes en la inteligencia artificial , la demostración automática 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 . A diferencia de muchos otros lenguajes de programación , Prolog está concebido 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 la demostración de teoremas , [ 6 ] sistemas expertos , [ 7 ] reescritura de términos , [ 8 ] sistemas de tipos , [ 9 ] planificación automatizada , [ 10 ] y respuesta a preguntas [ 11 ] [ 12 ] [ 13 ] así como en su campo de uso original previsto, el procesamiento del lenguaje natural . [ 14 ] [ 11 ]

Prolog es un lenguaje de programación de propósito general, Turing-completo , muy adecuado para aplicaciones de procesamiento inteligente del conocimiento.

Historia

Cronología de algunos de los primeros sistemas Prolog, hasta la norma ISO.

El nombre Prolog fue elegido por Philippe Roussel, a sugerencia de su esposa, como una abreviatura de Pro grammation en log ique ( Programación en lógica en francés ). [ 15 ] Fue creado alrededor de 1972 por Alain Colmerauer con Philippe Roussel, del Grupo de Inteligencia Artificial de la Facultad de Ciencias de Luminy de la Universidad de Aix-Marseille II de Francia. Se basó en la interpretación procedimental de las cláusulas de Horn de Robert Kowalski , y fue motivado en parte por el deseo de conciliar el uso de la lógica como un lenguaje de representación declarativa del conocimiento con la representación procedimental del conocimiento que era popular en Norteamérica a finales 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 Philippe Roussel. [ 16 ] [ 17 ] [ 18 ] 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ó una interfaz alternativa que definió la sintaxis del " Prolog de Edimburgo ", 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. Posteriormente, Warren generalizó las ideas detrás del DEC-10 Prolog para crear la Máquina Abstracta de Warren ( WAM ).

Los investigadores europeos de IA favorecieron Prolog, mientras que los estadounidenses favorecieron Lisp , lo que, según se informa, provocó muchos debates nacionalistas sobre los méritos de los lenguajes. [ 19 ] 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, Pure Prolog se limitaba 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 dichas cláusulas como procedimientos:

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

Sin embargo, Pure Prolog pronto se extendió para incluir la negación como fallo , en la que las condiciones negativas de la forma not(B i ) se muestran al intentar y no lograr resolver las condiciones positivas correspondientes B i .

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

Impacto

Aunque Prolog se usa ampliamente en investigación y educación, [ 20 ] Prolog y otros lenguajes de programación lógica no han tenido un impacto significativo en la industria informática en general. [ 21 ] La mayoría de las aplicaciones son pequeñas para los estándares industriales, y pocas superan las 100 000 líneas de código. [ 21 ] [ 22 ] La programación a gran escala 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. [ 23 ] La portabilidad del código Prolog entre implementaciones también ha sido un problema, pero los desarrollos desde 2007 han significado que: "la portabilidad dentro de la familia de implementaciones de Prolog derivadas de Edinburgh/Quintus es lo suficientemente buena como para permitir el mantenimiento de aplicaciones portátiles del mundo real". [ 24 ]

El software desarrollado en Prolog ha sido criticado por su elevado coste de rendimiento en comparación con los lenguajes de programación convencionales. En particular, la estrategia de evaluación no determinista de Prolog puede resultar problemática al programar cálculos deterministas, o incluso al utilizar el "no determinismo indiferente" (donde se toma una única decisión en lugar de recorrer todas las posibilidades). Es posible que sea necesario utilizar cortes y otras construcciones del lenguaje para lograr un rendimiento deseable, lo que anula una de las principales ventajas de Prolog: la capacidad de ejecutar programas "hacia adelante y hacia atrás". [ 25 ]

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

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 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 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 ". [ 11 ] Prolog se está utilizando en la plataforma de desarrollo de bajo código GeneXus , que se centra en la IA. La base de datos de grafos de código abierto TerminusDB está implementada en Prolog. [ 28 ] TerminusDB está diseñada para construir y curar grafos de conocimiento de forma colaborativa .

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 único tipo de datos de Prolog, el término . [ 4 ] Las relaciones se definen mediante cláusulas . Dada una consulta, el motor de 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 las cláusulas y el conjunto unitario 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 sintáctico de lenguajes. Debido a que Prolog permite predicados impuros , comprobar el valor de verdad de ciertos predicados especiales puede tener algún efecto secundario deliberado , como imprimir un valor en la pantalla. Por ello, el programador puede utilizar cierta cantidad de programación imperativa convencional cuando el paradigma lógico resulta inconveniente. Cuenta con un subconjunto puramente lógico, denominado "Prolog puro", así como con diversas características extralógicas.

Tipos de datos

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

  • Un átomo es un nombre de símbolo que comienza con una letra minúscula o está entre comillas. Ejemplos de átomos incluyen x, red, 'Taco', 'some atom', y 'p(a)'.
  • Los números pueden ser decimales o enteros . La mayoría de los sistemas Prolog principales admiten números enteros de longitud arbitraria.
  • Las variables se representan mediante una cadena de caracteres compuesta por letras, números y guiones bajos, que comienza con una letra mayúscula o un guion bajo. En lógica, las variables se asemejan mucho a las variables genéricas, ya que sirven como marcadores de posición para términos arbitrarios.
  • Un término compuesto se compone de un átomo llamado "functor" y varios "argumentos", que también son términos. Los términos compuestos se escriben normalmente como un functor seguido de una lista de argumentos separados por comas, que se encuentra entre paréntesis. El número de argumentos se denomina aridad del término . Un átomo puede considerarse un término compuesto con aridad cero. Un ejemplo de término compuesto es person_friends(zelda,[tom,jim]).

Casos especiales de términos compuestos:

  • Una lista es una colección ordenada de términos. Se denota mediante corchetes con los términos separados por comas, o en el caso de una lista vacía, por []. Por ejemplo, [1,2,3,4]o [red,green,blue].
  • Cadenas : Una secuencia de caracteres rodeada de comillas es equivalente a una lista de códigos de caracteres (numéricos), una lista de caracteres (átomos de longitud 1) o un átomo, dependiendo del valor del indicador de Prolog double_quotes. Por ejemplo, "to be, or not to be". [ 29 ]

Reglas y hechos

Los programas Prolog describen relaciones, definidas mediante cláusulas. El Prolog puro se limita a las 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 "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 integrado (es decir, un operador,/2 de aridad 2 con nombre ) denota la conjunción de objetivos, y denota la disyunción . Las conjunciones y disyunciones solo pueden aparecer en el cuerpo, no en la cabeza de una regla.,;/2

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

humano ( Sócrates ).

lo cual es equivalente a la regla:

humano ( sócrates ) : verdadero .

El predicado incorporado true/0siempre es verdadero.

Dado lo anterior, cabe preguntarse:

¿Sócrates era humano?

¿- humano ( Sócrates )? 

¿Qué 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 nos preguntamos: ¿qué cosas son mortales?

¿- mortal ( X ). X = Sócrates

Predicados y programas

Un predicado (o definición de procedimiento ) es un conjunto de cláusulas cuyos encabezados 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 familiares, tiene cuatro predicados:

madre_hija ( 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 ), no ( X = 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, estos suelen utilizarse en varias direcciones. Por ejemplo, length/2se puede usar para determinar la longitud de una lista ( length(List, L), dada una lista List), para generar un esqueleto de lista de una longitud dada ( length(X, 5)), y para generar ambos esqueletos de lista y sus longitudes juntas ( length(X, L)). De manera similar, append/3se puede usar tanto para concatenar 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 relativamente 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. Estos predicados no tienen un significado relacional y solo son útiles por los efectos secundarios que producen en el sistema. Por ejemplo, el predicado write/1muestra un término en la pantalla.

Bucles y recursión

Los algoritmos iterativos pueden implementarse mediante predicados recursivos . [ 30 ]

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

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 si X es padre de un ancestro de Y. Es recursiva porque se define en términos de sí misma (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 introduce un único objetivo, denominado consulta. Lógicamente, el motor Prolog intenta encontrar una refutación de la consulta negada. El método de resolución utilizado por Prolog se denomina resolución SLD . Si la consulta negada puede refutarse, se deduce que la consulta, con las asignaciones de variables adecuadas, es una consecuencia lógica del programa. En ese caso, se informan al usuario todas las asignaciones de variables generadas y se considera que la consulta ha tenido éxito. Operacionalmente, la estrategia de ejecución de Prolog puede considerarse una generalización de las llamadas a funciones en otros lenguajes, con la diferencia de que varias cabeceras de cláusula pueden coincidir con una llamada dada. En ese caso, el sistema crea un punto de decisión, unifica el objetivo con la cabecera de cláusula de la primera alternativa y continúa con los objetivos de dicha primera alternativa. Si algún objetivo falla durante la ejecución del programa, se deshacen todas las asignaciones de variables realizadas desde la creación del último punto de decisión, y la ejecución continúa con la siguiente alternativa de dicho punto de decisión. Esta estrategia de ejecución se denomina retroceso cronológico . Por ejemplo, dado el programa de relaciones familiares definido anteriormente, la siguiente consulta se evaluará como verdadera:

¿ Hermano/a ( Sally , Erica )? 

Esto se obtiene de la siguiente manera: Inicialmente, la única cabecera de cláusula que coincide con la consulta sibling(sally, erica)es la primera, por lo que probar la consulta es equivalente a probar el cuerpo de esa cláusula con las vinculaciones de variables apropiadas, 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 cabeceras 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 usando el hecho father_child(tom, sally), por lo que se genera la vinculación Z = tom, y el siguiente objetivo a probar es la segunda parte de la conjunción anterior: parent_child(tom, erica). Nuevamente, esto se puede probar mediante el hecho correspondiente. Dado que todos los objetivos se pudieron probar, la consulta tiene éxito. Como la consulta no contenía variables, no se informan vinculaciones al usuario. Una consulta con variables, como:

?- padre_hijo ( Padre , Hijo ).

Enumera todas las respuestas válidas en el método de retroceso.

Observe que, con el código descrito anteriormente, la consulta ?- sibling(sally, sally).también se ejecuta correctamente. Si se desea, se pueden añadir objetivos adicionales para describir las restricciones pertinentes.

Negación

El predicado integrado de Prolog \+/1proporciona la negación como fallo , 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 encuentra una prueba para ese objetivo, el objetivo original (es decir, \+ illegal(X)) falla. Si no se encuentra ninguna prueba, el objetivo original tiene éxito. Por lo tanto, el \+/1operador de prefijo se llama operador de "no demostrable", ya que la consulta ?- \+ Goal.tiene éxito si el Objetivo no es demostrable. Este tipo de negación es correcta si su argumento es "ground" (es decir, no contiene variables). La corrección se pierde si el argumento contiene variables y el procedimiento de prueba está completo. En particular, la consulta ?- legal(X).ahora no se puede usar para enumerar todas las cosas que son legales.

Programación en Prolog

En Prolog, cargar código se denomina consultar . Prolog se puede usar de forma interactiva introduciendo consultas en la consola de Prolog ?-. Si no hay 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 mantenibilidad del código. [ 31 ]

A continuación se muestran algunos ejemplos de programas 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 ("true." frente a "yes", "false." frente a "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 pasadas de optimización podría implementarse como una relación entre un programa inicial y su forma optimizada:

programa_optimizado ( Prog0 , Prog ) :- optimización_paso_1 ( Prog0 , Prog1 ), optimización_paso_2 ( Prog1 , Prog2 ), optimización_paso_3 ( Prog2 , Prog ).

o, de forma equivalente, utilizando la notación DCG :

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

Ordenación rápida

El algoritmo de ordenación Quicksort 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 ) ).quicksort ([]) --> []. quicksort ([ X | Xs ]) --> { partición ( Xs , X , Más pequeño , Más grande ) }, quicksort ( Más pequeño ), [ X ], quicksort ( Más grande ).

Patrones de diseño de Prolog

Un patrón de diseño es una solución general y reutilizable a un problema común en el diseño de software . Algunos patrones de diseño en Prolog son esqueletos, técnicas, [ 32 ] [ 33 ] clichés, [ 34 ] esquemas de programas, [ 35 ] esquemas de descripción lógica, [ 36 ] y programación de orden superior . [ 37 ]

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 saca a Prolog del dominio de la lógica de primer orden, que no permite la cuantificación sobre predicados, [ 38 ] ISO Prolog ahora tiene algunos predicados de orden superior incorporados como call/1, call/2, call/3, findall/3, setof/3, y bagof/3. [ 39 ] 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, permitiendo también la currificación . [ 37 ]

Para convertir soluciones de representación temporal (sustituciones de respuestas en retroceso) a representación espacial (términos), Prolog dispone de 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 , encontrar todos ( D , ( entre ( 1 , U , D ), N mod D =:= 0 ), Ds ), lista de suma ( 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:

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 todo X, P(X,Y)se unifica Ycon un único valor, 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 desarrollado inicialmente 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. [ 40 ] Sin embargo, aunque 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 optado por admitir como estándar de módulos de facto el sistema de módulos Quintus / SICStus . No obstante, solo algunas implementaciones proporcionan predicados de conveniencia adicionales relacionados con los módulos, y a menudo presentan sutiles diferencias en su semántica. [ 41 ]

Algunos sistemas optaron por implementar conceptos de módulos como compilación de código fuente a código fuente en Prolog ISO base, como es el caso de Logtalk . [ 23 ] GNU Prolog inicialmente se desvió de los módulos ISO, optando en cambio por la Programación Lógica Contextual , en la que la carga y descarga de unidades (módulos) se puede realizar dinámicamente. [ 42 ] 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 ocultación de términos y facilita la programación a gran escala. [ 43 ] XSB adopta un enfoque diferente y ofrece un sistema de módulos basado en átomos . [ 44 ] Los dos últimos sistemas Prolog permiten controlar la visibilidad de los términos además de la de los predicados. [ 41 ]

Análisis sintáctico

Existe una notación especial llamada gramáticas de cláusulas definidas . Una regla definida mediante -->/2en lugar de :-/2es expandida por el preprocesador ( expand_term/2, una función análoga a las macros en otros lenguajes) según unas pocas reglas de reescritura sencillas, lo que da como resultado cláusulas Prolog ordinarias. En particular, la reescritura dota al predicado de dos argumentos adicionales, que pueden usarse para enhebrar implícitamente el estado alrededor, de forma análoga a las mónadas en otros lenguajes. Las gramáticas de cláusulas definidas se utilizan a menudo para escribir analizadores sintácticos o generadores de listas, ya que también proporcionan una interfaz conveniente para las listas de diferencias.

Metaintérpretes y reflexión

Prolog es un lenguaje homoicónico y proporciona 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 meta-intérprete ) para código Prolog puro:

resolver ( verdadero ). resolver (( Subgoal1 , Subgoal2 )) :- resolver ( Subgoal1 ), resolver ( Subgoal2 ). resolver ( Head ) :- cláusula ( Head , Body ), resolver ( Body ).

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 ( :-/2es un operador infijo ) que se leen e inspeccionan fácilmente utilizando mecanismos integrados (como read/1), es posible escribir intérpretes personalizados que amplíen Prolog con características específicas del dominio. Por ejemplo, Sterling y Shapiro presentan un meta-intérprete que realiza razonamiento con incertidumbre, reproducido aquí con ligeras modificaciones: [ 45 ] : 330

resolver ( verdadero , 1 ) :- !. resolver (( Subgoal1 , Subgoal2 ), Certeza ) :- !, resolver ( Subgoal1 , Certeza1 ), resolver ( Subgoal2 , Certeza2 ), Certeza es min ( Certeza1 , Certeza2 ). resolver ( Meta , 1 ) :- builtin ( Meta ), !, Meta . resolver ( Cabeza , Certeza ) :- clause_cf ( Cabeza , Cuerpo , Certeza1 ), resolver ( Cuerpo , Certeza2 ), Certeza es Certeza1 * Certeza2 .

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

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

y cláusulas representadas como clause_cf(Head, Body, Certainty). Dados estos, se puede llamar como solve(Goal, Certainty)para 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-completo . La completitud de Turing de Prolog se puede demostrar utilizándolo para simular una máquina de Turing:

turing ( Tape0 , Tape ) :- perform ( q0 , [], Ls , Tape0 , Rs ), reverse ( Ls , Ls1 ), append ( Ls1 , Rs , Tape ).ejecutar ( qf , Ls , Ls , Rs , Rs ) :- !. ejecutar ( 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 ), ejecutar ( 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 especifica mediante los siguientes hechos:

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

Esta máquina incrementa un número en uno mediante codificación unaria: recorre cualquier número de celdas "1" y añade 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 de forma declarativa como una secuencia de transiciones de estado, implementadas en Prolog como una relación entre estados sucesivos de interés.

Implementación

Prolog Heritage. Los sistemas con fondo gris oscuro ya no son compatibles. Las flechas indican las influencias e inspiración de los sistemas. Leyenda rápida: JIT = "Compilador Just-in-Time", JVM = "Máquina Virtual Java", TOAM = "Máquina Abstracta Orientada a Árboles".

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, [ 39 ] [ 46 ] 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 portátiles. Existen tres correcciones: Cor.1:2007, [ 47 ] Cor.2:2012, [ 48 ] y Cor.3:2017. [ 49 ] ISO/IEC 13211-2, [ 39 ] 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 [ 50 ] . ANSI X3J17 es el Grupo Asesor Técnico de EE. UU. para la norma. [ 51 ]

Compilación

Para mayor eficiencia, el código Prolog se compila típicamente a código máquina abstracto, a menudo influenciado por el conjunto de instrucciones de la máquina abstracta Warren basada en registros. [ 52 ] Algunas implementaciones emplean interpretación abstracta para derivar información de tipo y modo de predicados en tiempo de compilación, o compilan a código máquina real para alto rendimiento. [ 53 ] El diseño de métodos de implementación eficientes para 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 máquinas virtuales basadas en pila .

Recursión de cola

Los sistemas Prolog suelen implementar un método de optimización bien conocido llamado optimización de llamadas de cola para predicados deterministas que presentan recursión 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 recursivos de cola deterministas se ejecutan con 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 con respecto al número de cláusulas. La indexación de términos utiliza una estructura de datos que permite búsquedas en tiempo sublineal . [ 54 ] La indexación solo afecta el rendimiento del programa, no la semántica. La mayoría de los 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 clave superpuestas proporcionan una indexación rápida en toda la consulta y el encabezado. [ 55 ] [ 56 ]

Hashing

Algunos sistemas Prolog, como WIN-PROLOG y SWI-Prolog, ahora implementan funciones hash para gestionar grandes conjuntos de datos de forma más eficiente. Esto suele traducirse en mejoras de rendimiento muy significativas al trabajar con grandes corpus como WordNet .

Presentación de la mesa

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 los resultados intermedios. La tabulación implica una compensación entre espacio y tiempo ; el tiempo de ejecución puede reducirse utilizando más memoria para almacenar los resultados intermedios: [ 57 ] [ 58 ]

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

El tabulador puede extenderse en diversas direcciones. Puede admitir predicados recursivos mediante resolución SLG o tabulador lineal. En un sistema Prolog multihilo, los resultados del tabulador podrían mantenerse privados para un hilo o compartirse entre todos los hilos. Y en el tabulador incremental, el tabulador podría 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. [ 60 ] [ 61 ] [ 62 ] Además, Prolog tiene varias propiedades que pueden permitir una aceleración mediante la ejecución paralela. [ 63 ] Un enfoque más reciente ha sido compilar programas Prolog restringidos en una matriz de puertas programables en campo (FPGA) . [ 64 ] Sin embargo, el rápido progreso en hardware de propósito general ha superado sistemáticamente a las arquitecturas más especializadas.

En 1982, las computadoras operaban a una velocidad de entre 10 000 y 100 000 inferencias lógicas por segundo (LIPS). El FGCS planeaba producir computadoras que operaran a entre 0,1 y 1 GLIPS. [ 65 ] Los documentos del Instituto de Tecnología Informática de Nueva Generación estimaban que 1 LIP requería aproximadamente 100 operaciones en una computadora convencional. El plan era producir, al final del proyecto (en 1992), una máquina con 1000 procesadores que alcanzara 1 GLIPS, lo que implicaba al menos 1 MLIPS por procesador. [ 66 ]

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

Extensiones

Se han desarrollado diversas implementaciones a partir de Prolog para ampliar las capacidades de programación lógica en múltiples direcciones. Estas incluyen tipos , modos, programación lógica con restricciones (CLP), programación lógica orientada a objetos , concurrencia, lógica lineal , programación lógica funcional y de orden superior , además de interoperabilidad con bases de conocimiento .

Tipos

Prolog es un lenguaje sin tipado. Los intentos de introducir y extender Prolog con tipos comenzaron en la década de 1980, [ 68 ] [ 69 ] y continúan hasta 2008.. [ 70 ] La información de tipo es útil no solo para la seguridad de tipos sino también para razonar sobre programas Prolog. [ 71 ]

Modos

La sintaxis de Prolog no especifica qué argumentos de un predicado son entradas y cuáles son salidas. [ 72 ] Sin embargo, esta información es importante y se recomienda incluirla en los comentarios. [ 73 ] Los modos proporcionan información valiosa al razonar sobre programas Prolog [ 71 ] y también pueden usarse para acelerar la ejecución. [ 74 ]

Restricciones

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

Orientación a objetos

Flora-2 es un sistema de representación del conocimiento y razonamiento orientado a objetos basado en F-logic e incorpora HiLog , lógica transaccional 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. Como lenguaje multiparadigma, incluye soporte tanto para prototipos como para clases.

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

Objlog era un lenguaje basado en marcos que combinaba objetos y Prolog II, desarrollado por el CNRS de Marsella, Francia.

Prolog++ fue desarrollado por Logic Programming Associates y lanzado por primera vez en 1989 para PC con MS-DOS. Posteriormente se añadió compatibilidad con otras plataformas y se lanzó una segunda versión en 1995. En 1994, la editorial Addison-Wesley publicó un libro sobre Prolog++ escrito por Chris Moss.

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

Gráficos

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

Concurrencia

Prolog-MPI es una extensión de código abierto de SWI-Prolog para computación distribuida sobre la Interfaz de Paso de Mensajes . [ 79 ] También existen varios lenguajes de programación Prolog concurrentes. [ 80 ]

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

Otro

Interfaces con otros lenguajes

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

  • El servidor de inteligencia LPA permite integrar LPA Prolog para Windows en otros lenguajes de programación, incluidos: C , C++ , C# , Java , Visual Basic , Delphi , .NET , Lua , Python y otros. Aprovecha el tipo de datos de cadena dedicado que proporciona LPA Prolog.
  • La interfaz de programación de aplicaciones ( API ) de Logic Server permite extender e integrar Prolog en C , C++ , Java , Visual Basic , Delphi , .NET y cualquier otro lenguaje o entorno que pueda llamar a una .dll o .so. Está implementada para Amzi! Prolog + Logic Server, pero la especificación de la API puede estar disponible para cualquier implementación.
  • JPL es un puente bidireccional Java Prolog que viene incluido por defecto con SWI-Prolog, permitiendo que Java y Prolog se llamen entre sí (de forma recursiva). Se sabe que ofrece un buen soporte para la concurrencia y se encuentra en desarrollo activo.
  • InterProlog es una biblioteca de programación que sirve de puente entre Java y Prolog, implementando la llamada bidireccional a predicados y métodos entre ambos lenguajes. Los objetos Java se pueden mapear a términos Prolog y viceversa. Permite el desarrollo de interfaces gráficas de usuario y otras funciones en Java, dejando el procesamiento lógico en la capa Prolog. Es compatible con XSB y SWI-Prolog .
  • Prova ofrece integración de sintaxis nativa con Java, mensajería de agentes y reglas de reacción. Prova se posiciona como un sistema de scripting basado en reglas (RBS) para middleware. El lenguaje abre nuevos caminos al combinar la programación imperativa y declarativa .
  • PROL es un motor Prolog integrable para Java. Incluye un pequeño entorno de desarrollo integrado (IDE) y algunas bibliotecas.
  • GNU Prolog para Java es una implementación de ISO Prolog como biblioteca Java (gnu.prolog).
  • Ciao proporciona interfaces para C, C++ , Java y bases de datos relacionales.
  • C#-Prolog es un intérprete de Prolog escrito en C# (administrado). Se integra fácilmente en programas C#. Características: intérprete fiable y bastante rápido, interfaz de línea de comandos, interfaz para Windows, DCG integrado, predicados XML, predicados SQL, extensible. El código fuente completo está disponible, incluyendo un generador de analizadores sintácticos que permite añadir extensiones específicas.
  • tuProlog es un sistema Prolog ligero para aplicaciones e infraestructuras distribuidas, diseñado intencionalmente en torno a un núcleo mínimo, que se puede configurar de forma estática o dinámica mediante la carga y descarga de bibliotecas de predicados. tuProlog admite de forma nativa la programación multiparadigma, proporcionando un modelo de integración limpio y sin fisuras entre Prolog y los lenguajes orientados a objetos más comunes, concretamente Java, para la versión Java de tuProlog, y cualquier lenguaje basado en .NET (C#, F#, etc.), para la versión .NET de tuProlog.
  • Janus es una interfaz bidireccional entre Prolog y Python que utiliza primitivas portátiles de bajo nivel. Inicialmente fue desarrollada para XSB por Anderson y Swift, [ 85 ] pero ha sido adoptada como una iniciativa conjunta por los equipos de XSB, Ciao y SWI-Prolog.

Véase también

  • El lenguaje Gödel es una implementación fuertemente tipada de programación lógica con restricciones concurrentes . Está construido sobre SICStus Prolog .
  • Visual Prolog , antes conocido como PDC Prolog y Turbo Prolog, es un dialecto de Prolog fuertemente tipado y orientado a objetos , muy diferente del Prolog estándar. Como Turbo Prolog, fue comercializado por Borland, pero actualmente es desarrollado y comercializado por la empresa danesa Prolog Development Center (PDC), que lo creó originalmente.
  • Datalog es un subconjunto de Prolog. Se limita a relaciones que pueden ser estratificadas y no permite términos compuestos. A diferencia de Prolog, Datalog no es Turing-completo .
  • Mercury es una rama de Prolog orientada a la ingeniería de software en general, con un sistema de tipos estático y polimórfico, así como un sistema de modos y determinismo.
  • GraphTalk es una implementación propietaria de la Máquina Abstracta de Warren, con propiedades adicionales orientadas a objetos.
  • En cierto modo, Prolog es un subconjunto de Planner . Las ideas de Planner se desarrollaron posteriormente en Scientific Community Metaphor .
  • AgentSpeak es una variante de Prolog para programar el comportamiento de los agentes en sistemas multiagente .
  • Erlang nació con una implementación basada en Prolog y conserva gran parte de la sintaxis unificada de Prolog.
  • Pilog es un lenguaje declarativo construido sobre PicoLisp , que tiene la semántica de Prolog, pero utiliza la sintaxis de Lisp.
  • λProlog es una extensión del núcleo de Prolog que presenta tipado polimórfico, programación modular y programación de orden superior, incluyendo soporte directo para términos con operadores de enlace de variables a través de la denominada sintaxis de árbol λ y unificación de patrones de orden superior.

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 en Prolog 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, NJ: Prentice Hall. ISBN 978-0-13-629213-5.
  4. 1 2 Lloyd, JW (1984). Fundamentos de la 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). Building expert systems in 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 los lenguajes de programación . Springer. 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 . Springer Science & Business Media. ISBN 978-3-540-40174-2.
  11. 1 2 3 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 del original el 3 de septiembre de 2014. Recuperado el 13 de junio de 2014 .Véase también Watson (computadora) .
  12. "Respuesta a preguntas: de particiones a Prolog" .
  13. "NLProlog: Razonamiento con unificación débil para la respuesta a preguntas en lenguaje natural" (PDF) .
  14. Fernando CN Pereira ; Stuart M. Shieber (2005). Prolog y análisis del lenguaje natural . Microtome.
  15. Colmerauer, A. y Roussel, P., 1996. El nacimiento de Prolog. En Historia de los lenguajes de programación---II (págs. 331-367).
  16. Kowalski, RA (1988). "Los primeros años de la programación lógica" (PDF) . Communications of the ACM . 31 : 38. doi : 10.1145/35043.35046 . S2CID 12259230 . 
  17. Colmerauer, A.; Roussel, P. (1993). "El nacimiento de Prolog" (PDF) . ACM SIGPLAN Notices . 28 (3): 37. doi : 10.1145/155360.155362 .
  18. "Prolog: una breve historia" . Consultado el 21 de noviembre de 2021 .
  19. Pountain, Dick (octubre de 1984). "POP and SNAP" . Byte . pág. 381. Consultado el 23 de octubre de 2013 . 
  20. "Ciencias de la computación: lenguajes de programación, sintaxis, algoritmos | Britannica" . www.britannica.com . Consultado el 12 de julio de 2023 .
  21. 1 2 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.
  22. "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 .
  23. 1 2 Moura, Paulo (agosto de 2004), "Logtalk" , Asociación de Programación Lógica , 17 (3), archivado del original el 12 de abril de 2010 , recuperado el 16 de febrero de 2010
  24. Jan Wielemaker y Vıtor Santos Costa: Portabilidad de programas Prolog: teoría y estudios de caso . Taller CICLOPS-WLPE 2010. Archivado el 16 de julio de 2010 en Wayback Machine .
  25. 1 2 Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Repensando Prolog . Actas de la 31.ª reunión de la Sociedad Japonesa de Ciencia y Tecnología del Software.
  26. Franzen, Torkel (1994), "Declarativo vs. procedimental" , Asociación de Programación Lógica , 7 (3)
  27. Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "Complejidad y poder expresivo de la programación lógica". ACM Computing Surveys . 33 (3): 374– 425. CiteSeerX 10.1.1.616.6372 . doi : 10.1145/502807.502810 . S2CID 518049 .  
  28. terminusdb/terminusdb , TerminusDB, 13-12-2020 , consultado el 15-12-2020
  29. 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.
  30. Carlsson, Mats (27 de mayo de 2014). Manual de usuario de SICStus Prolog 4.3: Documentación de referencia principal . BoD – Books on Demand. ISBN 978-3-7357-3744-1 vía Google Libros.
  31. Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A. ; Wielemaker, Jan; Price, Simon (2011). "Directrices de codificación para Prolog". Theory and Practice of Logic Programming . 12 (6): 889– 927. arXiv : 0911.2899 . doi : 10.1017/S1471068411000391 . S2CID 438363 . 
  32. Kirschenbaum, M.; Sterling, LS (1993). "Aplicación de técnicas a esqueletos". En Jacquet, JMJ (ed.). Construcción de programas lógicos . Wiley Professional Computing. John Wiley & Sons. pp. 127–140 . CiteSeerX 10.1.1.56.7278 . ISBN   978-0-471-93789-0.
  33. Sterling, Leon (2002). Lógica computacional: programación lógica y más allá . Vol. 2407. pp. 17–26 . doi : 10.1007/3-540-45628-7_15 . ISBN   978-3-540-43959-2.
  34. D. Barker-Plummer. Programación de clichés en Prolog. En M. Bruynooghe, editor, Actas del 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.
  35. Gegg-harrison, TS (1995). Representación de esquemas de programas lógicos en Prolog . Actas de la Duodécima Conferencia Internacional sobre Programación Lógica. págs. 467–481 . 
  36. Deville, Yves (1990). Programación lógica: desarrollo sistemático de programas . Wokingham, Inglaterra: Addison-Wesley. ISBN 978-0-201-17576-9.
  37. 1 2 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 . 
  38. "Con respecto a las variables de Prolog, las variables solo en la cabeza están implícitamente cuantificadas universalmente, y las que solo están en el cuerpo están implícitamente cuantificadas existencialmente" . Recuperado el 4 de mayo de 2013 .
  39. 1 2 3 ISO/IEC 13211: Tecnología de la información – Lenguajes de programación – Prolog. Organización Internacional de Normalización , Ginebra.
  40. ISO/IEC 13211-2: Módulos.
  41. 1 2 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
  42. Abreu, Salvador; Nogueira, Vitor (2006). «Uso de un lenguaje de programación lógica con persistencia y contextos». Programación declarativa para la gestión del conocimiento . Lecture Notes in Computer Science. Vol. 4369. pp. 38–47 . doi : 10.1007/11963578_4 . ISBN   978-3-540-69233-1.
  43. Cabeza, Daniel; Hermenegildo, Manuel (2000). "Un nuevo sistema de módulos para Prolog". Lógica Computacional — CL 2000. Notas de clase en Ciencias de la Computación. Vol. 1861. pp. 131–148 . doi : 10.1007/3-540-44957-4_9 . ISBN   978-3-540-67797-0.
  44. Sagonas, Konstantinos; Swift, Terrance; Warren, David S. (1994). "XSB como un motor de base de datos deductivo eficiente" . ACM SIGMOD Record . 23 (2): 442– 453. doi : 10.1145/191843.191927 .
  45. 1 2 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.
  46. ^ 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.
  47. "ISO/IEC 13211-1:1995/Cor 1:2007" . ISO .
  48. "ISO/IEC 13211-1:1995/Cor 2:2012" . ISO .
  49. "ISO/IEC 13211-1:1995/Cor 3:2017" . ISO .
  50. "ISO/IEC JTC1 SC22 WG17" .
  51. "X3J17 y el estándar Prolog" . Archivado del original el 23 de agosto de 2009. Consultado el 2 de octubre de 2009 .
  52. David HD Warren. "Un conjunto de instrucciones abstractas para Prolog" . Nota técnica 309, SRI International , Menlo Park, CA, octubre de 1983.
  53. 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 . 
  54. Graf, Peter (1995). Indexación de términos . Springer. ISBN 978-3-540-61040-3.
  55. Wise, Michael J.; Powers, David MW (1986). Indexación de cláusulas de Prolog mediante palabras clave superpuestas y palabras codificadas en campos . Simposio internacional sobre programación lógica . págs. 203–210 . 
  56. 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 .
  57. Swift, T. (1999). "Tabling for non-monotonic programming". Annals of Mathematics and Artificial Intelligence . 25 (3/4): 201– 240. doi : 10.1023/A:1018990308362 . S2CID 16695800 . 
  58. 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áctica de la Programación Declarativa : 275–283 .
  59. Swift, T.; Warren, DS (2011). "XSB: Extending Prolog with Tabled Logic Programming". Theory and Practice of Logic Programming . 12 ( 1– 2): 157– 187. arXiv : 1012.5123 . doi : 10.1017/S1471068411000500 . S2CID 6153112 . 
  60. 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 de computadoras - ISCA '87 . p. 100. doi : 10.1145/30350.30362 . ISBN  978-0-8186-0776-9. S2CID 10283148 . 
  61. Robinson, Ian (1986). Un procesador Prolog basado en un dispositivo de memoria de coincidencia de patrones . Tercera Conferencia Internacional sobre Programación Lógica. Lecture Notes in Computer Science. Vol. 225. Springer. pp. 172–179 . doi : 10.1007/3-540-16492-8_73 . ISBN   978-3-540-16492-0.
  62. Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). "Evaluación del rendimiento y la arquitectura de la máquina PSI" . ACM SIGPLAN Notices . 22 (10): 128. doi : 10.1145/36205.36195 .
  63. Gupta, G.; Pontelli, E.; Ali, KAM; Carlsson, M.; Hermenegildo, MV (2001). "Ejecución paralela de programas Prolog: una revisión" . ACM Transactions on Programming Languages ​​and Systems . 23 (4): 472. doi : 10.1145/504083.504085 . S2CID 2978041 . 
  64. "Sistemas de asignación estática" .
  65. Bramer, MA; Bramer, Dawn (1984). La quinta generación: una bibliografía anotada . Wokingham, Inglaterra; Reading, Mass: Addison-Wesley. pág. 6. ISBN  978-0-201-14427-7.
  66. 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 . 
  67. "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 . 
  68. Mycroft, A.; O'Keefe, RA (1984). "Un sistema de tipos polimórfico para prolog". Inteligencia Artificial . 23 (3): 295. doi : 10.1016/0004-3702(84)90017-1 .
  69. ^ Pfenning, Frank (1992). Tipos en programación lógica . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
  70. ^ 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.
  71. 1 2 Apt, KR; Marchiori, E. (1994). "Razonamiento sobre programas Prolog: De los modos a través de los tipos y las aserciones" . Aspectos formales de la computación . 6 (S1): 743. CiteSeerX 10.1.1.57.395 . doi : 10.1007/BF01213601 . S2CID 12235465 .  
  72. O'Keefe, Richard A. (1990). El arte de Prolog . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
  73. Covington, Michael; Bagnara, Roberto; et al. (2010). "Directrices de codificación para Prolog". arXiv : 0911.2899 [ cs.PL ]. 
  74. 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. pp. 111. doi : 10.1007 /BFb0014976 . ISBN   978-3-540-17611-4.
  75. Jaffar, J. (1994). "Programación lógica con restricciones: una revisión" . The Journal of Logic Programming . 19–20 : 503–581 . doi : 10.1016/0743-1066(94)90033-7 .
  76. Colmerauer, Alain (1987). "Abriendo el universo de Prolog III". Byte . Agosto.
  77. Wallace, M. (2002). «Programación lógica con restricciones». Lógica computacional: programación lógica y más allá . Notas de clase en ciencias de la computación. Vol. 2407. pp. 512–556 . doi : 10.1007/3-540-45628-7_19 . ISBN   978-3-540-45628-5.
  78. "XPCE: la biblioteca GUI nativa de SWI-Prolog" . swi-prolog.org .
  79. "prolog-mpi" . Apps.lumii.lv . Consultado el 16 de septiembre de 2010 .
  80. Ehud Shapiro. La familia de lenguajes de programación lógica concurrente. ACM Computing Surveys . Septiembre de 1989.
  81. Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). "SWI-Prolog y la web" (PDF) . Theory and Practice of Logic Programming . 8 (3): 363. doi : 10.1017/S1471068407003237 . S2CID 5404048 . 
  82. Wielemaker, Jan; Hildebrand, Michiel; van Ossenbruggen, Jacco (2007), Heymans, S.; Polleres, A.; Ruckhaus, E.; Pearse, D.; Gupta, G. (eds.), "Using {Prolog} as the fundament for applications on the semantic web" (PDF) , Actas del 2.º Taller sobre Aplicaciones de la Programación Lógica a la Web, la Web Semántica y los Servicios Web Semánticos , CEUR Workshop Proceedings, vol. 287, Oporto, Portugal: CEUR-WS.org, pp . 84–98  
  83. Procesamiento de ontologías OWL2 con Thea: Una aplicación de la 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-24 de octubre de 2009.
  84. Loke, SW; Davison, A. (2001). "Código móvil seguro basado en Prolog". Theory and Practice of Logic Programming . 1 (3): 321. arXiv : cs/0406012 . CiteSeerX 10.1.1.58.6610 . doi : 10.1017/S1471068401001211 . S2CID 11754347 .  
  85. 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.

Lecturas adicionales

  • Blackburn, Patrick; Bos, Johan; Striegnitz, Kristina (2006). ¡ Aprende Prolog ahora! Publicaciones universitarias. ISBN 978-1-904987-17-8Archivado del original el 26 de agosto de 2007. Consultado el 2 de diciembre de 2008 .
  • Ivan Bratko , Programación en Prolog para inteligencia artificial , 4.ª ed., 2012, ISBN 978-0-321-41746-6Suplementos del libro y código fuente
  • William F. Clocksin, Christopher S. Mellish: Programación en Prolog: Uso del estándar ISO . Springer, 5.ª ed., 2003, ISBN 978-3-540-00678-7( Esta edición está actualizada para Prolog ISO. Las ediciones anteriores describían Prolog Edimburgo).
  • William F. Clocksin: Cláusula y efecto. Programación en Prolog para el programador profesional . Springer, 2003, ISBN 978-3-540-62971-9.
  • Michael A. Covington , Donald Nute, Andre Vellino, Programación en Prolog en profundidad , 1996, ISBN 0-13-138645-X.
  • Michael A. Covington, Procesamiento del lenguaje natural para programadores de Prolog , 1994, ISBN 978-0-13-629213-5
  • MS Dawe y CMDawe, Prolog para Ciencias de la Computación , Springer Verlag 1992.
  • ISO/IEC 13211: Tecnología de la información – Lenguajes de programación – Prolog . Organización Internacional de Normalización , Ginebra.
  • Feliks Kluźniak y Stanisław Szpakowicz (con una contribución de Janusz S. Bień). Prolog para programadores . Academic Press Inc. (Londres), 1985, 1987 (disponible bajo licencia Creative Commons en sites.google.com/site/prologforprogrammers/ ) . ISBN 0-12-416521-4.
  • Richard O'Keefe , El arte del prólogo , ISBN 0-262-15039-5.
  • Robert Smith, John Gibson, Aaron Sloman : 'Soporte de máquina virtual de dos niveles de POPLOG para lenguajes interactivos', en Research Directions in Cognitive Science Volumen 5: Inteligencia Artificial , Eds . D. Sleeman y N. Bernsen, Lawrence Erlbaum Associates, pp. 203–231, 1992.
  • Leon Sterling y Ehud Shapiro , El arte de Prolog: Técnicas avanzadas de programación , 1994, ISBN 0-262-19338-8.
  • David HD Warren, Luis M. Pereira y Fernando Pereira, Prolog: el lenguaje y su implementación en comparación con Lisp. Archivo del Boletín ACM SIGART, número 64. Actas del simposio de 1977 sobre inteligencia artificial y lenguajes de programación, págs. 109-115.
  • Logotipo de WikibooksPrólogo en Wikilibros