P. 1
prolog

prolog

|Views: 17|Likes:
Publicado porVictor Macias

More info:

Published by: Victor Macias on Mar 24, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/01/2014

pdf

text

original

´ 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->