domingo, 4 de mayo de 2014

¿Qué es Prolog?



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".


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".
 
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.
 
El predicado predefinido 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 = 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 "|".

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). 
%%



%% 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