+ All Categories

prolog

Date post: 27-Nov-2015
Category:
Upload: alex-emmanuel-martinez-cortes
View: 24 times
Download: 3 times
Share this document with a friend
Popular Tags:
41
Transcript
Page 1: prolog

Lenguaje PROLOG

Page 2: 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

Page 3: prolog

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

Page 4: prolog

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

Page 5: prolog

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

Page 6: prolog

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

Page 7: prolog

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

Page 8: prolog

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

Page 9: prolog

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

Page 10: prolog

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

Page 11: prolog

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

Page 12: prolog

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

Page 13: prolog

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

Page 14: prolog

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

Page 15: prolog

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

Page 16: prolog

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

Page 17: prolog

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

Page 18: prolog

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

Page 19: prolog

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

Page 20: prolog

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

Page 21: prolog

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

Page 22: prolog

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

Page 23: prolog

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

Page 24: prolog

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

Page 25: prolog

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

Page 26: prolog

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

Page 27: prolog

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

Page 28: prolog

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

Page 29: prolog

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

Page 30: prolog

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

Page 31: prolog

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

Page 32: prolog

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

Page 33: prolog

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

Page 34: prolog

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

Page 35: prolog

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

Page 36: prolog

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

Page 37: prolog

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

Page 38: prolog

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

Page 39: prolog

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

Page 40: prolog

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

Page 41: prolog

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


Recommended