Prolog, un lenguaje realmente diferente
Este post fue migrado de un blog hecho con Wordpress. Si se ve mal, dejame un comentario y lo arreglo.
Hace unos años escuché una charla de Pupeno titulada "Lips, un lenguaje diferente". Fue una charla muy interesante y realmente logró sorprender a muchos de la audiencia con distintas características de Lisp.
Sin embargo, creo que Lisp no es tan diferente a otros lenguajes. Ok, se basa en un paradigma (el funcional) distinto al que se basa la mayoría (lideran los rankings el paradigma procedural y el paradigma orientado a objetos). Pero aún así, no está tan lejos. De hecho, muchos lenguajes de programación tienden a Lisp.
Prolog es el lenguaje más conocido, y otros prácticamente no se mencionan, del paradigma lógico. No es un paradigma imperativo (como los anteriormente mencionados) en el cual debemos decirle a la computadora cómo resolver un problema (poné en esta variable este valor multiplicado por dos, iterá hasta que n sea igual a 10, etc...) sino que es un paradigma declarativo: simplemente se plantean afirmaciones sobre los objetos y sus relaciones.
Un programa Prolog está compuesto de dos partes: una base de conocimiento + consultas contra esta. Ambas partes se escriben utilizando la misma sintaxis. Una vez que se tiene escrita la base de conocimientos, esta es compilada o interpretada y ya está lista para qué se realicen consultas contra ella.
Los siguientes son 3 ejemplos básicos de programas Prolog.
Base de conocimiento familiar
Vamos a utilizar Prolog para armar una base de conocimiento con relaciones familiares. Empezamos con hechos; se expresan las relaciones padre
y madre
:
padre(raul, juanjo).
padre(raul, marisu).
madre(susana, juanjo).
madre(susana, marisu).
madre(nieve, raul).
Y una regla, que se lee: X es abuela de Y si X es madre de Z y Z es madre de Y ó X es padre de Y.
abuela(X, Y) :- madre(X, Z), madre(Z, Y).
abuela(X, Y) :- madre(X, Z), padre(Z, Y).
Con esta base definida, podemos compilarla y hacerle consultas. ¿De quiénes es padre raul?
?- padre(raul, X).
X = juanjo ;
X = marisu.
¿Quién es abuela de quién?
?- abuela(X,Y).
X = nieve,
Y = juanjo ;
X = nieve,
Y = marisu.
nota: por lo general, la interfaz de Prolog nos da la primer respuesta que encuentra y con ;
le pedimos la siguiente.
Factorial
Definir un predicado que calcule el factorial de un número es bastante directo en Prolog. Si tenés que explicar la función factorial a alguien le decís: el factorial de 0 es 1. El factorial de N es N por el factorial de N - 1. Escribimos eso en Prolog:
factorial(0, 1) :- !.
factorial(N, F) :- N1 is N - 1, factorial(N1, F1), F is N*F1.
Con este programa compilado, podemos hacer las siguientes consultas:
?- factorial(0, N).
N = 1.
?- factorial(6, N).
N = 720.
?- factorial(6, 555).
false.
Podemos pedir el factorial de un número e indicar la variable dónde obtener la respuesta o consultar con un predicado sin variables (ground) y obtener como respuesta el valor de verdad de la misma.
Concatenar listas
Un tipo de dato poderoso que incorpora Prolog son las listas. Podemos definir un predicado que concatene listas. Lo vamos a llamar concatenar y tendrá 3 argumentos: las dos listas a concatenar y el resultado de la operación. Luego podremos usar el predicado de esta forma:
?- concatenar([1,2], [4,5,6], L).
L = [1, 2, 4, 5, 6].
?- concatenar(X, Y, [4,5,6]).
X = [],
Y = [4, 5, 6] ;
X = [4],
Y = [5, 6] ;
X = [4, 5],
Y = [6] ;
X = [4, 5, 6],
Y = [] ;
false.
Definir este predicado en Prolog es muy sencillo:
concatenar([],L,L).
concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3).
Tiene dos partes y se lee así:
Concatenar la lista vacía con L, da como resultado L.
Concatenar una lista cuya cabeza es X y cola L1 con L2, da como resultado la lista de cabeza X y cola L3 SI el resultado de concatenar L1 con L2 es L3.
Fin del tour
Este fue un tour acelerado por Prolog, tuvo como objetivo mostrárselo a quienes no lo conocen, dejarles el gusto en la boca y ganas de mas. ¿Lo logré? ¿No conocías Prolog? ¿Qué pensás ahora?
Tutoriales y otros enlaces
Notas
- Conocí Prolog cursando Paradigmas de Programación, una materia de segundo año de Ingeniería en Sistemas de Información
- Este no es mi primer post exclusivo sobre Prolog, de hecho es el segundo.
- Podés conocer más sobre Prolog leyendo preguntas y respuestas en StackOverflow.com
Comentarios
Comments powered by Disqus