Paradigma | Lógica |
---|---|
Diseñada por | Alain Colmerauer , Robert Kowalski |
Apareció por primera vez | 1972 |
Lanzamiento estable | Parte 1: Generalidades núcleo Edición 1 (junio de 1995 ) Parte 2: Módulos-1 edición (junio de 2000 ) |
Disciplina de mecanografía | Sin tipo (su único tipo de datos es "término") |
Extensiones de nombre de archivo | .pl , .pro ,.P |
Sitio web | Parte 1: www Parte 2: www |
Implementaciones importantes | |
B-Prolog , Ciao , Eclipse , GNU Prolog , Poplog Prolog, P # , Quinto Prolog , SICStus , fresa , SWI-Prolog , Tau Prolog , tuProlog, WIN-PROLOG , XSB , YAP . | |
Dialectos | |
ISO Prolog, Edinburgh Prolog | |
Influenciado por | |
Planificador | |
Influenciado | |
CHR , Clojure , registro de datos , Erlang , kl0 , KL1 , Mercurio , Oz , Strand , Visual Prolog , XSB | |
|
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.
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.
Ú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 .
x
, red
, 'Taco'
, y 'some atom'
.person_friends(zelda,[tom,jim])
.Casos especiales de términos compuestos:
[]
. Por ejemplo, [1,2,3]
o [red,green,blue]
.double_quotes
. Por ejemplo "to be, or not to be"
,. [15]ISO Prolog proporciona los atom/1
, number/1
, integer/1
, y float/1
predicados para tipo de comprobación . [dieciséis]
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 ;/2
denota 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/0
es siempre verdad.
Dado el hecho anterior, se puede preguntar:
Crookshanks es un gato?
? - gato ( Crookshanks ). sí
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/2
se 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/3
se puede utilizar tanto para anexar dos listas ( append(ListA, ListB, X)
listas dadas ListA
y 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/1
muestra un término en la pantalla.
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 ). sí
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 = tom
se 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.
Los algoritmos iterativos se pueden implementar mediante predicados recursivos. [17]
El built-in Prolog predicado \+/1
ofrece 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 \+/1
operador 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.
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.
Un ejemplo de una consulta:
? - escribir ( '¡Hola mundo!' ), nl . Hola mundo ! verdad .? -
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 .
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 ).
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]
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 maplist
se aplica un predicado P
a 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 P
es un predicado que para todos X
, P(X,Y)
unifica Y
con 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 .
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.
Existe una notación especial llamada gramáticas de cláusulas definidas (DCG). Una regla definida a través -->/2
en lugar de :-/2
se expande por el preprocesador ( expand_term/2
un 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.
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 true
representa 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 ( :-/2
es 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 Goal
y obtener una medida de certeza sobre el resultado.
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.
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]
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 ]
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.
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]
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 .
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.
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]
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]
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 :
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]
especificador modo | Interpretación |
---|---|
+ | nonvar en la entrada |
- | var en la entrada |
? | No especificado |
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]
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.
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.
Sistemas Prolog que proporcionan una biblioteca de gráficos son SWI-Prolog , [66] Visual Prolog , WIN-PROLOG , y B-Prolog .
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]
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 .
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 .
existen marcos que puede tender un puente entre el prólogo y otros idiomas:
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.
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 .
![]() | Wikilibros tiene más información sobre el tema de: Prolog |