viernes, 21 de mayo de 2010

EJEMPLOS

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 también 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 número

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

%el factorial se llama recursivamente dejando el resultado en F

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

PERSPECTIVA DEL LENGUAJE

•El programa prolog se compone de unos hechos (datos) y un conjunto de reglas, es decir, relaciones entre objetos de la base de datos.
•La ejecución del programa cargado en memoria consiste en realizar una pregunta de forma interactiva: el interprete generará por inferencia los resultados que se deducen a partir del contenido de la base de datos.
•PROLOG tiene una sintaxis y semántica simples. Sólo busca relaciones entre los objetos creados, las variables y las listas, que son sus estructuras básicas.
•Comentarios entre /* */





Objetos de datos


•Tipos de datos primitivos: variables y constantes:
■Enteros
■Reales
■Caracteres
Los identificadores con minúscula representan hechos, los que van con mayúscula variables. El alcance de una variable es la regla donde aparece.
•Tipos de datos estructurados:
■Átomos: constantes y variables de cadena.
■Listas, representadas entre [ ].
•Tipos definidos por el usuario. Las reglas para definir relaciones pueden actuar como tipos de usuario.
Representación de almacenamiento


•Las reglas y hechos son almacenadas en memoria como listas enlazadas.
•La ejecución de prolog consiste en una búsqueda en profundidad de un árbol conteniendo todas las posibles soluciones. Para cada una de ellas se evaluará su corrección. La búsqueda se puede hacer más eficiente mediante la poda del árbol de búsqueda (corte).
Control de secuencia

El orden de evaluación es secuencial.
•Expresiones, operaciones aritméticas y operadores relacionales. Not().
•Enunciados
■Hechos, relaciones que se expresan en una consulta. Son tuplas con un nombre de predicado y unos argumentos.
■Reglas, implicaiones que se expresan en una operación consult.
■Preguntas, sucesión de términos que finalizan con un punto.
■Cortes, (!), fuerza el retroceso en la búsqueda. Esto puede impedir que se encuentren ciertas soluciones, pero puede hacer más eficiente la búsqueda.
•Entrada y salida, nl y write.
Subprogramas y gestión de almacenamiento


•PROLOG tiene dos modos:
•Modo consulta, se introducen nuevas relaciones (hechos) en el almacenamiento dinámico de la base de datos.
•Modos pregunta, se ejecuta un intérprete basado en pilas para evaluar las preguntas del usuario.
•Alcance de las variables:
•Ambiente local de referencia, todas las variables son locales a la regla en que están definidas. La unificación hace interaccionar nombres locales de una regla con los de otras reglas.
•Ambiente común de referencia, todos los datos son compartidos.
•Paso de parámetros, la unificación proporciona el paso de parámetros entre reglas.
•Funciones normales, van integradas en el lenguaje:
•Consult(nommbrearchivo)
•Fail, siempre fracasa.
•See(nombrearchivo), lee las entradas de un archivo y las incorpora al conjunto de reglas.
•Write(término).
•Tell(término), reorienta la salida del write al archivo.
•Told, cierra el archivo anterior.
•Nl, salto de línea.
•Atom(X), devuleve cierto si X es un átomo.
•Var(X), devuelve cierto si X es una variable.
•Integer(X), devuelve cierto si X es un entero.
•Trace, activa la depuración del programa.
Abstracción y encapsulamiento

PROLOG no proporciona estas capacidades.

Evaluación del lenguaje


•PROLOG va bien para problemas de relaciones, p.e. Tratamiento del lenguaje natural, y consulta de bases de datos.
•A pesar de que es posible desarrollar programas sin especificar el algoritmo de resolución a veces hay que echar mano de otro tipo de programación para hacer los programas más eficientes, y a menudo se emplea el corte para limitar el espacio de búsqueda.

HISTORIA

•Coulmerauer (1970) desarrolló un lenguaje para hacer deducciones de texto.
•Se aplica un mecanismo de resolución sobre predicados especiales, cláusulas de Horn, llamado unificación.
•La difusión del lenguaje se produce en los 80, pero de forma muy limitada debido a la falta de aplicaciones en dicho lenguaje.

Se trata de un lenguaje de programación ideado a principios de los años 70 en la Universidad de Aix-Marseille (Marsella, Francia) por los profesores Alain Colmerauer y Philippe Roussel. Nació de un proyecto que no tenía como objetivo la implementación de un lenguaje de programación, 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 deducción e inferencia del sistema. Interesado por el método de resolución SL, Trudel persuadió a Robert Kowalski para que se uniera al proyecto, dando lugar a una versión preliminar del lenguaje Prolog a finales de 1971[2] y apareciendo la versión definitiva en 1972.[3] Esta primera versión 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 máquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado.
Las primeras versiones del lenguaje diferían, en sus diferentes implementaciones, en muchos aspectos de sus sintaxis, empleándose mayormente como forma normalizada el dialecto propuesto por la Universidad de Edimburgo[6] , hasta que en 1995 se estableció un estándar ISO (ISO/IEC 13211-1), llamado ISO-Prolog.

Prolog se enmarca en el paradigma de los lenguajes lógicos y declarativos, lo que lo diferencia enormemente de otros lenguajes más populares tales como Fortran, Pascal, C o Java.

INTRODUCCION A PROLOG

Prolog es un lenguaje de programación simple pero poderoso desarrollado en la Universidad de Marsella como una herramienta práctica para programación lógica. Desde el punto de vista del usario, la ventaja principal es la facilidad para programar, ya que se pueden escribir rapidamente y con pocos errores, programas claramente leíbles.
PROLOG está orientado a la resolución de problemas mediante el cálculo de predicados, basado en:
Preguntas a la base de datos.
Pruebas matemáticas.
El programa PROLOG especifíca cómo debe ser la solución, en vez de dar el algoritmo para su resolución. La solución se obtiene mediante búsqueda aplicando la lógica de predicados.

El Prolog (o PROLOG), proveniente del francés PROgrammation en LOGique,es un lenguaje de programación lógico e interpretado, bastante conocido en el medio de investigación en Inteligencia Artificial.