PROLOG
El Prolog (o PROLOG), proveniente del francés PROgrammation en LOGique, es un lenguaje de programación lógico e interpretado, bastante conocido en el
medio de investigación en Inteligencia Artificial.
Puedes
descargarlo de aquí.
http://www.swi-prolog.org/download/stable
Historia
Se trata de un
lenguaje de programación ideado a principios de los años 70 en la Universidad de Aix-Marseille I (Marsella, Francia) por los
profesores Alain Colmerauer y Philippe Roussel. Nació de un proyecto que no tenía como objetivo la implementación de un
lenguaje de programación, sino el procesamiento de lenguajes naturales. Alain
Colmerauer y Robert Pasero trabajaban en la parte del procesado del lenguaje
natural y Jean Trudel y Philippe Roussel en la parte de deducción e inferencia
del sistema. Interesado por el método de resolución SL, Trudel persuadió a
Robert Kowalski para que se uniera al proyecto, dando lugar a una versión
preliminar del lenguaje Prolog a finales de 1971 y apareciendo
la versión definitiva en 1972. Esta primera versión
de Prolog fue programada en ALGOL W.
Inicialmente
se trataba de un lenguaje totalmente interpretado hasta que, en 1983, David H.D. Warren desarrolló un compilador capaz de traducir
Prolog en un conjunto de instrucciones de una máquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces
Prolog es un lenguaje semi-interpretado.
Si bien en un
principio se trataba de un lenguaje de uso reducido, la aparición de
intérpretes del mismo para microordenadores de 8 bits (ej: micro-PROLOG) y para ordenadores domésticos de 16 bits (ej: Turbo Prolog de Borland, entre otros
muchos) a lo largo de la década de 1980 contribuyó notablemente a su
popularización.4 Otro
importante factor en su difusión fue la adopción del mismo para el desarrollo
del proyecto de la quinta generación de computadoras a principios de la década de los 80, en cuyo
contexto se desarrolló la implementación paralelizada del lenguaje llamada KL1 y del que
deriva parte del desarrollo moderno de Prolog.
Las primeras
versiones del lenguaje diferían, en sus diferentes implementaciones, en muchos
aspectos de sus sintaxis, empleándose
mayormente como forma normalizada el dialecto propuesto por la Universidad de
Edimburgo , hasta que
en 1995 se estableció un estándar ISO (ISO/IEC 13211-1), llamado ISO-Prolog.
Prolog se
enmarca en el paradigma de los lenguajes
lógicos y declarativos, lo que lo diferencia enormemente de otros
lenguajes más populares tales como Fortran, Pascal, C o Java.
Programación en Prolog
Existen dos
tipos de cláusulas: Hechos y Reglas. Una regla es del tipo:
Cabeza :- Cuerpo.
y se lee como
"La cabeza es verdad si el cuerpo es verdad". El cuerpo de una regla
consiste en llamadas a predicados, que son llamados los objetivos de las reglas. El Predicado ,/2 (es
decir, un operador de aridad 2 (que recibe 2 argumentos) y de nombre , ) denota
conjunción de objetivos, y el operador ;/2 denota disyunción. Conjunciones y disyunciones pueden sólo aparecer en el cuerpo, no en la
cabeza de la regla. En realidad la disyunción no es un operador básico o
predefinido, sino que está meta-programado así:
';' (A,_) :- A.
';' (_,B) :- B.
Las cláusulas
sin cuerpo (es decir, antecedente) son llamados hechos porque siempre son ciertos. Un ejemplo de un hecho es:
gato(tom).
que es
equivalente a la regla:
gato(tom) :- true.
El predicado
predefinido true/0 siempre es verdad.
Dado el hecho
anterior, se puede preguntar:
¿ es tom un
gato ?
?- gato(tom).
Yes
¿ que cosas
son gatos ?
?- gato(X).
X = tom
Debido a la
naturaleza relacional de muchos predicados, pueden ser usados revertidos sus
argumentos. Por ejemplo, length/2 puede ser usado para determinar el tamaño
(longitud) de una lista: length([a,b,c], L), así como para generar un esqueleto
de lista para un largo dado (length(X, 5)). Similarmente, append/3 puede ser
usado también para unir o anexar dos listas: append([a,b], [c,d], X) , así como
para dividir una lista en dos partes: append(X, Y, [a,b,c,d]). Todo depende de
qué argumentos sean variables libres y cuáles sean instanciados. En analogía
con la programación imperativa, las variables libres son argumentos de salida y
el resto son argumentos de entrada. Pero en Prolog, a diferencia de los
lenguajes imperativos, dicho rol es intercambiable en la mayoría de los
predicados. Esta característica se denomina reversibilidad, y las combinaciones válidas de argumentos de
salida o entrada se denomina modos de
uso. Por ejemplo, el predicado length/2 es reversible y tiene tres modos
de uso: los dos argumentos instanciados, el primer argumento instanciado pero
el otro no, y viceversa. El modo de uso con los dos argumentos sin instanciar
no tiene mucho sentido, pero podría ser admitido según algunas
implementaciones, en tal caso, generaría todas los esqueletos de lista de todas
las longitudes posibles...
Por esta
razón, una biblioteca relativamente pequeña de predicados basta para muchos
programas en Prolog. Todos los predicados pueden también ser usados para
realizar pruebas unitarias: las consultas pueden ser incrustados en
programas y permitir pruebas automáticas de regresión en tiempo de compilación.
Como un
lenguaje de propósito general, Prolog también posee varios predicados
predefinidos para interacción con el sistema operativo, como entrada/salida, gráficos y
comunicaciones de datos. Estos predicados no tienen un significado relacional y
son sólo útiles por los efectos laterales que exhiben en el sistema. Por
ejemplo, el predicado write/1 muestra un término en la pantalla, pero no tiene
relevancia su valor de verdad o falsedad.
Expresiones
Prolog cuenta
con operadores para la unificación y comparación, sea con evaluación o sea
simbólica, como los siguientes:
- X is Y %unificación con evaluación.
- X = Y %unificación simbólica
- X=:=Y %comparación con evaluación
- X == Y %comparación simbólica.
?- X is 3+5.
X = 8
?- X = 3+5.
X = 3+5
?- 3+5 =:= 2+6.
yes
?- 3+5 == 2+6.
no
?- 3+5 == 3+5.
yes
Listas
La
representación de hechos simples no es lo común en la clasificación de
elementos, sino que se agrupan los elementos de un mismo tipo en una lista.
Las listas son
colecciones de elementos en Prolog. Una lista se divide en dos partes: Cabeza.
Es el primer elemento de la lista. Cola. Es una lista con el resto de los
elementos de la lista. La cabeza y la cola de una lista se separan con el
símbolo "|".
Referencias
No hay comentarios:
Publicar un comentario