Date post: | 27-Nov-2015 |
Category: |
Documents |
Upload: | alex-emmanuel-martinez-cortes |
View: | 24 times |
Download: | 3 times |
Lenguaje PROLOG
Inteligencia Arti�cial - PROLOG 1
PRLOG = PROgrammation LOGique
introducido por Universidad de Aix-Marseille (Marsella, Fran-
cia) por los profesores Alain Colmerauer y Philippe Roussel
al inicio de '70.
lenguaje de programación de paradigma declarativo por el uso
de toda la gente que trabaja en el campo de la Inteligencia
Arti�cial (lingüistas)
muy simple para aprender y manejar
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 2
Sintaxis de PROLOG
Constantes: numero (enteros o con punto �otante), cadenas de
caracteres con minúsculas, cadenas de caracteres entre �.
Ejemplos: 2.5, 6, �la vida�, lavida, pedro, instalacion.
Variables: una cadena de caracteres que empieza con una mayús-
cula o con (guillon bajo).
Ejemplos : X, Xxx, Pero, , 33
Las variables con son variables anónimas, no nos interesan su
valor.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 3
Un termino compuesto es un functor (su nombre es una cade-
na con minúsculas) de una cierta aridad. Sus parámetros 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 pari-
dad.
Ejemplo : madre(X). Aridad madre/1.
Los comentarios se ponen entre /* y */ o después el% hasta al
�n de lineaUAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 4
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 modelización de los datos/situaciones elementales
que se consideran ciertos. Un hecho es un termino que tiene
todos sus parámetros constantes o evaluables directamente.
Ejemplos:madre(ana ,pedro ).gato(tom).come(tom ,jerry ).esnumero (34343).
peroanimal(Z).
no puede ser un hecho.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 5
Las reglas son la traducción de las clausulas de Horn que mod-
elizan las deducciones de nuevos hechos. Las reglas son de forma:
termino : −termino1? . . .?terminon.
donde ? signi�ca la conjunción traducida por , o la disjunción
traducida por ;.
La traducción en formulas lógicas: termino1? . . .?terminon →termino
El termino contiene como parámetros constantes o variables.
Si hay variables, se traduce con el ∀ cuanti�cador universal paracada variable. Si el los termino1, . . . , terminon aparecen otros vari-
ables se traducen por el ∃ cuanti�cador existencial.UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 6
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 también paréntesis en la parte derecha de la regla para
expresar formulas mas complicadas.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 7
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 sin-
táctico y que se compila), se pueden hacer interrogaciones de
hechos simple.
PROLOG intenta de obtener una deducción del hecho. SI hay
una deducción, se obtiene verdad, si no hay se regresa falso.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 8
Una interrogación es un termino compuesto con variables y con-
stantes por el argumento.
Se regresa entonces valores por las variables que non anónimas
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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 9
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 anónimas:11 ?- animal(_).true .12 ?- come(_,X).X = jerry.13 ?- come(_,_).true.14 ?- come(_1 ,_1).false.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 10
Uni�cación
Se nota en PROLOG con =. Es un mecanismo que permite la
instanciación de dos términos (constantes, variables o términos
compuestos) t1 y t2 con la instancia (el �valor�) de un termino t.
(es parecida a una única asignación de valor a los dos termino
que se ejecuta una sola vez).
La uni�cación se realiza de manera implícita cuando se resuelve
una interrogación (al �n de la interrogación los variables se pier-
den !) o explícitamente con =, que es un predicado.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 11
Las reglas de uni�cación :
una variable non-instanciada X se puede uni�car con otra
variable Y (instanciada o no). Si Y esta instanciada (o deviene
instanciada), X es instanciada al mismo valor.
en este caso de uni�cación, los dos variables devienen
sinonimias.
una variable non-instanciada X se puede uni�car con un áto-
mo o con un termino.
una variable instanciada no se uni�ca.
un átomo se puede uni�car con el mismo átomo.
un termino se uni�ca con otro termino si son del mismo
functor (mismo nombre) con la misma aridad, y si cada ar-
gumento se puede uni�car con el argumento correspondiente.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 13
Predicados relativos a la uni�cación :
x=y es verdad, si x y y son uni�ables. En este caso se realiza
la uni�cación.
x\=y es verdad, si x y y no son uni�ables.
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 uni�cación).
x\==y es verdad, si x y y no son iguales (sin hacer la uni�-
cación)
x is expr. se evalúa la expresión exp y, luego, se uni�ca x con
este valor.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 15
Predicados aritméticos :
x is y
x=:=y por la igualdad de dos numero o dos expresiones ar-
itméticas, primero se evalúa cada parte.
x<y, x=<y, x>y, x>=y primero se hace la evaluación arit-
mética y regresa verdad si la condición se cumple.
49 ?- X=:=X.ERROR: =:=/2: Arguments are not sufficiently instantiated50 ?- 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 16
Otros predicados :
atom(x) veri�ca si x es una constante (un átomo).
atomic(x) veri�ca si x es instanciado a un átomo.
number(x) veri�ca si x es instanciado un átomo numérico.
integer(x), �oat(x) numero entero o �otante.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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) (esun hecho), hermano(ana, pablo) (se aplica la primera regla), perola interrogacion hemano(ana,maria) produce une aplicacion in�nitade la misma regla 1:[trace] 12 ?- hermano(ana , pablo).
Call: (6) hermano(ana , pablo) ? creepCall: (7) hermano(pablo , ana) ? creepExit: (7) hermano(pablo , ana) ? creepExit: (6) hermano(ana , pablo) ? creep
true .[trace] 13 ?- hermano(ana , maria).
Call: (6) hermano(ana , maria) ? creepCall: (7) hermano(maria , ana) ? creepCall: (8) hermano(ana , maria) ? creepCall: (9) hermano(maria , ana) ? creepCall: (10) hermano(ana , maria) ? abort
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 19
En este caso, la regla hermano(X,Y):-hermano(Y,X) debe de apli-
carse 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 su�cienteUAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 apli-
cacion 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 21
Predicado fail
Este predicado produce el fracaso de la aplicacion de la regla.
Puede indicar una negacion, pero no esta su�ciente si hay pred-
icados �similares�.
hermano ( pab lo , ana ) .
hermano ( pab lo , mar i a ) .
hermano ( ana , mar i a ):− 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 ?- max(3,2,4). false.7 ?- max(1,2,2). true.8 ?- max(3,2,3). true.9 ?- max(25,34,X). X = 34.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 -> C=A ; C=B).
% Foreign: tcp_debug /1:- dynamic menor /1.menor(A) :- maxabs(B), A=<B.menor (3).
:- dynamic maxabs /1.
maxabs (1000).true.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 27
Listas
La lista es una estructura de datos muy utilizada en la progra-
mación non-numérica.
Es un conjunto ordenado de elementos y puede tener cualquier
dimensión.
una lista vacía : []
una lista con 3 átonos [a,b,c]
una lista con tres elementos donde el ultimo elemento es una
lista también [a,b,[1,3,5]]
una lista con variables [X,1,2,Y]
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 28
Una lista tiene una cabeza (head) = el primer elemento y
una cola (tail) = el ultimo elemento.
Con la notación | se pude extraer la cabeza de la lista y se obtiene
también una lista sin el primer elemento (esta puede ser vacía).
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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 29
La uni�cación se hace según las reglas siguientes :
una variable non instanciada se puede uni�car con una lista
dos listas se uni�can, si tienen el mismo tamaño y cada el-
emento de una lista es uni�able 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 30
Funciones para el manejo de listas
De manera muy simple se puede escribir una función recursiva
member que veri�ca 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 31
La inserción 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 inserción 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 32
Un predicado reverso(L1,L2) que veri�ca 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 veri�ca si LF es la concate-
nación 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 veri�car muy ráp-
idamente si una lista es el pre�jo o el su�jo 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 34
Manejo de conocimiento
estático o dinámico.
es posible de manejar los dos con assert y retract y añadir
o reducir la base de hechos, pero un predicado que se de�ne
de manera estática (con reglas y/o hechos) no se puede usar
como dinámico.
Ejemplo: calculo de los numero de Fibonacci : F0 = 1,F1 = 1,
FN+2 = FN+1 + FN
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 35
Solución estática :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 solución es correcta, pero a cada aplicación de la regla se
re-calcula todos los valores de fib(i, ) con i<N. Si hay una in-
terrogación de tipo fib(10,X) esta funciona, pero una segunda
interrogación de tipo fib(Y,89) no funciona, porque los valores
calculados no se guardan.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 36
Solución dinámica : cada vez que se el predicado fib(N,X) es cier-
to añadir un hecho dinámico (fib2/2 por ejemplo). Usar también
el valor de fib2 en la resolucion de fib si este valor existe.fib (0,1).fib (1,1).
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 interrogación con
inicio/0 por que el sistema esta capaz de reconocer fib2/2 como
un predicado dinámico.
Una primer interrogación fib(6,X) produce la inserción de los
hechos fib2(0,1), fib2(2,2) ....fib(6,13). En la segunda in-
terrogación fib(6,X) se usa el hecho fib2(6,13) insertado.UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 37
Predicados �ndall, bagof y setof
El predicado findall/3 :
findall(X, Predicado, Lista)
construye la Lista de valores que se uni�can con X para hacer el
Predicado verdad.
Ejemplo (aplicación de genealogía):1 ?- mujer(X).X = laura ;X = ana ;X = jeanne ;X = corinne ;X = frida.2 ?- findall(X,mujer(X),Z).Z = [laura , ana , jeanne , corinne , frida].3 ?- findall(X,( mujer(X),hombre(X)),Z).Z = [].
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 38
El predicado bagof:
bagof(X, Predicado, Lista)
es mas �no que �ndall, porque permite una 'factorizacion' según
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 , marie |...] ;Y = george , Z = [marie , jean] ;Y = jeanne , Z = [ana , michel , laura , mario , frida , gabriel , danielle , george , marie |...] ;Y = laura , Z = [frida , gabriel] ;...
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 39
El operador ^ se usa en frente del 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - 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 otoño 2010 c© Mihaela JUGANARU
Inteligencia Arti�cial - PROLOG 41
Las entrada/salidas en un programa PROLOG se hacen con los
predicados :
write/1 y writeln/1 y read/1. Se escribe/lee un átomo y una
variable. Por la lectura, la variable se uni�ca 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 símbolo '.'.
UAM Azcapotzalco otoño 2010 c© Mihaela JUGANARU