Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lógica y Funcional
m a c ión
progra a
Lógic
Un trabajito propuesto en 1970
¿Como programar un sistema como el siguiente?
Usuario > Los gatos matan ratones.
Usuario > Tom es un gato al que no le gustan los ratones
queso.
Sistema > Tom mata ratones.
Usuario > ¿Quíen es un gato?
Sistema > Tom.
Usuario > ¿Qué come Jerry?
Sistema > Queso.
1965. Alan Robinson [3] formula el principio de
resolución.
Reglas de inferencias menos humanas, pero mas
eficientes.
1970. Alain Colmerauer, Philippe Roussel y Robert
Pasero trabajan en traducción automática y
procesamiento de lenguaje natural.
1971. Robert Kowalski [2] dene la resolución-SL.
1974. El lenguaje Prolog.
Siglo XIX. En su segunda mitad, Gottlob Frege
introduce la lógica de primer orden. Modificada a su
forma actual por Giuseppe Peano y Bertrand Russell.
1930's. Kurt GŐedel y Jacques Herbrand estudiaron la
noción de computabilidad basada en derivaciones.
1965. La resolución y unificación por Alain Robinson.
1974. La resolución-SL de Kowalski: debate (en ese
momento) sobre representaciones declarativas y
procedimentales. Prolog.
1983. La máquina abstracta de Warren (WAM).
Compilación independiente al procesador usado.
La programación lógica es una herramienta y un sujeto
de estudio de la inteligencia artificial.
La lógica de primer orden es fundamental para entender
este paradigma de programación.
La programación lógica es un paradigma de
programación, que difiere de otros paradigmas como la
programación imperativa (Algol, C, Pascal, etc.), la
orientada a objetos (Simula, Smalltalk, Eiel, C++, Java,
etc.), o la funcional (ML, Haskell, Lisp, etc.).
Prolog <> programación lógica, pero es su realización
práctica más usada en la actualidad.
La clase más general de objeto manejado en
programación lógica es el término.
Suelen indicarse mediante un
identificador cuyo primer carácter es
una letra mayúscula
Leer operacionalmente
Conjunción Condicional
Prolog es la realización más utilizada del paradigma de
programación lógica.
Escribir un programa en Prolog tiene menos que ver
con la tarea de especificar un algoritmo, como es el
caso de la programación imperativa; y más con la
especificación de los objetos y las relaciones que
ocurren entre ellos, en el contexto de un problema.
Representación en prolog:
Condicional Conjunción
Inversa
Cabeza Cuerpo
tiene_rayas_negras.
Representación en prolog:
divide(6,X):- divide(2,X), divide(3,X).
variables
EL mecanismo operacional adoptado por los sistemas que
implementan la versión pura del leguaje prolog es la estrategia de
resolución SLD con las siguientes propiedades:
La regla de computación de prolog trata los objetivos como secuencia de
átomos y siempre selecciona para resolver el átomo situado mas a la
izquierda dentro del objetivo.
Prolog intenta unificar el átomo seleccionado por la regla de computación
con las cabezas de las clausulas del programa considerándolas en el orden
textual en el que éstas aparecen dentro del programa.
Prolog usa una regla de búsqueda en profundidad con vuelta atrás
(backtracking):
visita los descendientes de un nodo antes de visitar un nodo hermano
recorre primero la rama más a la izquierda del árbol de búsqueda antes de recorrer
el resto.
Prolog permite sintaxis ambivalente. Un mismo símbolo de función o
predicado puede utilizarse con diferentes aridades en un mismo programa.
Para estudiar el comportamiento operacional de
prolog, éste proporciona el predicado trace
mujer(pam).
mujer(liz).
mujer(pat).
mujer(ann). Predicados
hombre(tom).
hombre(bob).
hombre(jim).
vastago(Y,X) :- progenitor(X,Y).
tienehijo(X) :- progenitor(X,Y)
ancestro(X,Z) :- progenitor(X,Z).
tio(X,Y):-
primo(X,Y):-
sobrino(X,Y):-
cuñada(X,Y):-
Ejemplo: la carta de un restaurante
entrada(paella).
entrada(gazpacho).
entrada(consome).
carne(filete_de_cerdo).
carne(pollo_asado).
pescado(trucha).
pescado(bacalao).
postre(flan).
postre(nueces_con_miel).
postre(naranja).
Definir la relación "plato_principal(X)" que indicara que un plato
principal es un plato de carne o de pescado.
plato_principal(X):- carne(X).
plato_principal(X):- pescado(X).
`Inteligencia Artificial`
Variables:
cadenas formadas por letras, dígitos y el símbolo de
subrayado, deben empezar por una letra mayúscula o por un
símbolo de subrayado
Términos Compuestos (o estructuras)
Se construyen mediante un símbolo de función
(functor), que se denota mediante un átomo, seguido,
entre paréntesis, por una serie de términos separados
por comas, denominados argumentos.
Ejemplos: fecha(1,mayo,2001), punto(X,Y)
Uso: listas
Lista vacía []
toda lista no vacía tiene una cabeza (que sería cualquier
término) y un resto (que sería una lista), y se representa
mediante un término compuesto de aridad 2, cuyo functor es
un punto. y cuyos argumentos son, respectivamente, la
cabeza y el resto de la lista.
Ejemplo. .(a; []).
Operadores Aritméticos
Prolog es un lenguaje orientado a la manipulación
simbólica, por lo tanto el repertorio de operaciones
aritméticas suele ser limitado.
X+Y suma de X e Y
X-Y X menos Y
X*Y producto de X por Y
X/Y cociente real de la división de X por Y
X//Y cociente entero de la división de X por Y
X mod Y resto de la división entera de X por Y
abs(X) valor absoluto de X
sqrt(X) raíz cuadrada de X
Ejemplos de expresiones aritméticas
I. 3 +3 * 5
II. 3 mod 2
III. Y + 10 / 2
IV. 3/2+2*5
V. 6/2
VI. 6 div 2
VII. 50 + 10 / 3 mod 2
En prolog las expresiones no se evalúan automáticamente,
contrariamente a lo que sucede en otros lenguajes, es preciso
forzar su evaluación mediante el operador ‘is’ (operador infijo
binario)
Dado un objetivo
‘?-Expresion1 is Expresion2’
Expresiones Aritméticas
Ejemplo
?- X is 3 + 2 * 5.
X=13
?- X is 3 / 2 + 2 * 5.
X=11.500000 Se produce el error
?- X is 6 div 2. porque la variable y no
X= 3 esta instanciada en el
momento en que se
?- X is 3 mod 2
evalúa la expresión
X= 1
?- X is 6 / 2.
X=3.0
?- X is 50 + 10 / 3 mod 2.
X= 60.0
?- X is Y + 10 / 2.
Illegal argument to is.
_1<Illegal arg> : (1:0) _0 is _1 + 10 / 2. : a
“is”
Su uso puede dar lugar a un error en los dos
siguientes casos:
cuando la parte derecha no es una expresión
aritmética:
?- X is a+1.
{DOMAIN ERROR: _157 is a+1 - arg 2: expected
expression, found a}
cuando la parte derecha es una expresión
aritmética pero no se puede evaluar:
?-X is 4*Z.
{INSTANTIATION ERROR: _157 is 4*_155 - arg 2}
Salvo en los casos anteriores, el resultado del predicado
dependería de si la parte izquierda unifica o no con el
resultado obtenido al evaluar la parte derecha:
Comparaciones Aritméticas
X =:= Y cierto si los valores numéricos de X e Y son iguales
X =\= Y cierto si los valores numéricos de X e Y son distintos
X < Y cierto si el valor numérico de X es menor que el de Y
X =< Y cierto si el valor numérico de X es menor o igual que el
de Y
X > Y cierto si el valor numérico de X es mayor que el de Y
X >= Y cierto si el valor numérico de X es mayor o igual que el
de Y
Ejemplos:
Obtener el mayor de 2 números.
maximo(X,Y,X) :- X >= Y.
maximo(X,Y,Y) :- X < Y.
La variable anónima
Existen variables sin nombre, y todas ellas se representan
mediante el símbolo de subrayado _.
Aunque todas las variables anónimas se escriben igual, son
todas 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.
Entrada y Salida
Predicados para la E / S de términos (sobre el “stream”
por defecto):
read(X) lee un término y lo unifica con X (el término
debe terminar en punto).
write(T) escribe el término T (en particular,
write(‘texto’) para escribir texto).
display(T) escribe el término T (sin expandir los
operadores)
%lee un valor
lee(X) :- write('Introduzca un número: '), nl, read(X).