Programación Lógica en Prolog
El lenguaje de programación PROLOG (contracción de PROgrammation en LOGique
) lo creó Alain Colmerauer, un investigador de la Universidad de Marsella, a comienzos de los 70 y realiza una lógica de predicados. Para comprenderlo pondré el esquema de un sencillo, o simplista, programa en PROLOG:
necesita(x, luz) si fotositentiza(x) fotosintetiza(geranio)
que en PROLOG se escribiría de manera muy parecida:
necesita(X, luz) :- fotositentiza(X). fotosintetiza(geranio).
En esencia, hemos terminado cada frase con un punto y aparte, hemos puesto las variables o incógnitas en mayúscula y en lugar de si
hemos escrito la secuencia :-
.
La programación lógica es un ejemplo de programación declarativa, un paradigma opuesto a prácticamente todos los lenguajes de programación, desde ensamblador a Python pasando por BASIC, C, C++ o Java, a los que agrupamos en la categoría de la programación imperativa.
Un programa Prolog se compone de un conjunto de datos (afirmaciones simples) y de reglas (que sirven para afirmar la veracidad de un dato basándose en otros). El conjunto de datos de un programa viene a ser el equivalente a contar con una base de datos, aunque en este contexto se habla de base de conocimiento.
Ejemplo de datos:
es_hijo(Juanito, Juan) suma(10,5,15)
Una vez definidos estos datos (de los cuales el primero significa Juanito es hijo de Juan
y el segundo la suma de 10 y 5 es 15
), se pueden realizar preguntas al programa, que terminarán siempre en un punto, como el siguiente:
?es_hijo(x,Juan).
Dicha pregunta significa "¿Existe un X que sea hijo de Juan?"; la respuesta del programa sería positiva, y nos daría todas las respuestas posibles ("Juanito"... y el resto de sus hermanos, si los hubiera y los hubiéramos definido como datos).
Igualmente, a partir de lo anterior, podemos también establecer reglas, que definen nuevas relaciones a partir de relaciones ya dadas. Por ejemplo:
es_padre(X,Y) :- es_hijo(Y,X), es_varon(X).
Este código Prolog se correspondería con la fórmula lógica:
∀x ∀y ((es_hijo(y,x) ∧ es_varón(x)) → es_padre(x,y)).
(Que se lee: si para todo x y todo y tales que y sea hijo de x y x sea varón, entonces x es padre de y.)
Prolog cuenta también con objetos estructurados. En el siguiente ejemplo harry_potter_1(...) es un objeto estructurado, es decir compuesto:
en_stock( libro(harry_potter_1, autor(jkrowling)) ).
...que se interpreta: [hay] en stock un libro cuyo título es "harry_potter_1" y cuyo autor es "jkrowling".
Lo anterior nos permite preguntar al programa por varios elementos de la entidad: ¿Tenemos 'harry_potter_1' en stock?
, ¿Tenemos algún libro de jkrowling en stock?
, etc.
Los ámbitos de la computación donde más se usa Prolog son los de la inteligencia artificial y aspectos relacionados con la misma como el machine learning, procesamiento de lenguaje natural (Natural Language Processing), construcción de sistemas expertos (expert systems), etc.
Prolog era al principio un lenguaje interpretado hasta que, una década más tarde, se creó un compilador capaz de traducir Prolog a un conjunto de instrucciones de una máquina abstracta denominada WAM (Warren Abstract Machine), lo que lo convirtió desde entonces en un lenguaje semi-interpretado. ¿Mmm?