´ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Y).X) :. Al igual que en el ejemplo anterior.Y. la respuesta del sistema ante la consulta “?-maximo(3.Y).Z).0).Y. !.Z) :. pero sin embargo no siempre funciona con consultas en las que ambos argumentos est´ an instanciados: por ejemplo.X >= Y. [C|_]). Este problema no se da en las versiones anteriores. hay que destacar que esta u ´ltima versi´ on. pertenece(C. 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. Dado que las dos opciones son mutuamente excluyentes.2).”.Y. similar a lo que se coment´ o en el ejemplo anterior. tiene el inconveniente de que no siempre es correcta. el predicado encontrar´ a todas sus posibles ocurrencias. por lo que si un elemento aparece varias veces en una lista.Y. 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. As´ ı. 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.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.” ser´ ıa afirmativa.Z). maximo(_X.pertenece(C. la respuesta del sistema ante la consulta “?. 25 .” es afirmativa.X >= Y. una forma m´ as c´ omoda y eficiente de expresar lo anterior es utilizando el corte: maximo(X. cuando deber´ ıa ser evidentemente negativa. a pesar de ser m´ as c´ omoda de escribir. !. cuando deber´ ıa ser evidentemente negativa. las dos opciones no se consideran excluyentes.0. maximo(X. En la definici´ on anterior. resulta que esta u ´ltima versi´ on no puede usarse de cualquier forma. maximo(_X.Sin embargo.X) :.Y.Y) :.f(5.f(0. [_|R]) :.R).X < Y. porque con ciertas consultas puede dar lugar a resultados err´ oneos: por ejemplo.Y.X >= Y. porque no funciona adecuadamente para ciertos usos del predicado: resuelve correctamente consultas de la forma “?. Otra posibilidad. Al igual que en el ejemplo anterior. Z=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. ahora se tendr´ a (compru´ ebese construyendo el ´ arbol de resoluci´ on SLD correspondiente): ?.[a. X = a ? . [_|R]) :. no 26 . X = c ? .pertenece(X.pertenece(X. para enumerar todos los elementos de una lista.pertenece(C. [C|_]) :.c]). como con la versi´ on anterior. Con esto se consigue una versi´ on determinista y m´ as eficiente del predicado. X = a ? .[a. En efecto.c]). Por ejemplo. no Una versi´ on m´ as eficiente del predicado anterior se consigue introduciendo un corte en el cuerpo de la primera regla.b. de forma que el predicado termine en el momento de encontrar la primera ocurrencia de un cierto elemento: pertenece(C.!.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.c]). la respuesta del sistema ante la consulta “pertenece(X.R).” es la siguiente (compru´ ebese construyendo el ´ arbol de resoluci´ on SLD correspondiente). Sin embargo. pertenece(C. X = b ? .[a.b. ?.

Sign up to vote on this title
UsefulNot useful