´ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful