Está en la página 1de 7

Departamento de Informática

Lenguajes de Programación
Universidad Técnica Federico Santa María

5.2 Introducción a Prolog

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Lenguaje Prolog

• Su nombre viene de Programación en


Lógica, creado a comienzos de los ´70:
• Robert Kowalski (Edimburgo): lado teórico
• Maarten van Emden (Edimburgo): demostración
práctica
• Alain Colmerauer (Marsella): Implementación
• Popularidad se debe a David Warren
(Edimburgo), que a mediados de los ´70
realizó implementación eficiente.
V-2-2

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Características de Prolog
• Basado en Lógica y programación declarativa
• Produce estilo de programación orientado a metas
• No se especifica cómo debe hacerse, sino qué
debe lograrse (alto nivel)
• El programador se concentra más en el
conocimiento que en los algoritmos
• ¿Qué es conocido? (hechos y relaciones )
• ¿Qué preguntar? (cómo resolverlo)

V-2-3

1
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Aplicaciones de Prolog

• Pruebas Matemáticas
– Demostración de teoremas
• Inteligencia Artificial
– Sistemas Expertos
• Consultas a base de datos
– Permite inferir relaciones no especificadas a
priori

V-2-4

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Hechos en Prolog: Ejemplo

padre(maria, pedro).
padre(juan, pedro). maria
maria juan
juan
padre(juan, carola).
padre(pedro, ana). pedro
pedro carola
carola
padre(pedro, paty).
padre(paty, aldo).
ana
ana paty
paty

aldo
aldo

V-2-5

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Consultas en Prolog
?- padre(pedro, ana).
=> yes

?- padre(ana, paty).
=> no

?- padre(X, carola).
=> X = juan

?- padre(pedro, X).
=> X = ana ;
=> X = paty ;
=> no

V-2-6

2
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Consulta: Ejemplo 1

Preguntar por el abuelo de aldo:

∃X, Y : (X es padre de Y) ∩ (Y es padre de aldo)

que se expresa en Prolog como:

?- padre(X, Y), padre(Y, aldo).


=> X = pedro
Y = paty

V-2-7

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Consulta: Ejemplo 2
Preguntar por los nietos de juan:

∃X, Y : (juan es padre de X) ∩ (X es padre de Y)

que se expresa en Prolog como:

?- padre(juan, X), padre(X, Y).


=> X = pedro
Y = ana ;

=> X = pedro
Y = paty
V-2-8

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Consulta: Ejemplo 3
Preguntar si ana y paty tienen un padre en común:

∃X : (X es padre de ana) ∩ (X es padre de patricio)

que se expresa en Prolog como:

?- padre(X, ana), padre(X, paty).


=> X = pedro

V-2-9

3
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Otros Hechos
Agregar cláusulas sobre el sexo de las personas
(relaciones unarias):

femenino(maria).
masculino(juan).
masculino(pedro).
femenino(carola).
femenino(ana).
femenino(paty).
masculino(aldo).

V-2-10

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Alternativa de definición de
hechos
Podría haberse definido también con una relación binaria:

sexo(maria, femenino).
sexo(juan, masculino).
sexo(pedro, masculino).
sexo(carola, femenino).
sexo(ana, femenino).
sexo(paty, femenino).
sexo(aldo, masculino).

¡A continuación usaremos la forma unaria!

V-2-11

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Reglas en Prolog
• La relación:
a⊂b
• se expresa en Prolog como:
a :- b.
• Una cláusula de este tipo se denomina regla, que
tiene la siguiente estructura:
• la cabeza (parte izquierda de :- ) es la conclusión
• la proposición definida en el cuerpo (parte derecha de :- )

V-2-12

4
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Resolución Simple
• La relación hijo de corresponde a:
∀ X, Y : (Y es hijo de X) ⊂ (X es padre de Y)
• que se expresa en Prolog como:
hijo(X, Y) :- padre(Y, X).

• Ejemplo: la meta siguiente es evaluada como:


La meta: hijo(paty, pedro)
se convierte en submeta padre(pedro, paty)
Se busca este hecho: yes
V-2-13

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Ejemplo de Reglas

Se puede definir ahora varias nuevas reglas como:

papa(X, Y) :- padre(X, Y), masculino(X).


mama(X, Y) :- padre(X, Y), femenino(X).
abuelo(X, Y) :- padre(X, Z), padre(Z, Y).
hermana(X, Y) :- padre(Z, X), padre(Z, Y), femenino(X).

V-2-14

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Ejemplo de Consulta
?- hermana(ana, paty).
=> yes

?- hermana(X, paty).
=> X = ana ;
=> X = paty

oops ... paty es hermana de ella misma

¡Falta excluir este caso:

hermana(X, Y) :- diferente(X, Y), padre(Z, X),


padre(Z, Y), femenino(X).
V-2-15

5
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Observaciones
• Programas Prolog se extienden simplemente agregando más cláusulas
• Cláusulas son de tres tipos: hechos, reglas y consultas
• Reglas declaran cosas que cuya verdad depende de otras condiciones
• Por medio de consultas el usuario puede solicitar al programas que
establezca qué cosas son verdad
• Una cláusula tiene una cabeza y un cuerpo. El cuerpo son metas
separadas por comas (conjunción)
• Hechos son cláusulas que no tienen cuerpo
• Preguntas sólo tienen cuerpo
• Reglas tienen cabeza y cuerpo
• Una evaluación puede sustituir una variable X por otro objeto (se dice
que X se instancia)
• Variables se cuantifican universalmente (∀)
V-2-16

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Reglas Recursivas

La relación antepasado se define sobre la base de una


regla de descendencia directa y otra regla de descendencia indirecta:

∀X, Z : (X es un antepasado de Z), si


{X es padre de Z } ∨
{ ∃Y: (X es padre de Y) ∧ (Y es antepasado de Z) }

Lo que en Prolog se expresa como :

antepasado(X, Z) :- padre(X, Z). % descendiente directo


antepasado(X, Z) :- padre(X, Y), antepasado(Y, Z). % descendiente ind.

V-2-17

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Ejemplo de Consulta
% Consultar por los descendientes de maria

?- antepasado (maria, X)
=> X = pedro ;
=> X = ana ;
=> X = paty ;
=> X = aldo

V-2-18

6
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Resolución de Consulta
antepasado(juan,paty)
antepasado(juan, paty)

Regla#1 Regla#2
maria
maria juan
juan
padre(juan, X)
padre(juan, paty)
antepasado(X, paty)
NO Hecho: pedro
pedro carola
carola
X=pedro
padre(juan, pedro)
antepasado(pedro, paty) ana
ana paty
paty

Regla#1
aldo
aldo
padre(pedro, paty)
SI V-2-19

También podría gustarte