Está en la página 1de 5

Prolog

Prolog, proveniente del francés Programation et Logique, es un lenguaje de programación


lógico e interpretado, bastante popular en el medio de investigación en Inteligencia Artificial.

Origenes
La programación lógica tiene sus raíces en el cálculo de predicados, que es una teoría
matemática que permite, entre otras cosas, lograr que un computador pueda realizar
inferencias, capacidad que es requisito para que un computador sea una "máquina inteligente".
La realización del paradigma de la programación lógica es el lenguaje Prolog. El Prolog
estuvo un tiempo diseñado para ejecutarse en minicomputadoras o estaciones de trabajo,
actualmente hay versiones en Prolog que pueden instalarse en computadores personales como
IBM-PC y PC-Compatibles. Un programa escrito en PROLOG puro, es un conjunto de
clausulas.
Sin embargo, PROLOG, como lenguaje de programación moderno, incorpora más cosas, como
instrucciones de Entrada/Salida, etc.
Una clausula puede ser una conjunción de hechos positivos o una implicación con un único
consecuente (un único termino a la derecha). La negación no tiene representación en
PROLOG, y se asocia con la falta de una afirmación (negación por fallo), según el modelo de
suposición de un mundo cerrado solo es cierto lo que aparece en la base de conocimiento o
bien se deriva de esta.

Las diferencias sintácticas entre las representaciones lógicas y las representaciones


PROLOG son las siguientes:
1. En PROLOG todas las variables están implícitamente cuantificadas universalmente.
2. En PROLOG existe un símbolo explicito para la conjunción "y" (,), pero no existe uno
para la disyunción "o", que se expresa como una lista de sentencias alternativas.
3. En PROLOG, las implicaciones p --> q se escriben al reves q :- p, ya que el intérprete
siempre trabaja hacia atrás sobre un objetivo.

Backtracking
En los lenguajes de programación antes mencionados, las instrucciones se ejecutan
normalmente en orden secuencial, es decir, una a continuación de otra, en el mismo orden en
que están escritas, que sólo varía cuando se alcanza una instrucción de control (un bucle, una
instrucción condicional o una transferencia).
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.
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 éxito
("verdadero"), bien en fracaso ("falso").

Paradigma: Programación declarativa


La Programación Declarativa, o bien un Paradigma declarativo, es un paradigma de
programación que está basado en el desarrollo de programas especificando o "declarando" un
conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o
transformaciones que describen el problema y detallan su solución. La solución es obtenida
mediante mecanismos internos de control, sin especificar exactamente cómo encontrarla. No
existen asignaciones destructivas, y las variables son utilizadas con Transparencia referencial

Diferencia entre imperativo y declarativo


En la programación imperativa se describe paso a paso un conjunto de instrucciones que
deben ejecutarse para variar el estado del programa y hallar la solución, es decir, un algoritmo
en
el que se describen los pasos necesarios para solucionar el problema.
En la programación declarativa las sentencias que se utilizan lo que hacen es describir el
problema que se quiere solucionar, pero no las instrucciones necesarias para solucionarlo. Esto
último se realizará mediante mecanismos internos de inferencia de información a partir de la
descripción realizada

Algunos lenguajes declarativos


Lisp
Prolog

Programación lógica
La programación lógica consiste en la aplicación del corpus de conocimiento sobre lógica
para el diseño de lenguajes de programación; no debe confundirse con la disciplina de la lógica
computacional. La programación lógica comprende dos paradigmas de programación: la
programación declarativa y la programación funcional. La programación declarativa gira en
torno al concepto de predicado, o relación entre elementos. La programación funcional se basa
en el concepto de función (que no es más que una evolución de los predicados), de corte más
matemático.

Campos de aplicación
La programación lógica encuentra su hábitat natural en aplicaciones de inteligencia artificial o
relacionadas:
Sistemas expertos, donde un sistema de información imita las recomendaciones de un
experto sobre algún dominio de conocimiento.
Demostración automática de teoremas, donde un programa genera nuevos teoremas sobre
una teoría existente.
Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con
limitaciones) la información contenida en una expresión lingüística humana.

La programación lógica también se utiliza en aplicaciones más "mundanas" pero de manera


muy limitada, ya que la programación tradicional es más adecuada a tareas de propósito
general.

Fundamentos
La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer
orden, aunque también incorporan algunos comportamientos de orden superior. En este
sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la
única teoría lógica de orden superior que es demostradamente computable (hasta el momento).

Lenguajes
El lenguaje de programación lógica por excelencia es Prolog, que cuenta con diversas
variantes. La más importante es la programación lógica con restricciones (véase artículo sobre
programación con restricciones), que posibilita la resolución de ecuaciones lineales además de
la demostración de hipótesis.
Tutorial básico de programación en Prolog

El entorno de desarrollo Prolog


Prolog es un lenguaje de programación
a Java. El codigo fuente se compila a un código de byte el cuál se interpreta en una máquina
virtual
denominada Warren Abstract Machine
Por eso, un entorno de desarrollo Prolo
Un compilador. Transforma el código fuente en código de byte. A diferencia de Java, no
existe un standard al respecto. Por eso, el codigo de byte generado por un entorno de
desarrollo no tiene por que funcionar en el intérprete de otro en
Un intérprete. Ejecuta el código de byte.
Un shell o top-level. Se trata de una utilidad que permite probar los programas, depurarlos,
etc. Su funcionamiento es similar a los interfaces de línea de comando de los sistemas
operativos.
Una biblioteca de utilidades
entornos incluyen (afortunadamente) unas bibliotecas standard
funcionalidades básicas como manipular cadenas, entrada/salida, etc.
Generalmente, los entornos de desarrollo de programación con restricciones, concurrente,
orientada a objetos, etc.
Sería injusto no mencionar aquí el entorno de desarrollo más popular:
se trata de un entorno de desarrollo SICStus, CIAO Prolog, y posibiblemente otros más,
ofrecen entornos integrados generalmente basados en Emacs que resultan muy fáciles de
usar. CIAO Prolog además ofrece un autodocumentador similar al existente para Java además
de Prácticamente todos ellos son multiplataforma.

Compatibilidad ISO-Prolog
Existe un standard ISO que dicta las típicas normas con respecto a la sintáxis del lenguaje
y a las bibliotecas básicas que se deben ofrecer. Actua aspectos del lenguaje, y además, no
todos los entornos siguen el standard al pie de la letra. Por eso, programas que funcionan en
unos entornos podrían no funcionar en otros, o lo que es peor,funcionar de forma diferente.
Todos los ejemplos que aparecen en este curso siguen el standard ISO se especifique lo
contrario. En cualquier caso debe consultar la documentación de su entorno de
desarrollo puesto que pueden existir pequeñas variaciones. Los principales investigadores de
la tecnología Prolog son los suecos y los españoles.

Elementos del lenguaje


seminterpretado. Su funcionamiento es muy similar
(comúnmente denominada WAM).
Prolog se compone de:
. entorno.
. utilidades. Estas bibliotecas son, en general, muy amplias. Muchos
standard-ISO que permiten
desarrollo ofrecen extensiones al lenguaje como pueden ser la
SICStus Prolog
desarrollo comercial (no gratuito).
un preprocesador de programas.
Actualmente el standard no contempla todos los
ISO-Prolog salvo que
respecto a su uso.
. lo Prolog, si bién,
Lmente
En esta lección explicaremos como reconocer los dif programa fuente en Prolog. Como
observará en breve, Prolog carece de declaraciones en el sentido imperativo: secciones,
declaraciones de tipo, declaraciones de variable, declaraciones de procedimientos, etc.

Comentarios
Los comentarios en Prolog se escriben comenzando la línea con un símbolo de porcentaje.
Ejemplo:
% Hola, esto es un comentario.
% Y esto también.

Variables lógicas
Las váriables en Prolog no son variables en el sentido habitual, por eso las llamamos
variables lógicas. Se escriben como una secuencia de caracteres alfabéticos comenzando
siempre
por mayúscula o subrayado. Ejemplos de variables:
Variable
_Hola
_
Pero no son variables:
variable
$Hola
p__
El hecho de que los nombres de variables comienzen por mayúscula (o subrayado) evita la
necesidad de declarar previamente y d
lenguajes.

La variable anónima
Sí, sí, existen variables sin nombre, y todas ellas se representan mediante el símbolo de
subrayado _. Pero cuidado, aunque todas las variables anónimas se escri
distintas. Es decir, mientras que dos apariciones de la secuencia de caracteres Hola se refieren
a
la misma variable, dos apariciones de la secuencia _ se refieren a variables distintas.

Términos
Los términos son el único elemento del lenguaje. Todos los tados son términos, incluso el
propio programa es un término. No obstante, es habitual, llamar término solamente a los datos
que maneja un programa.
Un término se compone de un separados por comas. Los números enteros o decimales sin
restricciones de tamaño también son términos.

Un functor
Una sucesión de caracteres alfanuméricos comenzando por una letra minús
Un símbolo de puntuación o secuencia de estos. Las secuencias permitidas varian de un
entorno de desarrollo a otro.
Una sucesión cualquiera de caracteres encerrada entre comillas simples.
Veamos algunos ejemplos de functores:
functor
f384p12
'esto es un unico functor, eh!!'
'_functor'
$
+
No son functores válidos:
_functor
Functor
Los argumentos de un término pueden ser:
otro término.
una váriable lógica.
La mejor forma de aprender a escribir
termino_cero_ario
1237878837385345.187823787872344434
t(1)
'mi functor'(17,hola,'otro termino')
f(Variable)
muchos_argumentos(_,_,_,Variable,232,f,g,a)
terminos_anidados(f(g), h(i,j(7)), p(a
+(3,4)
$(a,b)
@(12)

Operadores
Los operadores simplemente sirven para escribir términos unarios o
binarios de una manera más cómoda. Por ejemplo, un factor definido como operador
suma (+). Así, la expresión a+b es perfectamente válida, aunque en realidad no es más que el
término +(a,b).

Los operadores tienen asociada una prioridad. Por ejemplo, la expresión a+b*c es en
realidad el término +(a,*(b,c)). Esto es así porque el operador producto (*) tiene más prioridad
que el operador suma (+). Si no fuese así, se trataría del término *(+(a,b),c).

algunos ejemplos:
a(b)), j(1,3,2,_))
operadores, bien de manera predefinida,factor entre los dos argumentos yminúscula.

Ejemplo
% Este es mi primer programa en Prolog
%
% Se trata de un arbol genealogico muy simple
%
%
% Primero defino los parentescos basicos
% de la familia.
% padre(A,B) significa que B es el padre de A...
padre(juan,alberto).
padre(luis,alberto).
padre(alberto,leoncio).
padre(geronimo,leoncio).
padre(luisa,geronimo).
% Ahora defino las condiciones para que
% dos individuos sean hermanos
% hermano(A,B) significa que A es hermano de B...
hermano(A,B) :-
padre(A,P),
padre(B,P),
A \== B.
% Ahora defino el parentesco abuelo
% nieto(A,B) significa que A es nieto de B...
nieto(A,B) :-
padre(A,P),
padre(P,B).

También podría gustarte