Minimanualillo de SWI-Prolog

Roberto Torres de Alba 22 de marzo de 2006

´ Indice
1. Introducci´n o 2. Comandos b´sicos a 3. Sintaxis de Prolog 4. Ayuda 5. Consultando y modificando programas 5.1. Consultar programas . . . . . . . . . . 5.2. Errores y avisos . . . . . . . . . . . . . 5.3. Mostrar base de clausulas . . . . . . . 5.4. Modificando la base de clausulas . . . 2 2 2 4 5 5 6 6 6 6 6 7 8 8 9 10 10 12 12 12 13

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

6. Depurador 6.1. Depurador en modo texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2. Depurador gr´fico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 7. Manejo de t´rminos e 7.1. Jerarqu´ . . . . . . . . . . . . ıa ´ 7.1.1. Atomos . . . . . . . . . 7.1.2. N´meros . . . . . . . . . u 7.2. Escritura y lectura de t´rminos e 8. Listas 9. Conjuntos 10.Manejo de archivos 11.Todas las soluciones a un objetivo

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

1

6.pl” para indicar a que contiene c´digo fuente de Prolog.”. Consultar un programa Prolog: la manera m´s f´cil de consultar un programa Prolog es usando el a a men´ file/consult y navegando por los directorios. Cobaltina. 3. que es la 5. a 2. Al lado del shell deber´ o ıa aparecer la palabra ”[trace]”.” y ”nodebug.swi-prolog. Variables: El identificador de una variable tendr´ que tener su primera letra en may´sculas. Si a a se quiere consultar un tema o un predicado en concreto basta con escribir el tema de la siguiente forma: help(Tema). sin la extensi´n ”. La manera m´s sencilla es usar el Bloc de Notas.” a 3. Dicho archivo debe poseer la extensin ”. a d´ de hoy. Ejecuci´n de objetivos: para ejecutar un objetivo simplemente lo escribimos en el shell (seguido de o punto). El a archivo del c´digo fuente de Prolog contendr´ el conjunto de hechos y de reglas y el objetivo ser´ lanzado o a a desde el shell de SWI-Prolog. a u Ej: X. Basta con poner en el shell ”help. Ej: [mi_prog].6 para Windows NT/2000/XP. Existe la posibilidad de utilizar un depurador gr´fico escribiendo ”guitracer. Si el objetivo no tiene ´xito SWI-Prolog responder´ ”no”. Los siguientes a ı apartados explican de forma muy general todo aquello que es fundamental conocer a la hora de usar este int´rprete. Para salir de este modo hay que escribir ”notrace. Introducci´n o Este peque˜o manual pretende ser una introducci´n al uso de SWI-Prolog poni´ndolo en relaci´n n o e o con los conceptos de la asignatura de Programaci´n L´gica de las Ingenier´ T´cnicas de Gesti´n y de o o ıas e o Sistema. La versi´n sobre la que versa este manual es la ultima que se puede encontrar. 2.pl”. encerrada por corchetes ”[ ]” y o seguida de punto. Depuraci´n: Para entrar en el modo trace hay que escribir ”trace. Existen ciertas consideraciones sobre la sintaxis de Prolog: 1. o Un programa Prolog est´ formado con un conjunto de hechos y de reglas junto con un objetivo. si no pulsamos enter.”. Sintaxis de Prolog Cualquier programa en Prolog tiene que estar escrito en un fichero de texto plano (sin formato).1.com. Atapuerca. RADgtfCdf 2 . 4. Comandos b´sicos a Una vez instalado SWI-Prolog y procediendo a su ejecuci´n observamos el shell visto como un n´mero o u m´s los caracteres ”?-”. Ahora debemos escribir un unico car´cter. Para una lista de comandos a escribimos ”h”. Ayuda: SWI-Prolog posee una ayuda gr´fica f´cil de usar.”. Desde ah´ es de donde vamos a ajecutar todos los objetivos. o ´ ıa en la p´gina www. Si ha tenido ´xito y el objetivo e a e ten´ variables entonces devolver´ la unificaci´n de esas variables que ha producido el ´xito y el ıa a o e programa esperar´ una acci´n del usuario. Si buscamos a o ´ a m´s respuestas escribiremos ”. e 1. Tambi´n existe la posibilidad de hacerlo desde u e el shell escribiendo el nombre del programa.” (punto y coma).

ıa 3. p y q1. a Ej: f(c. y no como funciones. e 5.q1. ’A’. ’a a’ y la lista vac´ [ ]. dentro del programa Prolog). 3 . o En Prolog la flecha se sustituye por ”:-”.02. rADgtfCdf) Tambi´n existe la posibilidad de tener predicados 0-arios. Tienen a ´ la siguiente forma en sintaxis de l´gica de primer orden: o P ← En Prolog no se escribe la flecha sino que se pone un punto al final: p. Constantes: La primera letra de una constante deber´ estar escrita en min´sculas. S´lo pueden sen lanzados o desde el shell de SWI-Prolog. Deber´ estar seguido de un u a conjunto de t´rminos (otras funciones. rADgtfCdf Tambi´n se consideran constantes a los n´meros. 0. Objetivos: Son cl´usulas de Horn que no poseen ning´n predicado en su cabeza: a u φ ← Q1. por su localizaci´n dentro de la cl´usula (es o a decir. Reglas: Son cl´usulas de Horn que poseen un unico predicado en la cabeza y uno o m´s en el cuerpo. shostakovich(compositor).” y la regla termina en punto: p :. rADgtfCdf(RADgtfCdf. q2 y q3 son predicados.poligono(X). 5. maria). q2. 6. conc arbol(Hijo Izq. las conectivas conjuntivas se escriben como comas ”. Raiz. Q2. compositor(shostakovich).4). conc arbol(Hijo Izq. rADgtfCdf(RADgtfCdf.X). a u Ej: a. donde. el compilador los identificar´ como tal. al igual que los hechos. numero_lados(X. Hijo Der). e u Ej: 1. variables o constantes) encerrados entre par´ntesis. Raiz. Ej: cuadrado(X) :. Ej: padre(aaron. su primera letra debe ser una min´scula. incienso. Q3 Los predicados se escriben separados por comas y terminados en punto. Q2. 7. Q3 escritos en sintaxis clausular o P ← Q1 ∧ Q2 ∧ Q3 escritos en sintaxis de l´gica de primer orden.7 las palabras entre comillas simples Ej: ’a’. Funciones: Al igual que las constantes.2. Hechos: Son cl´usulas de Horn que poseen un unico predicado en la cabeza y ninguno en el cuerpo. roberto. a ´ a Tienen la siguiente pinta: P ← Q1.X). Hijo Der). e e Ej: f(c. q3. Predicados: Su sintaxis es la misma que la de las funciones aunque. rADgtfCdf) 4. donde p es un predicado y tiene que seguir su sintaxis.

Nos devolvera predicados. L = [1. No ?: se considera de entrada o de salida.3.: identico a + pero esta vez como predicado de salida. Si adem´s nos referimos a un a predicado concreto tambi´n tenemos que escribir su aridad: help(pred/2).2. Pongamos lo que le pongamos va a intentar unificar con ello. apropos(’file’). 2.1]. pensar´ que el argumento es una variable).4 se escribira como 2-4: help(2-4).padre(Y. C = 1 R = [2. [2. Si no tenemos informaci´n tan concreta podemos usar el predicado apropos/1. 4. Podemos indicar una secci´n e o del manual: la seccion 2.padre(X.sort([5. l´gicamente.4]).4] ).4.3. 3. la definici´n de los predicados tiene su propia sintaxis.1]. 3. Ej: e ?. Despu´s del nombre del predicado se escribe un n´mero de e u variables. es decir. Z). Esto en Prolog se escribe pred/arid donde pred es el nombre del predicado y arid su aridad. [C|R] ). ERROR: sort/2: Arguments are not sufficiently instantiated . Ayuda En la ayuda de SWI-Prolog. funciones o secciones del manual que contengan ese nombre.3.1].4.sort(X. que no puede ser una variable sin estar unificada con nada. Ej: ?.sort([5. El nombre y o la aridad determinan un´ ıvocamente a un predicado. 4 . apropos(’the file’). A pesar de que en l´gica de primer a o orden ello no tendr´ mucho sentido.3. 5] ?. S´ le importa las may´sculas o min´sculas (cuidado si la primera es ı u u mayusculas porque.sotr([5.4. dependiendo de la aridad.2.2.5. 4. o o Para ver la ayuda sobre el predicado pred escribimos help(pred). Esto sigue el procedimiento normal de resoluci´n de la prograo maci´n l´gica. Tambi´n podemos proporo a e cionarle frases escritas entre comillas simples. 5] ?. en SWI-Prolog se dan cosas as´ debido a que. A este predicado se o le pasa el nombre aproximado de lo que buscamos. Ej: apropos(file). ıa ı dicho predicado puede estar relacionado con una llamada a C (como sort/2 ) o con operaciones aritm´ticas (como is/2 ). 4.[1.3. Y).?.1. apropos(’File’). L).2. Desde el punto de vista del programador se puede ver como un par´metro de entrada. con un s´ ımbolo delante de la variable: + : significa que esa variable debe estar instanciada. por ejemplo. en el momento es que se llega a ese predicado.

En este caso buscar´ en el directorio actual y en una serie de directorios que tiene para buscar. Otra alternativa a este predicado es el uso de los corchetes. La m´s a f´cil consiste en usar el men´ File→Consult.pl’]. Ej: consult(practica3_chunga). una m´s util en la 4. 5. aunque esta opci´n s´lo est´ disponible en el entorno Wina u o o a dows. c:/hlocal yes 2 ?.6 del manual.pl’). Consultando y modificando programas Consultar programas Cargar y compilar un programa en Prolog se conoce como consultar. [practica3_chunga]. consult/1 puede ser invocado de varias formas.Los predicados explain/1 y explain/2 dan cierta informaci´n sobre el argumento. como su funci´n o o o referencias aunque es demasiado escueto. a Otra forma consiste en escribir la ruta del archivo completa entrecomillada con comillas simples. yes 3 ?. Ej: a consult(’c:/hlocal/practica3_suspensa’).pwd.. Ej: 1 ?. Para consultar en qu´ directorio estamos usamos el predicado pwd/0.1.3 del manual y. [’practica3_chunga’]. Se usa escribiendo entre comillas simples la ruta absoluta o relatica. Su funcionamiento es identico al de consult/1 pero poniendo el nombre del archivo entre corchetes. o a o 5.2. consult(’c:/hlocal/practica3_suspensa. Tambi´n podemos usar el predicado consult/1. [’c:/hlocal/practica3_chunga. La barra que separa los directorios en Windows debe estar inclinada hacia la derecha (y no como en Windows que est´ escrita hacia la izquierda). Ej: consult(practica3_chunga). a o o a ´ 5 .’).cd(’.pwd. [’practica3_chunga. Esta informaci´n est´ recogida en la secci´n 2.3. Para cambiar la ruta usamos e el predicado cd/1. c: yes Existe m´s informaci´n detallada en la secci´n 4. La e m´s f´cil consiste en llamar a consult/1 con el nombre del programa sin la extensi´n.pl’]. que debe ser min´scula para que Prolog u u u no piense que es una variable. Es indiferente el a a o uso de may´sculas o min´sculas excepto para la primera letra. Existe varias formas.

6. unifican con cualquier cosa pero no entre ellas. a a 5. Con asserta/1 n a insertamos la cl´usula al principio de la lista de cl´usulas de ese predicado. Las variables an´nimas se escriben como o o un subrayado ” ”. da un aviso. Ej: a dios_hindu(ganesha). 5.5. Para ver s´lo aquellas cl´usulas que pertenecen a un a o a predicado usamos listing(+Pred) donde Pred es el predicado que buscamos mirar. Error sint´ctico: el int´rprete mostrar´ el error que se ha producido.3. una variable an´nima. Errores y avisos Cuando se consulta un archivo pueden aparecer mensajes de error o de aviso. la ruta que se ha puesto expl´ ıcitamente y los directorios por defecto en donde busca. 6. dios_hindu(krishna). _. in. Tambi´n podemos e escribir listing(+Pred/Arid) donde Arid es la aridad del predicado Pred. Para que el programa sea m´s claro y no salga el a aviso podemos usar.spy(dios_hindu). como puede ser el directorio de trabajo.4. en su lugar. Con spy(+Pred) establecemos un punto ıas. Aviso de que las cl´usulas de un mismo predicado no est´n juntas: este aviso salta cuando se a a escriben cl´usulas de un predicado entre cl´usulas de otro. Mostrar base de clausulas Para ver el contenido de la base de cl´usulas usamos el predicado listing/0. ıa 2. Aviso de variable singleton: una variable singleton es una variable que solamente aparece una vez en una cl´usula. Ej: % multiplica(in. Error de archivo no encontrado: hay que fijarse en el nombre del archivo. Podemos establecer puntos de paradas para el depurador. Para o conocer el estado del depurador usamos debugging/0. donde ha sido y por qu´ se a e a e ha parado. Los m´s comunes son: a 1. Depurador Depurador en modo texto El modo depurador comienza cuando escribimos el predicado debug/0. Ya que la sintaxis de Prolog es sencilla suele acertar la mayor´ de las veces. dios_hindu(shiva). 4. Deber aparecer ”[debug]” antes de la interrogaci´n en el shell de Prolog. out) multiplica(0. Con retract/1 y retractall/1 las eliminamos.2. Si la cl´usula est´ bien hecha y posee una variable a a singleton significa que el valor de esa variable no importa en dicha cl´usula ya que va a unificar a con cualquier cosa y no tiene relevancia posterior. 3. Modificando la base de clausulas Podemos a˜adir y eliminar cl´usulas usando la familia de predicados assert y retract. por no tratarse de un error.1. Este predicado muestra a todas las cl´usulas que tenemos actualmente. que en Prolog se conocen como puntos esp´ Dichos puntos son establecidos con el predicado spy/1. El compilador interpreta que puede haber un error al escribir esa variable a pero. Para salir de ese modo basta con usar nodebug/0. 0). Con assert/1 y assertz/1 a a hacemos lo mismo pero al final. 6 . de espionaje en las cl´usulas cuya cabeza sea Pred. ?.

aparece una ventana.Para eliminar un punto esp´ usamos nospy/1 o para eliminar todos usamos nospyall/0. e Existe muchas secciones del manual que hablan sobre el depurador. o a Fail: cuando esa cl´usula falla. Una vez ıa que se ha alcanzado un predicado que lleva asociado un esp´ la ejecucin del programa se para en los ıa llamados puertos (ports). a +: establece un punto de espionaje. Cuando llamamos ıa o a trace/0 aparece ”[trace]” a la izquierda de ?. Para salir de ´l simplemente llamamos a notrace/0. cuando la ejecuci´n se o para en alg´n punto. Funciona de la misma manera que el depurador en modo texto excepto que. e a Unify: cuando se ha unificado la cabeza de la cl´usula con el objetivo actual. Para que funcione se debe escribir guitracer. Depurador gr´fico a Existe tambi´n un depurador gr´fico. Pulsando ”h” obtendremos la lista de ´ a comandos. h: muestra las opciones disponibles.. y cuando quere a amos dejar de usarlo escribimos noguitracer. Redo: cuando. o En el shell de SWI-Prolog veremos el nombre del puerto seguido del objetivo con la unificaci´n que o lleve hasta ese momento m´s una interrogaci´n. Eso indica que se espera un gesto del usuario y ser´ la a o a escritura de un unico car´cter sin necesidad de seguirlo por enter. a: aborta la ejecuci´n. u La ventana que aparece es esta: 7 . El predicado trace/0 hace lo mismo que el predicado debug pero sin necesidad de establecer un punto esp´ para pararse en un puerto. -: elimina un punto de espionaje.2.9 o y 4. a Exception: cuando el predicado throw/1 lanza esa excepci´n. o L: muestra la cl´usula. Existen 6 y son: Call: pasamos por ´l cuando se llama a la cl´usula. Yo recomiendo las secci´nes 2. Los m´s utiles son: a ´ Enter (o espacio o ”c”): continua hasta el siguiente puerto. probamos otra cl´usula de un mismo predicado.38 por proporcionar una visi´n general. por recursi´n. o 6. sino que lo realiza desde el principio de la ejecuci´n. a Exit: cuando salimos del objetivo.indicando que hemos pasado a ese modo.

Manejo de t´rminos e Jerarqu´ ıa Para facilitar la tarea de la programaci´n en SWI-Prolog existe una peque˜a jerarqu´ de t´rminos o n ıa e 8 . (3) Aqu´ se muestra la pila de objetivos que sirve para la recursi´n. (4) En esta ventana aparece el programa Prolog. En color rojo aparecen las clausulas que fallan. En este ejemplo se ve que estamos ı o ejecutando el predicado d/3 y que ahora vamos a llamar a c/1. hemos unificado X con a e Y con b. y b(bbb). e 7. (2) Esta parte muestra las unificaciones que llevamos en este momento en esta cl´usula. En este a ejemplo.(1) Estos botones nos sirven para avanzar en la ejecuci´n del programa. 7. en concreto b(bb). En concreto la flecha recta o hacia la derecha se usa para avanzar paso a paso. Tambi´n vemos que queda pendiente e hechos del predicado b/1. Todav´ falta la Z de c(Z) porque es el predicado que se ıa va a llamar ahora.1. Se indica que cl´usula se esta ejecutando ahora y a en color verde a qu´ objetivo se va a llamar.

Ej: u ?. No Todos los predicados pueden ser encontrados en la secci´n 4.var(X). Ej: u ?.atom(fEdErIcO). o 7. Yes ?. La primera es escribiendo el nombre de la constante con la primera letra en min´sculas. caracteres a raros o la primera letra en may´sculas lo escribimos entre comillas simples.1.5 del manual.Debajo de cada categoria de t´rmino se ha escrito el predicado metal´gico que lo define. Si buscamos que nuestra constante contenga espacios.1. Yes La segunda forma es m´s flexible. var(X). ´ Atomos Los t´rminos ´tomos son aquellos que se corresponden con las constantes del vocabulario en l´gica e a o de primer orden.atom(’a’). Ej: e o ?. Se comprueban que est´n bien definidos mediando el predicado atom/1. 9 . a Existen dos formas de definir constantes.X=a.atom(a). X = _G230 Yes ?.

No ?. Yes 7.714286 ?.2. Yes ?. >=.4 is 2 + 1. 7.atom(’A’). Escritura y lectura de t´rminos e Prolog posee predicados para leer o escribir t´rminos por pantalla o desde un archivo. En su argumento izquierdo a usamos una variable libre (u otro valor con el que queremos que unifique) y en el argumento derecho una expresi´n aritm´tica. Yes ?.Yes ?. e o o El m´s importante de ellos es el predicado is/2 que se usa de forma infija. N = 0. =\= y =:= que se usan tambi´n en e forma infija. N´ meros u Es dif´ la definici´n de predicados para n´meros en el que sus argumentos sean de entrada y de ıcil o u salida.atom(’2’).1. Ej: o e ?.N is X + 2. =<. >.26 del manual.atom(’a a’). Por eso los argumentos de los o o predicados aritm´ticos s´lo poseen una direcci´n en SWI-Prolog. N = 4 ?.2. Si se busca m´s informaci´n sobre c´mo maneja SWI-Prolog los n´meros hay que consultar la secci´n a o o u o 4.N is 2 + 2.N is 5 / 7. Otros predicados m´s sencillos son write/1. tal y como se hace en los predicados en programaci´n l´gica. a writeln/1 o writeq/1. ERROR: is/2: Arguments are not sufficiently instantiated Otros predicados de este tipo son las relaciones <. El predicado e a m´s general para la escritura de terminos es write term/2. Ej: 10 .

Hay algo importante que decir sobre la lectura de t´rminos. No M´s predicados pueden ser encontrados en la secci´n 4. Existen versiones de estos predicados con un argumento m´s a˜adido que corresponde con el ”stream” a n de un archivo. Hay que escribir el punto expl´ ıcitamente (write(’. T = f(a) Yes ?.read(g(T)). f(a) Yes ?.read(f(T)). | f(a).write(f(a. o Para la lectura de t´rminos existen predicados an´logos: read term/2 y read/1 junto con predicados e a que llevan como argumento un flujo de un fichero. a a Yes ?. | f(a).write(f(a)). | f(a). Hay que tener cuidado con la escritura de un t´rmino en un e e archivo si queremos volverlo a leer inmediatamente.19. Ej: ?.write(’a a’).read(T). f(a. _G279) X = _G279 Yes Tambi´n ayudan a formatear la salida predicados como nl/0 (que escribe un salto de l´ e ınea) y tab/1 (que escribe una cantidad de espacios).X)).’)) porque write/1 no lo hacer. a o 11 . Su funci´n es la misma pero lo hacen en el archivo de texto asociado con el stream.?. Para que Prolog sepa cual es el final de e un t´rmino se debe acabar con un punto. T = a Yes ?.

append(?List1.1): e is set(+Set): Set es un conjunto list to set(+List. ?List2): List2 es la eliminaci´n de todos los elementos que unifican simult´neao a mente con Elem de List1. o Para manejar listas SWI-Prolog proporciona los dos t´rminos constructores de la lista: [ ]. ?List): Elem es elemento de List. La lista completa est´ en la secci´n 4. +Set2. o subtract(+Set. ?List2. a e delete(+List1. ?Elem.1. -Set3): Set3 es la intersecci´n de Set1 con Set2.28 y en el ap´ndice A. +Set): todos los elementos de Sebset est´n en Set. 9. append y update. o subset(+Subset. u sort(+List.1 a o e si usamos el comando help en vez del . la constante e lista vaca. Un conjunto est´ implementado e o a como una lista sin repeticiones aunque no es necesario conocer dicha implementaci´n ya que podemos o usarlo como un Tipo Abstracto de Datos con el predicado list to set/2. ?List): Y est´ despu´s de X en la lista List. ?Y. A open/3 se le pasa el nombre y/o la ruta del archivo escrito entre comillas simples a y el modo de escritura. comenzando por el 0. donde R debe ser una lista a o e su vez. -Result): elimina de Set todos los elementos del conjunto Delete. Para una definici´n m´s formal de lista consultar el predicado is list/1.1 (11. por lo que cada vez que se escriba sustituir´ algo de texto Ej: a 12 . El modo debe ser una de estas constantes: read. ?Int): Int es el n´mero de elementos de la lista List.1. e reverse(+List1. nth0(?Index. y [X|R] el operador (funci´n infija) concatenar por la cabeza. -List2): List2 es List1 pero con el orden de los elementos cambiado. ?Elem): Elem es el Index -´simo elemento de List. +Set2. intersection(+Set1.8. Listas Existe un m´dulo que se carga por defecto para el manejo de listas y es el que vamos a tratar ahora. Tambi´n se proporciona o a predicados para el manejo de listas. nextto(?X. Manejo de archivos Para abrir un fichero tenemos el predicado open/3 (tambi´n existe open/4 que es igual que open/3 e pero con una lista de opciones adicionales). -Set): Set es el conjunto de elementos de List pero sin duplicados. Conjuntos SWI-Prolog tambi´n posee un m´dulo para el manejo de conjuntos. ?List3): List3 es la concatenaci´n de List1 y List2 o member(?Elem. Devuelve en una variable el flujo (stream) donde podremos escribir. Nosotros vamos a ver algunos por encima: is list(+Term): cierto si Term es una lista.1 (u 11. append abre el fichero para escritura y se posiciona al final y update hace lo mismo pero se posiciona al principio (sin borrar nada a priori). a 10. Podemos consultar los predicados relativos a conjuntos en el ap´ndice A. length(?List. +Delete. El uso de open/3 es muy parecido al de C ya que se adapta a un est´ndar de ISO.pdf) del manual. write. ?List. -Set3): Set3 es la uni´n de Set1 y Set2. union(+Set1. -Sorted): Sorted es la lista ordenada de los elementos de List sin duplicados.

findall(X.16. Para cerrar el flujo asociado con el fichero usamos close/1. write. findall(+Template. vida(fernando_VII. 1819). El primer argumento ser´ el flua jo y el segundo el t´rmino (aunque mandemos texto al archivo. Para leer y escribir tenemos la familia de los predicados read/2 y write/2.txt’.L). S). dios_egipcio(apis). Yes 6 ?. open(declaracion_amor.B]. vida(carlos_III. -Bag): id´ntico a findall/3 excepto que si el objetivo posee variables e libres entonces primero probar´ la unificaci´n con esas variables libres y despu´s realizar´ el ´rbol a o e a a de vuelta atras para cada una de esas unificaciones. 1788). 5 ?. a o o 11.bagof([A. anubis. dios_egipcio(anubis). open(’c:/novias_secretas/declaracion_amor. apis.listing.open(’declaracion_amor. Cada vez a que llega a un ´xito unifica las variables con la plantilla Template e introduce el resultado en la e lista Bag. yes ?. +Goal. -Bag): realiza todo el ´rbol de backtracking del objetivo Goal. vida(carlos_IV. S).txt’. 1833). read. ´ste debe estar escrito como un t´rmino). L). C). A = _G371 B = _G374 13 . X = _G362 L = [amon. ?. dios_egipcio(amon). parando cada vez. +Goal.16 aunque nos hemos centrado en la 4. write.1. como se ha visto anteriormente. dios_egipcio(ra). e e e M´s informaci´n en la secci´n 4. ra] yes bagof(+Template.listing. S). 1784. Todas las soluciones a un objetivo Existen predicados que no se paran cada vez que llegan a una hoja ´xito en el ´rbol de vuelta e a atr´s sino que realizan todo el ´rbol que est´ por debajo de un objetivo dado y guardan las soluciones a a a (unificaciones) en una lista. B.dios_egipcio(X). vida(A. 1748. 1716.

C = 1788 L = [[carlos_III. A B C L No setof(+Template. -Set): igual que bagof/3 pero la lista Bag es devuelta ordenada y sin duplicados.31 y 4.B]. _G371 _G374 1833 [[fernando_VII. [fernando_VII. C). 1716]. = = = = = = = = _G371 _G374 1819 [[carlos_IV. = = = = _G383 _G386 _G391 [[carlos_III.29 existe explicaciones de estos predicados. B.L). 14 . En las secciones 4. 1748]] . 1784]] . C^vida(A. 1748]. 1784]] . [carlos_IV.bagof([A. +Goal. 1716]] . A B C L A B C L No Si no queremos que se pare cada vez que encuentre una unificaci´n debemos usar el s´ o ımbolo ˆ como en el ejemplo: ?.