´ 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

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

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

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

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

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

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

s(x)*y) ← Factorial(x. puesto que lo u ´nico que se quiere saber es si X es el factorial de alg´ un n´ umero.s(0)). Sin embargo. instanciado con un t´ ermino no variable (este tipo de argumentos se corresponden por lo tanto con par´ ametros de entrada).X).z).sort(X. Suma(x. As´ ı. Por ejemplo.sort([c.X).Y.y.x) ← Suma(x.factorial(Y.0.0. dado el predicado factorial.s(Z)) :. X). es decir. indicando as´ ı que para utilizarlo el primer argumento debe estar instanciado (debe ser una lista concreta). % suma(?X. se trata de par´ ametros que se pueden usar tanto para entrada como para salida).Z). el predicado sort/2 se podr´ a utilizar en consultas de la forma “ ?.”.pl”): ´ PROGRAMA LOGICO DEFINIDO Factorial(0.v. 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. Y y Z aparecen a ambos lados de las respectivas reglas.pl” y “suma. debe ser una variable (este tipo de argumentos se corresponden por lo tanto con par´ ametros de salida).sort([c.+ para indicar que el argumento correspondiente debe estar. En estos casos no es necesario pensar un nombre de variable sino que basta con usar la variable an´ onima “_”. pero si se intenta hacer una consulta en la que el primer argumento no est´ e instanciado.factorial(_.v. Por lo tanto. . en la consulta.?Y) % cierto si Y es el factorial de X factorial(0.s(0)) ← Factorial(s(x). el predicado predefinido sort/2. la definici´ on anterior se podr´ ıa sustituir por: es_factorial(X) :. [a. ?Lista2).a].” o “ ?.a].factorial(X. factorial(s(X).s(z)) ← Suma(x.v]). 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.s(Y). 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.?Z) % cierto si Z es la suma de X e Y suma(X.para indicar que el argumento correspondiente no debe estar instanciado en la consulta.c.?Y. 9 . que sirve para ordenar listas de elementos. se producir´ a un error. Ejemplo: Sup´ ongase que.X). Obs´ ervese que en los ejemplos anteriores las variables X . en este caso el posible valor de la variable Y es indiferente. ? para indicar que el argumento puede estar tanto instanciado como no instanciado (es decir. como por ejemplo “?. se describe como sort(+Lista1.”.s(y). 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. [c.suma(X. 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.Y).s(X)*Y) :.y) PROGRAMA PROLOG % factorial(?X. sin importar quien sea ´ este. es decir: % es_factorial(?X): cierto si X es el factorial de alg´ un n´ umero es_factorial(X) :. suma(X.a]).

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

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

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

progenitor(X. Y). Por ejemplo. Y) :. cierto cuando X es un ancestro de Y . Como ya se coment´ o en el tema anterior. Z). cuatro versiones distintas del predicado ancestro(X. Y) :. ?Y): cierto si X es un ancestro de Y % VERSI´ ON 1 ancestro1(X. Z). Y) :. Y). el sistema continua la b´ usqueda de nuevas soluciones en el ´ arbol de Resoluci´ on. erese el siguiente programa (“ancestros. ancestro1(X. Y).progenitor(X. adem´ as de un preEjemplo: Consid´ dicado progenitor(X. computaci´ on infinita si encuentra una rama infinita o valor de las variables correspondientes en caso de encontrarse otra soluci´ on). Y). 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(X. ancestro2(Z. Y) :.Y). Z). Y). Z). ancestro1(Z. con lo que el proceso se vuelve a repetir. % ancestro(?X.pl”). ya que dar´ an lugar a ´ arboles de Resoluci´ on distintos. % progenitor(?X.progenitor(X. Y).progenitor(X. % VERSI´ ON 4 ancestro4(X. Y). % VERSI´ ON 3 ancestro3(X. si se intenta averiguar de qui´ en es ancestro pepa. pepin). Y).ancestro3(Z. pepito). · si se introduce un punto y coma seguido de un retorno de carro.Y) que es cierto cuando X es progenitor de Y . % VERSI´ ON 2 ancestro2(X. su comportamiento en Prolog es distinto. 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. que incluye.progenitor(X. Y) :. ancestro2(X. progenitor(pepito.ancestro4(Z. progenitor(X. el sistema contesta “yes” y abandona la b´ usqueda de posibles nuevas soluciones. Y) :. Aunque las cuatro definiciones anteriores del predicado ancestro son iguales desde el punto de vista l´ ogico. ?Y): cierto si X es progenitor de Y progenitor(pepa.· si se introduce un retorno de carro. Y) :. resulta lo siguiente (compru´ ebense estos resultados mediante la construcci´ on de los ´ arboles de resoluci´ on SLD correspondientes): 13 . Y) :. ancestro4(X. 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.progenitor(X.progenitor(X.

D = pepito ? . la u ´nica que cumple estas dos recomendaciones es la primera. 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). no Consulta con “ancestro2”: ofrece las dos posibles soluciones (en orden inverso al caso anterior) y termina. D). % el sistema entra en un bucle.ancestro3(pepa. porque entra directamente en una rama infinita.ancestro4(pepa. Es por otro lado necesario evitar definiciones circulares del estilo: 14 . % el sistema entra en un bucle. s´ ı suelen ser recomendables los siguientes principios b´ asicos. que se interrumpe con CTRL-C CTRL-C Prolog interruption (h for help)? a {Execution aborted} Consulta con “ancestro4”: no produce ninguna soluci´ on. 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. en el mismo orden que “ancestro1”.ancestro2(pepa. D = pepin ? . basados en la idea de “hacer antes lo m´ as sencillo”: 1. D = pepito ? . no Consulta con “ancestro3”: ofrece las dos posibles soluciones. D).ancestro1(pepa. ?. D = pepito ? . D = pepin ? . pero si se piden m´ as soluciones la consulta no termina. ?. es decir. D = pepin ? .Consulta con “ancestro1”: ofrece las dos posibles soluciones y termina. ?. 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. Evitar las reglas con recursi´ on a la izquierda. ?. 2. D).

la expresi´ on 3+5 no es m´ as que el t´ ermino compuesto +(3. ciertos predicados para entrada/salida y el predicado de control denominado corte.1. pero ´ estas no son m´ as que estructuras (t´ erminos compuestos) que no representan ning´ un valor. Sin embargo. Aritm´ etica Operadores aritm´ eticos Prolog tiene predefinidos los operadores aritm´ eticos m´ as habituales.5) escrito en notaci´ on infija. y si se hiciese la consulta “ ?. 4. puesto que “+” no es un predicado.X).progenitor(X. las facilidades descritas no son suficientes para obtener un lenguaje de programaci´ on u ´til en la pr´ actica: por ejemplo. mediante los que se pueden formar expresiones aritm´ eticas.3+5.5) no es unificable con el t´ ermino constante 8. 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. As´ ı. la respuesta de Prolog ser´ ıa no.A). puesto que cualquier consulta a uno de los dos predicados anteriores provocar´ a necesariamente un bucle infinito. En lo que sigue se describen s´ olo algunos de estos predicados predefinidos. 15 .B) :.3+5 = 8. 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. todo lenguaje de programaci´ on “real” necesita facilidades para leer y/o escribir o mecanismos eficientes para realizar operaciones aritm´ eticas. hijo(A.”.hijo(Y. 4. Para poder evaluar expresiones aritm´ eticas en Prolog hay que utilizar los predicados aritm´ eticos que se describen a continuaci´ on. en concreto los relacionados con la realizaci´ on de operaciones aritm´ eticas. Por ejemplo.1.progenitor(B. Estos predicados no pueden ser redefinidos por el programador. 4. no es posible hacer consultas del estilo “ ?.”. Para ello.1.Y) :. dado que el t´ ermino compuesto +(3. 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.

3+5 is 3+5. found a} b ) cuando la parte derecha es una expresi´ on aritm´ etica pero no se puede evaluar: ?. Adem´ as del predicado anterior. el resultado del predicado depender´ a de si la parte izquierda unifica o no con el resultado obtenido al evaluar la parte derecha: ?.4. a pesar de 16 . 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.arg 2: expected expression. que se usa en notaci´ on infija de la siguiente forma: X is Y Si Y es una expresi´ on aritm´ etica.X is 4*Z. ´ esta se eval´ ua y el resultado se intenta unificar con X. {DOMAIN ERROR: _157 is a+1 . Salvo en los casos anteriores. 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. A la hora de usar este predicado hay que tener en cuenta las siguientes consideraciones: 1.0 ? yes ?.5 is 2+3. X = 2. resultante de evaluar la parte derecha.2. Y = 6 ? yes ?.X is a+1. {INSTANTIATION ERROR: _157 is 4*_155 . Y is X+1. X = 5. que se escribe al rev´ es de lo que suele ser normal en otros lenguajes de programaci´ on (<=). Prolog incorpora otros predicados comunes para comparaciones aritm´ eticas.X is 5. 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.arg 2} 2. El m´ as habitual es el predicado predefinido “is”. yes ?.1.X is sqrt(4). 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: ?.5)) no es unificable con el entero 8. Predicados aritm´ eticos Los predicados aritm´ eticos predefinidos de Prolog se utilizan para evaluar expresiones aritm´ eticas.

como por ejemplo los programas para el c´ alculo de la suma y el factorial de n´ umeros naturales. . Los programas aritm´ eticos del estilo de los anteriores se pueden considerar programas l´ ogicos puros.3+5 =:= 8. que. 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. ERROR: . relativo a la Programaci´ on L´ ogica general..serlo. En caso contrario.1+ 5 > abs(-8). no se pueda evaluar.?Z): cierto si Z es la suma de X e Y suma(X.3 =\= 3*a. requiere que su parte derecha est´ e instanciada. utilizando simplemente el predicado de evaluaci´ on is: % suma(+X. Esto es debido a la utilizaci´ on en el cuerpo de la regla del predicado predefinido is. Se trataba en ambos casos de programas l´ ogicos definidos. 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.Son tambi´ en. bastar´ ıa con definirlo como sigue. Recu´ erdese en particular c´ omo pueden utilizarse para varios cometidos distintos -por ejemplo el programa de la suma tambi´ en sirve para restar.. por lo que basta con adaptar su sintaxis para obtener los correspondientes programas en Prolog (v´ ease el apartado 3.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. y tienen dos caracter´ ısticas principales: . 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. As´ ı. 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. sin embargo.Z is X+Y.2 de este documento).1... el sistema eval´ ua las dos expresiones aritm´ eticas y devuelve el resultado de la comparaci´ on solicitada.1. se estudiaron varios programas l´ ogicos aritm´ eticos.Y.X+3 < sqrt(4). 17 . y la ineficiencia se debe al c´ alculo recursivo utilizado para resolver operaciones aritm´ eticas elementales. yes ?. En efecto. Tiene sin embargo la desventaja respecto a la versi´ on l´ ogica pura de que pierde la versatilidad de ´ esta. por un lado. ?. si se desease disponer de un predicado para sumar n´ umeros naturales. Programas aritm´ eticos en Prolog En el tema anterior. no ?. 4. . ?. Su incomodidad proviene del hecho de que los n´ umeros naturales se deben manipular mediante la funci´ on sucesor.1. puesto que est´ an definidos utilizando exclusivamente propiedades l´ ogicas. ERROR: . como se vio antes. .Son. ´ este.3). programas sencillos y vers´ atiles. a diferencia del anterior. inc´ omodos de utilizar en la pr´ actica y poco eficientes. como se puede ver en el comentario previo a la definici´ on del nuevo predicado.Z) :.3.

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

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

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

. e.!. En estos casos ocurre lo siguiente (siendo N el nodo anterior): 1.. !.a1. ...). Se puede incluir. !. 2.. un nodo de la forma “?. es decir.. que ser´ a igual a N pero sin el corte. como un predicado m´ as. 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.”. La siguiente figura ilustra lo anterior. por lo que el nodo N tendr´ a un u ´nico hijo... d :. e :. d. 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..  ¢¡ £¥¤§¦ ¨ ©¨   ¨ © £ ¤ ©¨   ¨ ©   Ejemplo.1. ser´ a de la forma “?.. Las ramas tachadas con una raya son aquellas que se ignoran como consecuencia del corte. b...a1. Consid´ erese el programa Prolog dado por las siguientes cl´ ausulas: a :. a :.4.. es decir.. 21 b :.. c. c.an.. En concreto. b :. d. Los cortes permiten al programador intervenir en el control del programa..b. puesto que su presencia hace que el sistema ignore ciertas ramas del a ´rbol SLD correspondiente...d. y cuya evaluaci´ on es siempre cierta. no tiene argumentos. Definici´ on y propiedades El corte es un predicado predefinido que se denota mediante un punto de exclamaci´ on (!).”.an. en el cuerpo de las reglas o en las consultas (por ejemplo a :.b..3. 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.

. En concreto: En el momento de evaluar el corte. elimin´ andose cualquier alternativa... el sistema ya ha encontrado soluciones para los objetivos a1... es mejorar la eficiencia de los programas.. El predicado de corte tiene dos ventajas fundamentales: Su utilidad b´ asica. no se consideran nuevas alternativas para el objetivo d). el predicado b).ai. Tampoco se considerar´ an otras alternativas para el predicado responsable de la introducci´ on del corte (en el ejemplo anterior.an” se produce por lo tanto cuando el sistema llega a la evaluaci´ on del corte.. 22 ..!.  ¢¡¤£¤¥  ¦¡¨§©¤¥  ¢¡¥¥¥¥  ¦¡¤¤©©¤© ¥  ¢¡¤ ¥  ¦¡¨¥¥¥¥©¤¥  ¢¡!©¤© ¥  ¢¡"¥¥¥©©¤©¤¥  ¢¡#¤©¤¥ El efecto de la existencia de una regla de la forma “a:-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..ai.La figura incluida a continuaci´ on muestra el ´ arbol de Resoluci´ on SLD resultante al realizarse la consulta ?-a. 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. Las ramas tachadas son las que se deben ignorar debido al corte. y no se considerar´ an otras alternativas para ninguno de ellos (en el ejemplo anterior. dado que reduce el espacio de b´ usqueda de soluciones.

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

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

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

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

Sign up to vote on this title
UsefulNot useful