You are on page 1of 12

INTRODUCCIN

Prolog es un lenguaje de programacin diseado para


representar y utilizar el conocimiento que se tiene sobre un
determinado dominio. Los programas en Prolog responden
preguntas sobre el tema del cual tienen conocimiento.
Forma parte de lo que se conoce como programacin
declarativa. En lenguajes tradicionales se indica cmo resolver
un problema, en la programacin lgica se establecen hechos
reales y reglas para as no saber cmo resolver el problema,
sino que hacer para resolverlo.
La popularidad de este lenguaje se debe a su capacidad de
deduccin y adems es un lenguaje fcil de usar por su
semntica y sintaxis. Slo busca relaciones entre los objetos
creados, las variables y las listas, que son su estructura
bsica.
En este artculo se dar una resea histrica, para entender
los orgenes del Prolog, una pequea descripcin del
programa, as como las estructuras bsicas y algunos
operadores. Tambin se mencionaran algunas ventajas y
desventajas de Prolog, as como casos de uso. Por ltimo se
mostrarn tres ejemplos para mostrar la sintaxis y
funcionamiento de Prolog.

HISTORIA
Se trata de un lenguaje de programacin ideado a principios
de los aos 70 en la Universidad de Aix-Marseille (Marsella,
Francia) por los profesores Alain Colmerauer y Philippe
Roussel. Naci de un proyecto que no tena como objetivo la
implementacin de un lenguaje de programacin, 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 deduccin e inferencia del sistema. Interesado por el
mtodo de resolucin SL, Trudel persuadi a Robert Kowalski
para que se uniera al proyecto, dando lugar a una versin
preliminar del lenguaje Prolog a finales de 1971 2 y
apareciendo la versin definitiva en 1972.3 Esta primera
versin 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 mquina 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 aparicin de intrpretes del mismo para
microordenadores de 8 bits (ej: micro-PROLOG) y para
ordenadores domsticos de 16 bits (ej: Turbo Prolog de
Borland, entre otros muchos) a lo largo de la dcada de 1980
contribuy notablemente a su popularizacin. 4 Otro
importante factor en su difusin fue la adopcin del mismo
para el desarrollo del proyecto de la quinta generacin de
computadoras a principios de la dcada de los 80, 5 en cuyo
contexto se desarroll la implementacin paralelizada del

lenguaje llamada KL1 y del que deriva parte del desarrollo


moderno de Prolog.
Las primeras versiones del lenguaje diferan, en sus diferentes
implementaciones, en muchos aspectos de sus sintaxis,
emplendose mayormente como forma normalizada el
dialecto propuesto por la Universidad de Edimburgo 6 , hasta
que en 1995 se estableci un estndar ISO (ISO/IEC 13211-1),
llamado ISO-Prolog.
Prolog se enmarca en el paradigma de los lenguajes lgicos y
declarativos, lo que lo diferencia enormemente de otros
lenguajes ms populares tales como Fortran, Pascal, C o Java.

VUELTA ATRS (BACKTRACKING)


En los lenguajes de programacin antes mencionados, las
instrucciones se ejecutan normalmente en orden secuencial,
es decir, una a continuacin de otra, en el mismo orden en
que estn escritas, que slo vara cuando se alcanza una
instruccin de control (un bucle, una instruccin condicional o
una transferencia).
Los programas en Prolog se componen de clusulas de Horn
que constituyen reglas del tipo "modus ponendo ponens", es
decir, "Si es verdad el antecedente, entonces es verdad el
consecuente". No obstante, la forma de escribir las clusulas
de Horn es al contrario de lo habitual. Primero se escribe el
consecuente y luego el antecedente. El antecedente puede
ser una conjuncin de condiciones que se denomina
secuencia de objetivos. Cada objetivo se separa con una coma
y puede considerarse similar a una instruccin o llamada a
procedimiento de los lenguajes imperativos. En Prolog no
existen instrucciones de control. Su ejecucin se basa en dos
conceptos: la unificacin y el backtracking.
Gracias a la unificacin, cada objetivo determina un
subconjunto de clusulas susceptibles de ser ejecutadas.
Cada una de ellas se denomina punto de eleccin. Prolog

selecciona el primer punto de eleccin y sigue ejecutando el


programa hasta determinar si el objetivo es verdadero o falso.
En caso de ser falso entra en juego el backtracking, que
consiste en deshacer todo lo ejecutado situando el programa
en el mismo estado en el que estaba justo antes de llegar al
punto de eleccin. Entonces se toma el siguiente punto de
eleccin que estaba pendiente y se repite de nuevo el
proceso. Todos los objetivos terminan su ejecucin bien en
xito ("verdadero"), bien en fracaso ("falso").

PROGRAMACIN EN PROLOG
Existen dos tipos de clusulas: 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 conjuncin de objetivos, y el operador ;/2
denota disyuncin. Conjunciones y disyunciones pueden slo
aparecer en el cuerpo, no en la cabeza de la regla. En realidad
la disyuncin no es un operador bsico o predefinido, sino que
est meta-programado as:
';' (A,_) :- A.
';' (_,B) :- B.

Las clusulas 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 tamao (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 tambin 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 cules sean instanciados.
En analoga con la programacin 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 mayora de los
predicados. Esta caracterstica se denomina reversibilidad, y
las combinaciones vlidas 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 podra ser admitido
segn algunas implementaciones, en tal caso, generara todas
los esqueletos de lista de todas las longitudes posibles...

Por esta razn, una biblioteca relativamente pequea de


predicados basta para muchos programas en Prolog. Todos los
predicados pueden tambin ser usados para realizar pruebas
unitarias: las consultas pueden ser incrustados en programas
y permitir pruebas automticas de regresin en tiempo de
compilacin.
como un lenguaje de propsito general, prolog tambin posee
varios predicados predefinidos para interaccin con el sistema
operativo, como entrada/salida, grficos y comunicaciones de
datos. Estos predicados no tienen un significado relacional y
son slo tiles por los efectos laterales que exhiben en el
sistema. por ejemplo, el predicado write/1 muestra un trmino
en la pantalla, pero no tiene relevancia su valor de verdad o
falsedad.

EXPRESIONES
Prolog cuenta con operadores para la unificacin y
comparacin, sea con evaluacin o sea simblica, como los
siguientes:

X is Y %unificacin con evaluacin.

X = Y %unificacin simblica

X=:=Y %comparacin con evaluacin

X == Y %comparacin simblica.

?- 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 representacin de hechos simples no es lo comn en la
clasificacin 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
smbolo "|".

Ejemplo simple
%%
%% declaraciones
%%
padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela').
padrede('carlos', 'debora').
% A es hijo de B si B es padre de A
hijode(A,B) :- padrede(B,A).
% A es abuelo de B si A es padre de C y C es padre B
abuelode(A,B) :padrede(A,C),
padrede(C,B).
% A y B son hermanos si el padre de A es tambin el padre de B y si A y B no
son lo mismo
hermanode(A,B) :padrede(C,A) ,
padrede(C,B),
A \== B.

% A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B


familiarde(A,B) :padrede(A,B).
familiarde(A,B) :hijode(A,B).
familiarde(A,B) :hermanode(A,B).
%%
%% consultas
%%
% juan es hermano de marcela?
?- hermanode('juan', 'marcela').
yes
% carlos es hermano de juan?
?- hermanode('carlos', 'juan').
no
% pablo es abuelo de maria?
?- abuelode('pablo', 'maria').
yes
% maria es abuela de pablo?
?- abuelode('maria', 'pablo').
no

Factorial de un nmero
% La sintaxis es factorial(N, F) -> Factorial de N es F (el resultado se guarda en
F)
factorial(0, 1).
factorial(N, F) :- N>0, N1 is N - 1, factorial(N1, F1), F is N*F1.
%el factorial se llama recursivamente dejando el resultado en F

Usos de Listas en Prolog


Creacin y consulta de listas
plantas([manzana, naranja, limon, espinaca, gardenia, alfalfa,pino]).
lista([1,2,3]).
?-lista([H|T]).
H=1
T=[2,3]
?-lista([H,J|T]).

H=1
J=2
T=[3]

Longitud de una lista


% Si queremos hallar la longitud de una lista.
% La longitud de una lista vacia es 0.
% La longitud de cualquier lista es la longitud de la cola + 1.
longitud([],0).
longitud([H|T],N):-longitud(T,N0), N is N0 + 1.
?- longitud([a,b,c],L).
3
?- longitud([a,b,c],4).
No

Bsqueda de un elemento
% Si queremos determinar si un elemento pertenece a una lista.
% El elemento pertenece a la lista si coincide con la cabeza de la lista.
% El elemento pertenece a la lista si se encuentra en la cola de la lista.
pertenece(X,[X|_]) :- !.
pertenece(X,[_|R]):- pertenece(X,R).
?- pertenece(b,[a,b,c]).
Yes
?- pertenece(b,[a,[b,c]]).
No
?- pertenece([b,c],[a,[b,c]]).
Yes

Eliminar elemento de una lista


% Si queremos eliminar un elemento de la lista.
% Si X es la cabeza de la lista, la cola T es la lista sin X
% Si X no es la cabeza de la lista, conservamos la cabeza de la lista
%
como parte de la respuesta y continuamos eliminando X de la cola T.
elimina(X,[X|T],T).
elimina(X,[H|T],[H|T1]):- elimina(X,T,T1).
?- elimina(1,[1,2,3,4],R).
R = [2,3,4]
?- elimina(1,R,[2,3]).
R = [1, 2, 3]
R = [2, 1, 3]
R = [2, 3, 1]

Concatenar listas
%
%
%
%
%

Si queremos concatenar dos listas lista.


Concatenar una lista vacia con L es L.
Concatenar X|L1 con L2 es poner el primer
elemento de la primera lista (X) ms la
concatenacin del resto de la lista (L1) con L2

concatenar([],L,L).
concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3).
?- concatenar([1,2],[3,4],R).
R = [1, 2, 3, 4].

Comprobar si una lista es la inversa de otra


% Si queremos calcular la inversa de una lista.
% La inversa de una lista vacia es una lista vacia.
% La inversa de H|T es la inversa de T concatenada con H.
inversa([],[]).
inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L).
?- inversa([a,b,c,d],[d,c,b,a]).
Yes
% Utilizando un parametro acumulador.
inver(L1,L2):-inver(L1,L2,[]).
inver([],L,L).
inver([H|T],L,S):-inver(T,L,[H|S]).
?- inver([a,b,c,d],[d,c,b,a]).
Yes

CONCLUSIONES
Las bases de Prolog se remontan a la necesidad de
automatizar ciertos procesos, como el de la resolucin de
autmatas deterministas finitos.
Prolog es una herramienta sencilla, potente y til para el
desarrollo de sistemas expertos e inteligencia artificial. Su
popularidad se debe a sus aplicaciones en sistemas complejos
de alta demanda en el mercado actual.
Su crecimiento seguir mientras exista necesidad de este tipo
de sistemas.
Prolog tiene la ventaja que el programa revisa la base de
datos para encontrar soluciones a las preguntas, infiriendo el
mismo la respuesta basndose en las reglas del programa. La

desventaja que esto posee, es que la resolucin automtica


no siempre es eficiente
Algo que le ha dado auge a Prolog, es su capacidad ser bajado
fcilmente de la Internet, ya que este programa es de cdigo
abierto, por lo que es gratuito. Al ser de cdigo abierto, se
pueden modificar las versiones
Prolog, e incluso hay muchas versiones en la web.

INSTALAR SWI PROLOG EN UBUNTU

Una compaera y amiga de la facultad Lis (patri) de EducFree me envi


este post para poder compartirlo junto a ustedes.
En la Lic. en Informatica Educativa tengo una materia que se llama
Elementos de Inteligencia Artificial, donde estamos iniciando con Prolog,
tenia dos alternativas, el swi prolog o el anzi prolog, buscando y
buscando para instalarlo en mi Ubuntu 8.04 encontr mucha
informacin, pero la voy a resumir en unos cuantos pasos. Bsicamente
me costo un poco, para ser sincera, al final resulto ser sencillo pero hay
q buscar mucho.

INSTALAR SWI PROLOG

1.- En consola: sudo apt-get install swi-prolog, o si prefieren el Synaptic o


el
Adept,
etc
2.- Buscar prolog e instalar el paquete q dice swi-prolog, van a aparecer
muchos paquete, pero instalen el primero.
Luego ir a la siguiente ruta: /usr/lib/swi-prolog
Una vez posicionados en ese directorio, en consola coloquen swipl
y se abre el edito pero EN MODO CONSOLA, a mi criterio no es muy
sencillo, mas cuando no se maneja bien el lenguaje, por lo que encontr
una muy linda interfaz grfica de un editor basado en JAVA. JPrologEditor,
que se encuentra en el siguiente enlace.
Bueno, al final de la pagina esta el editor que es .jar, lo descargan y
luego. se posicionan en el directorio que se encuentra almacenado y
tipean en consola:
$ java -jar JPrologEditor.jar (Nota: deben tener instalado los paquetes de
java, el jre)
y se inicia el editor.
Cuando este cargando al 94% va a salir un error de the swi prolog
interpreter could not be started, cierran esa ventana de warning y se
abre el editor, entonces van a:
Edit > Option
Prolog-Directory: /usr/lib/swi-prolog/bin/i386

You might also like