Está en la página 1de 25

Instituto Politcnico Nacional

Escuela Superior de Ingeniera Mecnica y Elctrica Unidad

CULHUACN
Materia: Compiladores Tema: Tutorial de prolog Integrantes: Javier Alcntara Ulises 2010350726 Romero Hernndez Vianey Montserrat 2010350288 Cruz de Luna Luis Manuel 2010350069 Rosas Crdenas Michel 2010350291 Profesor: VELOZ ORTIZ LUIS EFREN

Grupo: 5CM5 Fecha: 12-Septiembre-2011

TUTORIAL DE PROLOG ndice INTRODUCCIN. CAPTULO 1. COMO CORRER PROLOG. 1.1 Comienzo. 1.2 Lectura de Archivos con Programas. 1.3 Ingreso de Clusulas a la Terminal. 1.4 Directivas: Preguntas y Comandos. 1.5 Errores de Sintaxis. 1.6 Predicados no definidos. 1.7 Ejecucin de Programas e Interrupcin de stos. 1.8 Salida del Intrprete. 1.9 Ejecuciones Anidadas - Break y Abort. 1.10 Guardando y Recuperando Estados de Programas. 1.11 Inicializacin. 1.12 Entradas a Prolog. CAPTULO 2. DEPURACIN. 2.1 El Modelo de Flujo del Procedimiento Box Control. 2.2 Predicados Bsicos de Depuracin. 2.3 Rastreo. 2.4 Spy-Points. 2.5 Formato de los Mensajes de Depuracin. 2.6 Opciones Disponibles Durante la Depuracin. 2.7 Consultar Durante la Depuracin.

CAPTULO 3. COMPILACIN. 3.1 Llamando al Compilador 3.2 Declaraciones Pblicas. 3.3 Mezclando Cdigo Compilado y Cdigo Interpretado. 3.4 Declaraciones de Modo. 3.5 Indexacin. 3.6 Optimizacin de la Cola de Recursin. 3.7 Limitaciones Prcticas.

INTRODUCCIN. Prolog es un lenguaje de programacin simple pero poderoso desarrollado en la Universidad de Marsella como una herramienta prctica para programacin lgica. Desde el punto de vista del usuario, la ventaja principal es la facilidad para programar, ya que se pueden escribir rpidamente y con pocos errores, programas claramente lebles. Para una introduccin al Prolog, se recomienda que se consulte el libro de Closkin y Mellish (81), sin embargo, para beneficio de aquellos que no tiene acceso al libro y para aquellos que tienen conocimientos anteriores de lgica, se encuentra un sumario del lenguaje en el apndice I de esta obra. Este manual describe el Sistema Prolog que fue desarrollado en el Departamento de Inteligencia Artificial de la Universidad de Edimburgo expresamente para el DECsystem10. Este sistema se compone de un intrprete y un compilador, ambos escritos tambin en Prolog. A nivel del usuario, el compilador se puede considerar como un procedimiento integrado en el sistema que puede ser llamado por el intrprete. Ya compilado, un procedimiento se puede correr a una velocidad de 10 a 20 veces ms rpida, as como su almacenamiento tambin se ve reducido. Sin embargo, se recomienda que los usuarios nuevos ganen experiencia con el intrprete antes de intenten usar el compilador. El intrprete facilita el desarrollo y la prueba de programas as como tambin provee facilidades muy poderosas para la depuracin del cdigo. Ciertos aspectos del Prolog no se han previsto en la instalacin, por ejemplo el tipo de monitor en el que se va a usar, aspecto que lleva muchos de los procedimientos con los que el sistema cuenta. Este manual describe la instalacin de la versin de Edimburgo bajo TOPS-10, versin 7.01, los usuarios de otro tipo de instalacin se pueden referir al apndice III. Este manual se basa en la obra "User's Guide to DECsystem-10 Prolog" de L.M. Pereira, F.C.N. Pereira y D.H.D. Warren. Parte del captulo 2 se tomo del libro de Byrd, (80). Comentarios muy tiles que se presentan en este manual fueron realizados por Lawrence Byrd, Luis Jenkins, Richard O'Keefe, Fernando Pereira, Robert Rae y Leon Sterling. El sistema Prolog es mantenido por el Departamento de Inteligencia Artificial y el Engineering Board Computing Committee del Science and Engineering Research Council.

CAPTULO 1. COMO CORRER PROLOG. El Prolog para el DECsystem-10 ofrece al usuario un ambiente de programacin con herramientas para construir programas, depurarlos siguiendo su ejecucin a cada paso y modificar partes de los programas sin tener que volver a comenzar todo el proceso desde el ltimo error. El texto en un programa en Prolog se crea en un archivo o en un nmero de archivos usando cualquier editor de texto estndar. El intrprete de Prolog puede ser instruido para que lea los programas contenidos en estos archivos. A esta operacin se le llama consultar el archivo. 1.1 Comienzo Para correr el intrprete de Prolog, se deber teclear el siguiente comando: .r prolog El intrprete responde con un mensaje de identificacin y el indicador "| ?- " se presentar cuando el sistema est listo para aceptar cualquier entrada, as, la pantalla se ver como sigue: Edinburgh DEC-10 Prolog version 3.47 University of Edinburgh, September 1982 | ?En este momento el intrprete estar ya esperando que el usuario ingrese cualquier comando por ejemplo: una pregunta o una orden (ver seccin 1.4). No se pueden introducir clusulas inmediatamente (ver seccin 1.3). Este estado se llama nivel alto del intrprete. Mientras que se teclea un comando, el indicador permanecer de la siguiente manera: "| ". El indicador "?-" aparecer solamente en la primera lnea.

1.2 Lectura de archivos con programas Un programa esta compuesto por una secuencia de clusulas que se pueden intercalar con directivas para el intrprete. Las clusulas de un procedimiento no necesariamente tienen que ser consecutivas, pero si es necesario recordar que el orden relativo es muy importante. Para Ingresar un programa desde un archivo, slo se tiene que teclear el nombre del archivo dentro de corchetes y seguidos de un ENTER: | ?- [archivo] ENTER

Esta orden le dice al intrprete que tiene que leer (consultar) el programa. La especificacin del archivo tiene que ser un tomo de Prolog, tambin puede contener especificacin de dispositivos y/o una extensin, pero no se debe incluir la ruta de ubicacin. Ntese que es necesario que todas estas especificaciones se coloquen dentro de comillas, por ejemplo: | ?- ['dska:myfile.pl']. Despus de haber tecleado esto el archivo ser ledo, As las clusulas que se han guardado en un archivo estn listas para ser ledas e interpretadas, mientras que las directivas son ejecutadas al momento de ser ledas. Cuando se encuentra el fin del archivo, el intrprete pone en pantalla el tiempo que se ha gastado en la lectura y el nmero de palabras ocupadas por el programa. Cuando este mensaje se despliegue quiere decir que el comando se ha ejecutado con xito. Tambin se pueden combinar varios archivos de la siguiente manera: | ?- [miprograma,archivos_extras,archivos_de_tests]. En este caso los tres archivos sern ledos. Si un nombre de archivo se antecede del signo "menos" (-), por ejemplo: | ?- [-tests,-fixes]. Entonces este archivo o estos archivos sern reledos. La diferencia entre la lectura simple y la releda es que cuando un archivo es ledo entonces todas las clusulas en el archivo se aaden a la base de datos interna de Prolog, mientras que si se lee el archivo dos veces, entonces se tendr una copia doble de todas las clusulas. Sin embargo, si un archivo es reledo entonces las clusulas de todos los procedimientos en el archivo reemplazarn a cualquier clusula existente anteriormente. La reconsulta es til para indicarle a Prolog las correcciones que se realizan a los programas. 1.3 Ingreso de las clusulas a la terminal Las clusulas se puede ingresar directamente en la terminal pero esto es recomendado solamente cuando stas no se necesitan permanentemente y cuando son pocas. Para ingresar clusulas desde la terminal, se debe dar el comando especial: give the special command: | ?- [user]. | Y el indicador "| " mostrara que el intrprete est ahora en el estado de espera de clusulas o directivas. Para ingresar al nivel ms alto del intrprete se deber teclear Control + Z (^Z). Este es el equivalente al fin de archivo de archivo temporal virtual llamado user

1.4 Directivas: Preguntas y comandos Las directivas pueden ser preguntas y/o comandos. Ambas pueden ser formas de dirigir al sistema para alcanzar alguna o algunas metas. En el siguiente ejemplo, la funcin de pertenencia a una lista se defina como sigue: member(X,[X|_]). member(X,[_|L]) :- member(X,L). (Ntese que las variables sin valor asignado se representan como "_".) La sintaxis completa para una pregunta es "?-" seguida por una secuencia de metas, por ejemplo: ?- member(b,[a,b,c]). Al nivel ms alto del intrprete (en el que el indicador es como este: "| ?- "), una pregunta se puede teclear abreviando el "?-" que de hecho ya est incluido en el indicador. As, en el nivel ms alto, una pregunta se vera de la siguiente manera: | ?- member(b,[a,b,c]). Recuerde que los trminos en Prolog deben terminar con el punto ".", por lo que el Prolog no ejecutar nada hasta que Usted haya tecleado este punto y un ENTER al final de la pregunta. Si la meta que se ha especificado en la pregunta puede ser satisfecha, y si no hay variables a considerar como en este ejemplo, entonces el sistema responde: yes Y la ejecucin de la pregunta ha terminado. Si en la pregunta se incluyen variables, entonces el valor final de cada variable es desplegado (excepto para las variables annimas). As la pregunta: | ?- member(X,[a,b,c]). Podra ser respondida como: X=a En este momento el intrprete estar esperando que el usuario introduzca un ENTER o un punto "." Seguido de un ENTER. Si se teclea solamente ENTER, termina la pregunta y el sistema responde "yes". Sin embargo, si se teclea ".", el sistema realiza un backtracking y busca soluciones alternativas. Si no hay soluciones alternativas entonces el sistema responde: No

La salida para algunas preguntas como la que se muestra abajo, donde un nmero precede a un "_" significa un nombre generado por el sistema para una variable, por ejemplo: | ?- member(X,[tom,dick,harry]). X = tom ; X = dick ; X = harry ; no | ?- member(X,[a,b,f(Y,c)]), member(X,[f(b,Z),d]). X = f(b,c), Y = b, Z=c yes | ?- member(X,[f(_),g]). X = f(_52) yes | ?En el caso de los comandos, son similares a las preguntas excepto porque: 1. Las variables asociadas con un valor no se muestran cuando la ejecucin del comando tiene xito. 2. No existe la posibilidad de hacer backtracking para encontrar otras alternativas. Los comandos inician con el smbolo ":-" . A nivel alto del intrprete simplemente basta con iniciar con el indicador "| ?- ". Cualquier salida pretendida debe ser programada explcitamente, por ejemplo, en el comando: :- member(3,[1,2,3]), write(ok). Dirige al sistema para que verifique si el nmero 3 pertenece a la lista [1,2,3], y a que redirija la salida hacia la variable "ok" si as es. La ejecucin de un comando termina cuando todas las metas en el comando se han ejecutado de manera exitosa. No se muestran soluciones alternativas. Si no se encuentra solucin entonces el sistema indica: ?

como una advertencia. El uso principal de los comandos (en oposicin al uso de las preguntas) es permitir a los archivos el contener las directivas que llaman a varios procedimientos, para los cuales el usuario no requiere salida impresa. En estos casos solo se requiere llamar a los procedimientos por su efecto, por ejemplo, si no quiere tener interaccin con el intrprete durante la lectura de un archivo. Un ejemplo muy til es el uso de una directiva que consulte una lista completa de archivos. :- [ bits, bobs, main, tests, data, junk ]. Si un comando como este se encuentra contenido en el archivo 'myprog' entonces, teclear lo siguiente sera la forma ms rpida para cargar el programa entero: | ?- [myprog]. Cuando se interacta al nivel ms alto del intrprete de Prolog, la distincin entre comandos y preguntas es normalmente muy importante. A este nivel se teclean las preguntas en forma normal. Solo si se lee de un archivo, entonces para realizar varias metas se deben usar comandos, por ejemplo; una directiva en un archivo debe ser precedida por un ":-", de otra manera seran tratados como clusulas. 1.5 Errores de sintaxis Los errores de sintaxis se detectan durante la lectura. Cada clusula o directiva, o en general cualquier trmino ledo de un archivo o de la terminal, que provoca una falla, es desplegado en la terminal tan pronto como es ledo por el sistema. Una marca indica el punto en la cadena de smbolos en donde al parser ha fallando en su anlisis, por ejemplo: member(X,X:L). Implica que el parser muestre: *** syntax error *** member(X,X *** here *** : L). Si el operador "." No ha sido declarado como operado infijo. Ntese que no se muestran comentarios que especifiquen el tipo de error. Si usted tiene duda acerca de qu clusula contiene el error, puede usar el predicado: listing/1 Para enlistar todas las clusulas que han sido eficientemente ledas, por ejemplo: | ?- listing(member).

1.6 Predicados no definidos. El sistema puede ocasionalmente tambin darse cuenta de que se han llamado a predicados que no tienen clusulas, el estado de esta facilidad de identificacin puede ser: - 'trace', que causa que este tipo de errores sean desplegados en la terminal y que el proceso de depuracin muestre la ltima vez que ha ocurrido. O, - 'fail', que causa que estos predicados fallen (este es el estado por default) El predicado evaluable: unknown(OldState,NewState) unifica a OldState con el estado actual y coloca a State como Newstate. Este falla si los argumentos no son los apropiados. La depuracin de predicados evaluables imprime el valor de este estado a lo largo de otras informaciones. Es importante notar que se lleva casi un 70% ms de tiempo correr al intrprete en esta modalidad. Se espera que esta facilidad se pueda mejorar en el futuro.

1.7 Ejecucin de programas e interrupcin de stos. La ejecucin de un programa se inicia cuando se le da al intrprete una directiva en la cual se contienen llamadas a uno de los procedimientos del programa. Slo cuando la ejecucin de una directiva se ha realizado por completo es cuando el intrprete va por otra directiva. Sin embargo, uno puede interrumpir la ejecucin normal de sta al presionar ^C mientras el sistema est corriendo. Esta interrupcin tiene el efecto de suspender la ejecucin y se despliega el siguiente mensaje: function (H for help): En este momento el intrprete acepta comando de una sola letra, que correspondan con ciertas acciones. Para ejecutar una accin simplemente se deber teclear el carcter correspondiente (en minsculas) seguido de un ENTER. Los posibles comandos son: a.- aborta el comando actual tan pronto como sea posible b.- detiene la ejecucin (ver apartado 1.9) c.- continuar la ejecucin e.- Salir de prolog y cerrar todos los archivos g.- manejar posibilidad de recobrar aspectos ya borrados con anterioridad

h.- Lista todos los comandos disponibles m.- Sale a nivel Monitorl (puede teclear Monitor o CONTINUE) n.- desactiva el comando trace t.- activa el comando trace Ntese que no es posible romper la ejecucin directamente desde el cdigo compilado, cada una de las opciones "a", "b" y "t" piden que el intrprete realice una accin, por lo que la accin se seguir realizando hasta que el cdigo compilado devuelva en mando al intrprete. Note tambin que la opcin ("a") no saca al usuario cuando esta en modo [user] es decir insertando clusulas desde la terminal. Tiene que teclear ^Z para parar este proceso o teclear ("e") para poder salir de Prolog. Si se trata de abortar un programa con ^C y accidentalmente se llegara al nivel Monitor, (quiz porque se apret ^C demasiadas veces), deber teclear CONTINUE para regresar a la interrupcin ^C. 1.8 Salida del intrprete Para salir del intrprete y regresar al nivel monitor, deber teclear ^Z a nivel alto del intrprete, o llamar al procedimiento "halt" (pre-cargado por default), o usar el comando "e" (exit) seguido de una interrupcin ^C. ^Z es diferentes de los otros dos mtodos de salida, ya que imprime algunas estadsticas. Es posible regresar usando el comando del Monitor CONTINUE despus de ^Z, si se arrepiente de haber querido salir. 1.9 Ejecuciones anidadas, Break y Abort. El sistema prolog integra una manera de suspender la ejecucin de un programa e introducir nuevas directivas o cambiar metas a nivel alto del intrprete. Esto se logra si se llama a un predicado evaluable Break o tecleando "b" despus de una interrupcin con ^C ( ver seccin 1.7). Esto causa que el intrprete suspenda la ejecucin inmediatamente, a lo que el intrprete contestar [ Break (level 1) ] Que quiere decir que se ha parado desde el nivel Break y que se pueden introducir preguntas de la misma manera en que se haba hecho desde el nivel alto del intrprete. El intrprete indica el nivel Break en el que el sistema se encuentra (por ejemplo, en Breaks anidados), imprimiendo el nivel de Break despus de un yes o un no final a las preguntas. Por ejemplo, a nivel Break 2, se podra ver la respuesta as: uld look like: | ?- true. [2] yes | ?-

Un ^Z cierra la interrupcin que se haba realizado y se reanudan las tareas. Una ejecucin suspendida se puede abortar usando la directiva: | ?- abort. Dentro de un break. En este caso no se necesita un ^Z para cerrar el break; Todos los niveles break se descartarn y se llega automticamente al nivel ms alto del intrprete. 1.10 Guardado y restauracin de estados de programas Una vez que el programa ha sido ledo, el intrprete tendr disponible toda la informacin que sea necesaria para su ejecucin, esta informacin se llama estado de programa. El estado de un programa se puede grabar en disco para ejecuciones posteriores. Para guardar un programa en un archivo, realice la siguiente directiva: | ?- save(file). Este predicado se puede llamar en cualquier momento, por ejemplo, puede ser muy til a fin de guardar los estados de un programa inmediatos. Cuando el programa ha sido guardado en un archivo, la siguiente directiva recuperara el estado de un programa: | ?- restore(file). Despus de esta ejecucin el programa entonces podr ser regresado exactamente al mismo punto en que se dej al momento de salvarlo la ultima vez. | ?- save(myprog), write('programa restaurado'). As, al ejecutarse esta orden con el mensaje propio del usuario, se obtendr el mensaje "programa restaurado", por ejemplo. Ntese que cuando una versin de Prolog nueva se instala, todos los programas grabados se vuelven obsoletos. 1.11 Inicializacin Cuando prolog inicia busca un archivo llamado 'prolog.bin' en la ruta default del usuario. Si se encuentra este archivo entonces se asume que el estado de un programa se ha restaurado. El efecto es el mismo que si se hubiera tecleado: | ?- restore('prolog.bin'). Si no se encuentra este archivo, entonces se busca en forma similar, el archivo 'prolog.ini'. Si se encuentra este archivo, sera lo mismo que haber tecleado: | ?- ['prolog.ini'].

La idea de este archivo es que el usuario pueda tener aqu los procedimientos y directivas que se usan usualmente de manera que no se tengan que teclear cada vez que se necesiten. El archivo 'prolog.bin' parece ser que es til cuando se usa con el plsys(run(_,_)) que permite correr otros programas desde dentro de Prolog. Esta facilidad permite tambin regresar al mismo punto si se corri prolog desde otros programas. En este caso, el predicado evaluable save/2 debe ser usado paara salvar el estado del programa dentro de 'prolog.bin'. 1.12 Entrada a prolog Cuando se entra a prolog directamente en una interaccin con la terminal, se escribe automticamente el archivo 'prolog.log' en modo append. Esto es, si ya existe el archivo, en el directorio del usuario, entonces la nueva informacin se aade, si no es as, y el archivo no existe, entonces el archivo se crea.

CAPTULO 2 DEPURACIN Este captulo describe las facilidades de depuracin que estn disponibles en el intrprete de Prolog, el propsito de estas facilidades es proveer informacin concerniente al control del flujo del programa, las principales facilidades del paquete de depuracin son las siguientes: - El Procedure_Box, modelo de ejecucin de prolog que permite visualizar con fines de control el flujo del programa, especialmente durante un backtracking. El control de flujo se considera un nivel de procedimiento ms que un procedimiento a nivel de clusulas individuales. - La habilidad para rastrear el programa o un grupo selectivo de puntos de este. Puntos espas que pueden ser procedimientos bsicos o principales, en los que el programa deber tener para que el usuario pueda interactuar con el sistema. - La posibilidad de contar con opciones de control y de informacin, disponibles durante la depuracin.

2.1 El modelo de flujo del procedimiento Box Control Durante la depuracin de un programa se imprimen una secuencia de metas defectuosas a fin de mostrar el estado que el programa ha alcanzado durante esta ejecucin. Sin embargo, para poder entender qu es lo que ocurre, es necesario entender primero cundo y por que el intrprete imprime las metas. Como en otros lenguajes de programacin, existen puntos principales de inters como los procedimientos de entrada y regreso, pero en Prolog, existe el backtracking que tiene una complejidad adicional. Una de las principales confusiones para los novatos es que los programadores tienen que enfrentar la cuestin de qu es lo que est ocurriendo en el momento en que una meta falla y el sistema inicia repentinamente el backtracking. El modelo Box de Prolog permite que el flujo del programa posibilite identificar cualquier punto en la ejecucin en trminos de localizacin en el texto del programa. Este modelo provee las bases para la depuracin de un programa. Examinando a fondo un procedimiento se tiene: *--------------------------------------* Call | | Exit ---------> + descendant(X,Y) :- offspring(X,Y). + --------> | | | descendant(X,Z) :- | <--------- + offspring(X,Y), descendant(Y,Z). + <--------- Fail | | Redo *--------------------------------------* La primer clusula establece que Y es descendiente de X si Y es resultado de X, y la segunda clusula establece que Z es descendiente de X si Y lo es de X y si Z es descendiente de Y. En el diagrama, una caja se ha dibujada al rededor de todo el procedimiento y se han estipulado flechas para establecer el flujo de control con entradas y salidas de esta caja. Existen cuatro flechas por examinar durante el flujo: -Call que representa la llamada inicial del procedimiento. Cuando una meta es de la forma descendant(X,Y) se requiere que el centro pase a travs de la caja para ver un componente que haga matching y que de satisfaccin a alguna de las submetas en el

cuerpo de la clusula. Este procedimiento es independiente del matching posible que se de, por ejemplo, en la primera etapa se llama y el matching tiene lugar. Podemos imaginar textualmente el movimiento del cdigo cuando se llega a una llamada de descendencia en alguna parte del cdigo. Exit. Esta flecha representa un regreso exitoso del procedimiento. Este ocurre cuando la meta inicial ha sido unificada con uno de los componentes clausales y cualquiera de las submetas ha sido satisfecha. El control entonces pasa por el puerto de salida de la caja de descendencia. Textualmente se para el cdigo siguiente por descendencia y se regresa por el camino por donde se lleg. -Redo. Esta flecha indica que la meta subsiguiente ha fallado y que el sistema hace backtracking en un intento de encontrar alternativas a soluciones previas. El control pasa a travs del puerto Redo de la caja de descendencia. Se hace un intento entonces por resatisfacer una de las submetas componentes en el cuerpo de la ltima clusula en la que se ha tenido xito, si esto falla, se hace un completo, nuevo, matching con la clusula original al cuerpo de una nueva clusula, textualmente se sigue la parte anterior de cdigo de la manera en que se ha ido buscando nuevas formas de obtener xito descomponiendo sta en otras clusulas y siguiendo as mientras que sea necesario. -Fail. Esta flecha representa una falla en la meta inicial, que puede ocurrir si no existe un matching efectivo con alguna clusula o si las submetas establecidas nunca son satisfechas, o si cualquiera de las soluciones producidas es rechazada siempre por el proceso posterior. El control pasa entonces por la caja de descendencia en el puerto Fail y el sistema continua en backtracking. Textualmente el sistema se mueve hacia atrs en el cdigo que ha llamado este procedimiento y se continua movindose hacia atrs buscando puntos de eleccin. En trminos de este modelo, la informacin que nosotros obtenemos acerca de esta caja de procedimiento, es slo acerca del flujo de control que se da a lo largo de estos cuatro puertos. Esto significa que a este nivel no importa con cual clusula se hace matching y como se da satisfaccin a las submetas, sino ms bien como quisiramos conocer la meta inicial y la final tienen efecto. Note que la caja que se ha dibujado para cercar el procedimiento tiene que ser vista como una caja de invocacin, esto es, que hay una caja diferente para cada procedimiento, obviamente con algunos procesos recurrentes en todos los procedimiento, con diferentes llamadas y salidas en el flujo de control, pero estas para diferentes invocaciones. Por ello se les de una entero nico de identificacin a cada una de estas cajas.

2.2 Predicados bsicos de depuracin. El intrprete proporciona un rango de predicados evaluables para el control de las facilidades de evaluacin, lo ms bsicos son los siguientes: debug que coloca al modo Debug en On (usualmente est en off) a fin de tener un rango amplio de control en el flujo de informacin disponible desde el principio. Cuando el debug est en off, el sistema no recuerda los llamados hechos a procedimientos anteriormente, sino que solamente recuerda las invocaciones que se estn ejecutando. Se puede llamar a medias de una ejecucin despus de haber dado un ^C ( ver el comando trace) pero la informacin anterior no estar disponible. nodebug Pone adebug en off, y si existen puntos espas, stos sern borrados. state. Muestra el estado de debug. 2.3 Rastreo

El siguiente comando evaluable puede ser usado a fin de tener un control ms efectivo del programa que se va a depurar. trace coloca el switch debug en on, si es que no se ha hecho ya, y asegura que el siguiente tiempo de control, se desplegar un mensaje y se le pedir al usuario que interactu con el sistema. El efecto del rastreo tambin puede ser logrados tecleando un "t" despus de una interrupcin con ^C. leash(Mode) coloca el Leashing_Mode en forma de modo, donde modo puede tener cualquiera de los siguientes valores: full - prompt on Call, Exit, Redo y Fail tight - prompt on Call, Redo y Fail half - prompt on Call y Redo loose - prompt y Call off - never prompt o cualquiera otra combinacin de estos y de los puertos descritos en la seccin 4.12 El valor inicial del modo es "half", se puede cambiar si se modifica el archivo "prolog.ini".

2.4 Spy-points Para programas extensos o de cualquier extensin es prcticamente imposible que el programador siga paso a paso todo lo que esta ocurriendo en cada mdulo o en cada meta o submeta. Es por ello que se posibilita la tarea de formular puntos espas que permiten mantener un control exacto solamente en puntos clave elegidos por el usuario para el control total del programa y su curso. La seleccin del modo que se realice no tiene injerencia alguna en los puntos espas que se han elegido por parte del usuario. Los puntos espas son conjuntos de establecimientos de variables y de predicados evaluables o tambin de operadores estndares. spy X Coloca en On el modo de los puntos espas, se puede usar en cualquier predicado o punto del programa en una oracin evaluable o en una directiva establecida previamente. nospy X Funciona de manera similar a spy X pero en esta caso x es un conjunto de puntos espas definidos previamente y removidos. 2.5 Formato de los mensaje de depuracin. Se puede ver el formato que tienen exactamente y a profundidad los mensajes de error, esto permitir realizar de una manera ms eficiente las tareas de depuracin de programas al posibilitar el conocimiento de los smbolos usados en cada mensaje como este ** (23) 6 Call : foo(hello,there,_123) ?

"**" indica que es un spy-point. Si este punto no es un conjunto de puntos espas predefinidos entonces el puntero se convierte en un ">". Que da las siguientes posibles combinaciones: "**" un spy-point. "*>" un spy point con un skip la ultima vez que se estuvo en la caja " >" No es un sapy point pero si hubo un skip la ultima vez que se estuvo en la caja " " No es un spy point. Ntese que en esta caso las acciones son rastreadas a fin de mantener un centro exacto en el depurado durante el establecimiento de este tipo de mensajes. 2.6 Opciones disponibles durante la depuracin Esta seccin describe las opciones particulares que estn disponibles cuando el sistema te muestra despus de algn mensaje de depuracin. Todas las opciones son una letra como nemnico, y algunas pueden ser opcionales seguidas de un entero decimal. Algunas opciones solo requieren el terminador. La nica opcin que se hace necesaria de recordar es "h" y un ENTER, ya que es la funcin que desplegar a las siguientes funciones: <cr> creep <lf> leap <esc> skip x back to choice point r retry ; redo a abort h help w escribe meta g imprime ancestros @ comando accept [ consult user e salir de Prolog p imprime una meta d despliega una meta g <n> ultimo n ancestros b break n nodebug c creep l leap s skip q quasi skip r <n> retry goal n f fail f <n> fail goal n

Las primeras tres opciones son decisiones de control bsicas ya que son las ms frecuentemente usadas, cada una puede ser llamada con una sola tecla c <cr> Creep Causa que el intrprete se vaya de un solo paso al siguiente puerto e imprima un mensaje. Si el puerto esta atascado se le pedir al usuario acciones posteriores, de otra manera el procedimiento continuar hasta terminar en la terminal. l <lf> Leap Causa que el intrprete regrese ala ejecucin del programa, solo para cuando un punto espa se ha encontrado, o cuando el programa termina s <esc> Skip Es vlido solamente en el puerto Redo, brinca sobre una ejecucin entera o un procedimiento. El uso de esta directiva de compilacin garantiza que el control ser devuelto a la caja de control despus de la ejecucin dentro de la caja. Cuando se da un cuasibrinco o cuasiskip en donde no se ignoran los puntos espas, la opcin "t" despus de un ^C deshabilitar las mscaras. q Quasi-skip Es como skip, excepto porque este brinco no oculta a los puntos espas para la depuracin. Si existe un punto espa en la ejecucin de una meta, entonces el control regresa al punto en donde la accin se debe realizar. x Back to choice point Da la posibilidad de hacer un fail rpido, llevando al programa al punto real de decisin anterior. Cuando el usuario sabe que algo har fail, puede anticipar el punto de decisin y verificarlo rpidamente sin tener que repetir el proceso completo. Si se da una secuencia de Fails seguidos de una secuencia de Redos (o si la secuencia est vaca) se tienen mensajes estndares (como los mostrados anteriormente) excepto para los primeros dos caracteres donde ser "=>". Cuando se llama a la accin exit, la operacin de salida ocurri normalmente. r Retry Se puede usar en cualquiera de los cuatro puertos, aunque el puerto call no tenga efecto en realidad. Esto permite restablecer la invocacin cuando por ejemplo, el usuario se ha dado cuenta de que ha obtenido resultados algo raros. El estado de la ejecucin es exactamente el mismo que el alcanzado durante la ejecucin normal original. Si se proporciona un entero con el comando retry entonces se tomar como una especificacin de que el sistema trate de invocar al puerto y no a la caja actual, por supuesto que a un puerto designado por el usuario. Desafortunadamente el proceso no puede ser garantizado. Se puede suplir con cuts (!) al interior del programa. Un mensaje de error "[ ** JUMP ** ]" se desplegar en la terminal para indicar que es lo que ha ocurrido. f Fail

es similar al retry ya que transfiere el control al puerto fail desde la caja actual, en una posicin en donde se est cercado a hacer un backtracking ; Redo Puede ser llamado en una salida y forzar a mover al puesto Redo a Abort Causa que se aborte la ejecucin actual. Todas las ejecuciones se mantienen hasta que el usuario se asegura de que no las necesita conforme sube al ms alto nivel del intrprete (es equivalente al predicado evaluable abort) e Exit from Prolog Causa una salida irreversible del sistema de prolog, de regreso al Monitor (esta directiva es equivalente a Halt) h Help Despliega la tabla de opciones marcada arriba p Print goal Reimprime la meta actual usando print w Write goal Escribe la meta actual en la terminal usando write. Esto puede ser muy til cuando la lista temporal de rutinas no hace lo que se espera de ella d Display goal Despliega la meta en turno, usando display (ver Write arriba). g Print ancestor goals Provee al usuario de una lista de las metas o submetas que ya se han cumplido en la ejecucin de un programa, el orden se da en forma jerrquica hacia arriba de la secuencia que ha sido llamada. Usa los ancestros de cada predicado evaluable. Si se proporciona un entero con esta directiva entonces se despliegan n antecesores desde el punto en que el usuario ha dado la directiva. @ Accept command Permite llamar arbitrariamente a metas de Prolog, es un break de un solo paso muy efectivo, (ver mas adelante). El mensaje inicial "| :- " saldr en la terminal y el comando entonces se lee desde la terminal y se ejecuta como si el usuario estuviera en el nivel ms alto. b Break

Llama al predicado evaluable break, pone al interprete al nivel mas alto con la ejecucin aparte del modulo actual, cuando se finaliza el modo break (^Z) el sistema pregunta en que punto se hizo el rompimiento, y una nueva ejecucin se separa de la suspendida, los nmeros de invocacin comienzan a partir de 1 desde su invocacin. [ Consult user Permite insertar clausulas y regresar a donde se estaba, es lo mismo que usar "@" seguida de "[user].". n noebug Desactiva el modo debug, lo pone en Off, es la forma correcta de apagar el debug desde el modo de rastreo. No se puede usar "@" o "b" porque siempre activa el debug desde el regreso.

2.7 Consultar de nuevo durante la depuracin. Es posible y a veces es til reconsultar o releer un archivo a medias de la ejecucin de un programa. Sin embargo, esto puede ocasionar que el sistema funcione de una manera impredecible debido a las siguientes circunstancias: un procedimiento se ha ejecutado con xito, se ha redefinido por una consulta y despus se ha reactivado por un backtracking. Cuando el backtracking ocurre, todas las clausulas nuevas aparecern en el intrprete como posibilidades de alternativa de solucin an cuando se hayan usado ya clausulas o predicados exactamente iguales, as grandes cantidades de procedimientos no deseados ocasionaran backtracking. Este problema se evita si se hace el consult desde el puerto del procedimiento que ser redefinido.

CAPITULO 3. COMPILACIN El compilador Prolog DECsystem-10 produce cdigo ms compacto y eficiente, el cual funciona de 10 a 20 veces ms rpido que el intrprete de cdigo y requiere mucho menos almacenamiento en tiempo de ejecucin. Los programas compilados con Prolog, son comparados en eficiencia, con programas desarrollados en LISP ( con el compilador LISP DECsystem-10 ), para realizar las mismas funciones. En contra de esto, la desventaja es que la compilacin es varias veces ms lenta que la "consulta" y mucha de la ayuda proporcionada por el depurador, como el seguimiento, no es aplicable al cdigo compilado.

3.1 Llamando al Compilador. Para compilar el programa se usa la siguiente sentencia : |? compile (Archivos). donde "Archivos" es cualquier nombre de archivo ( incluyendo el archivo user ), o una lista de los nombres de los archivos que se desean compilar. Con esta instruccin, los procedimientos contenidos en dichos archivos sern compilados. A continuacin se muestra un ejemplo con varios archivos : |? compile ( [dbase, 'extras.pl,' user] ). Exteriormente, el efecto de "compile" es mucho muy parecido al de "reconsult". Si las clusulas para algunos predicados aparecen en ms de un archivo, el juego posterior de dichas clusulas, sobre-escribe el anterior. La divisin del programa en archivos separados no implica ninguna estructura modular ( ningn procedimiento compilado puede llamar a cualquier otro ). 3.2 Declaraciones Pblicas. Para hacer que un procedimiento compilado sea accesible por el intrprete de cdigo ( incluyendo directivas ) es necesario declarar dicho procedimiento como pblico, lo cual se realiza con el comando siguiente del compilador : :- public Predicates. donde "Predicates" es una especificacin del predicado, en la forma : Nombre / Arity , o tambin puede ser una conjuncin de especificaciones semejantes, por ejemplo : :- public concatenate/3, member/2, ordered/1, go/0. Las declaraciones pblicas pueden aparecer en cualquier parte dentro de un archivo compilado; no es necesario que las declaraciones pblicas procedan al correspondiente procedimiento, ni tampoco que estn dentro del mismo archivo. 3.3 Mezclando Cdigo Compilado y Cdigo Interpretado.

Para predicados pblicos un procedimiento compilado sobre-escribe cualquier versin interpretada previa ( cf. reconsult ). De la misma forma una reconsulta subsecuente de la versin interpretada sobre-escribir la versin compilada. Es posible tener un procedimiento compilado con el mismo nombre y arity, as como muchos y diferentes procedimientos interpretados. Suponiendo que el procedimiento compilado no fue declarado para ser pblico, los dos procedimientos nunca intervendrn el uno con el otro, es decir, el cdigo compilado utilizar la versin compilada mientras que el interpretador de cdigo usar la versin interpretada. Cuando una versin compilado se hace presente y sobre-escribe un procedimiento interpretado, ste ltimo es reemplazado por la clusula : P :- incore(P). donde "P" es el objetivo ms general para el predicado y "encore" es un predicado evaluable estndar ( anlogo a "call" ), por medio del cual son accesibles todos los procedimientos compilados para los predicados pblicos. Hay dos formas en que el cdigo compilado puede utilizar procedimientos interpretados : Si no hay clusulas compiladas para el predicado, el procedimiento interpretado es llamado automticamente. La sentencia : call( P ) , siempre llama al intrprete. Es importante hacer notar, que esto implica que deseamos llamar procedimientos compilados con "call" , deben ser declarados como pblicos. Para aclarar lo anterior vamos a ver un ejemplo : Primero compilamos el siguiente archivo: :- public f/1, g/1. f(a). g(X) :- f(X). g(X) :- h(X). No hay clusulas para h/1. Despus consultamos lo siguiente : f(b). h(c). Ahora, si nosotros llamamos a " f "obtendremos : ?- f(X). X=a; X=b; no

Esto es, nosotros usamos tanto las clusulas compiladas, como las interpretadas para " f ". De cualquier modo si llamamos a " g " : ?- g(X). X=a; X = c ; no podemos observar que " g " solo llama la versin compilada de " f ", as que la solucin : X = b , no es encontrada. La segunda clusula para " g " llama a " h ", y como no hay clusulas compiladas para " h " esta llamada es pasada al interprete, el cual encuentra una solucin : X = c. 3.4 Declaraciones de Modo. Cuando un programa va a ser compilado es conveniente incluir declaraciones de modo, las cuales informan al compilador que ciertos procedimientos sern usados en forma restringida, es decir, que algunos argumentos en la llamada siempre sern "entrada", mientras que otros siempre sern "salida". Esta informacin habilita al compilador para ser capaz de generar cdigo ms compacto y hacer un mejor uso del almacenamiento en tiempo de ejecucin. Las declaraciones de modo tambin ayudan a que otras personas comprendan la operacin del programa. Una declaracin de modo es indicada con una directiva del compilador de la forma : :- mode P(M). donde "P" es el nombre de un procedimiento y "M" especifica los "modos" de sus argumentos. M consiste de cierto nmero de "elementos de modo" ( elementos que indican el modo deseado para los argumentos ), separados por comas, una para cada posicin de los argumentos del predicado interesado. Los elementos de modo pueden ser de cualquiera de los 3 tipos siguientes : Modo + : Especifica que el argumento correspondiente en cualquier llamada al procedimiento siempre ser "entrada". Modo - : Indica que el argumento nunca ser "entrada", es decir, siempre ser "salida". Modo ? : Indica que no hay restriccin en la forma del argumento. Por ejemplo, una declaracin de modo como : :- mode concatenate(?,?,?). es equivalente a omitir completamente la declaracin. Por ejemplo, si tenemos un procedimiento llamado "encadenar" y los dos argumentos primeros, siempre sern "entradas", podemos dar la siguiente declaracin de modo : :- mode encadenar(+,+,?).

En el caso de que en el procedimiento anterior el tercer argumento siempre ser "salida", podemos reforzar la declaracin de modo como sigue : :- mode encadenar(+,+,-). Adems, esta permitido combinar varias declaraciones de modo en un solo comando, por ejemplo : :- mode encadenar(+,+,-), mode miembro(+,?), mode orden(+). Para que una declaracin de modo tenga efecto debe aparecer antes de las clusulas del procedimiento correspondiente. Cuando una declaracin de modo es violada por una llamada a un procedimiento, la forma precisa como reacciona depende del objetivo y la cabecera de la clusula. La llamada puede ser realizada con xito como si no hubiera una declaracin de modo o puede causar un mensaje de error y fracasar. Como el resultado preciso depende de los cambios en las versiones futuras del sistema, el usuario debi asumir que todas las declaraciones de modo que son violadas causaran un mensaje de error. Las declaraciones de modo son ignoradas por el intrprete. 3.5 Indexacin. En contraste con el interprete, las clusulas de un procedimiento compilado son indexadas de acuerdo al "functor" principal del primer argumento especificado en la cabecera de la clusula. Esto significa que el subconjunto de clusulas, son emparejadas con un determinado objetivo, hasta que el primer paso de la unificacin interesada, sea hallada muy rpidamente, prcticamente en un tiempo constante ( un tiempo independiente del nmero de clusulas ). Esto puede ser muy importante donde hay un gran nmero de clusulas en un procedimiento. La indexacin tambin mejora la capacidad del sistema de Prolog para detectar la determinacia, la cual es importante en la conservacin del espacio de trabajo. 3.6 Optimizacin de la cola de Recursin. El compilador incorpora "Optimizacin de la cola de recursin" para mejorar la velocidad y la eficiencia del espacio de procedimientos determinados. Cuando la ejecucin alcanza el ltimo objetivo en una clusula que pertenece a un procedimiento, y provee que no hay puntos de retroseguimiento restantes, todo el espacio de trabajo asignado a los procedimientos locales es reclamado ANTES de finalizar la llamada y cualquier estructura que fue creada es eliminada. Esto significa que el programa puede realizar varias recursiones sin necesidad de exceder el lmite en el espacio.

Por ejemplo : cycle(State) :- transform(State,State1), cycle(State1). donde "transform" es un procedimiento determinado, puede continuarse ejecutando indefinidamente, previendo que cada estructura individual "State", no sea demasiado larga. El procedimiento "cycle" es equivalente a un lazo iterativo de in lenguaje convencional. Para lograr la ventaja de la optimizacin de la cola recursiva, debemos asegurarnos que Prolog pueda reconocer que el procedimiento es determinado en el punto donde la llamada recursiva toma lugar. Dicho en otra forma, el sistema debe ser capaz de detectar que no hay otras soluciones que deben ser encontradas para el objetivo actual, mediante subsecuente retro seguimiento. En general esto esta envuelto en la indexacin del compilador Prolog DEC-10 y / o el uso de corte. 3.7 Limitaciones Prcticas. Algunas consideraciones que debemos tomar en cuenta son : Hay que tener presente que el espacio ocupado por el cdigo compilado, cuando es reemplazado, no es reclamado. Hacer que un predicado sea pblico, nos lleva a generar una cantidad significante de cdigo extra. Adems este cdigo es regenerado cada vez que el compilador es llamado ( con lo cual el espacio ocupado por el cdigo anterior no es reclamado ). Debido a esto, es conveniente, cuando sea posible, incluir en una sola llamada al compilador, todos los archivos que se desea sean compilados. La ejecucin del cdigo compilado no puede ser "rota" o "abortada", lo cual si s posible con el cdigo interpretado. Una respuesta a la peticin para "abortar", realizada con CTRL+C, solo tiene efecto en la siguiente entrada de un procedimiento interpretado. Se puede notar que hay una pausa despreciable en el inicio y terminacin de la compilacin. Esto se debe a que el compilador reside en una capa separada, la cual debe ser intercambiada

También podría gustarte