Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso de Programacion Usando Prolog
Curso de Programacion Usando Prolog
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
1.1 Comienzo
Para correr el intérprete de Prolog, se deberá teclear el siguiente comando:
.r prolog
El intérprete responde con un mensaje de identificación 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 intérprete estará ya esperando que el usuario ingrese cualquier
comando por ejemplo: una pregunta o una orden (ver sección 1.4). No se pueden introducir
cláusulas inmediatamente (ver sección 1.3). Este estado se llama nivel alto del intérprete.
Mientras que se teclea un comando, el indicador permanecerá de la siguiente manera:
"| ".
El indicador "?-" aparecerá solamente en la primera línea.
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
1.11 Inicialización
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, sería 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 también
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'.
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
2.3 Rastreo
El siguiente comando evaluable puede ser usado a fin de tener un control más 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 despliegará un mensaje y se le pedirá al usuario que
interactue con el sistema. El efecto del rastreo tembién puede ser logrados tecleando
un "t" después de una interrupción 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 combinación de estos y de los puertos descritos en la sección 4.12
El valor inicial del modo es "half", se puede cambiar si se modofica el archivo "prolog.ini".
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
2.4 Spy-points
Para programas extensos o de cualquier extensión es practicamente imposible que el
programador siga paso a paso todo lo que esta ocurriendo en cada módulo o en cada meta o
submeta. Es por ello que se posibilita la tarea de formular puntos espías que permiten
mantener un control exacto solamente en puntos clave elejidos por el usuario para el
control total del programa y su curso.
La selección del modo que se realice no tiene ingerencia alguna en los puntos espías que se
han elegido por parte del usuario.
Los puntos espías son conjuntos de establecimientos de variables y de predicados
evaluables o también de operadores estándares.
spy X Coloca en On el modo de los puntos espías, se puede usar en cualquier predicado o
punto del programa en una oración 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
espías definidos previamente y removidos.
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
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 serán usados en forma
restringida, es decir, que algunos argumentos en la llamada siempre serán "entrada",
mientras que otros siempre serán "salida". Esta información habilita al compilador para
ser capaz de generar código más compacto y hacer un mejor uso del almacenamiento en
tiempo de ejecución. Las declaraciones de modo también ayudan a que otras personas
comprendan la operación del programa.
Una declaración 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 número de "elementos de modo" ( elementos que indican
el modo deseado para los argumentos ), separados por comas, una para cada posición 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 restricción en la forma del argumento. Por ejemplo, una
declaración de modo como :
:- mode concatenate(?,?,?).
es equivalente a omitir completamente la declaración.
Por ejemplo, si tenemos un procedimiento llamado "encadenar" y los dos argumentos
primeros, siempre serán "entradas", podemos dar la siguiente declaración de modo :
:- mode encadenar(+,+,?).
En el caso de que en el procedimiento anterior el tercer argumento siempre será "salida",
podemos reforzar la declaración de modo como sigue :
:- mode encadenar(+,+,-).
Además, esta permitido combinar varias declaraciones de modo en un solo comando, por
ejemplo :
:- mode encadenar(+,+,-), mode miembro(+,?), mode orden(+).
Para que una declaración de modo tenga efecto debe aparecer antes de las cláusulas del
procedimiento correspondiente. Cuando una declaración de modo es violada por una
llamada a un procedimiento, la forma precisa como reacciona depende de el objetivo y la
cabecera de la cláusula. La llamada puede ser realizada con éxito como si no hubiera una
declaración 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 interprete.
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice
3.5 Indexación.
En contraste con el interprete, las cláusulas de un procedimiento compilado son indexadas
de acuerdo al "functor" principal del primer argumento especificado en la cabecera de la
cláusula. Esto significa que el subconjunto de cláusulas, son emparejadas con un
determinado objetivo, hasta que el primer paso de la unificación interesada, sea hallada
muy rápidamente, prácticamente en un tiempo constante ( un tiempo independiente del
número de cláusulas ). Esto puede ser muy importante donde hay un gran número de
cláusulas en un procedimiento.
La indexación también mejora la capacidad del sistema de Prolog para detectar la
determinacia, la cual es importante en la conservación del espacio de trabajo.
http://proton.ucting.udg.mx/tutorial/prolog/index.htm -
indicehttp://proton.ucting.udg.mx/tutorial/prolog/index.htm - indiceRegresar al Indice