Prólogo


De Wikipedia, la enciclopedia libre
  (Redirigido desde PROLOG )
Saltar a navegación Saltar a búsqueda

Prolog es una programación lógica idioma asociado a la inteligencia artificial y la lingüística computacional . [1] [2] [3]

Prolog tiene sus raíces en la lógica de primer orden , una lógica formal , ya diferencia de muchos otros lenguajes de programación , Prolog está concebido principalmente como una programación declarativa idioma: la lógica del programa se expresa en términos de relaciones , representadas como hechos y reglas . Un cómputo se inicia mediante la ejecución de una consulta sobre estas relaciones. [4]

El lenguaje fue desarrollado e implementado en Marsella, Francia, en 1972 por Alain Colmerauer con Philippe Roussel, basado en Robert Kowalski interpretación procedimental 's de cláusulas de Horn . [5] [6]

Prolog fue uno de los primeros lenguajes de programación lógica [7] y sigue siendo el más popular de este tipo de lenguaje de hoy, con varias implementaciones libres y comerciales disponibles. El lenguaje se ha utilizado para demostración de teoremas , [8] sistemas expertos , [9] término reescritura , [10] sistemas de tipo , [11] y de planificación automática , [12] , así como su originales previstos campo de uso, procesamiento del lenguaje natural . [13] [14] entornos Modern Prolog apoyar la creación de interfaces gráficas de usuario, Así como aplicaciones administrativas y en red.

Prolog es muy adecuado para las tareas específicas que se benefician de consultas lógicas basadas en reglas, tales como búsqueda de bases de datos , control de voz sistemas y plantillas de llenado.

Sintaxis y semántica

En Prolog, la lógica del programa se expresa en términos de relaciones, y un cómputo se inicia mediante la ejecución de una consulta sobre estas relaciones. Relaciones y consultas se construyen utilizando un solo tipo de datos de Prolog, el término . [4] Las relaciones se definen por las cláusulas . Dada una consulta, los intentos de motor Prolog para encontrar una resolución refutación de la consulta negada. Si la consulta negada puede ser refutada, es decir, una instancia para todas las variables libres se encuentra que hace que la unión de las cláusulas y el conjunto unitario que consiste en la falsa consulta negada, se deduce que la consulta original, con la creación de instancias encontrado aplica, es una consecuencia lógicaDel programa. Esto hace que Prolog (y otros lenguajes de programación lógica) particularmente útiles para la base de datos, las matemáticas simbólicas y aplicaciones de lenguaje de análisis. Debido a Prolog permite impuros predicados , comprobando el valor de verdad de ciertos predicados especiales puede tener cierta deliberada de efectos secundarios , tales como la impresión de un valor de la pantalla. Debido a esto, el programador está permitido utilizar cierta cantidad de convencionales de programación imperativo cuando el paradigma lógico es inconveniente. Tiene un subconjunto puramente lógico, llamado "pura Prolog", así como una serie de características extralógicos.

Tipos de datos

Única de Prolog tipo de datos es el término . Términos son o bien átomos , los números , las variables o términos compuestos .

  • Un átomo es un nombre de uso general sin un significado inherente. Ejemplos de átomos incluyen x, red, 'Taco', y 'some atom'.
  • Los números pueden ser flotantes o enteros . Prolog sistemas compatibles estándar ISO pueden comprobar la bandera Prolog "acotada". La mayoría de los principales sistemas de Prolog admiten números longitud entero arbitrario.
  • Las variables se indican mediante una cadena que consta de letras, números y caracteres de subrayado, y comenzando con una letra mayúscula o subrayado. Las variables se parecen mucho a las variables en la lógica de que son marcadores de posición para los términos arbitrarios.
  • Un término compuesto se compone de un átomo llamado un "funtor" y un número de "argumentos", que son de nuevo términos. Términos compuestos se escriben normalmente como un funtor seguido de una lista separada por comas de términos de argumentos, que figura entre paréntesis. El número de argumentos se llama el término de aridad . Un átomo puede ser considerado como un término compuesto con aridad cero. Un ejemplo de un 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 por corchetes con los términos separados por comas, o en el caso de la lista vacía, por []. Por ejemplo, [1,2,3]o [red,green,blue].
  • Strings : Una secuencia de caracteres rodeada por comillas es equivalente a o bien una lista de (numéricos) códigos de caracteres, una lista de caracteres (átomos de longitud 1), o un átomo en función del valor de la bandera Prolog double_quotes. Por ejemplo "to be, or not to be",. [15]

ISO Prolog proporciona los atom/1, number/1, integer/1, y float/1predicados para tipo de comprobación . [dieciséis]

Reglas y hechos

Programas Prolog describen las relaciones, que se define por medio de cláusulas. Prolog puro se limita a cláusulas de Horn . Hay dos tipos de cláusulas: hechos y reglas. Una regla es de la forma

Cabeza  : -  Cuerpo .

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

Cláusulas con cuerpos vacíos se llaman hechos . Un ejemplo de un hecho es:

gato ( Crookshanks ).

que es equivalente a la regla:

gato ( Crookshanks )  : -  verdadera .

El predicado incorporado true/0es siempre verdad.

Dado el hecho anterior, se puede preguntar:

Crookshanks es un gato?

 ? -  gato ( Crookshanks ).  

lo que las cosas son gatos?

 ? -  gato ( X ).  X  =  Crookshanks

Cláusulas con cuerpos se denominan reglas . Un ejemplo de una regla es:

animales ( X )  : -  gato ( X ).

Si añadimos que la regla y nos preguntamos qué cosas son animales?

 ? -  animales ( X ).  X  =  Crookshanks

Debido a la naturaleza relacional de muchos incorporado en los predicados, pueden ser utilizados normalmente en varias direcciones. Por ejemplo, length/2se puede utilizar para determinar la longitud de una lista ( length(List, L), dada una lista List), así como para generar una lista esqueleto de una longitud dada ( length(X, 5)), y también para generar tanto esqueletos de lista y sus longitudes juntos ( length(X, L)). Del mismo modo, append/3se puede utilizar tanto para anexar dos listas ( append(ListA, ListB, X)listas dadas ListAy ListB), así como para dividir una lista dada en partes ( append(X, Y, List), dada una lista List). Por esta razón, un relativamente pequeño conjunto de predicados de la biblioteca es suficiente para muchos programas Prolog.

Como un lenguaje de propósito general, Prolog también proporciona varios incorporado en los predicados para llevar a cabo las actividades de rutina como de entrada / salida , el uso de gráficos y de lo contrario se comunica con el sistema operativo. Estos predicados no se les da un significado relacional y sólo son útiles para los efectos secundarios que exhiben en el sistema. Por ejemplo, el predicado write/1muestra un término en la pantalla.

Ejecución

La ejecución de un programa Prolog es iniciado por la publicación del usuario de un solo objetivo, llamada la consulta. Lógicamente, el motor Prolog trata de encontrar una resolución refutación de la consulta negada. El método de resolución utilizada por Prolog se llama resolución SLD . Si la consulta negada puede ser refutada, se deduce que la consulta, con las asociaciones de variables adecuadas en su lugar, es una consecuencia lógica del programa. En ese caso, todas las asociaciones de variables generadas se notifican al usuario, y se dice que la consulta haber tenido éxito. Operativamente, la estrategia de ejecución de Prolog se puede considerar como una generalización de las llamadas a funciones en otros idiomas, un solo ser diferencia de que múltiples cabezas cláusula puede coincidir con una llamada determinada. En ese caso, el sistema crea una opción de punto, unificael objetivo con la cabeza de la cláusula de la primera alternativa, y continúa con los objetivos de esta primera alternativa. Si falla cualquier objetivo en el curso de la ejecución del programa, todas las asociaciones de variables que se hicieron desde la creación de la más reciente elección de punto se deshacen, y la ejecución continúa con la siguiente alternativa de que la elección de punto. Esta estrategia de ejecución se denomina retroceso cronológico . Por ejemplo:

madre_hijo ( trude ,  sally ). padre_hijo ( tom ,  sally ). padre_hijo ( tom ,  erica ). father_child ( mike ,  tom ). hermano ( X ,  Y )  : -  parent_child ( Z ,  X ),  parent_child ( Z ,  Y ). parent_child ( X ,  Y )  : -  father_child ( X ,  Y ). parent_child ( X ,  Y )  : -  mother_child ( X ,  Y ).

Esto da como resultado que la siguiente consulta se evalúe como verdadera:

 ? -  hermano ( Sally ,  Erica ).  

Esto se obtiene como sigue: Inicialmente, la cláusula de la cabeza solamente a juego para la consulta sibling(sally, erica)es la primera uno, así demostrando la consulta es equivalente a probar el cuerpo de dicha cláusula con los enlaces apropiados variables en lugar, es decir, la conjunción (parent_child(Z,sally), parent_child(Z,erica)). El siguiente objetivo a ser probado es el más a la izquierda de esta conjunción, es decir, parent_child(Z, sally). Dos cabezas cláusula coincide con este objetivo. El sistema crea un punto de elección y prueba la primera alternativa, de quién es el cuerpo father_child(Z, sally). Este objetivo se puede demostrar utilizando el hecho de father_child(tom, sally), por lo que la unión Z = tomse genera, y el siguiente objetivo a ser probada es la segunda parte de la conjunción arriba:parent_child(tom, erica). De nuevo, esto puede ser demostrado por el hecho correspondiente. Dado que todos los objetivos pueden ser probadas, la consulta tiene éxito. Dado que la consulta no contiene variables, no se informa al usuario de enlaces. Una consulta con variables, como:

? -  father_child ( padre ,  hijo ).

enumera todas las respuestas válidas en retroceso.

Tenga en cuenta que con el código como se ha dicho, la consulta ?- sibling(sally, sally).también tiene éxito. Uno podría insertar objetivos adicionales para describir las restricciones pertinentes, si así se desea.

Bucles y recursividad

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

Negación

El built-in Prolog predicado \+/1ofrece la negación como el fracaso , lo que permite no monótona razonamiento. El objetivo \+ illegal(X)de la regla

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

se evaluó como sigue: Prolog intentos para probar illegal(X). Si se puede encontrar una prueba para ese objetivo, el objetivo original (es decir, \+ illegal(X)) falla. Si hay prueba se puede encontrar, la meta original tiene éxito. Por lo tanto, el \+/1operador de prefijo se llama el operador "no es demostrable", ya que la consulta ?- \+ Goal.tiene éxito si el objetivo no es demostrable. Este tipo de negación es sonido si su argumento es "tierra" (es decir, no contiene variables). Solidez se pierde si el argumento contiene variables y el procedimiento de prueba está completa. 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, código de carga se conoce como consulta . Prolog se puede utilizar de forma interactiva mediante la introducción de consultas en el indicador de Prolog ?-. Si no hay solución, Prolog escribe no. Si existe una solución después de su impresión. Si hay varias soluciones a la consulta, entonces estos pueden ser solicitados mediante la introducción de un punto y coma ;. Hay directrices sobre buenas prácticas de programación para mejorar la eficiencia del código, la legibilidad y facilidad de mantenimiento. [18]

He aquí algunos ejemplos de programas escritos en Prolog.

Hola Mundo

Un ejemplo de una consulta:

? -  escribir ( '¡Hola mundo!' ),  nl . Hola  mundo ! verdad .? -

Optimización del compilador

Cualquier cálculo se puede expresar de forma declarativa como una secuencia de transiciones de estado. Como un ejemplo, un compilador de optimización con tres pases de optimización podría ser implementado como una relación entre un programa inicial y su forma optimizada:

program_optimized ( PROG0 ,  Prog )  : -  optimization_pass_1 ( PROG0 ,  Prog1 ),  optimization_pass_2 ( Prog1 ,  Prog2 ),  optimization_pass_3 ( Prog2 ,  Prog ).

o equivalentemente usando DCG notación:

program_optimized  ->  optimization_pass_1 ,  optimization_pass_2 ,  optimization_pass_3 .

Ordenación rápida

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

partición ([],  _ ,  [],  []). partición ([ X | Xs ],  pivote ,  Smalls ,  Bigs )  : -  (  X  @ <  Pivote  ->  Smalls  =  [ X | Rest ],  partición ( Xs ,  pivote ,  Rest ,  Bigs )  ;  Bigs  =  [ X | Rest ],  partición ( Xs ,  pivote,  Smalls ,  Rest )  ). ordenación rápida ([])  ->  []. quicksort ([ X | X ])  ->  {  partición ( X ,  X ,  más pequeño ,  más grande )  },  ordenación rápida ( más pequeño ),  [ X ],  la clasificación rápida ( más grande ).

Los patrones de diseño de Prolog

Un patrón de diseño es una solución reutilizable general a un problema que se produce comúnmente en el diseño de software . Algunos patrones de diseño en Prolog son esqueletos, técnicas, [19] [20] clichés, [21] esquemas programa, [22] descripción lógica esquemas, [23] y más altos de programación orden . [24]

la programación de orden superior

Un predicado de orden superior es un predicado que toma uno o más de otros predicados como argumentos. Aunque el apoyo para la programación de orden superior toma Prolog fuera del dominio de la lógica de primer orden, que no permite la cuantificación sobre los predicados, [25] ISO Prolog tiene ahora algunos incorporado en los predicados de orden superior, tales como call/1, call/2, call/3, findall/3, setof/3, y bagof/3. [26] Además, puesto que los objetivos arbitrarias Prolog pueden ser construidos y evaluados en tiempo de ejecución, es fácil para escribir predicados de orden superior como maplist/2, que se aplica un predicado arbitraria a cada miembro de una lista dada, y sublist/3, que filtra los elementos que satisfacen un predicado dado, además de facilitar la currying . [24]

Para convertir soluciones de representación temporal (sustituciones respuesta en retroceso) para la representación espacial (términos), Prolog tiene varias soluciones todo-predicados que recogen todas las sustituciones de respuesta de una consulta dada en una lista. Esto puede ser usado para la comprensión de lista . 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 , T , D ),  N  mod  D  =: =  0 ),  Ds ),  ListaSuma ( Ds ,  N ).

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

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

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

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

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

Módulos

Para programar en el intestino , Prolog proporciona un sistema de módulos . El sistema de módulos está estandarizado por ISO. [27] Sin embargo, no todos los compiladores de Prolog soportan módulos, y hay problemas de compatibilidad entre los sistemas de módulos de los principales compiladores de Prolog. [28] En consecuencia, módulos escritos en un compilador de Prolog no necesariamente funciona en otros.

Analizando

Existe una notación especial llamada gramáticas de cláusulas definidas (DCG). Una regla definida a través -->/2en lugar de :-/2se expande por el preprocesador ( expand_term/2un análogo facilidad para macros en otros idiomas) de acuerdo con algunas sencillas reglas de reescritura, lo que resulta en las cláusulas Prolog ordinarios. Más notablemente, la reescritura equipa el predicado con dos argumentos adicionales, que pueden ser utilizados para enhebrar implícitamente estado alrededor, [ aclaración necesaria ] análogas a las mónadas en otros idiomas. DCG se utilizan a menudo para analizadores de escritura o generadores de lista, ya que también proporcionan una interfaz conveniente a las listas de diferencia.

Meta-intérpretes y reflexión

Prolog es un homoiconic idiomas y ofrece muchas instalaciones para la reflexión . Su estrategia de ejecución implícita hace posible escribir concisa meta-circular evaluador (también llamado meta-intérprete ) para el código Prolog puro:

resolver ( verdadera ). resolver (( Subgoal1 , Subgoal2 ))  : -  resolver ( Subgoal1 ),  resolver ( Subgoal2 ). resolver ( la cabeza )  : -  cláusula ( cabeza ,  cuerpo ),  resolver ( cuerpo ).

donde truerepresenta un conjunto vacío, 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í mismas secuencias de términos Prolog ( :-/2es un infijo operador ) que se leen y se inspecciona usando mecanismos incorporados (como fácilmente read/1), es posible escribir intérpretes a medida que aumentan Prolog con las características específicas de dominio. Por ejemplo, Sterling y Shapiro presentan un meta-intérprete que realiza razonamiento con incertidumbre, reproducen aquí con ligeras modificaciones: [29] : 330 

resolver ( verdadera ,  1 )  : -  !. resolver (( Subgoal1 , Subgoal2 ),  Certeza )  : -  !,  resolver ( Subgoal1 ,  Certainty1 ),  resolver ( Subgoal2 ,  Certainty2 ),  La certeza  es  min ( Certainty1 ,  Certainty2 ). resolver ( Objetivo ,  1 )  : -  incorporado ( Objetivo ),  !,  Objetivo. resolver ( Cabeza ,  Certeza )  : -  clause_cf ( cabeza ,  cuerpo ,  Certainty1 ),  resolver ( Cuerpo ,  Certainty2 ),  La certeza  es  Certainty1  *  Certainty2 .

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

incorporado ( A  es  B ). incorporado ( lea ( X )). %, Etc.

y cláusulas representados como clause_cf(Head, Body, Certainty). Teniendo en cuenta esos, que puede ser llamado 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 primer orden lógica de predicados , cláusulas de Horn , que es Turing completo . Turing integridad de Prolog puede demostrarse mediante su uso para simular una máquina de Turing:

turing ( Tape0 ,  Tape )  : -  realizar ( q0 ,  [],  Ls ,  tape0 ,  Rs ),  inversa ( Ls ,  Ls1 ),  append ( Ls1 ,  Rs ,  de cinta ). 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 )),  la acción ( Acción ,  LS0 , LS1 ,  [ NewSym | RsRest ],  Rs1 ),  realizar ( Q1 ,  Ls1 ,  Ls ,  Rs1 ,  Rs ). símbolo ([],  b ,  []). símbolo ([ Sym | R ],  Sym ,  Rs ). acción ( izquierda ,  LS0 ,  Ls ,  Rs0 ,  Rs )  : -  izquierda ( LS0 ,  Ls ,  Rs0 ,  Rs ). acción ( estancia ,  Ls ,  Ls ,  Rs ,  Rs ). acción ( derecha ,  LS0 ,  [ Sym | LS0 ],  [ Sym | R ],  Rs ). izquierdo ([],  [],  Rs0 ,  [ b | Rs0 ]). izquierda ([ L | Ls ],  Ls ,  Rs ,  [ L | R ]).

Una máquina de Turing ejemplo sencillo es especificada por los hechos:

regla ( q 0 ,  1 ,  q 0 ,  1 ,  derecha ). regla ( q0 ,  b ,  QF ,  1 ,  estancia ).

Este rendimiento de la máquina de incremento por uno de un número en la codificación unaria: Se bucles sobre cualquier número de células "1" y agrega un adicional de "1" al final. Ejemplo consulta y resultado:

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

Esto ilustra cómo cualquier cálculo se puede expresar de forma declarativa como una secuencia de transiciones de estado, ejecutado en Prolog como una relación entre estados sucesivos de interés.

Implementación

ISO Prolog

La ISO estándar Prolog consta de dos partes. ISO / IEC 13211-1, [26] [30] publicado en 1995, tiene como objetivo estandarizar las prácticas existentes de las muchas implementaciones de los elementos centrales de Prolog. Ha aclarado aspectos del lenguaje que antes eran ambiguos y conduce a programas portátiles. Hay tres correcciones: Cor.1: 2007, [31] Cor.2: 2012, [32] y Cor.3: 2017. [33] ISO / IEC 13211-2, [26] publicado en 2000, añade soporte para los módulos a la norma. El estándar se mantiene por la ISO / IEC JTC1 / SC22 / WG17 [34] grupo de trabajo. ANSI X3J17 es el Grupo Asesor Técnico de EE. UU. Para el estándar.[35]

Compilacion

Para una mayor eficacia, el código Prolog está normalmente compilado a código máquina abstracta, a menudo influenciado por el registro basado en Warren Abstract Machine conjunto de instrucciones (WAM). [36] Algunas implementaciones emplean interpretación abstracta de tipo derivar y la información del modo de predicados en tiempo de compilación, o la compilación de código de máquina real para un alto rendimiento. [37] idear métodos de implementación eficiente para el código Prolog es un campo de investigación activo en la comunidad de programación lógica, y se emplean diversos otros métodos de ejecución en algunas implementaciones. Estos incluyen binarización cláusula y máquinas virtuales basadas pila . [ cita requerida ]

Recursión de cola

Sistemas Prolog típicamente poner en práctica un método de optimización bien conocido llamado optimización llamada cola (TCO) para predicados determinísticos que exhiben la recursión de cola o, más generalmente, las llamadas de la cola: marco de pila A de la cláusula se descarta antes de realizar una llamada en una posición de la cola. Por lo tanto, los predicados recursivos de cola deterministas se ejecutan con un espacio de pila constante, como los bucles en otros lenguajes.

indexación plazo

Encontrar cláusulas que son unificables con un término en una consulta es lineal en el número de cláusulas. Indexación plazo utiliza una estructura de datos que permite a los sub-tiempo lineal búsquedas. [38] La indexación sólo afecta el rendimiento del programa, que no afecta a la semántica. La mayoría de los prólogos sólo utilizan la indexación en el primer plazo, como la indexación de todos los términos es caro, pero las técnicas basadas en palabras codificadas en campo o superpuestas palabras de código proporcionan una rápida indexación a través de la consulta completa y la cabeza. [39] [40]

Hashing

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

presentación

Algunos sistemas Prolog, ( B-Prolog , XSB , SWI-Prolog , YAP , y Ciao ), implementan una memoization método llamado presentación , que libera al usuario de almacenar manualmente los resultados intermedios. La presentación es una compensación entre el espacio y el tiempo ; tiempo de ejecución se puede reducir mediante el uso de más memoria para almacenar resultados intermedios: [41] [42]

Sub-objetivos se encuentran en una evaluación de la consulta se mantienen en una mesa, junto con respuestas a estas sub-objetivos. Si se re-encontró con un sub-objetivo, la evaluación vuelve a utilizar la información de la tabla en lugar de volver a realizar resolución en contra de las cláusulas del programa. [43]

Tabling puede extenderse en varias direcciones. Puede soportar predicados recursivos través SLG resolución o presentación lineal. En un sistema multi-hilo Prolog informe vencerá resultados podrían mantenerse en privado a un hilo o compartidos por todos los hilos. Y en presentación incrementales, presentación 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. [44] [45] [46] Además, Prolog tiene una serie de propiedades que pueden permitir que la velocidad a través de la ejecución en paralelo. [47] Un enfoque más reciente ha sido para compilar programas Prolog restringidas a una matriz de puertas programable en campo . [48] Sin embargo, un rápido progreso en el hardware de propósito general ha superado consistentemente las arquitecturas más especializados.

Sega implementado Prolog para su uso con la Sega AI ordenador, lanzado para el mercado japonés en 1986. Prolog se utilizó para la lectura de lenguaje natural entradas, en el idioma japonés , a través de una pantalla táctil. [49]

Limitaciones

Aunque Prolog es ampliamente utilizado en la investigación y la educación, [ cita requerida ] Prolog y otros lenguajes de programación lógica no han tenido un impacto significativo en la industria de la informática en general. [50] La mayoría de las aplicaciones son pequeñas para los estándares industriales, con pocas superior a 100.000 líneas de código. [50] [51] programación en el grande se considera que es complicado porque no todos los compiladores de Prolog soportan módulos, y hay problemas de compatibilidad entre los sistemas de módulos de los principales compiladores de Prolog. [28] Portabilidad de código Prolog a través de implementaciones también ha sido un problema, pero los acontecimientos ocurridos desde 2007 han significado: "la portabilidad dentro de la familia de Edimburgo / Quinto deriva implementaciones Prolog es lo suficientemente bueno para permitir el mantenimiento de las aplicaciones del mundo real portátiles." [52]

El software desarrollado en Prolog ha sido criticado por tener una penalización de alto rendimiento en comparación con los lenguajes de programación convencionales. En particular, la estrategia de evaluación no determinista de Prolog puede ser problemático cuando se programan los cálculos deterministas, o cuando incluso el uso de "no me importa no determinismo" (donde una sola elección se hace en lugar de dar marcha atrás sobre todas las posibilidades). Los cortes y otras construcciones del lenguaje pueden tener que ser utilizado para lograr el rendimiento deseado, destruyendo uno de los principales atractivos de Prolog, la posibilidad de ejecutar programas de "atrás y hacia delante". [53]

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

Extensiones

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

Tipos

Prolog es un lenguaje sin tipo. Los intentos de introducir tipos se remontan a la década de 1980, [56] [57] ya partir de 2008 todavía hay intentos de ampliar Prolog con tipos. [58] La información de tipos es útil no solo para la seguridad de tipos sino también para razonar sobre los programas Prolog. [59]

Modos

La sintaxis de Prolog no especifica qué argumentos de un predicado son entradas y salidas de los cuales son. [60] Sin embargo, esta información es importante y se recomienda que se incluya en los comentarios. [61] modos proporcionan información valiosa cuando se razona sobre los programas Prolog [59] y también se puede utilizar para acelerar la ejecución. [62]

Restricciones

Programación lógica limitación se extiende Prolog para incluir los conceptos de satisfacción de restricciones . [63] [64] programa de lógica de restricción A permite limitaciones en el cuerpo de las cláusulas, tales como: A(X,Y) :- X+Y>0. Se adapta a gran escala de optimización combinatoria problemas [65] y es por tanto útil para aplicaciones en entornos industriales, tales como tiempo-mesas automatizado y la programación de la producción . La mayoría de sistemas Prolog se envían con al menos una restricción solucionador de dominios finitos, ya menudo también con solucionadores de otros dominios como números racionales.

La orientación a objetos

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

Logtalk es un lenguaje de programación orientado a objetos de lógica que puede utilizar la mayoría de las implementaciones Prolog como un compilador de fondo. Como un lenguaje multi-paradigma, que incluye soporte para ambos prototipos y clases.

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

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

Prolog ++ fue desarrollado por la lógica de programación Associates y editado por primera vez en 1989 para MS-DOS PCs. Se agregó el soporte para otras plataformas, y una segunda versión fue lanzada en 1995. Un libro sobre Prolog ++ por Chris Moss fue publicado por Addison-Wesley en 1994.

Visual Prolog es un lenguaje multi-paradigma con interfaces, clases, implementaciones y expresiones de objetos.

Gráficos

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

Concurrencia

Prolog-MPI es un código abierto SWI-Prolog extensión para computación distribuida sobre el paso de mensajes de interfaz . [67] También hay varios lenguajes de programación Prolog concurrentes. [68]

Programación web

Algunas implementaciones Prolog, en particular Visual Prolog , SWI-Prolog y Ciao , el apoyo del lado del servidor de programación web con soporte para protocolos web, HTML y XML . [69] También hay extensiones para soportar la web semántica formatos como RDF y OWL . [70] [71] Prolog también se ha sugerido como del lado del cliente lenguaje. [72] Además Visual Prolog apoya JSON-RPC y websockets .

Adobe Flash

Cedar es un intérprete de Prolog básica y gratuita. A partir de la versión 4 y por encima de cedro tiene un soporte FCA (Flash Cedar App). Esto proporciona una nueva plataforma para la programación en Prolog a través de ActionScript .

Otro

  • F-lógica extiende Prolog con frames / objetos para la representación del conocimiento .
  • Lógica Transacción extiende Prolog con una teoría lógica de los operadores de actualización de cambio de estado. Tiene tanto un modelo de teoría de la semántica y de procedimiento.
  • OW Prolog ha sido creado con el fin de responder a la falta de gráficos y la interfaz de Prolog.

Interfaces con otros idiomas

existen marcos que puede tender un puente entre el prólogo y otros idiomas:

  • El LPA Server Intelligence permite la incorporación de LPA Prolog para Windows en C, C #, C ++, Java, Visual Basic, Delphi, .Net, Lua, Python y otros lenguajes. Se explota el tipo de datos de cadena dedicada que proporciona LPA Prolog
  • La API de Logic Server permite tanto la extensión como la incrustación de Prolog en C, C ++, Java, VB, Delphi, .NET y cualquier lenguaje / entorno que pueda llamar a .dll o .so. Se implementa para Amsi! Prolog Amzi! Prolog + lógica del servidor pero la especificación API pueden estar disponibles para cualquier aplicación.
  • JPL es un puente de Java Prolog bidireccional que se suministra con SWI-Prolog por defecto, permitiendo Java y Prolog a llamar a los demás (de forma recursiva). Se sabe que tienen un buen soporte de concurrencia y está en desarrollo activo.
  • InterProlog , un puente de biblioteca de programación entre Java y Prolog, que implementa llamadas bidireccionales de predicado / método entre ambos lenguajes. Objetos de Java pueden ser mapeadas en términos Prolog y viceversa. Permite el desarrollo de GUI y otras funcionalidades en Java mientras deja el procesamiento lógico en la capa Prolog. Soportes XSB , con soporte para SWI-Prolog y YAP previsto para 2013.
  • Prova proporciona una integración nativa con la sintaxis de las reglas de Java, mensajería agente y de reacción. Prova se posiciona como un sistema de scripting basado en reglas (RBS) para el middleware. El lenguaje abre un nuevo camino en la combinación imperativa y programación declarativa .
  • PROL motor de un ojo de Prolog para Java. Incluye una pequeña IDE y algunas bibliotecas.
  • GNU Prolog para Java es una implementación de la norma ISO Prolog como una biblioteca de 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 (administrado) C #. Se puede integrar fácilmente en programas de C #. Características: intérprete fiable y bastante rápido, la interfaz de línea de comandos, Windows-interfaz, incorporadas DCG, XML predicados, SQL-predicados, extensibles. El código fuente completo está disponible, incluido un generador de analizador que se puede utilizar para agregar extensiones de propósito especial.
  • Un Warren Abstract Machine para PHP un prólogo compilador e intérprete de PHP 5.3. Una biblioteca que se puede utilizar independiente o en el marco Symfony2.1 que fue traducida a partir de Stephan Buettcher trabajo en Java que se puede encontrar [aquí Stefan .buettcher .org / cs / WAM / index .html ]
  • tuProlog es un sistema de Prolog de peso ligero para aplicaciones e infraestructuras distribuidas, diseñado intencionalmente alrededor de un núcleo mínimo, para ser estática o dinámicamente configurado por las bibliotecas de carga / descarga de predicados. tuProlog soporta de forma nativa la programación multi-paradigma, proporcionando un modelo de integración limpio, sin fisuras entre Prolog y principales idiomas, a saber orientados a objetos Java, para la versión tuProlog de Java, y cualquier lenguaje basado en .NET (C #, C # ..), para tuProlog. Versión .NET. [73]

Historia

El nombre Prolog fue elegido por Philippe Roussel como abreviatura de programación en logique ( Francés para la programación de la lógica ). Fue creado alrededor de 1972 por Alain Colmerauer con Philippe Roussel, basado en Robert Kowalski interpretación procedimental 's de cláusulas de Horn . Fue motivada en parte por el deseo de reconciliar el uso de la lógica como un lenguaje de representación del conocimiento declarativo con la representación procesal de conocimiento que fue muy popular en América del Norte a finales de 1960 y principios de 1970. De acuerdo con Robert Kowalski, El primer sistema de Prolog fue desarrollado en 1972 por Colmerauer y Phillipe Roussel. [5] La primera implementación de Prolog fue un intérprete escrito en Fortran por Gerard Battani y Henri Meloni. David HD Warren tomó esta intérprete a Edimburgo, y hay en marcha un front-end alternativo, que llegó a definir la sintaxis “Edinburgh Prolog” utilizado por la mayoría de las implementaciones modernas. Warren también implementó el primer compilador de Prolog, creando el influyente DEC-10 Prolog en colaboración con Fernando Pereira. Warren generalizado más adelante las ideas detrás de DEC-10 Prolog, para crear el extracto de la máquina Warren .

Los investigadores europeos de inteligencia artificial favorecieron a Prolog, mientras que los estadounidenses favorecieron a Lisp , lo que supuestamente provocó muchos debates nacionalistas sobre los méritos de los idiomas. [74] Gran parte del desarrollo moderno de Prolog vinieron del impulso del proyecto de Sistemas de Computación de quinta generación (de FGCS), que desarrolló una variante de Prolog llamado Kernel Idioma para su primer sistema operativo .

Pure Prolog estaba originalmente restringido 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 de las golosinas teorema-prover tales cláusulas como procedimientos:

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

Pure Prolog se extendió pronto, sin embargo, para incluir la negación como fracaso , en la que las condiciones negativas de la forma no (B i ) se muestran por tratar y de no resolver las condiciones positivas correspondientes B i .

Las posteriores extensiones de Prolog por parte del equipo original introdujeron habilidades de programación lógica de restricciones en las implementaciones.

Uso en la industria

Prolog se ha utilizado en Watson . Watson utiliza el software de IBM y DeepQA el Apache UIMA marco (no estructurada Gestión de la Información Arquitectura). El sistema fue escrito en varios lenguajes, como Java, C ++, y Prolog, y se ejecuta en el SUSE Linux Enterprise Server sistema operativo 11 usando Apache Hadoop Marco de Suministro de computación distribuida. Prolog se utiliza para la coincidencia de patronesmás de árboles de análisis sintáctico del lenguaje natural. Los desarrolladores han declarado: ". Necesitábamos un idioma en el que podríamos convenientemente expresar reglas de coincidencia de patrones a través de los árboles de análisis y otras anotaciones (como resultado el reconocimiento de entidades con nombre), y una tecnología que podría ejecutar estas reglas de manera muy eficiente Encontramos que Prolog era la opción ideal para la lengua debido a su simplicidad y expresividad ". [14] Prolog se está utilizando en la plataforma de desarrollo Low-Code GeneXus , que se centra en la IA. [75] [ circular referencia ] de código abierto base de datos de gráfico TerminusDB se implementa en Prolog. [76] TerminusDB está diseñada para la construcción en colaboración y curatinggráfico de conocimiento .

Ver también

  • Comparación de las implementaciones Prolog
  • Modelado lógico-lingüística . Un método para la construcción de un sistema basado en el conocimiento que utiliza Prolog.
  • Respuesta de programación conjunto . Un enfoque totalmente declarativo a la programación lógica.
  • Asociación para la programación lógica

Idiomas relacionados

  • El Gödel lenguaje es una aplicación inflexible de tipos de programación lógica limitación simultánea . Está construido sobre SICStus Prolog.
  • Visual Prolog , anteriormente conocido como PDC Prolog y Turbo Prolog, es un fuertemente tipado orientado a objetos dialecto de Prolog, que es muy diferente de estándar Prolog. Como Turbo Prolog, que se comercializó por Borland, pero ahora es desarrollado y comercializado por la firma danesa PDC (Centro de Desarrollo de Prolog) que produjo originalmente.
  • Registro de datos es un subconjunto de Prolog. Se limita a las relaciones que pueden ser estratificados y no permite que los términos compuestos. En contraste con Prolog, registro de datos no es Turing completo .
  • El mercurio es una rama de Prolog orientada hacia la ingeniería de software en el grande con una estática, sistema de tipo polimórfico, así como un sistema de modalidad y el determinismo.
  • GraphTalk es una implementación patentada de la máquina abstracta de Warren, con propiedades adicionales orientadas a objetos.
  • En cierto modo [ ¿cuál? ] Prolog es un subconjunto del planificador . Las ideas de Planner se desarrollaron más adelante más en la Comunidad Científica metáfora .
  • AgentSpeak es una variante de Prolog para programar el comportamiento del agente en sistemas multi-agente .
  • Erlang nació con una implementación basada en Prolog y mantiene gran parte de la sintaxis basada en unificación de Prolog.
  • Pilog es un lenguaje declarativo construido sobre PicoLisp , que tiene la semántica de Prolog, pero usa la sintaxis de Lisp.

Referencias

  1. ^ Clocksin, 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 la 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 los programadores de Prolog . Englewood Cliffs, Nueva Jersey: Prentice Hall. ISBN 978-0-13-629213-5.
  4. ^ Un b Lloyd, JW (1984). Fundamentos de la programación lógica . Berlín: Springer-Verlag. ISBN 978-3-540-13299-8.
  5. ^ Un b 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 .  
  6. ^ Colmerauer, A .; Roussel, P. (1993). "El nacimiento de Prolog" (PDF) . Avisos ACM SIGPLAN . 28 (3): 37. doi : 10.1145 / 155360.155362 .
  7. ^ Véase la lógica de programación § Historia .
  8. ^ Stickel, ME (1988). "Una tecnología prólogo teorema de prover: Aplicación por un compilador de Prolog extendida". Journal of Automated Razonamiento . 4 (4): 353-380. CiteSeerX 10.1.1.47.3057 . doi : 10.1007 / BF00297245 . S2CID 14621218 .  
  9. ^ Merritt, Dennis (1989). La construcción de sistemas expertos en Prolog . Berlín: Springer-Verlag. ISBN 978-0-387-97016-5.
  10. ^ Felty, Amy. "Un enfoque de programación lógica para implementar término de orden superior reescritura." Extensiones de la programación lógica (1992): 135-161.
  11. ^ Kent D. Lee (19 de enero de 2015). Fundamentos de Lenguajes de Programación . Saltador. págs. 298–. ISBN 978-3-319-13314-0.
  12. ^ Ute Schmid (21 de agosto de 2003). Inductiva Síntesis de programas funcionales: Planificación universal, plegable de Finito Programas y Esquema Abstracción por analógico Razonamiento . Springer Science & Business Media. ISBN 978-3-540-40174-2.
  13. ^ Fernando CN Pereira ; Stuart M. Shieber (2005). Prólogo y Análisis del Lenguaje Natural . Micrótomo.
  14. ^ Un b Adam Lally; Paul Fodor (31 de marzo de 2011). "Procesamiento del Lenguaje Natural Con prólogo en el Sistema IBM Watson" . Asociación para la programación lógica.Ver también Watson (ordenador) .
  15. ^ ISO / IEC 13211-1: 1995 Prolog, 6.3.7 - Términos doble notación lista citado. Organización Internacional de Normalización , Ginebra.
  16. ^ Verificar el tipo de un plazo - SWI-Prolog
  17. ^ Carlsson, Mats (27 de mayo de 2014). SICStus Prolog Manual del usuario 4.3: documentación de referencia Core . BoD - Libros a pedido. ISBN 9783735737441 - a través de Google Books.
  18. ^ Covington, Michael A .; Bagnara, Roberto; O'Keefe, Richard A. ; Wielemaker, Jan; Precio, Simon (2011). "Reglas 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 438.363 . 
  19. ^ Kirschenbaum, M .; Sterling, LS (1993). "La aplicación de técnicas de esqueletos". La construcción de programas lógicos, (Ed. Jacquet JMJ) : 27-140. CiteSeerX 10.1.1.56.7278 . 
  20. ^ Sterling, León (2002). "Patrones de Prolog Programación". Lógica Computacional: programación lógica y más allá . Lecture Notes in Computer Science / Lecture Notes in Artificial Intelligence. 2407 . pp. 17-26. doi : 10.1007 / 3-540-45628-7_15 . ISBN 978-3-540-43959-2.
  21. ^ D. Barker-Plummer. Programación de clichés en Prolog. En M. Bruynooghe, editor, Proc. Segundo Taller sobre Meta-Programación en Logic, páginas 247--256. Departamento de Comp. Sci., Katholieke Univ. Lovaina, 1990.
  22. ^ Gegg-Harrison, TS (1995). En representación de la lógica del programa Los esquemas en Prolog . Conferencia Internacional procsos Duodécimo programación lógica. pp. 467-481.
  23. ^ Deville, Yves (1990). La programación lógica: el desarrollo sistemático del programa . Wokingham, Inglaterra: Addison-Wesley. ISBN 978-0-201-17576-9.
  24. ↑ a b Naish, Lee (1996). La programación lógica de orden superior en Prolog (Informe). Departamento de Ciencias de la Computación de la Universidad de Melbourne. CiteSeerX 10.1.1.35.4505 . 
  25. ^ "Con respecto a las variables de Prolog, sólo las variables en la cabeza están implícitamente universalmente cuantificadas, y los que sólo en el cuerpo están implícitamente existencialmente cuantificados" . Consultado el 4 de mayo de 2013 .
  26. ^ Un b c ISO / IEC 13211: Tecnología de la información - Lenguajes de programación - Prolog. Organización Internacional de Normalización , Ginebra.
  27. ^ ISO / IEC 13211-2: Módulos.
  28. ^ Un b Moura, Paulo (agosto de 2004), "Logtalk" , Asociación de la programación lógica , 17 (3)
  29. ^ Un b 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.
  30. ^ A. Ed-Dbali; Deransart, Pierre; L. Cervoni (1996). Prolog: la norma: manual de referencia . Berlín: Springer. ISBN 978-3-540-59304-1.
  31. ^ "ISO / IEC 13211-1: 1995 / Cor 1: 2007 -" .
  32. ^ "ISO / IEC 13211-1: 1995 / Cor 2: 2012 -" .
  33. ^ "ISO / IEC 13211-1: 1995 / Cor 3: 2017 -" .
  34. ^ "/ IEC JTC 1 SC22 WG17 ISO" .[ enlace muerto permanente ]
  35. ^ "X3J17 y la Norma Prolog" . Archivado desde el original en 2009-08-23 . Consultado el 2009-10-02 .
  36. ^ David HD Warren. "Un conjunto de instrucciones Prólogo abstracto" . Nota Técnica 309, SRI Internacional , Menlo Park, CA, Octubre 1983.
  37. ^ Van Roy, P .; Despain, AM (1992). "Programación lógica de alto rendimiento con el compilador de Prolog Aquarius". Computadora . 25 : 54-68. doi : 10.1109 / 2.108055 . S2CID 16447071 . 
  38. ^ Graf, Peter (1995). Indexación plazo . Saltador. ISBN 978-3-540-61040-3.
  39. ^ Wise, Michael J .; Powers, David MW (1986). Indexación de las cláusulas Prolog a través de palabras de código superpuestos y Palabras campo codificados . Simposio Internacional sobre la programación lógica . pp. 203-210.
  40. ^ Colomb, Robert M. (1991). "Mejora de la unificación en PROLOG través de la cláusula de indexación" . El diario de la programación lógica . 10 : 23-44. doi : 10,1016 / 0743-1066 (91) 90004-9 .
  41. ^ Swift, T. (1999). "De Presentación de la programación no monótona". Annals of Mathematics e Inteligencia Artificial . 25 (3/4): 201-240. doi : 10.1023 / A: 1018990308362 . S2CID 16695800 . 
  42. ^ Zhou, Neng-Fa; Sato, Taisuke (2003). "Punto fijo computación eficiente en Tabling lineal" (PDF) . Actas de la 5ª Conferencia Internacional ACM SIGPLAN sobre Principios y Práctica de Programación Declarativa : 275-283.
  43. ^ Swift, T .; Warren, DS (2011). "XSB: Ampliación de Prolog con la programación lógica Tabled". Teoría y Práctica de la programación lógica . 12 (1-2): 157-187. arXiv : 1012.5123 . doi : 10.1017 / S1471068411000500 . S2CID 6.153.112 . 
  44. ^ Abe, S .; Bandoh, T .; Yamaguchi, S .; Kurosawa, K .; Kiriyama, K. (1987). "Alto rendimiento integrado procesador de Prolog IPP". Actas del simposio internacional anual de 14o en la arquitectura del ordenador - ISCA '87 . pag. 100. doi : 10.1145 / 30350.30362 . ISBN 978-0818607769. S2CID  10283148 .
  45. ^ Robinson, Ian (1986). Procesador A Prolog basado en un dispositivo de patrón de memoria a juego . Tercera Conferencia Internacional sobre la programación lógica. Apuntes de conferencias en Ciencias de la Computación. 225 . Saltador. pp. 172-179. doi : 10.1007 / 3-540-16492-8_73 . ISBN 978-3-540-16492-0.
  46. ^ Taki, K .; Nakajima, K .; Nakashima, H .; Ikeda, M. (1987). "El rendimiento y la evaluación de arquitectura de la máquina PSI". Avisos ACM SIGPLAN . 22 (10): 128. doi : 10.1145 / 36205.36195 .
  47. ^ Gupta, G .; Pontelli, E .; Ali, KAM; Carlsson, M .; Hermenegildo, MV (2001). "La ejecución paralela de programas de prólogo: una encuesta" . Transacciones ACM sobre lenguajes y sistemas de programación . 23 (4): 472. doi : 10.1145 / 504,083.504085 . S2CID 2.978.041 . 
  48. ^ "Asignado estáticamente sistemas" .
  49. ^ "El software que lleva los juegos en serio" . Nuevo científico . Información comercial de Reed . 26 de marzo de 1987. p. 34 - a través de Google Books .
  50. ^ Un b La programación lógica para el mundo real. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Actas del taller Postconference ILPS'95 sobre Visiones para el futuro de la programación lógica.
  51. ^ "Preguntas: Guía de recursos Prolog 1/2 [publicación mensual] Sección - [1-8] El Prolog 1000 de base de datos" .
  52. ^ Ene Wielemaker y Vitor Santos Costa: Portabilidad de programas Prolog: teoría y estudios de casos . CICLOPS-WLPE Workshop 2010 .
  53. ^ Un b Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Repensando Prolog . Proc. 31ª Reunión de la Sociedad Japonesa para el software de Ciencia y Tecnología.
  54. ^ Franzen, Torkel (1994), "declarativa vs procedimiento" , Asociación de la programación lógica , 7 (3)
  55. ^ Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "El poder y la complejidad expresiva de la programación lógica". Encuestas de computación ACM . 33 (3): 374-425. CiteSeerX 10.1.1.616.6372 . doi : 10.1145 / 502,807.502810 . S2CID 518.049 .  
  56. ^ Mycroft, A .; O'Keefe, RA (1984). "Un sistema de tipo polimórfico para prólogo". Inteligencia artificial . 23 (3): 295. doi : 10,1016 / 0004-3702 (84) 90017-1 .
  57. ^ Pfenning, Frank (1992). Tipos de programación lógica . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
  58. ^ Schrijvers, Tom; Santos Costa, Vitor; Wielemaker, Jan; Demoen, Bart (2008). "Hacia Typed Prolog". En María García de la Banda; Enrico Pontelli (eds.). Programación lógica: 24ª conferencia internacional, ICLP 2008, Udine, Italia, 9-13 de diciembre de 2008: actas . Apuntes de conferencias en Ciencias de la Computación. 5366 . págs. 693–697. doi : 10.1007 / 978-3-540-89982-2_59 . ISBN 9783540899822.
  59. ^ Un b KR Apt,; Marchiori, E. (1994). "Razonar sobre programas Prolog: De los modos a través de los tipos de afirmaciones" . Aspectos formales de la informática . 6 (S1): 743. CiteSeerX 10.1.1.57.395 . doi : 10.1007 / BF01213601 . S2CID 12235465 .  
  60. ^ O'Keefe, Richard A. (1990). El arte de Prolog . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
  61. ^ Michael Covington; Roberto Bagnara; et al. (2010). "Reglas de codificación para Prolog". arXiv : 0911.2899 [ cs.PL ].
  62. ^ Roy, P .; Demoen, B .; Willems, YD (1987). "Mejora de la velocidad de ejecución de Prolog compilado con modos, selección cláusula, y determinismo" . Tapsoft '87 . Apuntes de conferencias en Ciencias de la Computación. 250 . págs.  111 . doi : 10.1007 / BFb0014976 . ISBN 978-3-540-17611-4.
  63. ^ Jaffar, J. (1994). "Restricción de programación lógica: una encuesta" . El diario de la programación lógica . 19-20: 503-581. doi : 10,1016 / 0743-1066 (94) 90033-7 .
  64. ^ Colmerauer, Alain (1987). "Apertura del Prolog III Universo". Byte . Agosto.
  65. ^ Wallace, M. (2002). "Programación con restricciones lógica". Lógica Computacional: programación lógica y más allá . Apuntes de conferencias en Ciencias de la Computación. 2407 . pp. 512-556. doi : 10.1007 / 3-540-45628-7_19 . ISBN 978-3540456285.
  66. ^ "Biblioteca de gráficos XPCE" .
  67. ^ "Prólogo-MPI" . Apps.lumii.lv . Consultado el 2010-09-16 .
  68. ^ Ehud Shapiro. La familia de los lenguajes de programación lógica concurrente ACM encuestas Informática . Septiembre de 1989.
  69. ^ 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 5.404.048 .  
  70. ^ Ene Wielemaker y Michiel Hildebrand y Jacco van Ossenbruggen (2007), S. Heymans; A. Polleres; E. Ruckhaus; D. Pearse; G. Gupta (eds.), "Uso de Prolog {} como fundamento para aplicaciones en la web semántica" (PDF) , Actas de la segunda sobre las aplicaciones de la programación lógica y a la Web Semántica, Internet y servicios de Web Semántica , CEUR taller de Actas, Oporto, Portugal: CEUR-WS.org, 287 , pp 84-98.
  71. ^ Procesamiento OWL2 ontologías utilizando Thea: una aplicación de la programación lógica . Vangelis Vassiliadis, Jan Wielemaker y Chris Mungall. Actas del quinto taller internacional sobre OWL: experiencias y direcciones (OWLED 2009), Chantilly, VA, Estados Unidos, 23 al 24 de octubre de 2009
  72. ^ Loke, SW; Davison, A. (2001). "Secure código móvil 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 .  
  73. ^ "Copia archivada" . Archivado desde el original en 03/17/2019 . Consultado el 8 de junio de 2019 .CS1 maint: copia archivada como título ( enlace )
  74. ^ Pountain, Dick (octubre de 1984). "POP y SNAP" . BYTE . pag. 381 . Consultado el 23 de octubre de 2013 .
  75. ^ "Wikipedia GeneXus Página" .
  76. ^ Terminusdb / terminusdb , TerminusDB, 12/13/2020 , recuperada 15/12/2020

Otras lecturas

  • Blackburn, Patrick; Bos, Johan; Striegnitz, Kristina (2006). Learn Prolog Ahora! . ISBN 978-1-904987-17-8.
  • Ivan Bratko , Prolog Programming for Artificial Intelligence , 4a ed., 2012, ISBN 978-0-321-41746-6 . Suplementos de reserva y el código fuente [ vínculo roto permanente ] 
  • William F. Clocksin, Christopher S. Mellish: La programación en Prolog: El uso de la Norma ISO . Springer, 5ª ed., 2003, ISBN 978-3-540-00678-7 . (Esta edición se actualiza para ISO Prolog. Ediciones anteriores describieron Edinburgh Prolog.) 
  • William F. Clocksin: Cláusula y efecto. Prolog programación para el programador de trabajo . Springer, 2003, ISBN 978-3-540-62971-9 . 
  • Michael A. Covington , Donald Nute, Andre Vellino, Prolog Programación en Profundidad , 1996, ISBN 0-13-138645-X . 
  • Michael A. Covington, procesamiento del lenguaje natural para los programadores Prolog , 1994, ISBN 978-0-13-629213-5 
  • MS Dawe y CMDawe, Prolog de Ciencias Informáticas , Springer Verlag 1992.
  • ISO / IEC 13211: Tecnología de la información - Los 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. BIEN). Prólogo para programadores . Academic Press Inc. (Londres), 1985, 1987 (disponible bajo una licencia Creative Commons Licencia en sitios .google .com / sitio / prologforprogrammers / [ vínculo roto permanente ] ). ISBN 0-12-416521-4 . 
  • Richard O'Keefe , El oficio de Prolog , ISBN 0-262-15039-5 . 
  • Robert Smith, John Gibson, Aaron Sloman : 'de dos niveles soporte de la máquina virtual de Poplog de idiomas interactivos', en líneas de investigación en Ciencia Cognitiva Volumen 5: Inteligencia Artificial , Eds D. Sleeman y N. Bernsen, Lawrence Erlbaum Associates, pp 203- 231, 1992.
  • Leon Sterling y Ehud Shapiro , The Art of Prolog: Advanced Programming Techniques , 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 de ACM SIGART Boletín, Edición 64. Actas del simposio de 1977 en la inteligencia artificial y lenguajes de programación, pp 109-115.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Prolog&oldid=1057139701 "