Está en la página 1de 12

PROLOG

PROLOG = PROgrammation in LOGic


A. Colmerauer y Roussel (1973) crean, en la
universidad de Marsella, el primer intrprete del lenguaje
Prolog siguiendo las ideas de Robert Kowalski.
Utiliza un algoritmo determinstico
1. Eleccin del predicado que se encuentra ms a la
izquierda
2. Bsqueda secuencial de una clusula unificable en
lugar de hacerlo no determinsticamente
3. Backtracking: Rever el ltimo punto de decisin,
intentando encontrar un nuevo Unificador que lo
satisfaga

PROLOG
La programacin en prolog consiste en escribir clusulas
de Horn:
1. Hechos (facts): A .

PROGRAMA

2. Reglas (rules): A B1,,Bn


3. Consultas (queries): B1,,Bn
Un programa Prolog es una secuencia de Hechos y Reglas

Un programa Prolog es una lista ordenada de


clusulas, no un conjunto de clusulas.

Hechos
Los hechos no tienen que reflejar el mundo real
necesariamente, pero ser nica y exclusivamente
lo que PROLOG tomar como verdadero.
le_gusta_a(juan,maria).
valioso(oro).
tiene(juan,libro).
da(juan,libro,maria).
madre(ana, juan)

Reglas
Son utilizadas para expresar que un hecho depende de
un grupo de otros hechos.
abueloPaterno(X,Y):- padre(X,Z), padre(Z,Y)
X es abuelo paterno de Y si X es padre Z y Z es padre de Y

progenitor(X,Y):- padre(X,Y)c
progenitor(X,Y):- madre(X,Y)

X es progenitor de Y si
X es padre Y o
X es madre de Y

Reglas
REGLAS RECURSIVAS
Permiten definir relaciones en trmino de si misma.
ancestro(X,Y):- progenitor(X,Y).
ancestro(X,Y):- progenitor(X,Z), ancestro(Z,Y).

En una regla recursiva es necesario considerar:


Caso Bsico
Caso Recursivo

Ejercicios
Definir las reglas:
hermano(X,Y)
hermano(X,Y):- progenitor(Z,X), progenitor(Z,Y), X \= Y.

tio(X,Y)
tio(X,Y):- hermano(X, Z), progenitor(Z,Y).

Consultas
Dado el siguiente programa

?- progenitor(pilar,belen)
yes

progenitor(pilar, belen).
progenitor(tomas, belen).
progenitor(tomas, lucia).
progenitor(belen, ana).
progenitor(belen, pedro).
progenitor(pedro, jose).

?- progenitor(pilar,lucia)
no
?- progenitor(tomas,X).
X = belen ;
X = lucia.
?- progenitor(X,belen).
X = pilar ;
X = tomas ;
false.

En programacin lgica no hay direccionalidad


No existe el concepto de parmetro de entrada y
parmetro de salida.
dato

?- progenitor(tomas,X).
incgnita

?- progenitor(X,belen).
dato
El mismo predicado puede brindar distintos servicios, de
acuerdo a la forma en que se consulte el programa.
En programacin funcional sera necesario definir varias
funciones para brindar los distintos servicios que puede dar un
predicado.

Sintxis
madre (laura, martina).
Nombre de
la relacin

Argumentos

Constantes

tomos
Nmeros

Variables

Normales
Annimas

Simples
Trminos
vlidos

Estructuras

Predicados aritmticos predefinidos


Proveen una interfaz con
a las capacidades
aritmticas de la computadora.
Menos generales que la definicin lgica.
Incorporan direccionalidad en la definicin de los
predicados
Evaluador: is(Valor, Expresin)
Tiene solucin cuando Valor unifica con el resultado de
evaluar Expresin.
Sintaxis:
Valor is Expresin

Predicados aritmticos predefinidos


Consulta

Resultado

X is 3+5

Tiene la solucin X = 8.

8 is 3 +5.

Tiene xito

3+5 is 3+5.

Falla, dado que 3+5 no unifica con 8.

1. p(1).
2. q(X):- p(Y), X is Y+2.

?- q(Z).
Z = 3.

?- q(2).
false.
is' NO ES UNA ASIGNACIN

(N is N+1) no tiene sentido en Prolog.

Predicados relacionales
Expresin op Expresin
op ::= < | > | =< | >= |=:=(igual)| =/= (distinto).
Sea la consulta A op B (A y B expresiones).
Se evaluan A y B:
 Si el resultado de A y B, satisfacen la relacin que
representa el predicado relacional el predicado es verdadero.
 Si el resultado de A y B, no satisfacen la relacin que
representa el predicado relacional el predicado no es
verdadero.
 Si A o B no son expresiones aritmticas el predicado falla.
 Si A o B no son expresiones ground, ocurre un error.

Ejercicios
Definir el predicado mayor(X,Y, Z) que devuelve verdadero si
Z es el nmero mayor entre X e Y.

mayor(X,Y, X):- X > Y.


mayor(X,Y,Y):- X =< Y.

?- mayor(1,2,2).
true.
?- mayor(4,2,Z).
Z=4;
false.
?- mayor(4,4,X).
X = 4.

Ejercicios
Definir el predicado suma(X,Y, Z) que devuelve verdadero si
Z es la suma de X e Y.
suma((X,Y, Z):- Z is X + Y.
?- suma(1,3,4).
true.
?- suma(1,2,X).
X = 3.
?- suma(X,4,6).
ERROR: is/2: Arguments are not sufficiently instantiated

Ejercicios
Definir el predicado exp(X,Y, XY) que devuelve verdadero si
XY es el resultado de elevar X a la Y
exp(X,0,1).
exp(X,Y,XY) :- Y1 is Y-1, exp(X,Y1,XY1), XY is X * XY1.
?- exp(3,3,X).
X = 27.
?- exp(X,2,4).
ERROR: is/2: Arguments are not sufficiently instantiated

Listas
Una lista es un par de elementos en donde el
primero es un trmino y el segundo es
recursivamente el resto de la lista.
Notacin:
[ ]: lista vaca
[a1 , a2, ... , an]: lista de n elementos
[X | Y]: X, primer elemento de la lista - Y, cola de la lista
[a1 , a2 | X]: a1, primer elemento de la lista
a2, segundo elemento de la lista
X, cola de la lista

Listas y Unificacin
Lista1

Lista2

Unificacin

[X,Y,Z]
[X,Y,Z]

[a,b,c]
[a,b,c]

X=a, Y=b, Z=c


X=a, Y=b, Z=c

[a]
[a]

[X|Y]
[X|Y]

X = a, Y = [ ]
X = a, Y = [ ]

[X, Y | Z]
[X, Y | Z]

[a, b, c]
[a, b, c]

X=a, Y=b, Z=[c]


X=a, Y=b, Z=[c]

[[a,Y]|Z]
Y]|Z]
[[a,

[[X,b],[c,d]]
[[X,b],[c,d]]

X=a,
X=a,
Z=[[c,d]]
Z=[[c,d]]

[a|Y]
[a|Y]

[a,b]
[a,b]

YY
= [b]
= [b]

[a,b]
[a,b]

[b,Z]
[b,Z]

nono

[a|Q]

[P|b]

Y=b,
Y=b,

P=a, Q=b

Programas bsicos de listas


1. Lista( [ ] ) .

CONSULTA

2. Lista([X | Y]) :- Lista ( Y ).

( Lista([a , b , c]) )

(Lista([a , b , c]))
1 ,
2 , = {X = a , Y = [b , c]}
(Lista ([b , c]))
1 ,

2 , = {X = b , Y = [c]}
(Lista([c]))

1 ,

2 , = {X = c , Y = [ ]}
(Lista([ ]))
1,={}
()

Programas bsicos de listas


Determinar si un elemento pertenece a una lista.
1. miembro(X, [X|Xs]).

2. miembro(X,[Y|Ys]):-miembro(X,Ys).
f es una consulta
/ R |= f
?
f = miembro(a , [s , a , d]) ;
Si existe y f
= miembro(a , [s , a , d])
f = miembro(a , [s , T , d]) ;
Si existe y f
= miembro(a , [s , a , d])

Programas bsicos de listas


Dada dos listas, obtener una lista que tenga todos los
elementos de la primer lista, y luego los de la segunda.
R
1. concatenar ([ ], Xs, Xs).
2. concatenar([X|Xs],Ys,[X|Zs]) :- concatenar(Xs,Ys,Zs).
f es una consulta
/ R |= f
?
f = concatenar([a , d , c] , [s , a , d] , Z) ;
Si existe y Z = [a , d , c , s , a , d]
f = concatenar(T , [s , a , d] , [a , d , c , s , a , d]) ;
Si existe y T = [s , a , d]

10

Funciones o trminos complejos


Predicado
<smbolo-predicado> (t1 , t2 , ..... , tn)
ti = trmino
ti = variable | constante | funcin
funcin : <smbolo-funcional>( t1 , t2 , ..... , tn)
Una FUNCIN puede ser unificada.
libro(The Art of Prolog , autor(leon , sterling),

funciones

editor(The MIT Press)).

PROGRAMA
libro(The Art of Prolog , autor(leon , sterling),
editor(The MIT Press)).
libro(Inside Smalltalk v1 , autor(wilf , lalonde),
editor(Prentice Hall)).
libro(Inside Smalltalk v2 , autor(wilf , lalonde),
editor(Prentice Hall)).
apellido_autor(Titulo , X) :- libro(Titulo , autor(T , X) , K).

Consulta:
apellido_autor(The Art of Prolog , T)
Respuesta:
T = sterling

11

Ejercicios
Definir los siguientes predicados
factorial(X,F): devuelve verdadero si F es el factorial de X
long(L,N): devuelve verdadero si N es la longitud de la lista L
suma(L,N): devuelve verdadero si N es la suma de los elementos
de la lista L
invertir(L,LI): devuelve verdadero si LI contiene los elementos
de L en orden inverso
primero(L,X) : devuelve verdadero si X es el primer elemento de
la lista L
ultimo (L,X): devuelve verdadero si X es el ltimo elemento de
la lista L

12

También podría gustarte