Está en la página 1de 25

Introduccin a

Prolog

Prolog

Computacin simblica, no numrica.


Resolver problemas expresados en forma de
objetos y relaciones entre ellos.

Constantes y variables: se utilizan para referirse a


objetos o entidades.
Predicados: expresan relaciones entre los objetos o
entidades.

Ejemplo:
progenitor(juan,luis).
Juan es el progenitor de Luis

Semntica declarativa
Los programas en Prolog se pueden
entender como teoras lgicas:

P :- Q, R
Si Q y R son ciertos, P es cierto

Un objetivo G se cumple si:

Existe una clusula C en el programa tal que:

Existe una instancia I de C tal que


1.
2.

La cabeza de I es idntica a G
Todos los objetivos en el cuerpo de I son ciertos

Hechos

Una parte importante de los programas en


prolog son los hechos, formados por
combinacin de predicados y constantes:
progenitor(juan,luis).

Juan

progenitor(juan,maria).
Luis

Maria

progenitor(luis,carlos)
progenitor(luis,laura).

Carlos Laura

Consultas (I) Preguntas de


s y no

En el intrprete, se pueden realizar


consultas:
?- progenitor(juan, luis).
yes
?- progenitor(juan, laura).
no

Variables

Cadenas de letras, dgitos y guin bajo, que


comienzan con letra mayscula, o con el guin bajo:
X Result _ Lista_de_tareas _x23
El nombre _ est reservado para variables
"annimas".
El alcance de una variable es en la clusula
(excepto _):
abuelo(X,Y) :- padre(X,Z), padre(Z,Y).
padre(X,Y) :- hijo(Y,X).
padreEHijo(X) :- padre(X,_), padre(_,X).

Consultas (II) Variables

Si alguno de los atributos es una variable, el


intrprete retornar los valores que puede
tomar para ser satisfecha.
Su nombre ha de comenzar con mayscula
?- progenitor(juan,X).
X = luis ;
X = maria
?- progenitor(laura,X).
no

Consultas (III) Varias


variables

En consultas con varias variables, se retornarn


todas las combinaciones de valores posibles:
?- progenitor(X,Y).
X = juan
Y = luis ;
X = juan
Y = maria ;
X = luis
Y = carlos ;
X = luis
Y = maria ;

Consultas (IV) Varios


predicados

Es posible combinar varios predicados en la


misma consulta. En este caso, para
satisfacer la consulta debern satisfacerse
todos ellos:
?- progenitor(juan,Y),
progenitor(Y,carlos).
Y = luis ;
?- progenitor(X,luis),
progenitor(X,maria).
X = juan

Reglas (I)

Podramos introducir todos los hechos


inversos acerca de quin es hijo de quin:
hijo(luis,juan).
hijo(maria,juan).

Una manera ms sencilla sera introducir una


regla:
Para todo X e Y,
Si X es progenitor de Y,
Y es hijo de X

Reglas (II)

Las reglas en prolog tienen dos


componentes: cabeza (el consecuente) y
cuerpo (el antecedente).
hijo(Y,X) :- progenitor(X,Y).

Una vez introducida la regla en el intrprete,


podr utilizarla para responder consultas:
?- hijo(luis,X).
X = juan

Reglas (III) Varios


antecedentes

Cuando el cuerpo de una regla contiene


varios antecedentes, han de ser todos
satisfechos para que se aplique:
hija(Y,X) :- progenitor(X,Y),hembra(Y).
hijo(Y,X) :- progenitor(X,Y),macho(Y).
hembra(maria).
macho(luis).
?- hija(X,juan).
X = maria

Reglas (IV)
hermano(X,Y) :progenitor(Z,X),
progenitor(Z,Y).
?- hermano(luis,H).
H = luis ;
H = maria ;

Reglas recursivas (I)

Consideremos la relacin antepasado:

juan es antepasado de luis, mara, carlos y laura.


luis es antepasado de carlos y laura.

X es antepasado de Y si existe una sucesin


de relaciones de paternidad entre Y y X:

antepasado(X,Y) :- progenitor(X,Y).
antepasado(X,Y) :- progenitor(X,Z), progenitor(Z,Y).
antepasado(X,Y) :- progenitor(X,Z), progenitor(Z,K),
progenitor(K,Y).
etc.

Reglas recursivas (II)


X es antepasado de Y si:
O bien X es el padre de Y
O bien X es el padre de un antepasado de Y
antepasado(X,Y) :- progenitor(X,Y).
antepasado(X,Y) :- progenitor(X,Z),
antepasado(Z,Y).

Funcionamiento de prolog

Para responder una consulta, prolog:

Busca por orden un hecho o regla que unifique


con la consulta (asignando valores a las
variables, si es preciso).

Si es un hecho, termina.
Si es una regla, intenta comprobar (de manera
recursiva) si se cumple el cuerpo de la misma.
En el caso de que no se cumpla, hace backtracking, y
continua buscando la siguiente regla que unifique con la
consulta.

Funcionamiento de prolog
(II)
Los contenidos de la base de datos son:
progenitor(juan,luis).
progenitor(juan,maria).
progenitor(luis,carlos)
progenitor(luis,laura).
antepasado(X,Y) :- progenitor(X,Y).
antepasado(X,Y) :- progenitor(X,Z),
antepasado(Z,Y).

Funcionamiento de prolog
(III)
?- progenitor(juan,X)
Prolog busca el primer hecho o regla con
nombre progenitor, y cuyo primer
argumento sea el tomo juan.
El primer resultado (en la BD) es
progenitor(juan,luis).
por lo que el intrprete devuelve
X = luis

Funcionamiento de prolog
(IV)
El segundo resultado (en la BD) es
progenitor(juan,maria).
por lo que el intrprete devuelve
X = maria
No habra ms resultados en la base de datos.

Funcionamiento interno de
prolog
(V)
Ante la consulta
antepasado(juan,X)

la primera regla que unifica con la consulta es:


antepasado(X,Y) :- progenitor(X,Y).

por tanto, se intenta responder a la consulta


progenitor(juan,X)

cuyo primer resultado sera


progenitor(juan,luis).
por lo que el intrprete devuelve
X = luis

Nmeros

Enteros: 1, 34, -5, 0


Reales: 3.14, -0.0035, 100.2

No son muy utilizados, pues Prolog es un


lenguaje de programacin simblica.

Operadores (II) Aritmticos


Existen operadores predefinidos para
operaciones aritmticas
+
Suma
Resta
*
Multiplicacin
/
Divisin
// Divisin entera
** Elevacin a potencia
mod Mdulo (resto de divisin)

Listas (I)

Una lista es una secuencia de elementos


(tomos, estructuras, o listas).
Se representan entre corchetes:
[juana, tenis, carlos, futbol]

Una lista vaca se representa como:


[]

Listas (II)

La representacin interna es con una


estructura llamada ".", con dos elementos:
cabeza y cola:
La cola de toda lista puede ser:

Otra lista
La lista vaca [].

Separacin de la cabeza y
la cola

Se puede especificar explcitamente la


separacin entre la cabeza y la cola,
mediante una barra vertical:

?- L = [a,b,c], R = [cabeza|L]
L = [a,b,c]
R = [cabeza,a,b,c]
?- L=[a,b,c], R=[el1,el2|L], U=[a|[]]
L = [a,b,c]
R = [el1,el2,a,b,c]
U = [a]

También podría gustarte