Programación Lógica
M.C. Juan Carlos Olivares Rojas
Agenda
5.1 Principios de la programación lógica.
5.2 Bases para la programación en lenguaje prolog
Paradigma de Programación Lógica
• Otra forma de estructurar programas es a través
del pensamiento lógico, generalmente lógica de
primer orden en donde se pueden expresar
mucha información.
• Por cuestiones de tiempo un repaso sobre lógica
de primer orden es muy difícil por lo que se
realizará sobre la marcha.
PROLOG
•
•
•
•
•
•
Hechos:
las aves vuelan
los pingüinos no vuelan
"pichurri" es un ave
"sandokan" es un perro
"alegría" es un ave
PROLOG
• Reglas o Restricciones:
• una mascota vuela si es un ave y no es un
pingüino
• Preguntas
• ¿ "pichurri" vuela ?
• ¿ qué mascotas vuelan ?
PROLOG
• Términos: constantes (a), variables (X), funciones
(f(X, Y ))
pepe, juan, Cliente, cliente-de(X, Y )
• Fórmulas atómicas: predicados definidos sobre
términos
tipo-cliente(X,bueno)
PROLOG
• Fórmulas bien formadas (wff): fórmulas atómicas
unidas por conectivas (^, _,!, ¬) y cuantificadas
(1A universal, 1B existencial)
• 1AX, 1BZ cliente(X) ^ compra(X, Z) ^ caro(Z) 
tipo-cliente(X, bueno)
• abuelo(X,Y) :- padre(X,Z), padre(Z,Y).
• 1AX, Y 1BZ padre(X, Z) ^ padre(Z, Y)  abuelo(X,
Y)
PROLOG
• abuelo(X,Y) :- padre(X,Z), madre(Z,Y).
• abuelo(X,Y) :- padre(X,Z), padre(Z,Y).
• abuelo(X, Y) = {(pepe, juan), (pepe, ana), … , (luis,
javier)}
• progenitor(X, Y ) :- padre(X, Y ).
• progenitor(X, Y ) :- madre(X, Y ).
PROLOG
• abuelo(X,Y) :- padre(X,Z), madre(Z,Y).
• abuelo(X,Y) :- padre(X,Z), padre(Z,Y).
• abuelo(X,Y) :- padre(X,Z), progenitor(Z,Y).
• hechos: A. (A átomo)
• reglas: A :- A1, ..., An. (n>0, y A, A1, ..., An
átomos)
PROLOG
• Hechos:
– padece(jon, gripe).
– padece(jon, hepatitis).
– padece(ana, gripe).
– padece(carlos, alergia).
– es-síntoma(fiebre, gripe).
– es-síntoma(cansancio, gripe).
– es-síntoma(estornudos, alergia).
– suprime(paracetamol, fiebre).
– suprime(antihistamínico, estornudos).
PROLOG
• Reglas:
– debe-tomar(Per, Far) :- padece(Per, Enf), alivia(Far,
Enf).
– alivia(Far, Enf) :- es-síntoma(Sin, Enf), suprime(Far,
Sin).
• Preguntas:
– ? padece(carlos, gripe).
– ? padece(jon, Z).
– ? alivia(paracetamol, gripe).
PROLOG
– ? alivia(X, gripe).
– ? debe-tomar(Y, antihistamínico).
– ? alivia(X, Y).
– ? suprime(X, fiebre), suprime(X, estornudos).
• ¿Qué devuelve cada pregunta como resultado?
PROLOG
• hija (*A, *B) <- mujer (*A), padre (*B, *A).
• hija (*A, *B) <- mujer (*A), madre (*B, *A).
• A continuación se muestra un programa completo
en PROLOG:
%% declaraciones
padrede('juan', 'maria').
padrede('pablo', 'juan').
PROLOG
padrede('pablo', 'marcela').
padrede('carlos', 'debora').
%%Reglas
% A es hijo de B si B es padre de A hijode(A,B) :padrede(B,A).
abuelode(A,B) :- padrede(A,C), padrede(C,B).
hermanode(A,B) :- padrede(C,A) , padrede(C,B), A
\== B.
familiarde(A,B) :- padrede(A,B).
PROLOG
familiarde(A,B) :- hijode(A,B).
familiarde(A,B) :- hermanode(A,B).
%% consultas
% juan es hermano de marcela?
?- hermanode('juan', 'marcela').
Yes
?- hermanode('carlos', 'juan'). No
?- abuelode('pablo', 'maria'). Yes
?- abuelode('maria', 'pablo'). no
PROLOG
%unificación con evaluación.
?- X is 3+5.
X=8
%unificación simbólica
?- X = 3+5.
X = 3+5
PROLOG
%comparación con evaluación
?- 3+5 =:= 2+6.
yes
%comparación simbólica.
?- 3+5 == 2+6.
no
?- 3+5 == 3+5.
yes
PROLOG
• Los programas en PROLOG se definen a través de
Algoritmos, Lógica y Control.
• En caso de que una consulta de más de un
resultado, el prompt no aparece en la shell. Se
puede utilizar el operador . Para terminar el
resultado, o bien, el operador ; para continuar
con los emparejamientos de resultados.
• Se pueden combinar preguntas para obtener
respuestas más exactas.
PROLOG
•
•
•
•
•
•
•
%Combinación de preguntas
legusta(pepe, pesca).
legusta(maria, bailar).
legusta(ana, pesca).
legusta(pepe, musica).
legusta(maria, musica).
legusta(ana, bailar).
• %preguntas
PROLOG
• ¿Le gusta la música a Pepé y a María?
• ?_ legusta(pepe,musica), legusta(maria, musica).
• ¿Le gusta bailar a Pepé o le gusta la música a
maria?
• ?_ legusta(pepe,bailar); legusta(maria, musica).
• ¿Le gusta bailar a Pepé y a maria no le gusta la
música?
• legusta(pepe,bailar), not(legusta(maria,musica)).
PROLOG
• El portal de redes sociales de la UVAQ desea
diseñar un Sistema Experto para encontrar la
pareja ideal de cada estudiante si es que existiere.
Para lograr esto, se tienen en la base de
conocimientos registrados los gustos de cada
usuario (color de ojos, altura, complexión, carro,
etc.). Se da un punto por cada coincidencia.
Diseñar la regla o reglas que determinen la mejor
pareja de cada usuario. (Se deben tener al menos
2 hombres y 2 mujeres con 5 gustos c/u).
PROLOG
• Se puede aplicar recursividad en PROLOG además
de que algunos programas en programación
estructurada pueden ser implementados.
•
•
•
•
•
•
%Sucesiones
sucesor(1,2).
sucesor(2,3).
sucesor(3,4).
sucesor(4,5).
sucesor(5,6).
PROLOG
• sucesor(6,7).
• suma(1,X,R):-sucesor(X,R).
• suma(N,X,R):-sucesor(M,N),
sucesor(R1, R).
suma(M,X,
• %Como se crearía una consulta?
• %¿Qué es lo que el programa haría?
R1),
PROLOG
• %Programa aridad
• ama(juan).
• ama(pepe, maria).
• La unificación es el proceso en el cual uma
variable toma un valor.
• Cuando una variable tiene un valor, este no
cambia.
Prolog
• Realizar un programa en Prolog que permita
determinar si dos personas pueden comunicarse
entre sí.
• Se deberá codificar una base de conocimientos
para 5 personas con los idiomas que conocer, así
como establecer una regla que permita inferir el
resultado.
PROLOG
• Dos términos se ejecutan cuando existe una
posible ligadura en sus variables y en sus valores.
Ejemplo: a(X, 3) = a(2, Y).
•
•
•
•
•
•
edad(luis,25).
edad(hugo,32).
edad(paco,29).
edad(jaime,67).
edad(laura,85).
es_viejo(Persona) :- edad(Persona,Valor), valor >
60.
Ejercicio
•
•
•
•
•
•
•
•
•
padre(X,Y) – X es padre de Y
madre(X,Y) – X es madre de Y
es_padre(X) – X es un padre
es_madre(X) – X es una madre
es_hijo(X) – X es un hijo (hombre)
hermana(X,Y) – X es hermana de Y
abuelo(X,Y) – X es abuelo (hombre) de Y
tia(X,Y) – X es tía de Y
primo(X,Y) – X es primo (hombre) de Y
PROLOG
• Prolog tiene la característica de ser reversible; es
decir, los argumentos pueden ser de entrada y
salida. Si se tiene un predicado abuelo se puede
saber quienes son los nietos de ese abuelo.
• Esto no sucede con los operadores aritméticos.
• Otro tipo de datos utilizado en Prolog es el
registro. El cual es una combinación de
elementos.
PROLOG
• Por ejemplo: persona(‘Eva’, ‘López’, ‘Cárdenas’,
25)
• Define a una persona teniendo como atributos su
nombre, sus apellidos y su edad. Dado que los
términos son anidados se pueden tener registros
como:
• Persona(“Helena”, edad(22), dirección(‘Miguel
Hidalgo 33’, ‘Centro’, ‘Morelia’))
PROLOG
• Se pueden utilizar estructuras de datos
recurrentes como árboles, en donde el primer
elemento podría ser un nodo, el segundo el hijo
izquierdo y el tercer elemento, el hijo derecho.
• arbol(dato1, temp, temp)
• arbol(dato1, arbol(dato2, temp, temp), temp)
• En donde temp indica un campo vacío.
PROLOG
•
•
•
•
•
•
•
•
•
% Ejemplo
entrada(paella).
entrada(gazpacho).
entrada(consome).
carne(filete_de_cerdo).
carne(pollo_asado).
pescado(trucha).
pescado(bacalao).
postre(flan).
PROLOG
•
•
•
•
•
•
•
•
•
postre(nueces_con_miel).
postre(naranja).
calorias(paella, 200).
calorias(gazpacho, 150).
calorias(consome, 300).
calorias(filete_de_cerdo, 400).
calorias(pollo_asado, 280).
calorias(trucha, 160).
calorias(bacalao, 300).
PROLOG
•
•
•
•
•
calorias(flan, 200).
calorias(nueces_con_miel, 500).
calorias(naranja, 50).
plato_principal(P):- carne(P); pescado(P).
comida(Entrada,
Principal,
Postre):entrada(Entrada),
plato_principal(Principal),
postre(Postre).
• valor(Entrada,
Principal,
Postre,
Valor):calorias(Entrada, X), calorias(Principal, Y),
calorias(Postre, Z), sumar(X, Y, Z, Valor).
PROLOG
• comida_equilibrada(Entrada, Principal, Postre):comida(Entrada, Principal, Postre), valor(Entrada,
Principal, Postre, Valor), menor(Valor, 800).
• sumar(X, Y, Z, Res):- Res is X + Y + Z.
• menor(X, Y):- X < Y.
• dif(X, Y):- X \==Y.
•
• Encontrar: ¿Cuántas calorías tiene la combinación
paella, trucha, naranja? ¿Qué comida que tiene
cónsome de entrada es la más balanceada?
PROLOG
• Se pueden definir funciones recursivas como el
factorial:
• fac(0,1).
• fac(N,F) :- N > 0, M is N - 1, fac(M,Fm), F is N *
Fm.
• ¿Cómo se expresa la serie de fibonnaci?
Prolog
• El predicado trace() permite
invocación de un predicado
observar
la
• El predicado listing() permite visualizar la regla
que define un predicado en particular.
• El predicado assert() permite agregar
predicado a la base de conocimiento.
un
Proyecto
• Se realizará el programa adivina quien.
• Se codificarán como hechos al menos 5 personas
con 5 características físicas. Se tendrá una regla
que indique quién es la persona al inicio.
• Se codificarán reglas para preguntar, si tienen la
característica física y una regla para afirmar quien
es (si no le atina pierde el jugador).
¿Preguntas, dudas y comentarios?
Descargar

Introducción a la ciencia de la computación