prolog

´ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful