SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
Minimanualillo de SWI-Prolog
                                       Roberto Torres de Alba
                                         22 de marzo de 2006


´
Indice
1. Introducci´n
             o                                                                                                                                                              2

2. Comandos b´sicos
             a                                                                                                                                                              2

3. Sintaxis de Prolog                                                                                                                                                       2

4. Ayuda                                                                                                                                                                    4

5. Consultando y modificando programas                                                                                                                                       5
   5.1. Consultar programas . . . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5
   5.2. Errores y avisos . . . . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
   5.3. Mostrar base de clausulas . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
   5.4. Modificando la base de clausulas . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6

6. Depurador                                                                                                                                                                6
   6.1. Depurador en modo texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                       6
   6.2. Depurador gr´fico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
                    a                                                                                                                                                       7

7. Manejo de t´rminos
                 e                                                                                                                                                          8
   7.1. Jerarqu´ . . . . . . . . . . . .
               ıa                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
               ´
        7.1.1. Atomos . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
        7.1.2. N´meros . . . . . . . . .
                 u                         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
   7.2. Escritura y lectura de t´rminos
                                e          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10

8. Listas                                                                                                                                                                  12

9. Conjuntos                                                                                                                                                               12

10.Manejo de archivos                                                                                                                                                      12

11.Todas las soluciones a un objetivo                                                                                                                                      13




                                                               1
1.      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, a d´ de hoy,
                 o                                       ´                                 ıa
en la p´gina www.swi-prolog.com, que es la 5.6.6 para Windows NT/2000/XP.
       a


2.      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 ”?-”. Desde ah´ es de donde vamos a ajecutar todos los objetivos. Los siguientes
  a                               ı
apartados explican de forma muy general todo aquello que es fundamental conocer a la hora de usar
este int´rprete.
        e
  1. 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. Tambi´n existe la posibilidad de hacerlo desde
          u                                                     e
     el shell escribiendo el nombre del programa, sin la extensi´n ”.pl”, encerrada por corchetes ”[ ]” y
                                                                o
     seguida de punto. Ej:

       [mi_prog].

  2. Ayuda: SWI-Prolog posee una ayuda gr´fica f´cil de usar. Basta con poner en el shell ”help.”. Si
                                            a     a
     se quiere consultar un tema o un predicado en concreto basta con escribir el tema de la siguiente
     forma: help(Tema).
  3. Ejecuci´n de objetivos: para ejecutar un objetivo simplemente lo escribimos en el shell (seguido de
            o
     punto). Si el objetivo no tiene ´xito SWI-Prolog responder´ ”no”. 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. Ahora debemos escribir un unico car´cter. Si buscamos
                       a          o                                         ´       a
     m´s respuestas escribiremos ”;” (punto y coma), si no pulsamos enter. Para una lista de comandos
       a
     escribimos ”h”.
  4. Depuraci´n: Para entrar en el modo trace hay que escribir ”trace.”. Al lado del shell deber´
              o                                                                                    ıa
     aparecer la palabra ”[trace]”. Para salir de este modo hay que escribir ”notrace.” y ”nodebug.”.
     Existe la posibilidad de utilizar un depurador gr´fico escribiendo ”guitracer.”
                                                       a


3.      Sintaxis de Prolog
   Cualquier programa en Prolog tiene que estar escrito en un fichero de texto plano (sin formato). La
manera m´s sencilla es usar el Bloc de Notas. Dicho archivo debe poseer la extensin ”.pl” para indicar
          a
que contiene c´digo fuente de Prolog.
              o

   Un programa Prolog est´ formado con un conjunto de hechos y de reglas junto con un objetivo. 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.

     Existen ciertas consideraciones sobre la sintaxis de Prolog:

  1. Variables:
     El identificador de una variable tendr´ que tener su primera letra en may´sculas.
                                          a                                  u
     Ej: X, Atapuerca, Cobaltina, RADgtfCdf

                                                     2
2. Constantes:
   La primera letra de una constante deber´ estar escrita en min´sculas.
                                          a                     u
   Ej: a, incienso, roberto, rADgtfCdf
   Tambi´n se consideran constantes a los n´meros,
           e                               u
   Ej: 1, 5.02, 0.7
   las palabras entre comillas simples
   Ej: ’a’, ’A’, ’a a’
   y la lista vac´ [ ].
                 ıa
3. Funciones:
   Al igual que las constantes, su primera letra debe ser una min´scula. Deber´ estar seguido de un
                                                                  u            a
   conjunto de t´rminos (otras funciones, variables o constantes) encerrados entre par´ntesis.
                 e                                                                    e
   Ej: f(c,X), conc arbol(Hijo Izq, Raiz, Hijo Der), rADgtfCdf(RADgtfCdf, rADgtfCdf)
4. Predicados:
   Su sintaxis es la misma que la de las funciones aunque, por su localizaci´n dentro de la cl´usula (es
                                                                            o                 a
   decir, dentro del programa Prolog), el compilador los identificar´ como tal, y no como funciones.
                                                                     a
   Ej: f(c,X), conc arbol(Hijo Izq, Raiz, Hijo Der), rADgtfCdf(RADgtfCdf, rADgtfCdf)
   Tambi´n existe la posibilidad de tener predicados 0-arios.
          e
5. Hechos:
   Son cl´usulas de Horn que poseen un unico predicado en la cabeza y ninguno en el cuerpo. 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.
   donde p es un predicado y tiene que seguir su sintaxis. Ej:

   padre(aaron, maria).
   compositor(shostakovich).
   shostakovich(compositor).

6. Reglas:
   Son cl´usulas de Horn que poseen un unico predicado en la cabeza y uno o m´s en el cuerpo.
          a                                ´                                         a
   Tienen la siguiente pinta:
   P ← Q1, Q2, Q3 escritos en sintaxis clausular o
   P ← Q1 ∧ Q2 ∧ Q3 escritos en sintaxis de l´gica de primer orden.
                                               o
   En Prolog la flecha se sustituye por ”:-”, las conectivas conjuntivas se escriben como comas ”,” y
   la regla termina en punto:

   p :- q1, q2, q3.

   donde, al igual que los hechos, p y q1, q2 y q3 son predicados. Ej:

   cuadrado(X) :- poligono(X), numero_lados(X,4).

7. Objetivos:
   Son cl´usulas de Horn que no poseen ning´n predicado en su cabeza:
         a                                   u
   φ ← Q1, Q2, Q3
   Los predicados se escriben separados por comas y terminados en punto. S´lo pueden sen lanzados
                                                                          o
   desde el shell de SWI-Prolog.

                                                 3
?- padre(X, Y),padre(Y, Z).


4.    Ayuda
    En la ayuda de SWI-Prolog, la definici´n de los predicados tiene su propia sintaxis. El nombre y
                                           o
la aridad determinan un´ıvocamente a un predicado. Esto en Prolog se escribe pred/arid donde pred es
el nombre del predicado y arid su aridad. Despu´s del nombre del predicado se escribe un n´mero de
                                                e                                          u
variables, dependiendo de la aridad, con un s´
                                             ımbolo delante de la variable:

+ : significa que esa variable debe estar instanciada, es decir, que no puede ser una variable sin estar
     unificada con nada, en el momento es que se llega a ese predicado. Desde el punto de vista del
     programador se puede ver como un par´metro de entrada. A pesar de que en l´gica de primer
                                              a                                       o
     orden ello no tendr´ mucho sentido, en SWI-Prolog se dan cosas as´ debido a que, por ejemplo,
                        ıa                                                ı
     dicho predicado puede estar relacionado con una llamada a C (como sort/2 ) o con operaciones
     aritm´ticas (como is/2 ). Ej:
           e

     ?- sort(X,[1,2,3,4]).
     ERROR: sort/2: Arguments are not sufficiently instantiated

- : identico a + pero esta vez como predicado de salida. Pongamos lo que le pongamos va a intentar
      unificar con ello. Ej:

     ?- sotr([5,4,3,2,1], L).

     L = [1, 2, 3, 4, 5]

     ?- sort([5,4,3,2,1], [C|R] ).

     C = 1
     R = [2, 3, 4, 5]

     ?- sort([5,4,3,2,1], [2,1,3,5,4] ).

     No

?: se considera de entrada o de salida. Esto sigue el procedimiento normal de resoluci´n de la progra-
                                                                                      o
      maci´n l´gica.
          o o

    Para ver la ayuda sobre el predicado pred escribimos help(pred). Si adem´s nos referimos a un
                                                                              a
predicado concreto tambi´n tenemos que escribir su aridad: help(pred/2). Podemos indicar una secci´n
                           e                                                                      o
del manual: la seccion 2.4 se escribira como 2-4: help(2-4).
    Si no tenemos informaci´n tan concreta podemos usar el predicado apropos/1. A este predicado se
                              o
le pasa el nombre aproximado de lo que buscamos. Nos devolvera predicados, funciones o secciones del
manual que contengan ese nombre. S´ le importa las may´sculas o min´sculas (cuidado si la primera es
                                       ı                  u          u
mayusculas porque, l´gicamente, pensar´ que el argumento es una variable). Tambi´n podemos propor-
                       o                  a                                     e
cionarle frases escritas entre comillas simples. Ej:
apropos(file).
apropos(’file’).
apropos(’File’).
apropos(’the file’).

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

     Esta informaci´n est´ recogida en la secci´n 2.6 del manual.
                   o     a                     o


5.      Consultando y modificando programas
5.1.     Consultar programas
    Cargar y compilar un programa en Prolog se conoce como consultar. Existe varias formas. La m´s   a
f´cil consiste en usar el men´ File→Consult, aunque esta opci´n s´lo est´ disponible en el entorno Win-
 a                           u                               o o        a
dows.

   Tambi´n podemos usar el predicado consult/1. consult/1 puede ser invocado de varias formas. La
          e
m´s f´cil consiste en llamar a consult/1 con el nombre del programa sin la extensi´n. Es indiferente el
  a a                                                                             o
uso de may´sculas o min´sculas excepto para la primera letra, que debe ser min´scula para que Prolog
            u             u                                                    u
no piense que es una variable. Ej:
consult(practica3_chunga).
En este caso buscar´ en el directorio actual y en una serie de directorios que tiene para buscar.
                   a

   Otra forma consiste en escribir la ruta del archivo completa entrecomillada con comillas simples.
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:
                a
consult(’c:/hlocal/practica3_suspensa’).
consult(’c:/hlocal/practica3_suspensa.pl’).
   Otra alternativa a este predicado es el uso de los corchetes. Su funcionamiento es identico al de
consult/1 pero poniendo el nombre del archivo entre corchetes. Ej:
consult(practica3_chunga).
[practica3_chunga].
[’practica3_chunga’].
[’practica3_chunga.pl’].
[’c:/hlocal/practica3_chunga.pl’].
    Para consultar en qu´ directorio estamos usamos el predicado pwd/0. Para cambiar la ruta usamos
                        e
el predicado cd/1. Se usa escribiendo entre comillas simples la ruta absoluta o relatica. Ej:
1 ?- pwd.
c:/hlocal

yes
2 ?- cd(’..’).

yes
3 ?- pwd.
c:

yes
Existe m´s informaci´n detallada en la secci´n 4.3 del manual y, una m´s util en la 4.3.2.
        a           o                       o                         a ´

                                                    5
5.2.     Errores y avisos
     Cuando se consulta un archivo pueden aparecer mensajes de error o de aviso. Los m´s comunes son:
                                                                                      a
  1. Error sint´ctico: el int´rprete mostrar´ el error que se ha producido, donde ha sido y por qu´ se
               a             e              a                                                     e
     ha parado. Ya que la sintaxis de Prolog es sencilla suele acertar la mayor´ de las veces.
                                                                               ıa
  2. Error de archivo no encontrado: hay que fijarse en el nombre del archivo, la ruta que se ha puesto
     expl´
         ıcitamente y los directorios por defecto en donde busca, como puede ser el directorio de trabajo.
  3. Aviso de variable singleton: una variable singleton es una variable que solamente aparece una
     vez en una cl´usula. El compilador interpreta que puede haber un error al escribir esa variable
                   a
     pero, por no tratarse de un error, da un aviso. 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. Para que el programa sea m´s claro y no salga el
                                                                                    a
     aviso podemos usar, en su lugar, una variable an´nima. Las variables an´nimas se escriben como
                                                        o                       o
     un subrayado ” ”, unifican con cualquier cosa pero no entre ellas. Ej:

       % multiplica(in, in, out)
       multiplica(0, _, 0).

  4. 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.
                a                               a

5.3.     Mostrar base de clausulas
    Para ver el contenido de la base de cl´usulas usamos el predicado listing/0. Este predicado muestra
                                          a
todas las cl´usulas que tenemos actualmente. 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. Tambi´n podemos
                                                                                            e
escribir listing(+Pred/Arid) donde Arid es la aridad del predicado Pred.

5.4.     Modificando la base de clausulas
    Podemos a˜adir y eliminar cl´usulas usando la familia de predicados assert y retract. Con asserta/1
              n                  a
insertamos la cl´usula al principio de la lista de cl´usulas de ese predicado. Con assert/1 y assertz/1
                a                                    a
hacemos lo mismo pero al final. Con retract/1 y retractall/1 las eliminamos.


6.      Depurador
6.1.     Depurador en modo texto
   El modo depurador comienza cuando escribimos el predicado debug/0. Deber aparecer ”[debug]”
antes de la interrogaci´n en el shell de Prolog. Para salir de ese modo basta con usar nodebug/0. Para
                       o
conocer el estado del depurador usamos debugging/0.

   Podemos establecer puntos de paradas para el depurador, que en Prolog se conocen como puntos
esp´ Dichos puntos son establecidos con el predicado spy/1. Con spy(+Pred) establecemos un punto
   ıas.
de espionaje en las cl´usulas cuya cabeza sea Pred. Ej:
                      a
dios_hindu(ganesha).
dios_hindu(krishna).
dios_hindu(shiva).
?- spy(dios_hindu).

                                                   6
Para eliminar un punto esp´ usamos nospy/1 o para eliminar todos usamos nospyall/0. 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). Existen 6 y son:

       Call: pasamos por ´l cuando se llama a la cl´usula.
                         e                         a

       Unify: cuando se ha unificado la cabeza de la cl´usula con el objetivo actual.
                                                      a
       Exit: cuando salimos del objetivo.
       Redo: cuando, por recursi´n, probamos otra cl´usula de un mismo predicado.
                                o                   a
       Fail: cuando esa cl´usula falla.
                          a

       Exception: cuando el predicado throw/1 lanza esa excepci´n.
                                                               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. Pulsando ”h” obtendremos la lista de
                 ´       a
comandos. Los m´s utiles son:
                   a ´

       Enter (o espacio o ”c”): continua hasta el siguiente puerto.
       h: muestra las opciones disponibles.
       a: aborta la ejecuci´n.
                           o
       L: muestra la cl´usula.
                       a
       +: establece un punto de espionaje.
       -: elimina un punto de espionaje.

    El predicado trace/0 hace lo mismo que el predicado debug pero sin necesidad de establecer un punto
esp´ para pararse en un puerto, sino que lo realiza desde el principio de la ejecuci´n. Cuando llamamos
    ıa                                                                              o
a trace/0 aparece ”[trace]” a la izquierda de ?- indicando que hemos pasado a ese modo. Para salir de
´l simplemente llamamos a notrace/0.
e

   Existe muchas secciones del manual que hablan sobre el depurador. Yo recomiendo las secci´nes 2.9
                                                                                            o
y 4.38 por proporcionar una visi´n general.
                                o

6.2.     Depurador gr´fico
                     a
  Existe tambi´n un depurador gr´fico. Para que funcione se debe escribir guitracer. y cuando quer-
               e                   a
amos dejar de usarlo escribimos noguitracer..

   Funciona de la misma manera que el depurador en modo texto excepto que, cuando la ejecuci´n se
                                                                                            o
para en alg´n punto, aparece una ventana.
           u

   La ventana que aparece es esta:




                                                     7
(1) Estos botones nos sirven para avanzar en la ejecuci´n del programa. En concreto la flecha recta
                                                          o
hacia la derecha se usa para avanzar paso a paso.

   (2) Esta parte muestra las unificaciones que llevamos en este momento en esta cl´usula. En este
                                                                                   a
ejemplo, hemos unificado X con a e Y con b. Todav´ falta la Z de c(Z) porque es el predicado que se
                                                  ıa
va a llamar ahora.

    (3) Aqu´ se muestra la pila de objetivos que sirve para la recursi´n. En este ejemplo se ve que estamos
           ı                                                          o
ejecutando el predicado d/3 y que ahora vamos a llamar a c/1. Tambi´n vemos que queda pendiente
                                                                            e
hechos del predicado b/1, en concreto b(bb). y b(bbb).

   (4) En esta ventana aparece el programa Prolog. Se indica que cl´usula se esta ejecutando ahora y
                                                                      a
en color verde a qu´ objetivo se va a llamar. En color rojo aparecen las clausulas que fallan.
                   e


7.      Manejo de t´rminos
                   e
7.1.     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
Debajo de cada categoria de t´rmino se ha escrito el predicado metal´gico que lo define. Ej:
                                  e                                      o
?- var(X).

X = _G230

Yes

?- X=a, var(X).

No
     Todos los predicados pueden ser encontrados en la secci´n 4.5 del manual.
                                                            o

7.1.1.    ´
          Atomos
   Los t´rminos ´tomos son aquellos que se corresponden con las constantes del vocabulario en l´gica
        e        a                                                                             o
de primer orden. Se comprueban que est´n bien definidos mediando el predicado atom/1.
                                      a

   Existen dos formas de definir constantes. La primera es escribiendo el nombre de la constante con la
primera letra en min´sculas. Ej:
                    u
?- atom(a).

Yes

?- atom(fEdErIcO).

Yes
   La segunda forma es m´s flexible. Si buscamos que nuestra constante contenga espacios, caracteres
                            a
raros o la primera letra en may´sculas lo escribimos entre comillas simples. Ej:
                               u
?- atom(’a’).



                                                   9
Yes

?- atom(’a a’).

Yes

?- atom(’A’).

Yes

?- atom(’2’).

Yes

7.1.2.   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, tal y como se hace en los predicados en programaci´n l´gica. Por eso los argumentos de los
                                                           o o
predicados aritm´ticos s´lo poseen una direcci´n en SWI-Prolog.
                 e       o                    o

   El m´s importante de ellos es el predicado is/2 que se usa de forma infija. 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. Ej:
           o       e
?- N is 2 + 2.

N = 4

?- N is 5 / 7.

N = 0.714286

?- 4 is 2 + 1.

No

?- N is X + 2.
ERROR: is/2: Arguments are not sufficiently instantiated
   Otros predicados de este tipo son las relaciones <, >, =<, >=, == y =:= que se usan tambi´n en
                                                                                             e
forma infija.

   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.26 del manual.

7.2.     Escritura y lectura de t´rminos
                                 e
   Prolog posee predicados para leer o escribir t´rminos por pantalla o desde un archivo. El predicado
                                                 e
m´s general para la escritura de terminos es write term/2. Otros predicados m´s sencillos son write/1,
 a                                                                             a
writeln/1 o writeq/1. Ej:



                                                  10
?- write(f(a)).
f(a)

Yes
?- write(’a a’).
a a

Yes
?- write(f(a,X)).
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).

   Existen versiones de estos predicados con un argumento m´s a˜adido que corresponde con el ”stream”
                                                            a n
de un archivo. Su funci´n es la misma pero lo hacen en el archivo de texto asociado con el stream.
                       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.

   Hay algo importante que decir sobre la lectura de t´rminos. Para que Prolog sepa cual es el final de
                                                      e
un t´rmino se debe acabar con un punto. Hay que tener cuidado con la escritura de un t´rmino en un
    e                                                                                     e
archivo si queremos volverlo a leer inmediatamente. Hay que escribir el punto expl´
                                                                                  ıcitamente (write(’.’))
porque write/1 no lo hacer. Ej:
?- read(T).
|    f(a).

T = f(a)

Yes
?- read(f(T)).
|    f(a).

T = a

Yes
?- read(g(T)).
|    f(a).

No
     M´s predicados pueden ser encontrados en la secci´n 4.19.
      a                                               o




                                                   11
8.    Listas
    Existe un m´dulo que se carga por defecto para el manejo de listas y es el que vamos a tratar ahora.
                o
Para manejar listas SWI-Prolog proporciona los dos t´rminos constructores de la lista: [ ], la constante
                                                      e
lista vaca; y [X|R] el operador (funci´n infija) concatenar por la cabeza, donde R debe ser una lista a
                                      o
su vez. Para una definici´n m´s formal de lista consultar el predicado is list/1. Tambi´n se proporciona
                         o    a                                                         e
predicados para el manejo de listas. La lista completa est´ en la secci´n 4.28 y en el ap´ndice A.1 (11.1
                                                          a            o                  e
si usamos el comando help en vez del .pdf) del manual. Nosotros vamos a ver algunos por encima:
is list(+Term): cierto si Term es una lista.
length(?List, ?Int): Int es el n´mero de elementos de la lista List.
                                u
sort(+List, -Sorted): Sorted es la lista ordenada de los elementos de List sin duplicados.
append(?List1, ?List2, ?List3): List3 es la concatenaci´n de List1 y List2
                                                       o
member(?Elem, ?List): Elem es elemento de List.
nextto(?X, ?Y, ?List): Y est´ despu´s de X en la lista List.
                            a      e
delete(+List1, ?Elem, ?List2): List2 es la eliminaci´n de todos los elementos que unifican simult´nea-
                                                    o                                           a
     mente con Elem de List1.
nth0(?Index, ?List, ?Elem): Elem es el Index -´simo elemento de List, comenzando por el 0.
                                              e
reverse(+List1, -List2): List2 es List1 pero con el orden de los elementos cambiado.


9.    Conjuntos
    SWI-Prolog tambi´n posee un m´dulo para el manejo de conjuntos. 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. Podemos consultar los predicados
relativos a conjuntos en el ap´ndice A.1.1 (u 11.1.1):
                              e
is set(+Set): Set es un conjunto
list to set(+List, -Set): Set es el conjunto de elementos de List pero sin duplicados.
intersection(+Set1, +Set2, -Set3): Set3 es la intersecci´n de Set1 con Set2.
                                                        o
subtract(+Set, +Delete, -Result): elimina de Set todos los elementos del conjunto Delete.
union(+Set1, +Set2, -Set3): Set3 es la uni´n de Set1 y Set2.
                                          o
subset(+Subset, +Set): todos los elementos de Sebset est´n en Set.
                                                        a


10.     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). El uso de open/3 es muy parecido al de C ya que se adapta a
un est´ndar de ISO. A open/3 se le pasa el nombre y/o la ruta del archivo escrito entre comillas simples
      a
y el modo de escritura. Devuelve en una variable el flujo (stream) donde podremos escribir. El modo
debe ser una de estas constantes: read, write, append y update. 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),
por lo que cada vez que se escriba sustituir´ algo de texto Ej:
                                             a

                                                   12
open(’declaracion_amor.txt’, write, S).
open(’c:/novias_secretas/declaracion_amor.txt’, write, S).
open(declaracion_amor, read, S).
    Para cerrar el flujo asociado con el fichero usamos close/1. Para leer y escribir tenemos la familia
de los predicados read/2 y write/2, como se ha visto anteriormente. El primer argumento ser´ el flu-
                                                                                                a
jo y el segundo el t´rmino (aunque mandemos texto al archivo, ´ste debe estar escrito como un t´rmino).
                    e                                         e                                e

   M´s informaci´n en la secci´n 4.16 aunque nos hemos centrado en la 4.16.1.
    a           o             o


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

findall(+Template, +Goal, -Bag): realiza todo el ´rbol de backtracking del objetivo Goal. Cada vez
                                                     a
    que llega a un ´xito unifica las variables con la plantilla Template e introduce el resultado en la
                   e
    lista Bag.

      5 ?- listing.

      dios_egipcio(amon).
      dios_egipcio(anubis).
      dios_egipcio(apis).
      dios_egipcio(ra).

      Yes
      6 ?- findall(X,dios_egipcio(X), L).

      X = _G362
      L = [amon, anubis, apis, ra]

      yes

bagof(+Template, +Goal, -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, parando cada vez.

      ?- listing.

      vida(carlos_III, 1716, 1788).
      vida(carlos_IV, 1748, 1819).
      vida(fernando_VII, 1784, 1833).

      yes
      ?- bagof([A,B], vida(A, B, C),L).

      A = _G371
      B = _G374

                                                  13
C = 1788
     L = [[carlos_III, 1716]] ;

     A   =   _G371
     B   =   _G374
     C   =   1819
     L   =   [[carlos_IV, 1748]] ;

     A   =   _G371
     B   =   _G374
     C   =   1833
     L   =   [[fernando_VII, 1784]] ;

     No

     Si no queremos que se pare cada vez que encuentre una unificaci´n debemos usar el s´
                                                                   o                   ımbolo ˆ como
     en el ejemplo:

     ?- bagof([A,B], C^vida(A, B, C),L).

     A   =   _G383
     B   =   _G386
     C   =   _G391
     L   =   [[carlos_III, 1716], [carlos_IV, 1748], [fernando_VII, 1784]] ;

     No

setof(+Template, +Goal, -Set): igual que bagof/3 pero la lista Bag es devuelta ordenada y sin
     duplicados.

   En las secciones 4.31 y 4.29 existe explicaciones de estos predicados.




                                                   14

Más contenido relacionado

La actualidad más candente

Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapaRobert Wolf
 
Diseño canónico control automatico
Diseño canónico control automaticoDiseño canónico control automatico
Diseño canónico control automaticoAlejandra Mendoza
 
Aprenda el lenguaje ansi c como si estuviera en primero
Aprenda el lenguaje ansi c como si estuviera en primeroAprenda el lenguaje ansi c como si estuviera en primero
Aprenda el lenguaje ansi c como si estuviera en primeroRolando Azcorra Medina
 
Trabajo Junto Taller Saul Angel Cuzcano Quintin
Trabajo Junto Taller Saul Angel Cuzcano QuintinTrabajo Junto Taller Saul Angel Cuzcano Quintin
Trabajo Junto Taller Saul Angel Cuzcano Quintinguest86420
 
2008 minitab-15
2008 minitab-152008 minitab-15
2008 minitab-15R. Tex
 
Guía del menú rFactor 1.8 pro de FZO
Guía del menú rFactor 1.8 pro de FZOGuía del menú rFactor 1.8 pro de FZO
Guía del menú rFactor 1.8 pro de FZOformulazero
 
Guía del menú rFactor 1.8 pro FZO
Guía del menú rFactor 1.8 pro FZOGuía del menú rFactor 1.8 pro FZO
Guía del menú rFactor 1.8 pro FZOdanisenra_34
 
INDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTES
INDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTESINDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTES
INDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTESmilenagost
 

La actualidad más candente (11)

Manual Scilab
Manual ScilabManual Scilab
Manual Scilab
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapa
 
Cppbasico
CppbasicoCppbasico
Cppbasico
 
Diseño canónico control automatico
Diseño canónico control automaticoDiseño canónico control automatico
Diseño canónico control automatico
 
Aprenda el lenguaje ansi c como si estuviera en primero
Aprenda el lenguaje ansi c como si estuviera en primeroAprenda el lenguaje ansi c como si estuviera en primero
Aprenda el lenguaje ansi c como si estuviera en primero
 
Intro c
Intro cIntro c
Intro c
 
Trabajo Junto Taller Saul Angel Cuzcano Quintin
Trabajo Junto Taller Saul Angel Cuzcano QuintinTrabajo Junto Taller Saul Angel Cuzcano Quintin
Trabajo Junto Taller Saul Angel Cuzcano Quintin
 
2008 minitab-15
2008 minitab-152008 minitab-15
2008 minitab-15
 
Guía del menú rFactor 1.8 pro de FZO
Guía del menú rFactor 1.8 pro de FZOGuía del menú rFactor 1.8 pro de FZO
Guía del menú rFactor 1.8 pro de FZO
 
Guía del menú rFactor 1.8 pro FZO
Guía del menú rFactor 1.8 pro FZOGuía del menú rFactor 1.8 pro FZO
Guía del menú rFactor 1.8 pro FZO
 
INDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTES
INDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTESINDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTES
INDICE DE SEGURIDAD ALIMENTARIA POR MACRONUTRIENTES
 

Destacado (16)

Prolog ejercicios resueltos
Prolog ejercicios resueltosProlog ejercicios resueltos
Prolog ejercicios resueltos
 
Prolog file
Prolog fileProlog file
Prolog file
 
Programacion practica prolog
Programacion practica prologProgramacion practica prolog
Programacion practica prolog
 
Prolog
PrologProlog
Prolog
 
Prolog
PrologProlog
Prolog
 
Manual lab prolog
Manual lab prologManual lab prolog
Manual lab prolog
 
Prolog cinthya
Prolog cinthyaProlog cinthya
Prolog cinthya
 
Tutorial de prolog
Tutorial de prologTutorial de prolog
Tutorial de prolog
 
Listas prolog m_c
Listas prolog m_cListas prolog m_c
Listas prolog m_c
 
Practicas prolog2011 listas
Practicas prolog2011 listasPracticas prolog2011 listas
Practicas prolog2011 listas
 
Clase de logica posbc
Clase de logica posbcClase de logica posbc
Clase de logica posbc
 
Sotfware de Programacion Lógica - CLIPS, PROLOG, LISP
Sotfware de Programacion Lógica - CLIPS, PROLOG, LISPSotfware de Programacion Lógica - CLIPS, PROLOG, LISP
Sotfware de Programacion Lógica - CLIPS, PROLOG, LISP
 
Estructuras De Control Prolog
Estructuras De Control PrologEstructuras De Control Prolog
Estructuras De Control Prolog
 
Problema de la ocho reinas. Implementación en Prolog.
Problema de la ocho reinas. Implementación en Prolog.Problema de la ocho reinas. Implementación en Prolog.
Problema de la ocho reinas. Implementación en Prolog.
 
Practicas prolog
Practicas prologPracticas prolog
Practicas prolog
 
52 ejercicios-resueltos-en-pseudocodigo
52 ejercicios-resueltos-en-pseudocodigo52 ejercicios-resueltos-en-pseudocodigo
52 ejercicios-resueltos-en-pseudocodigo
 

Similar a Minimanualillo swi prolog

Similar a Minimanualillo swi prolog (20)

Comandos cisco ccna_exploration
Comandos cisco ccna_explorationComandos cisco ccna_exploration
Comandos cisco ccna_exploration
 
Comandos cisco ccna_exploration
Comandos cisco ccna_explorationComandos cisco ccna_exploration
Comandos cisco ccna_exploration
 
Comandos cisco ccna_exploration
Comandos cisco ccna_explorationComandos cisco ccna_exploration
Comandos cisco ccna_exploration
 
Proyecto Informatico
Proyecto InformaticoProyecto Informatico
Proyecto Informatico
 
Manual LyX: Con "L" de LaTeX
Manual LyX: Con "L" de LaTeXManual LyX: Con "L" de LaTeX
Manual LyX: Con "L" de LaTeX
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapa
 
Calculo
CalculoCalculo
Calculo
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
 
Manual dematlab
Manual dematlabManual dematlab
Manual dematlab
 
Physthones 0 1
Physthones 0 1Physthones 0 1
Physthones 0 1
 
Conselleria educació pmb_bibliotecas
Conselleria educació pmb_bibliotecasConselleria educació pmb_bibliotecas
Conselleria educació pmb_bibliotecas
 
Introduccion a matlab
Introduccion a matlabIntroduccion a matlab
Introduccion a matlab
 
Tutorial xhtml y css
Tutorial xhtml y cssTutorial xhtml y css
Tutorial xhtml y css
 
MANUAL DE LENGUAJE C
MANUAL DE LENGUAJE CMANUAL DE LENGUAJE C
MANUAL DE LENGUAJE C
 
Tutorial c18
Tutorial c18Tutorial c18
Tutorial c18
 
Arduino user manual_es
Arduino user manual_esArduino user manual_es
Arduino user manual_es
 
Arduino user manual_es
Arduino user manual_esArduino user manual_es
Arduino user manual_es
 
Arduino Manual de Usuario
Arduino Manual de UsuarioArduino Manual de Usuario
Arduino Manual de Usuario
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
 
Manual r 1
Manual r 1Manual r 1
Manual r 1
 

Más de Facultad de Ciencias y Sistemas

Introducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaIntroducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaFacultad de Ciencias y Sistemas
 

Más de Facultad de Ciencias y Sistemas (20)

Ejercicios HTML 5
Ejercicios HTML 5Ejercicios HTML 5
Ejercicios HTML 5
 
CSS3
CSS3CSS3
CSS3
 
09 ordenamiento-en-vectores-en-c
09 ordenamiento-en-vectores-en-c09 ordenamiento-en-vectores-en-c
09 ordenamiento-en-vectores-en-c
 
08 mas-de-vectores-en-c
08 mas-de-vectores-en-c08 mas-de-vectores-en-c
08 mas-de-vectores-en-c
 
07 vectores-en-c final
07 vectores-en-c final07 vectores-en-c final
07 vectores-en-c final
 
06 clases-en-c
06 clases-en-c06 clases-en-c
06 clases-en-c
 
05 cadenas-de-caracteres-en-c
05 cadenas-de-caracteres-en-c05 cadenas-de-caracteres-en-c
05 cadenas-de-caracteres-en-c
 
04 mas-estructuras-iterativas-en-c
04 mas-estructuras-iterativas-en-c04 mas-estructuras-iterativas-en-c
04 mas-estructuras-iterativas-en-c
 
03 estructuras-iterativas-en-c
03 estructuras-iterativas-en-c03 estructuras-iterativas-en-c
03 estructuras-iterativas-en-c
 
02 mas-de-las-estructuras-de-programacion-en-c
02 mas-de-las-estructuras-de-programacion-en-c02 mas-de-las-estructuras-de-programacion-en-c
02 mas-de-las-estructuras-de-programacion-en-c
 
01 estructuras-de-programacion-en-c
01 estructuras-de-programacion-en-c01 estructuras-de-programacion-en-c
01 estructuras-de-programacion-en-c
 
Procesamiento del lenguaje natural con python
Procesamiento del lenguaje natural con pythonProcesamiento del lenguaje natural con python
Procesamiento del lenguaje natural con python
 
Actividades de aprendizaje en Moodle
Actividades de aprendizaje en MoodleActividades de aprendizaje en Moodle
Actividades de aprendizaje en Moodle
 
Creación de grupos en Moodle
Creación de grupos en MoodleCreación de grupos en Moodle
Creación de grupos en Moodle
 
Introducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaIntroducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con Java
 
Como crear un diagrama de clases
Como crear un diagrama de clasesComo crear un diagrama de clases
Como crear un diagrama de clases
 
Diagrama de clases - Ejemplo monográfico 02
Diagrama de clases - Ejemplo monográfico 02Diagrama de clases - Ejemplo monográfico 02
Diagrama de clases - Ejemplo monográfico 02
 
Diagrama de clases - Ejemplo monográfico 01
Diagrama de clases - Ejemplo monográfico 01Diagrama de clases - Ejemplo monográfico 01
Diagrama de clases - Ejemplo monográfico 01
 
Otro ejemplo de diagrama de clases UML
Otro ejemplo de diagrama de clases UMLOtro ejemplo de diagrama de clases UML
Otro ejemplo de diagrama de clases UML
 
Un ejemplo de diagrama de clases
Un ejemplo de diagrama de clasesUn ejemplo de diagrama de clases
Un ejemplo de diagrama de clases
 

Último

plande accion dl aula de innovación pedagogica 2024.pdf
plande accion dl aula de innovación pedagogica 2024.pdfplande accion dl aula de innovación pedagogica 2024.pdf
plande accion dl aula de innovación pedagogica 2024.pdfenelcielosiempre
 
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptxTECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptxKarlaMassielMartinez
 
proyecto de mayo inicial 5 añitos aprender es bueno para tu niño
proyecto de mayo inicial 5 añitos aprender es bueno para tu niñoproyecto de mayo inicial 5 añitos aprender es bueno para tu niño
proyecto de mayo inicial 5 añitos aprender es bueno para tu niñotapirjackluis
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxlupitavic
 
Dinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dDinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dstEphaniiie
 
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptxTIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptxlclcarmen
 
Éteres. Química Orgánica. Propiedades y reacciones
Éteres. Química Orgánica. Propiedades y reaccionesÉteres. Química Orgánica. Propiedades y reacciones
Éteres. Química Orgánica. Propiedades y reaccionesLauraColom3
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSjlorentemartos
 
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxzulyvero07
 
SELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdf
SELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdfSELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdf
SELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdfAngélica Soledad Vega Ramírez
 
Ecosistemas Natural, Rural y urbano 2021.pptx
Ecosistemas Natural, Rural y urbano  2021.pptxEcosistemas Natural, Rural y urbano  2021.pptx
Ecosistemas Natural, Rural y urbano 2021.pptxolgakaterin
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Carlos Muñoz
 
origen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioorigen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioELIASAURELIOCHAVEZCA1
 
Neurociencias para Educadores NE24 Ccesa007.pdf
Neurociencias para Educadores  NE24  Ccesa007.pdfNeurociencias para Educadores  NE24  Ccesa007.pdf
Neurociencias para Educadores NE24 Ccesa007.pdfDemetrio Ccesa Rayme
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.amayarogel
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdfBaker Publishing Company
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónLourdes Feria
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfFrancisco158360
 

Último (20)

plande accion dl aula de innovación pedagogica 2024.pdf
plande accion dl aula de innovación pedagogica 2024.pdfplande accion dl aula de innovación pedagogica 2024.pdf
plande accion dl aula de innovación pedagogica 2024.pdf
 
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptxTECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
 
proyecto de mayo inicial 5 añitos aprender es bueno para tu niño
proyecto de mayo inicial 5 añitos aprender es bueno para tu niñoproyecto de mayo inicial 5 añitos aprender es bueno para tu niño
proyecto de mayo inicial 5 añitos aprender es bueno para tu niño
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docx
 
Dinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dDinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes d
 
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptxTIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
 
Éteres. Química Orgánica. Propiedades y reacciones
Éteres. Química Orgánica. Propiedades y reaccionesÉteres. Química Orgánica. Propiedades y reacciones
Éteres. Química Orgánica. Propiedades y reacciones
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
 
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
 
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdfTema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
 
SELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdf
SELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdfSELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdf
SELECCIÓN DE LA MUESTRA Y MUESTREO EN INVESTIGACIÓN CUALITATIVA.pdf
 
Medición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptxMedición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptx
 
Ecosistemas Natural, Rural y urbano 2021.pptx
Ecosistemas Natural, Rural y urbano  2021.pptxEcosistemas Natural, Rural y urbano  2021.pptx
Ecosistemas Natural, Rural y urbano 2021.pptx
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
 
origen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioorigen y desarrollo del ensayo literario
origen y desarrollo del ensayo literario
 
Neurociencias para Educadores NE24 Ccesa007.pdf
Neurociencias para Educadores  NE24  Ccesa007.pdfNeurociencias para Educadores  NE24  Ccesa007.pdf
Neurociencias para Educadores NE24 Ccesa007.pdf
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcción
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
 

Minimanualillo swi prolog

  • 1. Minimanualillo de SWI-Prolog Roberto Torres de Alba 22 de marzo de 2006 ´ Indice 1. Introducci´n o 2 2. Comandos b´sicos a 2 3. Sintaxis de Prolog 2 4. Ayuda 4 5. Consultando y modificando programas 5 5.1. Consultar programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5.2. Errores y avisos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.3. Mostrar base de clausulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.4. Modificando la base de clausulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6. Depurador 6 6.1. Depurador en modo texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6.2. Depurador gr´fico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 7 7. Manejo de t´rminos e 8 7.1. Jerarqu´ . . . . . . . . . . . . ıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 ´ 7.1.1. Atomos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 7.1.2. N´meros . . . . . . . . . u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2. Escritura y lectura de t´rminos e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 8. Listas 12 9. Conjuntos 12 10.Manejo de archivos 12 11.Todas las soluciones a un objetivo 13 1
  • 2. 1. 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, a d´ de hoy, o ´ ıa en la p´gina www.swi-prolog.com, que es la 5.6.6 para Windows NT/2000/XP. a 2. 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 ”?-”. Desde ah´ es de donde vamos a ajecutar todos los objetivos. Los siguientes a ı apartados explican de forma muy general todo aquello que es fundamental conocer a la hora de usar este int´rprete. e 1. 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. Tambi´n existe la posibilidad de hacerlo desde u e el shell escribiendo el nombre del programa, sin la extensi´n ”.pl”, encerrada por corchetes ”[ ]” y o seguida de punto. Ej: [mi_prog]. 2. Ayuda: SWI-Prolog posee una ayuda gr´fica f´cil de usar. Basta con poner en el shell ”help.”. Si a a se quiere consultar un tema o un predicado en concreto basta con escribir el tema de la siguiente forma: help(Tema). 3. Ejecuci´n de objetivos: para ejecutar un objetivo simplemente lo escribimos en el shell (seguido de o punto). Si el objetivo no tiene ´xito SWI-Prolog responder´ ”no”. 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. Ahora debemos escribir un unico car´cter. Si buscamos a o ´ a m´s respuestas escribiremos ”;” (punto y coma), si no pulsamos enter. Para una lista de comandos a escribimos ”h”. 4. Depuraci´n: Para entrar en el modo trace hay que escribir ”trace.”. Al lado del shell deber´ o ıa aparecer la palabra ”[trace]”. Para salir de este modo hay que escribir ”notrace.” y ”nodebug.”. Existe la posibilidad de utilizar un depurador gr´fico escribiendo ”guitracer.” a 3. Sintaxis de Prolog Cualquier programa en Prolog tiene que estar escrito en un fichero de texto plano (sin formato). La manera m´s sencilla es usar el Bloc de Notas. Dicho archivo debe poseer la extensin ”.pl” para indicar a que contiene c´digo fuente de Prolog. o Un programa Prolog est´ formado con un conjunto de hechos y de reglas junto con un objetivo. 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. Existen ciertas consideraciones sobre la sintaxis de Prolog: 1. Variables: El identificador de una variable tendr´ que tener su primera letra en may´sculas. a u Ej: X, Atapuerca, Cobaltina, RADgtfCdf 2
  • 3. 2. Constantes: La primera letra de una constante deber´ estar escrita en min´sculas. a u Ej: a, incienso, roberto, rADgtfCdf Tambi´n se consideran constantes a los n´meros, e u Ej: 1, 5.02, 0.7 las palabras entre comillas simples Ej: ’a’, ’A’, ’a a’ y la lista vac´ [ ]. ıa 3. Funciones: Al igual que las constantes, su primera letra debe ser una min´scula. Deber´ estar seguido de un u a conjunto de t´rminos (otras funciones, variables o constantes) encerrados entre par´ntesis. e e Ej: f(c,X), conc arbol(Hijo Izq, Raiz, Hijo Der), rADgtfCdf(RADgtfCdf, rADgtfCdf) 4. Predicados: Su sintaxis es la misma que la de las funciones aunque, por su localizaci´n dentro de la cl´usula (es o a decir, dentro del programa Prolog), el compilador los identificar´ como tal, y no como funciones. a Ej: f(c,X), conc arbol(Hijo Izq, Raiz, Hijo Der), rADgtfCdf(RADgtfCdf, rADgtfCdf) Tambi´n existe la posibilidad de tener predicados 0-arios. e 5. Hechos: Son cl´usulas de Horn que poseen un unico predicado en la cabeza y ninguno en el cuerpo. 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. donde p es un predicado y tiene que seguir su sintaxis. Ej: padre(aaron, maria). compositor(shostakovich). shostakovich(compositor). 6. Reglas: Son cl´usulas de Horn que poseen un unico predicado en la cabeza y uno o m´s en el cuerpo. a ´ a Tienen la siguiente pinta: P ← Q1, Q2, Q3 escritos en sintaxis clausular o P ← Q1 ∧ Q2 ∧ Q3 escritos en sintaxis de l´gica de primer orden. o En Prolog la flecha se sustituye por ”:-”, las conectivas conjuntivas se escriben como comas ”,” y la regla termina en punto: p :- q1, q2, q3. donde, al igual que los hechos, p y q1, q2 y q3 son predicados. Ej: cuadrado(X) :- poligono(X), numero_lados(X,4). 7. Objetivos: Son cl´usulas de Horn que no poseen ning´n predicado en su cabeza: a u φ ← Q1, Q2, Q3 Los predicados se escriben separados por comas y terminados en punto. S´lo pueden sen lanzados o desde el shell de SWI-Prolog. 3
  • 4. ?- padre(X, Y),padre(Y, Z). 4. Ayuda En la ayuda de SWI-Prolog, la definici´n de los predicados tiene su propia sintaxis. El nombre y o la aridad determinan un´ıvocamente a un predicado. Esto en Prolog se escribe pred/arid donde pred es el nombre del predicado y arid su aridad. Despu´s del nombre del predicado se escribe un n´mero de e u variables, dependiendo de la aridad, con un s´ ımbolo delante de la variable: + : significa que esa variable debe estar instanciada, es decir, que no puede ser una variable sin estar unificada con nada, en el momento es que se llega a ese predicado. Desde el punto de vista del programador se puede ver como un par´metro de entrada. A pesar de que en l´gica de primer a o orden ello no tendr´ mucho sentido, en SWI-Prolog se dan cosas as´ debido a que, por ejemplo, ıa ı dicho predicado puede estar relacionado con una llamada a C (como sort/2 ) o con operaciones aritm´ticas (como is/2 ). Ej: e ?- sort(X,[1,2,3,4]). ERROR: sort/2: Arguments are not sufficiently instantiated - : identico a + pero esta vez como predicado de salida. Pongamos lo que le pongamos va a intentar unificar con ello. Ej: ?- sotr([5,4,3,2,1], L). L = [1, 2, 3, 4, 5] ?- sort([5,4,3,2,1], [C|R] ). C = 1 R = [2, 3, 4, 5] ?- sort([5,4,3,2,1], [2,1,3,5,4] ). No ?: se considera de entrada o de salida. Esto sigue el procedimiento normal de resoluci´n de la progra- o maci´n l´gica. o o Para ver la ayuda sobre el predicado pred escribimos help(pred). Si adem´s nos referimos a un a predicado concreto tambi´n tenemos que escribir su aridad: help(pred/2). Podemos indicar una secci´n e o del manual: la seccion 2.4 se escribira como 2-4: help(2-4). Si no tenemos informaci´n tan concreta podemos usar el predicado apropos/1. A este predicado se o le pasa el nombre aproximado de lo que buscamos. Nos devolvera predicados, funciones o secciones del manual que contengan ese nombre. S´ le importa las may´sculas o min´sculas (cuidado si la primera es ı u u mayusculas porque, l´gicamente, pensar´ que el argumento es una variable). Tambi´n podemos propor- o a e cionarle frases escritas entre comillas simples. Ej: apropos(file). apropos(’file’). apropos(’File’). apropos(’the file’). 4
  • 5. 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. Esta informaci´n est´ recogida en la secci´n 2.6 del manual. o a o 5. Consultando y modificando programas 5.1. Consultar programas Cargar y compilar un programa en Prolog se conoce como consultar. Existe varias formas. La m´s a f´cil consiste en usar el men´ File→Consult, aunque esta opci´n s´lo est´ disponible en el entorno Win- a u o o a dows. Tambi´n podemos usar el predicado consult/1. consult/1 puede ser invocado de varias formas. La e m´s f´cil consiste en llamar a consult/1 con el nombre del programa sin la extensi´n. Es indiferente el a a o uso de may´sculas o min´sculas excepto para la primera letra, que debe ser min´scula para que Prolog u u u no piense que es una variable. Ej: consult(practica3_chunga). En este caso buscar´ en el directorio actual y en una serie de directorios que tiene para buscar. a Otra forma consiste en escribir la ruta del archivo completa entrecomillada con comillas simples. 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: a consult(’c:/hlocal/practica3_suspensa’). consult(’c:/hlocal/practica3_suspensa.pl’). Otra alternativa a este predicado es el uso de los corchetes. Su funcionamiento es identico al de consult/1 pero poniendo el nombre del archivo entre corchetes. Ej: consult(practica3_chunga). [practica3_chunga]. [’practica3_chunga’]. [’practica3_chunga.pl’]. [’c:/hlocal/practica3_chunga.pl’]. Para consultar en qu´ directorio estamos usamos el predicado pwd/0. Para cambiar la ruta usamos e el predicado cd/1. Se usa escribiendo entre comillas simples la ruta absoluta o relatica. Ej: 1 ?- pwd. c:/hlocal yes 2 ?- cd(’..’). yes 3 ?- pwd. c: yes Existe m´s informaci´n detallada en la secci´n 4.3 del manual y, una m´s util en la 4.3.2. a o o a ´ 5
  • 6. 5.2. Errores y avisos Cuando se consulta un archivo pueden aparecer mensajes de error o de aviso. Los m´s comunes son: a 1. Error sint´ctico: el int´rprete mostrar´ el error que se ha producido, donde ha sido y por qu´ se a e a e ha parado. Ya que la sintaxis de Prolog es sencilla suele acertar la mayor´ de las veces. ıa 2. Error de archivo no encontrado: hay que fijarse en el nombre del archivo, la ruta que se ha puesto expl´ ıcitamente y los directorios por defecto en donde busca, como puede ser el directorio de trabajo. 3. Aviso de variable singleton: una variable singleton es una variable que solamente aparece una vez en una cl´usula. El compilador interpreta que puede haber un error al escribir esa variable a pero, por no tratarse de un error, da un aviso. 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. Para que el programa sea m´s claro y no salga el a aviso podemos usar, en su lugar, una variable an´nima. Las variables an´nimas se escriben como o o un subrayado ” ”, unifican con cualquier cosa pero no entre ellas. Ej: % multiplica(in, in, out) multiplica(0, _, 0). 4. 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. a a 5.3. Mostrar base de clausulas Para ver el contenido de la base de cl´usulas usamos el predicado listing/0. Este predicado muestra a todas las cl´usulas que tenemos actualmente. 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. Tambi´n podemos e escribir listing(+Pred/Arid) donde Arid es la aridad del predicado Pred. 5.4. Modificando la base de clausulas Podemos a˜adir y eliminar cl´usulas usando la familia de predicados assert y retract. Con asserta/1 n a insertamos la cl´usula al principio de la lista de cl´usulas de ese predicado. Con assert/1 y assertz/1 a a hacemos lo mismo pero al final. Con retract/1 y retractall/1 las eliminamos. 6. Depurador 6.1. Depurador en modo texto El modo depurador comienza cuando escribimos el predicado debug/0. Deber aparecer ”[debug]” antes de la interrogaci´n en el shell de Prolog. Para salir de ese modo basta con usar nodebug/0. Para o conocer el estado del depurador usamos debugging/0. Podemos establecer puntos de paradas para el depurador, que en Prolog se conocen como puntos esp´ Dichos puntos son establecidos con el predicado spy/1. Con spy(+Pred) establecemos un punto ıas. de espionaje en las cl´usulas cuya cabeza sea Pred. Ej: a dios_hindu(ganesha). dios_hindu(krishna). dios_hindu(shiva). ?- spy(dios_hindu). 6
  • 7. Para eliminar un punto esp´ usamos nospy/1 o para eliminar todos usamos nospyall/0. 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). Existen 6 y son: Call: pasamos por ´l cuando se llama a la cl´usula. e a Unify: cuando se ha unificado la cabeza de la cl´usula con el objetivo actual. a Exit: cuando salimos del objetivo. Redo: cuando, por recursi´n, probamos otra cl´usula de un mismo predicado. o a Fail: cuando esa cl´usula falla. a Exception: cuando el predicado throw/1 lanza esa excepci´n. 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. Pulsando ”h” obtendremos la lista de ´ a comandos. Los m´s utiles son: a ´ Enter (o espacio o ”c”): continua hasta el siguiente puerto. h: muestra las opciones disponibles. a: aborta la ejecuci´n. o L: muestra la cl´usula. a +: establece un punto de espionaje. -: elimina un punto de espionaje. El predicado trace/0 hace lo mismo que el predicado debug pero sin necesidad de establecer un punto esp´ para pararse en un puerto, sino que lo realiza desde el principio de la ejecuci´n. Cuando llamamos ıa o a trace/0 aparece ”[trace]” a la izquierda de ?- indicando que hemos pasado a ese modo. Para salir de ´l simplemente llamamos a notrace/0. e Existe muchas secciones del manual que hablan sobre el depurador. Yo recomiendo las secci´nes 2.9 o y 4.38 por proporcionar una visi´n general. o 6.2. Depurador gr´fico a Existe tambi´n un depurador gr´fico. Para que funcione se debe escribir guitracer. y cuando quer- e a amos dejar de usarlo escribimos noguitracer.. Funciona de la misma manera que el depurador en modo texto excepto que, cuando la ejecuci´n se o para en alg´n punto, aparece una ventana. u La ventana que aparece es esta: 7
  • 8. (1) Estos botones nos sirven para avanzar en la ejecuci´n del programa. En concreto la flecha recta o hacia la derecha se usa para avanzar paso a paso. (2) Esta parte muestra las unificaciones que llevamos en este momento en esta cl´usula. En este a ejemplo, hemos unificado X con a e Y con b. Todav´ falta la Z de c(Z) porque es el predicado que se ıa va a llamar ahora. (3) Aqu´ se muestra la pila de objetivos que sirve para la recursi´n. En este ejemplo se ve que estamos ı o ejecutando el predicado d/3 y que ahora vamos a llamar a c/1. Tambi´n vemos que queda pendiente e hechos del predicado b/1, en concreto b(bb). y b(bbb). (4) En esta ventana aparece el programa Prolog. Se indica que cl´usula se esta ejecutando ahora y a en color verde a qu´ objetivo se va a llamar. En color rojo aparecen las clausulas que fallan. e 7. Manejo de t´rminos e 7.1. 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
  • 9. Debajo de cada categoria de t´rmino se ha escrito el predicado metal´gico que lo define. Ej: e o ?- var(X). X = _G230 Yes ?- X=a, var(X). No Todos los predicados pueden ser encontrados en la secci´n 4.5 del manual. o 7.1.1. ´ Atomos Los t´rminos ´tomos son aquellos que se corresponden con las constantes del vocabulario en l´gica e a o de primer orden. Se comprueban que est´n bien definidos mediando el predicado atom/1. a Existen dos formas de definir constantes. La primera es escribiendo el nombre de la constante con la primera letra en min´sculas. Ej: u ?- atom(a). Yes ?- atom(fEdErIcO). Yes La segunda forma es m´s flexible. Si buscamos que nuestra constante contenga espacios, caracteres a raros o la primera letra en may´sculas lo escribimos entre comillas simples. Ej: u ?- atom(’a’). 9
  • 10. Yes ?- atom(’a a’). Yes ?- atom(’A’). Yes ?- atom(’2’). Yes 7.1.2. 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, tal y como se hace en los predicados en programaci´n l´gica. Por eso los argumentos de los o o predicados aritm´ticos s´lo poseen una direcci´n en SWI-Prolog. e o o El m´s importante de ellos es el predicado is/2 que se usa de forma infija. 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. Ej: o e ?- N is 2 + 2. N = 4 ?- N is 5 / 7. N = 0.714286 ?- 4 is 2 + 1. No ?- N is X + 2. ERROR: is/2: Arguments are not sufficiently instantiated Otros predicados de este tipo son las relaciones <, >, =<, >=, == y =:= que se usan tambi´n en e forma infija. 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.26 del manual. 7.2. Escritura y lectura de t´rminos e Prolog posee predicados para leer o escribir t´rminos por pantalla o desde un archivo. El predicado e m´s general para la escritura de terminos es write term/2. Otros predicados m´s sencillos son write/1, a a writeln/1 o writeq/1. Ej: 10
  • 11. ?- write(f(a)). f(a) Yes ?- write(’a a’). a a Yes ?- write(f(a,X)). 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). Existen versiones de estos predicados con un argumento m´s a˜adido que corresponde con el ”stream” a n de un archivo. Su funci´n es la misma pero lo hacen en el archivo de texto asociado con el stream. 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. Hay algo importante que decir sobre la lectura de t´rminos. Para que Prolog sepa cual es el final de e un t´rmino se debe acabar con un punto. Hay que tener cuidado con la escritura de un t´rmino en un e e archivo si queremos volverlo a leer inmediatamente. Hay que escribir el punto expl´ ıcitamente (write(’.’)) porque write/1 no lo hacer. Ej: ?- read(T). | f(a). T = f(a) Yes ?- read(f(T)). | f(a). T = a Yes ?- read(g(T)). | f(a). No M´s predicados pueden ser encontrados en la secci´n 4.19. a o 11
  • 12. 8. Listas Existe un m´dulo que se carga por defecto para el manejo de listas y es el que vamos a tratar ahora. o Para manejar listas SWI-Prolog proporciona los dos t´rminos constructores de la lista: [ ], la constante e lista vaca; y [X|R] el operador (funci´n infija) concatenar por la cabeza, donde R debe ser una lista a o su vez. Para una definici´n m´s formal de lista consultar el predicado is list/1. Tambi´n se proporciona o a e predicados para el manejo de listas. La lista completa est´ en la secci´n 4.28 y en el ap´ndice A.1 (11.1 a o e si usamos el comando help en vez del .pdf) del manual. Nosotros vamos a ver algunos por encima: is list(+Term): cierto si Term es una lista. length(?List, ?Int): Int es el n´mero de elementos de la lista List. u sort(+List, -Sorted): Sorted es la lista ordenada de los elementos de List sin duplicados. append(?List1, ?List2, ?List3): List3 es la concatenaci´n de List1 y List2 o member(?Elem, ?List): Elem es elemento de List. nextto(?X, ?Y, ?List): Y est´ despu´s de X en la lista List. a e delete(+List1, ?Elem, ?List2): List2 es la eliminaci´n de todos los elementos que unifican simult´nea- o a mente con Elem de List1. nth0(?Index, ?List, ?Elem): Elem es el Index -´simo elemento de List, comenzando por el 0. e reverse(+List1, -List2): List2 es List1 pero con el orden de los elementos cambiado. 9. Conjuntos SWI-Prolog tambi´n posee un m´dulo para el manejo de conjuntos. 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. Podemos consultar los predicados relativos a conjuntos en el ap´ndice A.1.1 (u 11.1.1): e is set(+Set): Set es un conjunto list to set(+List, -Set): Set es el conjunto de elementos de List pero sin duplicados. intersection(+Set1, +Set2, -Set3): Set3 es la intersecci´n de Set1 con Set2. o subtract(+Set, +Delete, -Result): elimina de Set todos los elementos del conjunto Delete. union(+Set1, +Set2, -Set3): Set3 es la uni´n de Set1 y Set2. o subset(+Subset, +Set): todos los elementos de Sebset est´n en Set. a 10. 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). El uso de open/3 es muy parecido al de C ya que se adapta a un est´ndar de ISO. A open/3 se le pasa el nombre y/o la ruta del archivo escrito entre comillas simples a y el modo de escritura. Devuelve en una variable el flujo (stream) donde podremos escribir. El modo debe ser una de estas constantes: read, write, append y update. 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), por lo que cada vez que se escriba sustituir´ algo de texto Ej: a 12
  • 13. open(’declaracion_amor.txt’, write, S). open(’c:/novias_secretas/declaracion_amor.txt’, write, S). open(declaracion_amor, read, S). Para cerrar el flujo asociado con el fichero usamos close/1. Para leer y escribir tenemos la familia de los predicados read/2 y write/2, como se ha visto anteriormente. El primer argumento ser´ el flu- a jo y el segundo el t´rmino (aunque mandemos texto al archivo, ´ste debe estar escrito como un t´rmino). e e e M´s informaci´n en la secci´n 4.16 aunque nos hemos centrado en la 4.16.1. a o o 11. 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. findall(+Template, +Goal, -Bag): realiza todo el ´rbol de backtracking del objetivo Goal. Cada vez a que llega a un ´xito unifica las variables con la plantilla Template e introduce el resultado en la e lista Bag. 5 ?- listing. dios_egipcio(amon). dios_egipcio(anubis). dios_egipcio(apis). dios_egipcio(ra). Yes 6 ?- findall(X,dios_egipcio(X), L). X = _G362 L = [amon, anubis, apis, ra] yes bagof(+Template, +Goal, -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, parando cada vez. ?- listing. vida(carlos_III, 1716, 1788). vida(carlos_IV, 1748, 1819). vida(fernando_VII, 1784, 1833). yes ?- bagof([A,B], vida(A, B, C),L). A = _G371 B = _G374 13
  • 14. C = 1788 L = [[carlos_III, 1716]] ; A = _G371 B = _G374 C = 1819 L = [[carlos_IV, 1748]] ; A = _G371 B = _G374 C = 1833 L = [[fernando_VII, 1784]] ; No Si no queremos que se pare cada vez que encuentre una unificaci´n debemos usar el s´ o ımbolo ˆ como en el ejemplo: ?- bagof([A,B], C^vida(A, B, C),L). A = _G383 B = _G386 C = _G391 L = [[carlos_III, 1716], [carlos_IV, 1748], [fernando_VII, 1784]] ; No setof(+Template, +Goal, -Set): igual que bagof/3 pero la lista Bag es devuelta ordenada y sin duplicados. En las secciones 4.31 y 4.29 existe explicaciones de estos predicados. 14