Prolog es un lenguaje para programar artefactos electrónicos con técnicas de producción final interpretada. Es conocido en el área de la Ingeniería Informática para investigación en Inteligencia Artificial. Su nombre proviene de las palabras francesas "PROgrammation en LOGique".
Los programas en Prolog se componen de cláusulas 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 cláusulas de Horn es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente puede ser una conjunción de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instrucción o llamada a procedimiento de los lenguajes imperativos. En Prolog no existen instrucciones de control. Su ejecución se basa en dos conceptos: la unificación y el backtracking.
*Nota: Backtracking es una estrategia para encontrar soluciones a problemas que satisfacen restricciones.
Gracias a la unificación, cada objetivo determina un subconjunto de cláusulas susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de elección. Prolog selecciona el primer punto de elección 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 elección. Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso. Todos los objetivos terminan su ejecución bien en "verdadero", bien en "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 elección. Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso. Todos los objetivos terminan su ejecución bien en "verdadero", bien en "falso".
Programación en Prolog
Una regla es del tipo: Cabeza :- Cuerpo. Y se lee como "La cabeza es verdad si el cuerpo es verdad".
Las cláusulas sin cuerpo (es decir, sin 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.
true/0
siempre es verdad.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.
Ejemplos:
?- X is 3+5
X = 8
X = 8
?- X = 3+5.
X = 3+5
?- 3+5 =:= 2+6.
yes
?- 3+5 == 2+6.
no
?- 3+5 == 3+5.
yes
X = 3+5
?- 3+5 =:= 2+6.
yes
?- 3+5 == 2+6.
no
?- 3+5 == 3+5.
yes
Listas
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 "|".
Ejemplo de Listas:
%% Declaraciones
%
padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela'). % pablo es padre de marcela
padrede('carlos', 'debora'). % carlos es padre de 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 también el padre de B y si A =/= B
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).
%%
%
padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela'). % pablo es padre de marcela
padrede('carlos', 'debora'). % carlos es padre de 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 también el padre de B y si A =/= B
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
?- 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