´ AL LENGUAJE PROLOG INTRODUCCION

´ Indice
1. Introducci´ on 2. Caracter´ ısticas Generales 2.1. Evoluci´ on hist´ orica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Esquema general de trabajo en Prolog . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Implementaciones de Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1. SICStus Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2. SWI-Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Prolog y el paradigma de la Programaci´ on L´ ogica 3.1. Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1. T´ erminos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2. Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 4 5 6 6 6 6 8

3.1.3. Consultas para la activaci´ on de programas . . . . . . . . . . . . . . . . . . 10 3.1.4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2. Sem´ antica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4. Predicados Predefinidos 15

4.1. Aritm´ etica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.1.1. Operadores aritm´ eticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.1.2. Predicados aritm´ eticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.1.3. Programas aritm´ eticos en Prolog . . . . . . . . . . . . . . . . . . . . . . . 17 4.2. Entrada/Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.3. Control: el corte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.3.1. Definici´ on y propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.3.2. Usos del corte. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

1.

Introducci´ on

En este documento se realiza una breve introducci´ on al lenguaje de programaci´ on Prolog, con el objetivo fundamental de mostrar c´ omo se da el paso desde el concepto de programaci´ on l´ ogica “pura” estudiado en el tema anterior a un lenguaje de programaci´ on “real”. En efecto, el lenguaje Prolog se puede ver como una extensi´ on de la programaci´ on l´ ogica pura, en el sentido de que, adem´ as de permitir programar de acuerdo con el paradigma de la programaci´ on l´ ogica, incorpora una serie de elementos adicionales cuyo objetivo es ofrecer una herramienta de programaci´ on que sea u ´til en la pr´ actica. Despu´ es de una descripci´ on de las caracter´ ısticas generales del lenguaje (evoluci´ on hist´ orica, esquema general de trabajo e implementaciones existentes), el apartado 3 estudia el funcionamiento de Prolog desde el punto de vista de la programaci´ on l´ ogica pura, basado en la Programaci´ on L´ ogica Definida estudiada en el tema anterior. Su extensi´ on, que se realiza mediante la introducci´ on de los denominados predicados predefinidos, se resume en el apartado 4. No se abordan, por lo tanto, m´ as que algunos de los aspectos m´ as relevantes del lenguaje. Para un estudio m´ as en profundidad de Prolog se recomienda consultar los siguientes libros (los tres primeros son libros de car´ acter introductorio, mientras que el u ´ltimo trata aspectos m´ as avanzados). L. Sterling and E. Shapiro. The Art of Prolog. The MIT Press, Cambridge, Mass., second edition, 1994. W.F. Clocksin and C.S. Mellish. Programming in Prolog. Springer-Verlag, Berlin, fourth edition, 1994. I. Bratko. Prolog Programming for Artificial Intelligence. Addison-Wesley, Reading, Massachusetts, third edition, 2001. R. O’Keefe. The Craft of Prolog. The MIT Press, Cambridge, MA, 1990.

2.
2.1.

Caracter´ ısticas Generales
Evoluci´ on hist´ orica

Prolog (del franc´ es, PROgrammation en LOGique) fue el primer lenguaje de programaci´ on basado en el paradigma de la programaci´ on l´ ogica. Se implement´ o por primera vez a principios de los a˜ nos setenta en la Universidad de Marsella (Francia), por un equipo dirigido por A. Colmeraeur, utilizando resultados te´ oricos aportados por R. Kowalski (Universidad de Edimburgo). Aunque con ciertas dificultades iniciales, debido principalmente a la novedad del paradigma y a la escasa eficiencia de las implementaciones disponibles, el lenguaje se fue expandiendo r´ apidamente, sobre todo en Europa y en Jap´ on (en este u ´ltimo pa´ ıs la programaci´ on l´ ogica se incluy´ o como parte central del proyecto de ordenadores de quinta generaci´ on de los a˜ nos ochenta). En 1995 el lenguaje se normaliza con el correspondiente est´ andar ISO. En la actualidad Prolog se ha convertido en una herramienta de desarrollo de software pr´ actica y de gran aceptaci´ on para la que se dispone de m´ ultiples compiladores, tanto comerciales como de libre distribuci´ on. 2

Podr´ an asimismo incluirse comentarios : % El s´ ımbolo % precede los comentarios en una ´ unica l´ ınea /* Los comentarios en varias l´ ıneas empiezan con /* y terminan con */ */ Los programas se pueden escribir mediante cualquier editor de textos. existen editores especiales que facilitan la escritura de programas en Prolog. Para poder trabajar con un programa escrito previamente. Iniciar el sistema Prolog y cargar un programa. basta con utilizar el predicado del sistema consult. evidentemente.2. Esquema general de trabajo en Prolog El esquema general de trabajo en Prolog es el siguiente: 1. ´ este se deber´ a guardar en un fichero (la extensi´ on habitual para los programas en Prolog es “. tendr´ an que adaptarse a la sintaxis espec´ ıfica del lenguaje (´ esta se detalla m´ as adelante). Para realizarla. un programa l´ ogico es un conjunto finito de f´ ormulas l´ ogicas. aunque ofrece menos facilidades en lo que a depuraci´ on se refiere.compile(’c:/Prolog/prueba.pl’]. Como se ha visto en el tema anterior. 3 . Lo anterior es equivalente a escribir simplemente el nombre del fichero entre corchetes: ?. Escribir un programa l´ ogico en Prolog. 2.interpretando el programa por medio del int´ erprete del lenguaje. Lo anterior se puede hacer de dos formas distintas: . con el nombre del fichero que se quiere cargar: ?. un programa en Prolog estar´ a formado por una serie de f´ ormulas l´ ogicas que. .pl’). Esta soluci´ on es la m´ as habitual cuando se est´ a probando un programa. ´ este muestra por pantalla una l´ ınea con el siguiente formato: ?que indica que el sistema est´ a esperando la introducci´ on por parte del usuario de alguna consulta.consult(’c:/Prolog/prueba. como se ver´ a despu´ es.compilando el programa por medio del compilador del lenguaje. es necesario cargar el fichero correspondiente en el sistema Prolog.pl”). aunque. La compilaci´ on de un programa se realiza por medio del predicado del sistema compile: ?. Cuando se inicia un sistema Prolog.[’c:/Prolog/prueba. y la acci´ on se conoce como “consultar” un fichero. Por lo tanto. Una vez escrito un programa. que reflejan el conocimiento del que se dispone acerca del problema a resolver. El c´ odigo compilado es m´ as r´ apido que el c´ odigo interpretado.2.pl’).

3.si se ha detectado alg´ un error sint´ actico en el programa. existen muchas implementaciones del lenguaje Prolog. Tambi´ en puede pulsarse la tecla h para obtener ayuda sobre las distintas opciones disponibles. En estos casos habr´ a que volver a editar el programa para corregir los errores que contiene y volver a cargarlo.En cualquiera de los dos casos. Una vez que se ha cargado correctamente un programa. 4. en la l´ ınea de consultas del sistema. entre ellas la carga de ficheros tanto para ser interpretados como para ser compilados (normalmente. la respuesta del sistema puede ser de dos tipos: . Activar un programa desde el sistema Prolog.en caso contrario. A partir de ese momento. Nota: la mayor´ ıa de los sistemas Prolog ofrecen un entorno de programaci´ on interactivo dotado de men´ us mediante los cuales se ofrecen las acciones m´ as habituales. “File/Consult. tanto comerciales como de libre distribuci´ on. establecer puntos de corte en la ejecuci´ on. Para avanzar en la depuraci´ on.trace. 4 . Su funcionamiento b´ asico es el siguiente: para entrar en modo de depuraci´ on debe escribirse el predicado del sistema trace en la l´ ınea de consultas: ?. el sistema Prolog avisa de ello mediante un mensaje. etc.. En particular. Salir del sistema Prolog.. que indica que el programa se ha cargado correctamente y el sistema est´ a listo para recibir consultas del usuario. on que permite Nota: Los sistemas Prolog suelen incorporar un mecanismo de depuraci´ seguir paso a paso la ejecuci´ on de las consultas. el sistema est´ a preparado para recibir las consultas del usuario relativas al problema que se pretende resolver. 2..3. Para salir del sistema Prolog basta con escribir el predicado del sistema halt en la l´ ınea de comandos: ?. las consultas que se realicen se ejecutar´ an en modo de depuraci´ on.. el sistema responde con la palabra yes. la tecla n permite abandonar el proceso de depuraci´ on.halt. El formato de estas consultas as´ ı como las posibles reacciones del sistema ante ellas se detallan m´ as adelante. La mayor´ ıa de ellas se adaptan al est´ andar ISO. basta con pulsar la tecla RETURN.”). Para una informaci´ on m´ as detallada sobre el mecanismo de depuraci´ on de Prolog se recomienda leer el cap´ ıtulo 8 del libro de Clocksin y Mellish citado en la introducci´ on o consultar el manual de referencia del sistema Prolog que se est´ e utilizando.” y “File/Compile. siguiendo la sintaxis espec´ ıfica del lenguaje. para desactivar el modo de depuraci´ on se utiliza el predicado notrace: ?. mostrando una despu´ es de otra todas las llamadas realizadas internamente por el sistema Prolog. Implementaciones de Prolog Como se ha comentado previamente.notrace. Para ello bastar´ a con escribir dichas consultas. .

entre otras. en caso contrario. Aunque SICStus Prolog se puede usar directamente (activando el ejecutable correspondiente y siguiendo el esquema general de trabajo en Prolog descrito m´ as arriba). lo m´ as recomendable es usarlo a trav´ es del editor de textos GNU Emacs (Emacs es un potente editor de textos. programable y de libre distribuci´ on. no s´ olo se cargar´ a el programa en el sistema sino que adem´ as se abrir´ a una nueva ventana con el sistema SICStus Prolog.. al sistema SICStus Prolog y a su manual de ayuda. mostrar´ a una ventana vac´ ıa en la que se podr´ a escribir el nuevo programa.”. la combinaci´ on de teclas CONTROL-X CONTROL-F. el editor mostrar´ a su contenido en pantalla. Si el fichero abierto en el punto anterior tiene extensi´ on “.. de dominio p´ ublico. el modo de trabajar en SICStus Prolog a trav´ es del editor Emacs ser´ a el siguiente: 1. Iniciar Emacs. Tanto para crear un nuevo programa como para modificar un programa ya existente se usar´ a la opci´ on del men´ u de Emacs “File/Open File.3. Si el nombre facilitado se corresponde con un fichero existente. 2. En esta asignatura (y en este documento) se va a utilizar la implementaci´ on comercial denominada “SICStus Prolog”. una vez instalado dicho interfaz. desarrollado por el Instituto Sueco de Ciencias de la Computaci´ on (SICS).exe”. 5 .por lo que los programas Prolog que se generen de acuerdo con dicho est´ andar podr´ an ejecutarse en cualquiera de estos sistemas. para la cual la URJC dispone de una licencia de Campus. Cargar un programa e iniciar el sistema Prolog. SICStus Prolog SICStus Prolog es un compilador de Prolog comercial. 2. Las entradas de los men´ us “Edit” y “File” (o las combinaciones de teclas asociadas) ofrecen las opciones habituales para editar y guardar (CONTROL-X CONTROL-S) el contenido del fichero. Crear/editar un programa Prolog. denominado SWI-Prolog. o.emacs. El editor Emacs se inicia mediante el ejecutable “runemacs. bibliotecas con las estructuras de datos m´ as habituales. SICStus Prolog incluye en su distribuci´ on un fichero de interfaz con Emacs (. alternativamente. interfaz con el lenguaje C. que permitir´ a realizar las consultas pertinentes. as´ ı como acceso directo desde el editor Emacs a la carga de programas. A continuaci´ on se describe brevemente tanto este sistema como otro sistema Prolog.1. As´ ı.emacs).pl”. 3. que aporta un modo de edici´ on especial para programas en Prolog. las opciones pertinentes para consultar (CONTROL-C CONTROL-F) o compilar el programa correspondiente.org). ubicado en el subdirectorio “bin” del directorio en el que se haya instalado el editor. que puede obtenerse en la URL http://www. Al elegir cualquiera de ellas. Para ello. compatible con el est´ andar ISO-Prolog. con facilidades de depuraci´ on. el interfaz de SICStus Prolog con Emacs a˜ nadir´ a autom´ aticamente a la barra de men´ us de Emacs una nueva entrada bajo el nombre Prolog que incluye. etc. estructuraci´ on modular.

6 . 3. etc) aunque tambi´ en se pueden representar en otras bases no decimales.1. compatible con el est´ andar ISO y disponible para distintas plataformas. El lenguaje Prolog se basa en la Programaci´ on L´ ogica Definida estudiada en el tema anterior.2.1. que se discuten a continuaci´ on. . 12. 1. Constantes Prolog distingue dos tipos de constantes: N´ umeros.12e+3.Tambi´ en es posible acceder desde Emacs al sistema de ayuda de SICStus Prolog: .el men´ u “Help/Manuals/Browse Manuals with Info” permite acceder a los manuales de usuario de SICStus.14) como en notaci´ on exponencial (por ejemplo 4. variables y t´ erminos compuestos. -320.5E6. -0.la opci´ on “Help on Predicate” (CONTROL-C ?) del men´ u contextual “Prolog” antes citado ofrece ayuda sobre los predicados predefinidos de Prolog. 3. Se puede obtener en la direcci´ on http://www. -3. Sintaxis T´ erminos Al igual que en L´ ogica de Primer Orden.Los n´ umeros reales se pueden representar tanto en notaci´ on decimal (por ejemplo 1. . los t´ erminos en Prolog se clasifican en tres categor´ ıas: constantes.La representaci´ on m´ as corriente de los n´ umeros enteros es la notaci´ on decimal habitual (por ejemplo 0.org.0. Este se utiliza de acuerdo con el esquema general de trabajo en Prolog descrito m´ as arriba. tanto sint´ acticas como sem´ anticas. SWI-Prolog SWI-Prolog es un compilador de Prolog de dominio p´ ublico dise˜ nado e implementado en la Universidad de Amsterdam.0e-2). . 3. que se distinguen dependiendo del tipo de L´ ogica utilizada para representar el conocimiento y del mecanismo de demostraci´ on autom´ atica elegido.3.swi-prolog. 2. Este tipo de constantes se utilizan para representar tanto n´ umeros enteros como n´ umeros reales y poder realizar con ellos operaciones aritm´ eticas. 539. existen muchos modelos distintos de programaci´ on l´ ogica. La versi´ on para Windows ´ consta de un u ´nico fichero ejecutable que instala autom´ aticamente el sistema. En ambos casos deber´ a haber siempre por lo menos un d´ ıgito a cada lado del punto. pero con ciertas peculiaridades.1. Prolog y el paradigma de la Programaci´ on L´ ogica Como se ha visto previamente.

Prolog representa las listas teniendo en cuenta su estructura recursiva: . representan individuos concretos. que deben empezar necesariamente por una letra min´ uscula. que se mencionar´ an m´ as adelante. Estos ´ atomos son u ´tiles cuando se necesita trabajar con constantes que empiecen por una letra may´ uscula o por un d´ ıgito. por una serie de t´ erminos separados por comas. se denominan variables an´ onimas. Cadenas no v´ alidas: 1libro. Ejemplos: ’SICStus Prolog’. denominado functor. punto(3. _. libro-blanco. compuestos por combinaciones especiales de signos. Prolog tambi´ en permite escribir ciertos t´ erminos compuestos en forma de operadores. . T´ erminos Compuestos Los t´ erminos compuestos. 7 . libro33a. .´ Atomos . donde los elementos pueden ser cualquier tipo de t´ ermino. no puede haber ning´ un espacio entre el functor y el par´ entesis abierto previo a los argumentos.mayo. _total3.existe adem´ as otro tipo de ´ atomos. que se denota mediante un ´ atomo.Y). y se usan cuando se necesita trabajar con variables cuyos posibles valores no interesan. denominados argumentos. entre par´ entesis. Resultado_1. Este es el caso de los operadores aritm´ eticos predefinidos de Prolog. recta(punto(1. seguido. _ Las variables que empiezan con un s´ ımbolo de subrayado. d´ ıgitos y el s´ ımbolo de subrayado. de uso menos com´ un.Y) o -(X).5)) Nota: al escribir un t´ ermino compuesto. Variables Las variables en Prolog se representan mediante cadenas formadas por letras. Los ´ atomos (no confundir con las f´ ormulas at´ omicas de la LPO) se utilizan para dar nombre a objetos espec´ ıficos. Ejemplos: X. o estructuras. secuencias ordenadas de cero o m´ as elementos. “punto (X. pepe1. pero deben necesariamente empezar por una letra may´ uscula o por un s´ ımbolo de subrayado. Libro. Cadenas v´ alidas: f.2001). El programador tambi´ en puede definir sus propios operadores. Por ejemplo. Uno de los t´ erminos compuestos m´ as importantes y u ´tiles que ofrece Prolog son las listas. Su utilidad se describir´ a m´ as adelante al analizar la construcci´ on de programas y consultas. libro_blanco.2). se construyen mediante un s´ ımbolo de funci´ on. generalmente en notaci´ on infija en el caso de functores de aridad 2 y en notaci´ on prefija o postfija en el caso de functores de aridad 1. y que permiten escribir t´ erminos compuestos de la forma X+Y o -X en lugar de +(X. _hola.cadenas formadas por letras. punto(X.la lista vac´ ıa se representa mediante el ´ atomo []. es decir. ’Libro-blanco’. d´ ıgitos y el s´ ımbolo de subrayado. ’28003 Madrid’. Entrada. Existen tres clases principales de ´ atomos: . _3bis.Y)” no es un t´ ermino compuesto correcto y producir´ a un error de compilaci´ on. Ejemplos: fecha(1.cualquier cadena de caracteres encerrada entre comillas simples.

#NomVar_n) donde NomVar_1. . Obs´ ervese por lo tanto que el lenguaje Prolog no distingue entre s´ ımbolos de predicado. la cabeza y el resto de la lista. 3. la regla “A ← A1 .. andar para describir el uso de Nota: Al trabajar en Prolog se suele aplicar un convenio est´ los predicados (tanto predefinidos como definidos por el programador): en los programas. . las dos listas del ejemplo anterior se representar´ ıan. y se representa mediante un t´ ermino compuesto de aridad 2. . [])))”. Esta u ´ltima notaci´ on es fundamental para poder separar la cabeza del resto de una lista. respectivamente. . se representa como “·(a.. As´ ı. Prolog tambi´ en dispone de otra notaci´ on para las listas.toda lista no vac´ ıa tiene una cabeza (que ser´ a cualquier t´ ermino) y un resto (que ser´ a una lista). el hecho “← A” se escribe en Prolog de la forma “A. cuyo functor es un punto · y cuyos argumentos son. esto es. puesto que todos ellos se representan mediante ´ atomos (el compilador distingue unos de otros dependiendo del contexto en el que aparecen). c]. An . y est´ an por lo tanto compuestos por una serie de cl´ ausulas de Horn positivas. [])”. que sirve para indicar c´ omo debe usarse el argumento correspondiente al realizarse una consulta. . las cl´ ausulas de cada predicado deber´ an ir precedidas de un comentario incluyendo una l´ ınea que describa su uso.. ·(b. Para referirse a un predicado nombre_predicado se suele emplear la notaci´ on nombre_predicado/n. Ejemplos: la lista compuesta por un u ´nico elemento. ·(c. . puede tomar uno de los tres siguientes valores: 8 . Prolog admite tambi´ en una notaci´ on m´ as sencilla que consiste en enumerar entre corchetes todos los elementos de la lista. respectivamente. donde n indica el n´ umero de argumentos del predicado.. Hay que tener en cuenta sin embargo las siguientes diferencias en cuanto a la notaci´ on empleada en la Programaci´ on L´ ogica Definida: Los s´ ımbolos de predicado se denotan mediante a ´tomos. . por lo que no pueden empezar. s´ ımbolos de funci´ on y constantes. la constante a.”. b. as´ ı como una descripci´ on en lenguaje natural de su cometido. Programas Los programas Prolog son programas l´ ogicos definidos. hechos y reglas. separados por comas.”. como [a] y [a. Dado que la notaci´ on anterior puede resultar inc´ omoda a la hora de escribir listas complicadas.A1 . Los hechos deben terminar con un punto y omitir el s´ ımbolo “←” utilizado en Programaci´ on L´ ogica. b y c se corresponde con la estructura “·(a. mediante una letra may´ uscula... Con esta notaci´ on. Su utilidad en la pr´ actica se ver´ a en las clases de problemas. As´ ı.2. como ocurre en Programaci´ on L´ ogica. . La lista compuesta por los elementos a.1.. que consiste en representar la lista con cabeza X y resto Y mediante el t´ ermino [X |Y ]. . Las reglas deben tambi´ en terminar con un punto y sustituir el s´ ımbolo “←” de la Programaci´ on L´ ogica por el s´ ımbolo “:-”. NomVar_n son nombres de variables y el s´ ımbolo #. An ” se escribe en Prolog de la forma “A :. El convenio para describir el uso de un predicado es el siguiente: nombre_predicado(#NomVar_1.. .

es decir: % es_factorial(?X): cierto si X es el factorial de alg´ un n´ umero es_factorial(X) :. En estos casos no es necesario pensar un nombre de variable sino que basta con usar la variable an´ onima “_”. suma(X.s(Z)) :.a]. Ejemplo: Sup´ ongase que.?Y.s(x)*y) ← Factorial(x. la definici´ on anterior se podr´ ıa sustituir por: es_factorial(X) :. 9 . Obs´ ervese que en los ejemplos anteriores las variables X . en la consulta.X). Por lo tanto.X).?Z) % cierto si Z es la suma de X e Y suma(X. debe ser una variable (este tipo de argumentos se corresponden por lo tanto con par´ ametros de salida).0. el predicado predefinido sort/2.s(X)*Y) :. sin importar quien sea ´ este. que sirve para ordenar listas de elementos.pl”): ´ PROGRAMA LOGICO DEFINIDO Factorial(0.v.s(0)).Y.”. pero si se intenta hacer una consulta en la que el primer argumento no est´ e instanciado. ?Lista2). Y y Z aparecen a ambos lados de las respectivas reglas.sort([c.c.?Y) % cierto si Y es el factorial de X factorial(0.sort([c. se necesita definir a partir de ´ el un predicado es_factorial(X) que es cierto si X es el factorial de alg´ un n´ umero natural. se trata de par´ ametros que se pueden usar tanto para entrada como para salida). Existen sin embargo casos en los que una variable aparece s´ olo a un lado de una regla y sus posibles valores no tienen importancia. Por ejemplo. [a.para indicar que el argumento correspondiente no debe estar instanciado en la consulta. instanciado con un t´ ermino no variable (este tipo de argumentos se corresponden por lo tanto con par´ ametros de entrada). Ejemplo: Los programas l´ ogicos para el c´ alculo del factorial y la suma de n´ umeros naturales estudiados en el tema anterior eran programas l´ ogicos definidos.X).a]). . el predicado sort/2 se podr´ a utilizar en consultas de la forma “ ?.s(Y).s(y). es decir.Z).pl” y “suma.” o “ ?. como por ejemplo “?.z).sort(X. se producir´ a un error.x) ← Suma(x.s(0)) ← Factorial(s(x).factorial(X. % suma(?X. indicando as´ ı que para utilizarlo el primer argumento debe estar instanciado (debe ser una lista concreta). dado el predicado factorial.factorial(Y.0. por lo que se pueden convertir f´ acilmente en programas Prolog con s´ olo adaptar su sintaxis de acuerdo con lo establecido m´ as arriba (ficheros “factorial. se describe como sort(+Lista1.y) PROGRAMA PROLOG % factorial(?X.”.v]).s(z)) ← Suma(x. Una forma de definir este predicado ser´ ıa estableciendo que X es un factorial siempre y cuando exista alg´ un Y tal que X sea el factorial de ese Y .v.suma(X. puesto que lo u ´nico que se quiere saber es si X es el factorial de alg´ un n´ umero.factorial(_. factorial(s(X). X).+ para indicar que el argumento correspondiente debe estar. Sin embargo. en este caso el posible valor de la variable Y es indiferente. As´ ı.a]. ? para indicar que el argumento puede estar tanto instanciado como no instanciado (es decir. [c.v.Y). Suma(x.y.

”.3. dicho s´ ımbolo aparece directamente en el sistema Prolog. . .Z). An ” se escribe en Prolog de la forma “?. . s(s(0))). An . .1. As´ ı. . bastar´ ıa con utilizar una variable an´ onima: ?. . presenta ciertas diferencias respecto a esta u ´ltima. An son predicados. que son de la forma “← A1 . s(s(0))). Consultas para la activaci´ on de programas Al estar Prolog basado en la Programaci´ on L´ ogica Definida. las u ´nicas consultas que se pueden realizar para activar un programa Prolog se corresponden con cl´ ausulas de Horn negativas.los s´ ımbolos de variable se escriben empezando por una letra may´ uscula o por un s´ ımbolo de subrayado. Se recuerda que estas cl´ ausulas. . Sin embargo. factorial(s(s(0)). A continuaci´ on se resumen las m´ as importantes: . donde A1 . . . Fact3). . ¿Qu´ e n´ umeros existen tales que su suma sea 2? ?. y el s´ ımbolo “←” de la Programaci´ on L´ ogica debe sustituirse por el s´ ımbolo “?-”. ¿Cu´ ales son los n´ umeros tales que sumados a 1 dan 3? Las consultas anteriores incluyen variables no an´ onimas. En Prolog. X). las consultas deben terminar siempre con un punto. .factorial(s(s(s(0))).A1 . Y. ¿Cu´ anto vale la suma 1+1? ?.Z). . Ejemplo: Dados los programas para el c´ alculo del factorial y para la suma facilitados previamente. 3. p ≥ 0. cl´ ausulas objetivo (cl´ ausulas meta ).suma(s(0). . Existen sin embargo ocasiones en las que las consultas pueden incluir variables an´ onimas. ¿Existe alg´ un n´ umero natural que sea igual al factorial de 0 y al factorial de 2? ¿Cu´ al? ?.suma(s(0). . como se ha comentado antes. _. ∃xp (A1 ∧ . al igual que los s´ ımbolos de funci´ on y las constantes. Resumen Como se acaba de ver. puesto que. aunque se basa en la sintaxis de la Programaci´ on L´ ogica Definida. la sintaxis del lenguaje Prolog. Ejemplo: En la u ´ltima consulta del ejemplo anterior se pretend´ ıa averiguar cu´ al es el n´ umero natural tal que sumado a 1 da 3. la consulta “← A1 . puesto que el objetivo no es s´ olo saber si existen n´ umeros que cumplan lo pedido sino que se desea adem´ as conocer su valor. 10 . Obs´ ervese sin embargo que no ser´ a necesario escribir el s´ ımbolo “?-”. .suma(X.3.4. An ”. ¿Es cierto que el factorial de 2 es 2? ?. . si lo u ´nico que se desea saber es si existe alg´ un n´ umero natural tal que sumado a 1 d´ e 3.1.factorial(s(s(0)). s(s(s(0)))). ∧ An ). ¿Cu´ anto vale el factorial de 3? ?. . . algunas consultas posibles ser´ ıan las siguientes: ?. s(0). s(s(s(0)))). . . esto es. n ≥ 1. Y. se corresponden con la negaci´ on de f´ ormulas ∃x1 .suma(s(0).factorial(0. .los s´ ımbolos de predicado se escriben empezando por una letra min´ uscula.

que devuelve cierto si las dos expresiones que se le pasan resultan ser. A} ∀x1 . ∧ An ) ← A 1 . . An . .f(X. por razones de eficiencia. X = a. Prolog usa el algoritmo de unificaci´ on est´ andar estudiado en el tema anterior pero. ¬An } ¬∃x1 . An A :. .c)) = f(Z.[a.b. que devuelve cierto si el predicado = falla y falso en caso contrario. Z = X ? yes ?. g(Y. . ∃xp (A1 ∧ . no ?. el s´ ımbolo “←” se sustituye por el s´ ımbolo “:-” · en los hechos..las cl´ ausulas de Horn terminan siempre con un punto. . METAS {¬A1 . g(Y. .[c. Ejemplos: ?. . . el s´ ımbolo “←” se sustituye por el s´ ımbolo “?-”.3+5 = 8. . . .c)) = f(Z.d)). no % 3+5 no es m´ as que el t´ ermino compuesto +(3. no suele incluir el test de ocurrencia. .f(X. Adem´ as: · en las reglas. . omitiendo el test de ocurrencia. Aunque la omisi´ on de este test puede llevar a la obtenci´ on de resultados err´ oneos.5) 11 . que se pueden usar en notaci´ on infija: . · en las cl´ ausulas objetivo. An .c)). La siguiente tabla resume las distintas notaciones para cl´ ausulas de Horn vistas hasta el momento: ´ NOTACION clausular l´ ogica est´ andar prog. An ?. unificables. g(b. Prolog permite al programador la utilizaci´ on directa de su algoritmo de unificaci´ on mediante los dos siguientes predicados predefinidos. . .[c.A1 . . g(b. .A1 .d]] = [X|Y]. . . . 3. el s´ ımbolo “←” desaparece. HECHOS {A} ∀x1 . . ∀xp (A) A← A. Y = [b. ∧ An ) → A] A ← A 1 . . .el predicado \=. . pero implementado de acuerdo con las siguientes pautas: Unificaci´ on. . Y = b. l´ ogica Prolog REGLAS {¬A1 . . . . .d]] ? yes ?. ∀xp [(A1 ∧ . .2.el predicado =. esto ocurre raramente. . ¬An . . . . Sem´ antica El mecanismo de demostraci´ on autom´ atica utilizado por Prolog es el sistema de Resoluci´ on SLD estudiado en el tema anterior. .

por lo que es necesario interrumpir la ejecuci´ on de la consulta mediante CONTROL-C (si se est´ a usando SICStus Prolog a trav´ es de Emacs. ?. cuando. se realiza una consulta.unify_with_occurs_check(X. En SICStus Prolog este predicado se denomina unify_with_occurs_check. Una vez interrumpida la ejecuci´ on. el sistema muestra por pantalla el mensaje: Prolog interruption (h for help)? y acepta a continuaci´ on una letra que determine la acci´ on a seguir. Algunos sistemas. esto es. . incorporan un predicado predefinido especial que permite unificar con test de ocurrencia. las posibles respuestas del sistema ante una consulta son las siguientes: Si todas las ramas del ´ arbol SLD son ramas fallo. la respuesta del sistema ser´ a “no”.X = f(X). el sistema muestra por pantalla los valores de las variables que se corresponden con la primera rama ´ exito encontrada al buscar en profundidad en el ´ arbol de Resoluci´ on. Otros. como por ejemplo SWI-Prolog. termin´ andose as´ ı la ejecuci´ on de la consulta.f(X)). cuando el ´ arbol de Resoluci´ on tiene por lo menos una rama ´ exito m´ as a la izquierda que cualquier posible rama infinita): . Estrategia de b´ usqueda : b´ usqueda en profundidad (se recuerda que esta estrategia es muy eficiente pero tiene el inconveniente de que no es completa.. Si el ´ arbol SLD tiene alguna rama infinita m´ as a la izquierda que cualquier posible rama ´ exito. y queda a la espera de nuevas instrucciones por parte del usuario: 12 .Si la consulta realizada tiene alguna variable no an´ onima. puede conducir a una computaci´ on infinita a´ un en el caso de que exista una soluci´ on). En otro caso (es decir. cuya acci´ on asociada es abortar la ejecuci´ on de la consulta. Prolog construye el ´ arbol de Resoluci´ on SLD correspondiente. una vez cargado un programa l´ ogico.. Elige las cl´ ausulas de acuerdo con el orden en el que ´ estas aparecen en el programa. como por ejemplo SICStus Prolog. haciendo un recorrido en profundidad.Si la consulta realizada no tiene variables (o las que tiene son an´ onimas). la respuesta del sistema ser´ a “yes”. aunque lo m´ as habitual ser´ a contestar con la letra a. As´ ı.)))))))))) ? yes % no se realiza el test de ocurrencia Nota: algunas implementaciones de Prolog. presentan un mensaje de error. la composici´ on de teclas CONTROL-C deber´ a efectuarse dos veces seguidas). como es el caso de SICStus Prolog. X = f(f(f(f(f(f(f(f(f(f(. Las posibles acciones se pueden consultar pulsando la tecla h. no % s´ ı se realiza el test de ocurrencia Funci´ on de selecci´ on. Por lo tanto. Selecciona siempre el literal m´ as a la izquierda. Regla de ordenaci´ on. no responden. la reacci´ on del sistema depender´ a de la implementaci´ on concreta de Prolog que se est´ e utilizando. de acuerdo con la funci´ on de selecci´ on y la regla de ordenaci´ on citadas.?.

Y) :. Y). ?Y): cierto si X es un ancestro de Y % VERSI´ ON 1 ancestro1(X. Y) :. Y).progenitor(X. adem´ as de un preEjemplo: Consid´ dicado progenitor(X. Y) :. computaci´ on infinita si encuentra una rama infinita o valor de las variables correspondientes en caso de encontrarse otra soluci´ on). Z).pl”). si se intenta averiguar de qui´ en es ancestro pepa.progenitor(X. Z). Por ejemplo. Y) :. % progenitor(?X. ancestro2(Z. resulta claro que tanto el orden en el que aparecen las cl´ ausulas en los programas como el orden de los literales dentro de las cl´ ausulas pueden influir no s´ olo en el orden en el que aparecen las soluciones sino tambi´ en en la terminaci´ on de las consultas que se realizan.· si se introduce un retorno de carro. Y) :. progenitor(X.Y) que es cierto cuando X es progenitor de Y . pepin). con lo que el proceso se vuelve a repetir. ?Y): cierto si X es progenitor de Y progenitor(pepa. Y). progenitor(X. Y).progenitor(X. Y). ancestro1(X. que incluye. progenitor(pepito. Y). dependiendo la respuesta del resultado de la b´ usqueda (“no” si termina de recorrer el ´ arbol sin encontrar ninguna nueva soluci´ on ni ninguna rama infinita. el sistema contesta “yes” y abandona la b´ usqueda de posibles nuevas soluciones. Z). resulta lo siguiente (compru´ ebense estos resultados mediante la construcci´ on de los ´ arboles de resoluci´ on SLD correspondientes): 13 . ancestro4(X.progenitor(X.progenitor(X. % VERSI´ ON 4 ancestro4(X.ancestro4(Z. Y). · si se introduce un punto y coma seguido de un retorno de carro. pepito). Y) :. cuatro versiones distintas del predicado ancestro(X. % VERSI´ ON 3 ancestro3(X. erese el siguiente programa (“ancestros. ancestro3(X. Z). su comportamiento en Prolog es distinto. Y) :. % VERSI´ ON 2 ancestro2(X. ya que dar´ an lugar a ´ arboles de Resoluci´ on distintos. Las cuatro versiones var´ ıan dependiendo del orden de sus cl´ ausulas y del orden en el que se colocan los literales dentro de ellas.ancestro3(Z. Como ya se coment´ o en el tema anterior.Y). cierto cuando X es un ancestro de Y . Y). el sistema continua la b´ usqueda de nuevas soluciones en el ´ arbol de Resoluci´ on. ancestro2(X. Y) :. Aunque las cuatro definiciones anteriores del predicado ancestro son iguales desde el punto de vista l´ ogico.progenitor(X. ancestro1(Z. % ancestro(?X.

Colocar las cl´ ausulas que expresan las condiciones de parada de la recursividad antes que las otras (esto se cumple en las versiones 1 y 3 del ejemplo anterior). D = pepin ? . en el mismo orden que “ancestro1”. es decir. % el sistema entra en un bucle. pero si se piden m´ as soluciones la consulta no termina. D = pepin ? . que se interrumpe con CTRL-C CTRL-C Prolog interruption (h for help)? a {Execution aborted} Aunque no existe ninguna regla general que establezca el orden ´ optimo de las cl´ ausulas ni el orden ´ optimo de los literales dentro de ellas.ancestro3(pepa. D = pepito ? . ?. 2.ancestro2(pepa. D = pepito ? . Evitar las reglas con recursi´ on a la izquierda. ?. no Consulta con “ancestro3”: ofrece las dos posibles soluciones. % el sistema entra en un bucle. s´ ı suelen ser recomendables los siguientes principios b´ asicos. no Consulta con “ancestro2”: ofrece las dos posibles soluciones (en orden inverso al caso anterior) y termina.Consulta con “ancestro1”: ofrece las dos posibles soluciones y termina. basados en la idea de “hacer antes lo m´ as sencillo”: 1. porque entra directamente en una rama infinita. las reglas tales que el primer literal de su cuerpo es una llamada recursiva al mismo predicado de la cabeza de la regla (las versiones 3 y 4 del ejemplo anterior presentan recursi´ on a la izquierda). De las cuatro versiones del ejemplo anterior. la u ´nica que cumple estas dos recomendaciones es la primera. D). Es por otro lado necesario evitar definiciones circulares del estilo: 14 . D).ancestro4(pepa. ?. D). que se interrumpe con CTRL-C CTRL-C Prolog interruption (h for help)? a {Execution aborted} Consulta con “ancestro4”: no produce ninguna soluci´ on. D). ?.ancestro1(pepa. D = pepin ? . D = pepito ? .

las facilidades descritas no son suficientes para obtener un lenguaje de programaci´ on u ´til en la pr´ actica: por ejemplo.3+5 = 8. la respuesta de Prolog ser´ ıa no.B) :. puesto que “+” no es un predicado.3+5. 4. Sin embargo. Por ejemplo.X). 4. Aritm´ etica Operadores aritm´ eticos Prolog tiene predefinidos los operadores aritm´ eticos m´ as habituales. puesto que cualquier consulta a uno de los dos predicados anteriores provocar´ a necesariamente un bucle infinito. la expresi´ on 3+5 no es m´ as que el t´ ermino compuesto +(3. 15 . dado que el t´ ermino compuesto +(3. Para poder evaluar expresiones aritm´ eticas en Prolog hay que utilizar los predicados aritm´ eticos que se describen a continuaci´ on. A continuaci´ on se enumeran algunos de los m´ as importantes: X+Y X-Y X*Y X/Y X//Y X mod Y abs(X) sqrt(X) log(X) suma de X e Y X menos Y producto de X por Y cociente real de la divisi´ on de X por Y cociente entero de la divisi´ on de X por Y resto de la divisi´ on entera de X por Y valor absoluto de X ra´ ız cuadrada de X logaritmo neperiano de X T´ engase en cuenta que los operadores anteriores permiten simplemente construir expresiones aritm´ eticas. Estos predicados no pueden ser redefinidos por el programador.”.hijo(Y. no es posible hacer consultas del estilo “ ?.progenitor(B. Predicados Predefinidos En el apartado anterior se ha resumido el funcionamiento del lenguaje Prolog desde el punto de vista del paradigma de la Programaci´ on L´ ogica. 4. pero ´ estas no son m´ as que estructuras (t´ erminos compuestos) que no representan ning´ un valor.progenitor(X.”. En lo que sigue se describen s´ olo algunos de estos predicados predefinidos.Y) :. ciertos predicados para entrada/salida y el predicado de control denominado corte.5) no es unificable con el t´ ermino constante 8. mediante los que se pueden formar expresiones aritm´ eticas.1. y si se hiciese la consulta “ ?.1.5) escrito en notaci´ on infija. el lenguaje Prolog incorpora toda una serie de predicados del sistema o predicados predefinidos (“system or built-in predicates”) que ofrecen al usuario facilidades como las citadas as´ ı como otro tipo de funcionalidades extra-l´ ogicas o meta-l´ ogicas. en concreto los relacionados con la realizaci´ on de operaciones aritm´ eticas.1. As´ ı.A). Para ello. hijo(A. todo lenguaje de programaci´ on “real” necesita facilidades para leer y/o escribir o mecanismos eficientes para realizar operaciones aritm´ eticas.

found a} b ) cuando la parte derecha es una expresi´ on aritm´ etica pero no se puede evaluar: ?. X X X X X X =:= Y =\= Y < Y =< Y > Y >= Y cierto cierto cierto cierto cierto cierto si si si si si si los valores num´ ericos de X e Y son iguales los valores num´ ericos de X e Y son distintos el valor num´ erico de X es menor que el de Y el valor num´ erico de X es menor o igual que el de Y el valor num´ erico de X es mayor que el de Y el valor num´ erico de X es mayor o igual que el de Y El funcionamiento de estos predicados es similar al del predicado “is”: producir´ an un error en caso de que alguno de los dos argumentos no sea una expresi´ on aritm´ etica o.5 is 2+3. El m´ as habitual es el predicado predefinido “is”. A la hora de usar este predicado hay que tener en cuenta las siguientes consideraciones: 1.0 ? yes ?. yes ?. resultante de evaluar la parte derecha. {INSTANTIATION ERROR: _157 is 4*_155 . que se usa en notaci´ on infija de la siguiente forma: X is Y Si Y es una expresi´ on aritm´ etica. el resultado del predicado depender´ a de si la parte izquierda unifica o no con el resultado obtenido al evaluar la parte derecha: ?.5)) no es unificable con el entero 8.arg 2} 2. Predicados aritm´ eticos Los predicados aritm´ eticos predefinidos de Prolog se utilizan para evaluar expresiones aritm´ eticas. X = 2. que se escribe al rev´ es de lo que suele ser normal en otros lenguajes de programaci´ on (<=). aunque en algunos casos con una notaci´ on distinta a la habitual: obs´ ervense en particular los s´ ımbolos para la igualdad/desigualdad (que no pueden ser los habituales = y \= puesto que ´ estos se utilizan para la unificaci´ on) y la comparaci´ on menor o igual.X is sqrt(4).1. Y is X+1. Prolog incorpora otros predicados comunes para comparaciones aritm´ eticas. Su uso puede dar lugar a un error en los dos siguientes casos: a ) cuando la parte derecha no es una expresi´ on aritm´ etica: ?.2. ´ esta se eval´ ua y el resultado se intenta unificar con X. {DOMAIN ERROR: _157 is a+1 .3+5 is 3+5.X is 4*Z. Salvo en los casos anteriores.X is 5.4. a pesar de 16 . Adem´ as del predicado anterior.X is a+1. X = 5. Y = 6 ? yes ?.arg 2: expected expression. no La respuesta negativa obtenida en el u ´ltimo ejemplo se debe a que la expresi´ on “3+5” de la parte izquierda (recu´ erdese que se trata simplemente del t´ ermino compuesto +(3.

. requiere que su parte derecha est´ e instanciada. si se desease disponer de un predicado para sumar n´ umeros naturales.1.1.?Z): cierto si Z es la suma de X e Y suma(X.ya que cualquiera de sus argumentos puede usarse tanto de entrada como de salida (v´ eanse los ejemplos de consultas dados en el apartado 3. inc´ omodos de utilizar en la pr´ actica y poco eficientes. Su incomodidad proviene del hecho de que los n´ umeros naturales se deben manipular mediante la funci´ on sucesor. como por ejemplo los programas para el c´ alculo de la suma y el factorial de n´ umeros naturales.. como se vio antes.serlo.3 =\= 3*a. Una alternativa evidente para mejorar la comodidad y la eficiencia de estos programas es reemplazarlos por otros que hagan uso de las facilidades aritm´ eticas ofrecidas por Prolog. no ?. . por un lado.1. Programas aritm´ eticos en Prolog En el tema anterior. utilizando simplemente el predicado de evaluaci´ on is: % suma(+X. s´ olo se puede usar cuando sus dos primeros argumentos est´ an instanciados: si se intenta usar de otra forma se producir´ a un error. bastar´ ıa con definirlo como sigue. 17 . . programas sencillos y vers´ atiles. En efecto.X+3 < sqrt(4).Z is X+Y. a diferencia del anterior. . 4. el sistema eval´ ua las dos expresiones aritm´ eticas y devuelve el resultado de la comparaci´ on solicitada. As´ ı. ERROR: . Esta versi´ on del predicado suma es claramente mucho m´ as c´ omoda (permite utilizar directamente n´ umeros naturales en notaci´ on decimal) y mucho m´ as eficiente (utiliza la potencia de c´ alculo aritm´ etico del ordenador).Y.Son tambi´ en.. y tienen dos caracter´ ısticas principales: . como se puede ver en el comentario previo a la definici´ on del nuevo predicado. sin embargo. En caso contrario. y la ineficiencia se debe al c´ alculo recursivo utilizado para resolver operaciones aritm´ eticas elementales.1+ 5 > abs(-8). Se trataba en ambos casos de programas l´ ogicos definidos. Los programas aritm´ eticos del estilo de los anteriores se pueden considerar programas l´ ogicos puros. por lo que basta con adaptar su sintaxis para obtener los correspondientes programas en Prolog (v´ ease el apartado 3.3). ´ este. Tiene sin embargo la desventaja respecto a la versi´ on l´ ogica pura de que pierde la versatilidad de ´ esta. ?.3.Z) :. ?. que. tanto en lo que se refiere al uso de sus constantes num´ ericas como al uso de los operadores y predicados aritm´ eticos mencionados m´ as arriba. Recu´ erdese en particular c´ omo pueden utilizarse para varios cometidos distintos -por ejemplo el programa de la suma tambi´ en sirve para restar.+Y. se estudiaron varios programas l´ ogicos aritm´ eticos. relativo a la Programaci´ on L´ ogica general. puesto que est´ an definidos utilizando exclusivamente propiedades l´ ogicas.. yes ?. Esto es debido a la utilizaci´ on en el cuerpo de la regla del predicado predefinido is.Son.3+5 =:= 8. ERROR: . no se pueda evaluar.2 de este documento).

1). Esta restricci´ on no s´ olo afecta al uso directo del predicado. A continuaci´ on se describen algunos de los predicados de entrada/salida m´ as b´ asicos: open(+NombreFichero. la comprobaci´ on X>0. Entrada/Salida El lenguaje Prolog ofrece toda una serie de predicados predefinidos para la realizaci´ on de operaciones de entrada/salida. apertura/cierre de un fichero. 18 .2. abre el fichero correspondiente de acuerdo con el modo especificado por Modo. las operaciones de escritura se realizar´ an al final del fichero). close(+Fichero) Cierra el fichero asociado con el identificador Fichero. el predicado es v´ alido para calcular factoriales.1.De forma similar. Los valores para el argumento Modo pueden ser: read para abrir el fichero en modo lectura. a partir de la versi´ on l´ ogica del predicado factorial ya no podr´ a definirse utilizando esta nueva versi´ on. set_input(+Fichero) set_output(+Fichero) Convierte al fichero con identificador Fichero en el fichero de lectura (escritura) actual. su contenido se perder´ a). +Modo. el predicado es_factorial que se describi´ o en el apartado 2. Se trata de predicados que no tienen sentido desde un punto de vista puramente l´ ogico. Obs´ ervese asimismo que en la nueva versi´ on se ha introducido. -Fichero) Si NombreFichero es un nombre de fichero v´ alido. lo crea. etc). sino tambi´ en a su capacidad para ser usado en la definici´ on de otros: por ejemplo. lo crea. FactX1). si ya existe. factorial(0. ?Y): cierto si Y es el factorial de X. pero no sirve ya para averiguar si un n´ umero es o no el factorial de alg´ un otro n´ umero. el predicado anterior s´ olo se podr´ a usar cuando el primer argumento est´ e instanciado. es decir. 4. si ya existe. append para abrir el fichero en modo escritura (si el fichero no existe. factorial(X. Y) :X >0. necesaria si se quiere evitar que se produzca una rama infinita en el ´ arbol de Resoluci´ on SLD correspondiente (constr´ uyanse como ejercicio los ´ arboles de Resoluci´ on asociados a una consulta concreta con y sin la comprobaci´ on anterior). sino que producen un efecto colateral (escritura/lectura de alg´ un termino. y unifica con Fichero el identificador del fichero abierto. Por el mismo motivo que antes. factorial(X1. una definici´ on m´ as eficiente -aunque menos elegante.del predicado factorial ser´ ıa la siguiente: % factorial(+X.2. antes de la llamada recursiva. X1 is X-1. Y is X*FactX1. current_input(?Fichero) current_output(?Fichero) Fichero es el fichero de lectura (escritura) actual. write para abrir el fichero en modo escritura (si el fichero no existe.

cuyo identificador es user. nl nl(+Fichero) Escribe un retorno de carro en el fichero de escritura actual o en el fichero especificado (previamente abierto en modo escritura). ?Termino) Lee el siguiente t´ ermino (del fichero de lectura actual o del fichero especificado. [C|R]) :write(Fichero. write(’El cuadrado de ’). write(X2). imprime_lista(Fichero. % escribe los elementos de L en el fichero. 19 . % escribe_cuadrado(+X) % escribe el cuadrado de X en el fichero de escritura actual escribe_cuadrado(X) :X2 is X*X. +L) % Si Fichero es un identificador de fichero y L es una lista. % imprime_lista(+Fichero. ?Termino) Escribe el t´ ermino Termino en el fichero de escritura actual o en el fichero especificado (previamente abierto en modo escritura). El t´ ermino debe acabar con un punto y un retorno de carro.pl”): % pide_numero(-X) % X es un n´ umero le´ ıdo del fichero de lectura actual pide_numero(X) :write(’Introduzca un n´ umero: ’). read(?Termino) read(+Fichero. Ejemplos: Se incluyen a continuaci´ on algunos ejemplos t´ ıpicos de predicados que realizan operaciones de entrada/salida (fichero “entrada-salida. escribe_cuadrado(X).Nota: el fichero por defecto. es la pantalla. uno por l´ ınea imprime_lista(_Fichero. nl(Fichero). previamente abierto en modo lectura) y unifica el resultado con Termino. tanto para lectura como para escritura. R). write(’ es ’). C). % pide un n´ umero y escribe su cuadrado por pantalla cuadrado :pide_numero(X). nl. write(X). imprime_lista(Fichero. []). read(X). write(?Termino) write(+Fichero.

L). imprime por pantalla sus elementos. read(Lista). Control: el corte Los predicados de control son predicados predefinidos que permiten al programador intervenir en el mecanismo de b´ usqueda de soluciones de Prolog. uno por l´ ınea imprime_lista(L) :imprime_lista(user.a] en el fichero “prueba.cuadrado.una.o.l.prueba_fich. % user es el identificador de la pantalla % pide una lista y la imprime en un fichero prueba_fich :write(’Introduzca una lista: ’). la lista se ha escrito en el fichero prueba. El cuadrado de 3 es 9 yes ?.a]. Introduzca una lista: |: [h. esto es una lista yes ?. imprime_lista(Prueba. 4.txt”.txt yes La ejecuci´ on de este u ´ltimo predicado tiene como efecto colateral la escritura de los elementos de la lista [h. A continuaci´ on se reproduce la ejecuci´ on de algunos de los predicados anteriores: ?. open(’prueba.o. Prueba). el denominado predicado de corte.l. Lista). write.imprime_lista([esto.txt’). 20 .% imprime_lista(+L) % Si L es una lista. write(’la lista se ha escrito en el fichero prueba. Introduzca un n´ umero: |: 3. nl.3. En este apartado se va a introducir exclusivamente uno de ellos.lista]).txt’.es. close(Prueba).

3... c. Se puede incluir. y cuya evaluaci´ on es siempre cierta. La siguiente figura ilustra lo anterior.”. Los cortes permiten al programador intervenir en el control del programa.. En estos casos ocurre lo siguiente (siendo N el nodo anterior): 1. . b.  ¢¡ £¥¤§¦ ¨ ©¨   ¨ © £ ¤ ©¨   ¨ ©   Ejemplo.. c. a :.1. como un predicado m´ as. e :.”. d :.. !.. puesto que su presencia hace que el sistema ignore ciertas ramas del a ´rbol SLD correspondiente. no tiene argumentos. Tanto para cada uno de los nodos ascendientes de N que contengan el corte como para el primer ascendiente que no lo contiene (sea N’ dicho nodo) se ignoran todas sus posibles ramas situadas m´ as a la derecha de la rama que lleva a N. es decir. en el cuerpo de las reglas o en las consultas (por ejemplo a :. En concreto. que ser´ a igual a N pero sin el corte.4.!. ser´ a de la forma “?. e. d.).. es decir.a1. b :. por lo que el nodo N tendr´ a un u ´nico hijo..b.an. 21 b :. Las ramas tachadas con una raya son aquellas que se ignoran como consecuencia del corte. El predicado de corte siempre se eval´ ua como cierto. La expansi´ on de este nodo se realiza igual que la expansi´ on de cualquier otro nodo del ´ arbol. un nodo de la forma “?.. 2.. el efecto de los cortes en la construcci´ on y recorrido de los ´ arboles de resoluci´ on SLD se produce cuando el sistema llega a un nodo del ´ arbol cuyo primer predicado es un corte.a1..... !.an. Definici´ on y propiedades El corte es un predicado predefinido que se denota mediante un punto de exclamaci´ on (!).d...b. Consid´ erese el programa Prolog dado por las siguientes cl´ ausulas: a :.. d......

an” se produce por lo tanto cuando el sistema llega a la evaluaci´ on del corte... El predicado de corte tiene dos ventajas fundamentales: Su utilidad b´ asica. evitando la exploraci´ on de partes del ´ arbol de resoluci´ on de las que se sabe de antemano que no conducir´ an a ninguna nueva soluci´ on.. Tampoco se considerar´ an otras alternativas para el predicado responsable de la introducci´ on del corte (en el ejemplo anterior. es mejorar la eficiencia de los programas. elimin´ andose cualquier alternativa.  ¢¡¤£¤¥  ¦¡¨§©¤¥  ¢¡¥¥¥¥  ¦¡¤¤©©¤© ¥  ¢¡¤ ¥  ¦¡¨¥¥¥¥©¤¥  ¢¡!©¤© ¥  ¢¡"¥¥¥©©¤©¤¥  ¢¡#¤©¤¥ El efecto de la existencia de una regla de la forma “a:-a1. no se consideran nuevas alternativas para el objetivo d). dado que reduce el espacio de b´ usqueda de soluciones. En concreto: En el momento de evaluar el corte.La figura incluida a continuaci´ on muestra el ´ arbol de Resoluci´ on SLD resultante al realizarse la consulta ?-a...ai.. Las ramas tachadas son las que se deben ignorar debido al corte.ai. el predicado b).. 22 .. el sistema ya ha encontrado soluciones para los objetivos a1.!. y consiste en hacer que todas las opciones tomadas desde el momento en el que aparece la cl´ ausula objetivo conteniendo un corte (incluida la decisi´ on que lleva a la consideraci´ on de esta cl´ ausula) hasta la evaluaci´ on del corte sean obligatorias. y no se considerar´ an otras alternativas para ninguno de ellos (en el ejemplo anterior..

se cumplen las condiciones bi y ci . bn. Ejemplos Aunque el predicado de corte tiene usos muy variados (en general. en el momento en que se compruebe que se verifica una cierta condici´ on bi. el predicado de corte de Prolog constituye una herramienta de car´ acter extral´ ogico. a :a :b1. que preconiza una separaci´ on n´ ıtida entre la l´ ogica del problema (responsabilidad del programador) y la forma de resolverlo (responsabilidad del mecanismo de demostraci´ on autom´ atica).pl”).Por otro lado.. donde cada regla expresa una de las posibles formas de calcular el predicado: la regla i-´ esima expresa que el predicado es cierto si no se cumple ninguna de las condiciones b1 . A continuaci´ on se describe el uso del corte mediante su aplicaci´ on a varios ejemplos (todos ellos contenidos en el fichero “corte... en combinaci´ on con otros predicados predefinidos de Prolog) uno de los m´ as habituales es la simulaci´ on de estructuras condicionales de la forma: si b1 entonces c1 . En definitiva. b2. el corte es un predicado muy controvertido.. As´ ı. De esta forma se consigue que.. aporta nuevas construcciones de gran utilidad. si no: si bn . no se intente aplicar ninguna regla posterior. su uso entra en clara contradicci´ on con los principios b´ asicos de la programaci´ on l´ ogica pura. c2. Su representaci´ on utilizando el corte es la siguiente: a :a :.. este tipo de estructuras. !. como por ejemplo la negaci´ on por fallo finito. Usos del corte. . 23 . y puede provocar muchos errores de programaci´ on. cn. 4.3... muy potente pero que debe usarse con mucho cuidado y en casos muy concretos. si no: si b2 .. adem´ as. !.2. Al tratarse de una herramienta de control (interviene en c´ omo se debe resolver el problema). Sin embargo. . si no: c. c1. el corte tambi´ en permite aumentar la expresividad del lenguaje: su uso. c. entonces cn . bi−1 anteriores y. entonces c2 . normalmente en combinaci´ on con otros predicados predefinidos. se representan mediante un predicado definido por medio de n + 1 reglas. !. el corte puede conducir a programas l´ ogicos dif´ ıciles de leer y de validar. El corte permite simplificar la representaci´ on anterior y conseguir un uso m´ as eficiente de este tipo de estructuras. En Prolog. con condiciones mutuamente excluyentes.

Por lo tanto. una vez que se ha encontrado una soluci´ on con una de ellas no tiene sentido probar con el resto. La respuesta de Prolog ser´ a “no”. si x ≤ 10 si 10 < x ≤ 20 si x > 20 Una primera aproximaci´ on para la resoluci´ on del problema anterior es definir un predicado f(X.f(0. mediante las tres siguientes reglas: f(X. cierto si Y es igual a f un(X ).1) :.0) :. Obs´ ervese que una forma m´ as c´ omoda para representar esta nueva versi´ on consistir´ ıa en.Y) :. gracias a la introducci´ on del corte en la primera regla.X =< 10. !. Z>1. 24 .Ejemplo 1: c´ alculo de una funci´ on Sup´ ongase que se necesita definir un predicado en Prolog que permita calcular la siguiente funci´ on f un:   0.Z). f(X.Y) :. Y=1. La representaci´ on anterior calcula correctamente los valores de la funci´ on f un. pero para llegar a dicha conclusi´ on el sistema tiene que recorrer las 3 posibles ramas del ´ arbol de Resoluci´ on SLD correspondiente (dib´ ujese como ejercicio dicho ´ arbol). una forma de remediar la ineficiencia anterior es utilizando el predicado de corte como se ha indicado al principio de este apartado: f(X.2). Z>1.” ser´ a tambi´ en “no”. f(X. la respuesta de Prolog a la consulta “?. f(X. si no: si X ≤ 20. f un(x) =  2. f(_X. Sup´ ongase que se realiza la consulta “?.Y).X =< 10. la funci´ on que se est´ a calculando tiene la siguiente estructura condicional: si X ≤ 10 entonces Y = 0.X =< 20. pero tiene el siguiente inconveniente. realizar la unificaci´ on directamente en la cabeza de las reglas: f(X. Con esta nueva versi´ on.X =< 20. puesto que.1) :.X =< 10. X =< 20. Lo anterior es poco eficiente.f(0. !. al igual que en la primera versi´ on. En efecto. 1. al ser las tres reglas que describen el predicado f mutuamente excluyentes.X>10.2) :. entonces Y = 1.X > 20. el sistema s´ olo tendr´ a que explorar la primera rama del ´ arbol SLD. f(_X.0) :.2). Y=0.Z). pero ahora. !. !.”. f(X. si no: Y = 2.

!. [C|_]).Y).Z) :. Ejemplo 3: pertenencia de un elemento a una lista La forma m´ as inmediata para representar en Prolog la pertenencia de un elemento a una lista es la siguiente: pertenece(C.Sin embargo. Ejemplo 2: c´ alculo del m´ aximo de dos n´ umeros El procedimiento para calcular el m´ aximo de dos n´ umeros naturales se puede implementar en Prolog mediante un predicado maximo(X. Al igual que en el ejemplo anterior. hay que destacar que esta u ´ltima versi´ on. a pesar de ser m´ as c´ omoda de escribir.f(0.” ser´ ıa afirmativa. [_|R]) :. porque con ciertas consultas puede dar lugar a resultados err´ oneos: por ejemplo. cierto si Z es el m´ aximo de X e Y. una primera versi´ on para dicho predicado podr´ ıa ser la siguiente: maximo(X.Y).Z). !. porque no funciona adecuadamente para ciertos usos del predicado: resuelve correctamente consultas de la forma “?.0).Y. similar a lo que se coment´ o en el ejemplo anterior.Y.Y.R).”. As´ ı.X < Y.” es afirmativa.Y.X >= Y.Z). pertenece(C. una forma m´ as c´ omoda y eficiente de expresar lo anterior es utilizando el corte: maximo(X.2).X >= Y. es modificar la versi´ on anterior de forma que la unificaci´ on se realice directamente en la cabeza de las cl´ ausulas: maximo(X.f(5.Y) :.pertenece(C. Dado que las dos opciones son mutuamente excluyentes. resulta que esta u ´ltima versi´ on no puede usarse de cualquier forma. por lo que si un elemento aparece varias veces en una lista. maximo(X. la respuesta del sistema ante la consulta “?.Y. cuando deber´ ıa ser evidentemente negativa. Otra posibilidad. Este problema no se da en las versiones anteriores.X) :. 25 .X >= Y.0. En la definici´ on anterior.X) :. Z=X. cuando deber´ ıa ser evidentemente negativa. maximo(_X. el predicado encontrar´ a todas sus posibles ocurrencias.Y. maximo(_X. tiene el inconveniente de que no siempre es correcta.Y. pero sin embargo no siempre funciona con consultas en las que ambos argumentos est´ an instanciados: por ejemplo. las dos opciones no se consideran excluyentes. la respuesta del sistema ante la consulta “?-maximo(3. Al igual que en el ejemplo anterior.

de forma que el predicado termine en el momento de encontrar la primera ocurrencia de un cierto elemento: pertenece(C.[a. la introducci´ on del corte y la consiguiente poda del ´ arbol de Resoluci´ on SLD hace que el predicado ya no se pueda usar. Por ejemplo. no 26 .[a.b.b.pertenece(X.el predicado anterior podr´ a utilizarse no s´ olo para averiguar si un elemento pertenece a una lista determinada sino tambi´ en para recorrer todos los elementos de una lista. X = a ? .c]).!. la respuesta del sistema ante la consulta “pertenece(X. [_|R]) :.pertenece(C.R). X = b ? .b.” es la siguiente (compru´ ebese construyendo el ´ arbol de resoluci´ on SLD correspondiente). ahora se tendr´ a (compru´ ebese construyendo el ´ arbol de resoluci´ on SLD correspondiente): ?. Sin embargo.c]). X = a ? . En efecto. no Una versi´ on m´ as eficiente del predicado anterior se consigue introduciendo un corte en el cuerpo de la primera regla. ?. como con la versi´ on anterior.c]). [C|_]) :. X = c ? . para enumerar todos los elementos de una lista. Con esto se consigue una versi´ on determinista y m´ as eficiente del predicado.[a.pertenece(X. pertenece(C.