Introducción a la Lógica, Curso 2006/2007 Programación Lógica: Introducción y Sintaxis Básica Prolog Prolog es un lenguaje declarativo e interpretado. Esto quiere decir que el lenguaje se usa para representar conocimientos sobre un determinado dominio y las relaciones entre objetos de ese dominio. A partir de ese conocimiento, el propio sistema deduce respuestas a cuestiones que se le planteen, es decir, realiza una inferencia. El dominio lo constituyen un conjunto de objetos y el conocimiento se formaliza mediante un conjunto de relaciones (reglas) que describen de forma simultánea propiedades de los objetos y sus interacciones. Por tanto, escribir un programa de Prolog consiste en declarar el conocimiento disponible acerca de: • Objetos: tanto sus propiedades (por ejemplo, X es par, X es un hombre) como las relaciones entre ellos (por ejemplo, X es múltiplo de Y, X es padre de Y). • Reglas: determinan interacciones lógicas entre los objetos, del tipo “si ocurren q y r, entonces ocurre p”. La ventaja de este tipo de lenguaje frente a lenguajes procedimentales (como Java) es que no hay que preocuparse de cómo resolver algo; la desventaja es que la resolución automática no siempre es eficiente. SWI Prolog La sintaxis empleada en SWI-Prolog v5.2 sigue tanto el estándar de tipo Edimburgo como el ISO-Standar. Esta herramienta, aparte de proporcionar un entorno de trabajo en el que se permiten interpretar programas Prolog también incluye opciones de compilación pudiendo generar un ejecutable independiente, así como la posibilidad de combinar Prolog con lenguaje C mediante un potente interfaz bidireccional que permite generar ejecutables tanto desde C como desde Prolog incorporando código en ambos lenguajes. SWI-Prolog proporciona un entorno de desarrollo en Prolog multiplataforma (Windows y Linux, entre otros) y además gratuito, disponible en su página web: http://www.swi-prolog.org . Entorno de trabajo El entorno de trabajo está formado por diversos módulos. En primer lugar la ventana principal que es la consola que actúa como intérprete de comandos. Permite plantear, mediante el prompt, consultas (goals) al sistema. En ella se presentan las soluciones a los objetivos planteados, los errores de compilación y permite introducir cualquier comando en Prolog. Para la edición de los documentos proporciona una versión del editor Emacs. Edición de programas Proporciona una versión de Emacs, para activarlo deberemos lanzar el objetivo: emacs. o emacs(nombre_fichero): :- emacs. :- emacs(pract1). 1/4 Introducción a la Lógica, Curso 2006/2007 Este editor es sensible a contexto con lo que nos resaltará la sintaxis de nuestro código fuente, y nos facilitará darle formato con opciones de sangrado automático. Desde este editor podremos no sólo editar, sino también compilar y lanzar el depurador de código. Todo ello a través de sus opciones de menú. Para editar un archivo ya existente utilizamos la opción File| Find file. Los programas en código fuente de Prolog vienen en archivos de texto (con extensión .pl) en formato ASCII. Sintaxis (Básica) Acabamos ver que SWI-Prolog trabaja con archivos de texto en formato ASCII. Cada archivo contiene un programa o un módulo de sentencias Prolog. La composición básica de un programa Prolog viene dada por dos secciones, ambas opcionales: • Cláusulas : Cláusulas definidas del programa (hechos y reglas) • Comandos : Objetivos a plantear al sistema Veamos con más detalle cada una de ellas. Cláusulas Las cláusulas del programa constan de los hechos y las reglas, terminados con un punto cada uno. Los predicados no se declaran, con lo que los tipos de sus argumentos pueden variar de una invocación a otra. Obviamente si se emplean operadores propios de un tipo de datos (por ejemplo, aritméticos) sobre otro tipo (constantes simbólicas en vez de números) se producirá un error de ejecución. Sintaxis: Hechos: nombre_predicado(arg1,… , argn). Reglas: nombre_predicado(arg1,…,argn):− pred1(...),...,predm(...). NOTA: Los hechos y reglas con el mismo nombre deben de ir correlativos en el programa. NOTA2: No puede haber espacios entre el nombre de predicado y el carácter ‘(‘. Comentarios: /* comentarios tipo C */ % comentario de una línea Dominios (tipos) de argumentos Los principales dominios reconocidos por SWI-Prolog son: Enteros Enteros de 32bits con signo. 0 1 9821 -10 –64320 Reales Números reales, admiten formato científico. 1.0 246.8 -12.3 20.002e-10 -3.3e20 Átomos alfanuméricos Comienza con una letra (a-z) minúscula seguido por una secuencia de cero o más caracteres alfabéticos (A-Z,a-z) o (_). 2/4 Introducción a la Lógica, Curso 2006/2007 Ej: manzana a1 caso_1 tarta_de_manzana miCasa Átomos simbólicos Secuencia de símbolos, y caracteres con ASCII > 127. Caracteres simbólicos son: # $ & = - ^ ~ \ @ ` : . / + * ? < > Ej: & &: ++ << >> <- .. *-/* Átomos literales Secuencia de caracteres entre comillas simples (' '). La secuencia ~nnn representa el carácter con código ASCII nnn. ~I, representa ctrl-I. Para insertar un ' en un átomo se introducen dos ' seguidos. Ej:'Manzana' '123' 'hola mundo' '~Ihol~065~M~J'(<tab>hola<CR><LF>) Variables Las variables son cadenas alfanuméricas cuyo primer carácter es una letra mayúscula o el guión de subrayado ‘_’. ej: X, A, Titulo, _Sys01, Temperatura, Altura. Comandos Un comando es un Goal (objetivo) de la forma: :- goal1,…, goaln. % n>=1 Cuando el intérprete se encuentra con un objetivo durante la compilación, éste es ejecutado inmediatamente. Ej: :- abuelo(X,Y). :- write('Hola Mundo!'),nl. Los objetivos así planteados se diferencian de los objetivos planteados directamente desde la consola en dos aspectos: 1. Prolog busca sólo la primera solución para ellos. 2. Prolog no muestra el resultado de resolver estos objetivos. Compilación Para poder plantear un objetivo es necesario compilar previamente el programa Prolog. Además, debemos compilar cada vez que introducimos algún cambio o corrección en el código fuente. Para ello seleccionamos la opción de compilación Compile|Compile buffer. Como resultado de la compilación: • Si no hubo errores se nos muestra en la consola el mensaje: % path_absoluto/de/nombre.pl compiled X sec, N bytes | ?- 3/4 Introducción a la Lógica, Curso 2006/2007 • Si se detecta algún error se muestra un cuadro de mensaje con la lista de errores encontrados. Cada elemento de la lista es un enlace a la posición del programa donde se identificó el error, a la que accederemos directamente por medio de un doble clic. También es posible cargar las definiciones de un archivo .pl en memoria desde la consola por medio del predicado consult(archivo.pl) o la opción File|Consult. Consulta de Objetivos (GOALS) Una vez compiladas las cláusulas del programa, podemos pasar a plantear preguntas (goals) al sistema. Para ello basta con introducir en el prompt de la consola los objetivos que queramos plantear. Ej: | ?- abuelo(X,Y). | ?- write('Hola Mundo!'),nl. Si un objetivo tiene más de una solución, Prolog nos muestra la primera y espera que pulsemos una tecla. Si pulsamos la tecla ‘n’ (Next) nos mostrará la siguiente, si pulsamos <space> no buscará más soluciones. Para interrumpir la evaluación de un objetivo basta con pulsar la combinación <Crtl>+C y luego a (Abort). Ayuda en Línea La opción del menú Help|Online Manual nos muestra la ayuda en línea del SWI-Prolog. Contiene información de referencia de los predicados predefinidos, errores y mensajes del sistema de ventanas. 4/4