Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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").
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.
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
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.
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).