Вы находитесь на странице: 1из 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). , 33

Ejemplos : X, Xxx, Pero, Las variables con valor.

son variables annimas, no nos interesan su

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. ? signica la conjuncin traducida por , o la disjuncin traducida por ;.
La traduccin en formulas lgicas: donde

termino1? . . .?terminon

termino 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
El

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 control de programa.

terminoi se puede poner directivas de

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

verdad, si no hay se regresa f also.


c Mihaela JUGANARU

UAM Azcapotzalco

otoo 2010

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

=, que es un predicado.
c Mihaela JUGANARU

UAM Azcapotzalco

otoo 2010

Inteligencia Articial - PROLOG


Las reglas de unicacin :

11

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


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 .

12

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

13

Predicados relativos a la unicacin :

x=y es verdad, si la unicacin.

x y y son uniables. En este caso se realiza

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 este valor.

exp y, luego, se unica x con

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


Predicados aritmticos :

15

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


El programa PRLOG siguinte:
hermano ( pablo , ana ). hermano ( pablo , maria ).

18

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) 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 ) ,!.

! permite de indicar al

PROLOG que nu esta necesaria de aprofondir mas el arbol de

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 gusta los tacos se pone :

likes,

el hecho que a Sam no les

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). :- dynamic maxabs /1. maxabs (1000). true .

C =A

C=B

A =<B.

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


La unicacin se hace segn las reglas siguientes :

29

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


La insercin en la cabeza de un elemento en una lista

31

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

32
que verica si una lista es la imagen

reverso(L1,L2)

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


?- 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 .

33

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 terrogacin de tipo interrogacin de

fib(i, )

con

i<N.

Si hay una in-

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

funciona, pero una segunda funciona, porque los valores

calculados no se guardan.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG


Solucin dinmica : cada vez que se el predicado el valor de
fib (0 ,1). fib (1 ,1).

36

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

fib(N,X) es cier-

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

los in-

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

37

Predicados ndall, bagof y setof


El predicado

findall/3

findall(X, Predicado, Lista)


construye la

Predicado
1 X X X X X 2 Z 3 Z

Lista

de valores que se unican con

para hacer el

verdad.

Ejemplo (aplicacin de genealoga):


?- 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


El predicado bagof:

38

bagof(X, Predicado, Lista)


es mas no que ndall, porque permite una 'factorizacion' segn las otras variables que intervienen en el 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 ] ; ...

Predicado.

UAM Azcapotzalco

otoo 2010

c Mihaela JUGANARU

Inteligencia Articial - PROLOG

39

El operador ^ se usa en frente del ables que no se factorizan. Ejemplo :

Predicado

par indicar las vari-

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