Está en la página 1de 41

Lenguaje PROLOG

Inteligencia Articial - PROLOG

PRLOG = PROgrammation LOGique

introducido por Universidad de Aix-Marseille (Marsella, Francia) por los profesores Alain Colmerauer y Philippe Roussel
al inicio de '70.
lenguaje de programacin de paradigma declarativo por el uso
de toda la gente que trabaja en el campo de la Inteligencia
Articial (lingistas)
muy simple para aprender y manejar

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Sintaxis de PROLOG
Constantes: numero (enteros o con punto otante), cadenas de
caracteres con minsculas, cadenas de caracteres entre .
Ejemplos: 2.5, 6, la vida, lavida, pedro, instalacion.
Variables: una cadena de caracteres que empieza con una mayscula o con

(guillon bajo).

Ejemplos : X, Xxx, Pero,


Las variables con

33

son variables annimas, no nos interesan su

valor.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Un termino compuesto es un functor (su nombre es una cadena con minsculas) de una cierta aridad. Sus parmetros son
constantes o variables.
Ejemplo: madre(X,ana), madre(maria,pablo), numeroparo(32),
f(g(Y),h(Z)).
La

aridad

se

marca

con

/.

Ejemplos

madre/2,numeroparo/1,f/2.
El mismo nombre de functor se puede utilizar con una otra paridad.
Ejemplo : madre(X). Aridad madre/1.
Los comentarios se ponen entre /* y */ o despus el % hasta al
n de linea

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Un programa PRLOG se compone de una parte de hechos y una


parte de reglas. Cada hecho o regla se termina con un . .
Un hecho es la modelizacin de los datos/situaciones elementales
que se consideran ciertos. Un hecho es un termino que tiene
todos sus parmetros constantes o evaluables directamente.
Ejemplos:
madre ( ana , pedro ).
gato ( tom ).
come ( tom , jerry ).
esnumero (34343).

pero
animal (Z ).

no puede ser un hecho.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Las reglas son la traduccin de las clausulas de Horn que modelizan las deducciones de nuevos hechos. Las reglas son de forma:

termino : termino1? . . .?terminon.


donde

? signica la conjuncin traducida por , o la disjuncin


traducida por ;.
La traduccin en formulas lgicas:

termino1? . . .?terminon

termino
El

termino contiene como parmetros constantes o variables.


Si hay variables, se traduce con el cuanticador universal para
cada variable. Si el los termino1 , . . . , terminon aparecen otros variables se traducen por el cuanticador existencial.
UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Ejemplo:
madre (X ): - hija (X , ana ). /* si ana es la hija de X */
madre (X ): - hijo (X , Y ). /* si X tiene un hijo Y ( cualquier ) */

A veces en lugar de un

terminoi se puede poner directivas de

control de programa.

Se usan tambin parntesis en la parte derecha de la regla para


expresar formulas mas complicadas.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Ejemplo de programa con hechos y reglas:


gato ( tom ).
raton ( jerry ).
come ( tom , jerry ).
animal ( oso ).
animal (X ): - gato ( X ).
animal (X ): - raton (X ).
animalpeligroso (X) : - animal (X ) ,( X = oso ; come (X ,Y )).

un animal peligroso es un animal que o es un oso o come a


alguien.
En base de un programa cargado (que es entonces correcto sintctico y que se compila), se pueden hacer interrogaciones de
hechos simple.
PROLOG intenta de obtener una deduccin del hecho. SI hay
una deduccin, se obtiene

UAM Azcapotzalco

verdad, si no hay se regresa f also.

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Una interrogacin es un termino compuesto con variables y constantes por el argumento.


Se regresa entonces valores por las variables que non annimas
si el valor regresado es verdad.
Ejemplo1:
1 ?- animal ( oso ).
true .
2 ?- animal ( leon ).
false .
3 ?- raton ( tom ).
false .
4 ?- animal ( tom ).
true .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

Ejemplo2 - con variables:


6 ?- animal (X ).
X = oso ;
X = tom ;
X = jerry .
8 ?- come (X ,Y ).
X = tom , Y = jerry .
10 ? - come (X ,X ).
false .

Ejemplo3 - con variables annimas:


11 ? - animal ( _ ).
true .
12 ? - come (_ , X ).
X = jerry .
13 ? - come (_ , _ ).
true .
14 ? - come (_1 , _1 ).
false .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

10

Unicacin
Se nota en PROLOG con

=. Es un mecanismo que permite la

instanciacin de dos trminos (constantes, variables o trminos


compuestos) t1 y t2 con la instancia (el valor) de un termino t.
(es parecida a una nica asignacin de valor a los dos termino
que se ejecuta una sola vez).
La unicacin se realiza de manera implcita cuando se resuelve
una interrogacin (al n de la interrogacin los variables se pierden !) o explcitamente con

UAM Azcapotzalco

otoo 2010

=, que es un predicado.
c Mihaela JUGANARU

Inteligencia Articial - PROLOG

11

Las reglas de unicacin :

una variable non-instanciada X se puede unicar con otra


variable Y (instanciada o no). Si Y esta instanciada (o deviene
instanciada), X es instanciada al mismo valor.
en este caso de unicacin, los dos variables devienen
sinonimias.
una variable non-instanciada X se puede unicar con un tomo o con un termino.
una variable instanciada no se unica.
un tomo se puede unicar con el mismo tomo.
un termino se unica con otro termino si son del mismo
functor (mismo nombre) con la misma aridad, y si cada argumento se puede unicar con el argumento correspondiente.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

12

Ejemplos:
14 ? - X=Y.
X = Y.
15 ? - Y =5.
Y = 5.
19 ? - Z=Z.
true .
20 ? - Z=T , T =25.
Z = 25 ,
T = 25.
22 ? - R=Z.
R = Z.
35 ? - abd = abd .
true .
36 ? - abd = xyz .
false .
37 ? - X= abc ,Y =X , abc = Y.
X = abc ,
Y = abc .
38 ? - X= abc , Y= xyz .
X = abc ,
Y = xyz .
39 ? - X= abc , Y= xyz , X=Y.
false .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

13

Predicados relativos a la unicacin :

x=y es verdad, si

x y y son uniables. En este caso se realiza

la unicacin.
x\=y es verdad, si

x y y no son uniables.
var(x) es verdad, si x es una variable non-instanciada.
nonvar(x) es verdad, si x no es una variable non-instanciada.
x==y es verdad, si x y y son iguales (sin hacer la unicacin).
x\==y es verdad, si x y y no son iguales (sin hacer la unicacin)
x is expr. se evala la expresin

exp y, luego, se unica x con

este valor.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

14

41 ? - a == a .
true .
42 ? - a == X .
false .
43 ? - a == X , X == b .
false .
44 ? - a \== X , X == b.
false .
45 ? - X =2+3.
X = 2+3.
46 ? - X is 2+3.
X = 5.
47 ? - var ( X ).
true .
48 ? - X is 2+2 , var (X ).
false .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

15

Predicados aritmticos :

x is y
x=:=y por la igualdad de dos numero o dos expresiones aritmticas, primero se evala cada parte.
x<y, x=<y, x>y, x>=y primero se hace la evaluacin aritmtica y regresa verdad si la condicin se cumple.
49 ? - X =:= X.
ERROR : =:=/2: Arguments are not sufficiently instantiated
50 ? - X =2 , X =:= X.
X = 2.
51 ? - X =2 , Y =5 , X =:= Y -3.
X = 2,
Y = 5.
52 ? - X =2 , Y =5 ,X <Y +3.
X = 2,
Y = 5.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

16

Otros predicados :

atom(x) verica si x es una constante (un tomo).


atomic(x) verica si x es instanciado a un tomo.
number(x) verica si x es instanciado un tomo numrico.
integer(x), oat(x) numero entero o otante.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

17

Recursividad
PROLOG no esta un lenguaje completo de programacion logica,
sino un lenguaje que intenta la resolucion de las interrogaciones
segun las reglas siguientes:

primero se examina los hechos


luego se intenta la alpicacion de la reglas de la primera con
el functor indicado hasta la ultima con este functor.
se aplica un metodo de backtracking el caso de fracaso (a
saber, no se puede decidir nada y no hay otra opcion)
una interrogacion sin respuesta se interpreta como falsa.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

18

El programa PRLOG siguinte:


hermano ( pablo , ana ).
hermano ( pablo , maria ).

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

es capaz de resolver las interrogaciones hermano(pablo,ana) (es


un hecho), hermano(ana, pablo) (se aplica la primera regla), pero
la interrogacion hemano(ana,maria) produce une aplicacion innita
de la misma regla 1:
[ trace ] 12 ?- hermano ( ana , pablo ).
Call : (6) hermano ( ana , pablo ) ? creep
Call : (7) hermano ( pablo , ana ) ? creep
Exit : (7) hermano ( pablo , ana ) ? creep
Exit : (6) hermano ( ana , pablo ) ? creep
true .
[ trace ] 13 ?- hermano ( ana , maria ).
Call : (6) hermano ( ana , maria ) ? creep
Call : (7) hermano ( maria , ana ) ? creep
Call : (8) hermano ( ana , maria ) ? creep
Call : (9) hermano ( maria , ana ) ? creep
Call : (10) hermano ( ana , maria ) ? abort

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

19

En este caso, la regla hermano(X,Y):-hermano(Y,X) debe de aplicarse una sola vez. Varianta posible : introducir un predicado
hermano2 para las reglas y dejar los hechos con el predicado
inicial hermano.
En la regla de distributividad usamos tambien el predicado nuevo.
hermano ( pablo , ana ).
hermano ( pablo , maria ).
hermano2 (X ,Y ): - hermano (X ,Y ).
hermano2 (X ,Y ): - hermano (Y ,X ).
hermano2 (X ,Z ): - hermano2 (X ,Y ), hermano2 (Y ,Z ).

Este programa funciona correctamente por la interrogacion


hermano2(ana,maria).
Con una interogacion hermano2(pablo, ana) PROLOG busca
true, pero puede varias veces tambien true con aplicacion a las
otras reglas que la primera es necesario indicar al sistema que
un solo resultado es suciente
c Mihaela JUGANARU
UAM Azcapotzalco
otoo 2010

Inteligencia Articial - PROLOG

20

Predicado de corte
En el caso donde hay varias reglas por un predicado PROLOG
construye un arbol donde intenta a aplicar todas reglas posibles.
El predicado de corte (cut predicate)

! permite de indicar al

PROLOG que nu esta necesaria de aprofondir mas el arbol de


demonstracion.
El en caso de la aplicacion hermano2, un corte despues la aplicacion de cada regla evita la aplicacion de las otras reglas.
hermano ( pablo , ana ).
hermano ( pablo , maria ).
hermano2 (X ,Y ): - hermano (X ,Y ) ,!.
hermano2 (X ,Y ): - hermano (Y ,X ) ,!.
hermano2 (X ,Z ): - hermano2 (X ,Y ), hermano2 (Y ,Z ) ,!.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

21

Predicado fail
Este predicado produce el fracaso de la aplicacion de la regla.
Puede indicar una negacion, pero no esta suciente si hay predicados similares.
hermano ( p a b l o , ana ) .
hermano ( p a b l o , m a r i a ) .
hermano ( ana ,

maria ): f a i l .

hermano2 (X , Y): hermano (X , Y ) , ! .


hermano2 (X , Y): hermano (Y , X ) , ! .
hermano2 (X , Z): hermano2 (X , Y) , hermano2 (Y , Z ) , ! .
Este programa regresa falso por hermano(ana,maria) (normal !),
pero regresa verdad por el predicado hermano2(ana,maria) con
la aplicacion de la regla 3 de distributividad.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

22

La negacion
La negacion de un heco se expresa con lod dos predicados fail
y !, con la precaucion de poner la negacion como primera regla
(en el orden de aplicacion).
Ejemplo : por la aplicacion

likes,

el hecho que a Sam no les

gusta los tacos se pone :

likes(sam, tacos):-fail,!.
Pero, estas reglas se maneja con cuidado.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

24

Estructura IF-THEN-ELSE
Es posible de describir esto tipo de estructura if A then B else
C con :

(A > B; C)
El sentido es : prueba A y si es verdad evalua B, sino evalua C.
Ejemplo :
max (X ,Y ,Z ): -( X >= Y -> Z= X;Z =Y ).
6
7
8
9

????-

max (3 ,2 ,4). false .


max (1 ,2 ,2). true .
max (3 ,2 ,3). true .
max (25 ,34 , X ). X = 34.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

25

Menejo del conocimiento


El manejo de la base de hechos y reglas se hace con :

listing/0 : produce el contenido de la base


assert/1 : inserta en la base un hecho o una regla, las reglas
se protegen con parentesis.
asserta/1 y assertz/1: la insercion se hace al inicio o al n
de la base
retract/1 : se sale (se borra) los hechos o reglas indicadas.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

26

Ejemplo:
18 ? - assert ( maxabs (1000)).
true .
19 ? - assert (( menor ( X ): - maxabs (Y ),X =<Y )).
true .
20 ? - menor (3).
true .
21 ? - X =3 , menor (X) , assert ( menor (X )).
X = 3.
22 ? - listing .
max (A , B , C) :(
A >= B
->
).
%
Foreign : tcp_debug /1
:- dynamic menor /1.
menor (A ) : maxabs ( B),
menor (3).

C =A

C=B

A =<B.

:- dynamic maxabs /1.


maxabs (1000).
true .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

27

Listas
La lista es una estructura de datos muy utilizada en la programacin non-numrica.
Es un conjunto ordenado de elementos y puede tener cualquier
dimensin.

una lista vaca : []


una lista con 3 tonos [a,b,c]
una lista con tres elementos donde el ultimo elemento es una
lista tambin [a,b,[1,3,5]]
una lista con variables [X,1,2,Y]

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

28

Una lista tiene una cabeza (head) = el primer elemento y


una cola (tail) = el ultimo elemento.
Con la notacin

| se pude extraer la cabeza de la lista y se obtiene

tambin una lista sin el primer elemento (esta puede ser vaca).
Ejemplo:
[ debug ] 50 ?- X =[ a | [b ,c ]].
X = [a , b , c ].
[ debug ] 49 ?- Y = [1 | [3 , 4, [10 | []] , 5]].
Y = [1 , 3, 4, [10] , 5].
[ debug ] 44 ?- [X| Y ]=[1 ,2 ,3 ,4].
X = 1, Y = [2 , 3, 4].
[ debug ] 45 ?- [X |[ Y|Z ]]=[1 ,2 ,3 ,4].
X = 1,
Y = 2,
Z = [3 , 4].

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

29

La unicacin se hace segn las reglas siguientes :


una variable non instanciada se puede unicar con una lista
dos listas se unican, si tienen el mismo tamao y cada elemento de una lista es uniable con el elemento del mismo
rango en la segunda lista.
Ejemplos:
[ debug ] 51 ?- [X , Y ]=[1 ,[5 ,6]].
X = 1,
Y = [5 , 6].
[ debug ] 52 ?- [X ,X ,2 ,3]=[1 ,1 , Y , Z ].
X = 1,
Y = 2,
Z = 3.
[ debug ] 53 ?- [X ,X ,2 ,3]=[1 ,5 , Y , Z ].
false .
[ debug ] 54 ?- [X ,X ,2 ,3]=[1 ,1 , Y ,Z ,T ].
false .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

30

Funciones para el manejo de listas


De manera muy simple se puede escribir una funcin recursiva
member que verica si un elemento apartiene o no a una lista :
member (X ,[ X| _ ]).
member (X ,[_ , T ]): - member (X , T ).

El uso :
[ debug ] 56 ?- member (1 ,[3 , 2, 1, 0]).
true .
[ debug ] 57 ?- member (9 ,[3 , 2, 1, 0]).
false .
[ debug ] 58 ?- member (9 ,[3 ,[9] , 1, 0]).
false .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

31

La insercin en la cabeza de un elemento en una lista

inserta(E,

Linicial, Lfinal):
inserta (X ,[] ,[ X |[]]).
inserta (X ,Z ,[ X| Z ]).
?- inserta (1 ,[2 ,3] , Z ).
Z = [1 , 2, 3].
?- inserta (R ,[2 ,3] ,[1 ,2 , Y ]).
R = 1,
Y = 3.

La insercin en la cola

insertz(E,Linicial,Lfinal):

insertz (X ,[] ,[ X |[]]).


insertz (X ,[ Y |T ] ,[ Y| Z ]): - insertz (X ,T , Z ).
?- insertz (1 ,[2 ,3] , Z ).
Z = [2 , 3, 1] .
?- insertz (1 ,Z ,[3 ,2 ,1]).
Z = [3 , 2] .
?- insertz (1 ,Z ,[3 ,2 ,1 ,5]).
false .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG


Un predicado

reverso(L1,L2)

32
que verica si una lista es la imagen

de la otra en espejo :
reverso ([] ,[]).
reverso ([ X|T ],L ): - insertz (X ,L2 ,L ), reverso (T , L2 ).
?- reverso ([1 ,2] ,[2 ,1]).
true .
?- reverso ([1 ,2] , X ).
X = [2 , 1] .
?- reverso (Y ,[1 ,2 ,6]).
Y = [6 , 2, 1] .

Un predicado anadir(L1,L2,LF) que verica si LF es la concatenacin de las dos listas L1 y L2 en este orden :
anadir ([] ,L , L ).
anadir ([ X |R] ,Y ,[ X|F ]): - anadir (R ,Y ,F ).

?- anadir ([1 ,2] ,[3 ,4] , X ).


X = [1 , 2, 3, 4].
?- anadir ([1 ,2] , X ,[1 ,2 ,5 ,6]).
X = [5 , 6].

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

33

?- anadir (X ,Y ,[1 ,2 ,5 ,6]).


X = [] , Y = [1 , 2, 5, 6] ;
X = [1] , Y = [2 , 5 , 6] ;
X = [1 , 2] , Y = [5 , 6] ;
X = [1 , 2, 5] , Y = [6] ;
X = [1 , 2, 5, 6] , Y = [] ;
false .

Este predicado

anadir

ofrece la posibilidad de vericar muy rp-

idamente si una lista es el prejo o el sujo de una otra:


prefixo (X ,Y ): - anadir (X ,_ ,Y ).
sufixo (X , Y ): - anadir (_ ,X ,Y ).
1 ?- prefixo ([1 ,2] ,[1 ,2 ,4 ,7]).
true .
2 ?- prefixo ([1 ,2] , X ).
X = [1 , 2| _G424 ].
3 ?- sufixo ([4 ,7] ,[1 ,2 ,4 ,7]).
true .
4 ?- sufixo ([4 ,7] , X ).
X = [4 , 7] ;
X = [ _G414 , 4, 7] ;
X = [ _G414 , _G420 , 4 , 7] .

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

34

Manejo de conocimiento
esttico o dinmico.
es posible de manejar los dos con

assert

retract

y aadir

o reducir la base de hechos, pero un predicado que se dene


de manera esttica (con reglas y/o hechos) no se puede usar
como dinmico.

Ejemplo: calculo de los numero de Fibonacci :

F0 = 1,F1 = 1,

FN +2 = FN +1 + FN

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

35

Solucin esttica :
fib (0 ,1).
fib (1 ,1).
fib (N ,X ): - number (N ),N >=2 , N1 is N -1 , N2 is N -2 , fib (N1 , X1 ), fib (N2 , X2 ),X is X1 + X2 .

La solucin es correcta, pero a cada aplicacin de la regla se


re-calcula todos los valores de

fib(i, )

fib(10,X) esta
tipo fib(Y,89) no

con

i<N.

Si hay una in-

terrogacin de tipo

funciona, pero una segunda

interrogacin de

funciona, porque los valores

calculados no se guardan.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

36

Solucin dinmica : cada vez que se el predicado

fib(N,X) es cier-

to aadir un hecho dinmico ( fib2/2 por ejemplo). Usar tambin


el valor de
fib (0 ,1).
fib (1 ,1).

fib2

en la resolucion de

fib

si este valor existe.

fib (N ,X ): -( fib2 (N , X)- > true ;


number (N) ,N >=2 , N1 is N -1 , N2 is N -2 , fib (N1 , X1 ) , fib (N2 , X2 ),
X is X1 + X2 , assert ( fib2 (N , X ))).
inicio : - ( fib (X ,Y )-> assert ( fib2 (X , Y )); fail ).

Al inicio del uso debemos de hacer una interrogacin con

inicio/0 por que el sistema esta capaz de reconocer fib2/2 como


un predicado dinmico.

fib(6,X) produce la insercin de


hechos fib2(0,1), fib2(2,2) ....fib(6,13). En la segunda
terrogacin fib(6,X) se usa el hecho fib2(6,13) insertado.
Una primer interrogacin

UAM Azcapotzalco

otoo 2010

los
in-

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

37

Predicados ndall, bagof y setof


El predicado

findall/3

findall(X, Predicado, Lista)


construye la

Predicado

Lista

de valores que se unican con

para hacer el

verdad.

Ejemplo (aplicacin de genealoga):


1
X
X
X
X
X
2
Z
3
Z

?- mujer ( X ).
= laura ;
= ana ;
= jeanne ;
= corinne ;
= frida .
?- findall (X , mujer ( X),Z ).
= [ laura , ana , jeanne , corinne , frida ].
?- findall (X ,( mujer (X), hombre ( X )) , Z ).
= [].

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

38

El predicado bagof:

bagof(X, Predicado, Lista)


es mas no que ndall, porque permite una 'factorizacion' segn
las otras variables que intervienen en el

Predicado.

Ejemplo:
5 ?- findall (X , ascendiente (X , corinne ), Z ).
Z = [ ana , michel , laura , mario , frida , gabriel , danielle , george , marie |...].
6 ?- findall (X , ascendiente (X ,Y), Z ).
Z = [ frida , marie , laura , laura , danielle , ana , ana , ana , gabriel |...].
7 ?- bagof (X , ascendiente (X ,Y ),Z ).
Y = ana , Z = [ laura , mario , frida , gabriel ] ;
Y = corinne , Z = [ ana , michel , laura , mario , frida , gabriel , danielle , george , mar
Y = george , Z = [ marie , jean ] ;
Y = jeanne , Z = [ ana , michel , laura , mario , frida , gabriel , danielle , george , mari
Y = laura , Z = [ frida , gabriel ] ;
...

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

El operador ^ se usa en frente del

39

Predicado

par indicar las vari-

ables que no se factorizan.


Ejemplo :
9 ?- bagof (X , persona (X ,_ ,_ ,Y ,Z), List ).
Y = marie , Z = jean , List = [ george ] ;
Y = frida , Z = gabriel , List = [ laura ] ;
Y = laura , Z = mario , List = [ miguel ] ;
...
11 ? - bagof (X , Y^ persona (X ,_ ,_ ,Y ,Z) , List ).
Z = jean , List = [ george ] ;
Z = gabriel , List = [ laura ] ;
Z = mario , List = [ miguel ] ;
Z = mario , List = [ ana ] ;
Z = george , List = [ michel ] ;
...

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

40

El predicado setof funciona de la misma manera que bagof, pero


las listas construidas son conjuntos ordenados (ordena y elimina
las doblones).
14 ? - bagof (X , Y^ ascendiente (X ,Y ),Z ).
Z = [ frida , marie , laura , laura , danielle , ana , ana , ana , gabriel |...].
15 ? - setof (X ,Y^ ascendiente (X ,Y ),Z ).
Z = [ ana , danielle , frida , gabriel , george , jean , laura , marie , mario |...].

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

41

Las entrada/salidas en un programa PROLOG se hacen con los


predicados :

write/1

writeln/1

read/1.

Se escribe/lee un tomo y una

variable. Por la lectura, la variable se unica con la entrada.


Ejemplo:
21 ? - write (' entrega numero : ') , read ( X), fib (X ,Y) , writeln (Y ).
entrega numero :12.
233
X = 12 , Y = 233 .

La lectura se hace hasta encontrar el smbolo '.'.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

También podría gustarte