* Líneas generales para resolver los problemas en Prolog El siguiente es una serie de apuntes para guiar a la alumna[1] de lenguaje Prolog en su forma de encarar la resolución individual de ejercicios en dicho lenguaje. El objetivo central de estos textos es describir una serie de caminos de pensamiento que han resultado exitosos a la hora de escribir los programas que aparecen en los parciales y finales de la materia Paradigmas de Programación. El autor principal es César Ballardini , y una larga lista de colaboradores que seguramente vendrán :-) [1]: En este texto se utilizará el género femenino para referirse a quien estudie Prolog. No se debe inferir ninguna intención sexista de esto, y cada vez que se lea el género elegido, se deberá interpretar sin hacer referencia a ningún sexo en particular. Cada texto debe tomar una decisión sobre el género de quien lo lee, y demasiadas veces se elige el masculino; la selección del género femenino aquí intenta corregir dicho desbalance. ** Debe leer las cuestiones introductorias Los conceptos de término; cláusula; regla; cabeza y cola de una regla, y el algoritmo de control que usa el intérprete de Prolog le deben ser familiares. Cualquier libro de Prolog, como por ejemplo: - Programación en Prolog, de Clocksin y Mellish - The Art of Prolog, de Shapiro - @@@ El libro de Tasistro tienen en sus primeros capítulos las definiciones y ejemplos de estas cuestiones. Asegúrese de entender cómo funciona Prolog cuando recorre su base de reglas y/o hechos. Esto es crucial para el desarrollo de los programas en un inérprete que se comporta tan diferente de lo que la alumna seguramente ha visto antes. En el archivo 05-convenciones.txt se explica la notación que se seguirá para describir los predicados en el texto. ** Debe comprender como usar su entorno de trabajo Prolog El entorno de trabajo está compuesto por las siguientes partes, desde el punto de vista de la alumna de Prolog: - el editor de programas - las facilidades de depuración Algunos intérpretes tienen incorporado un editor de programas, y otros usan un editor externo. La opción es más bien de gusto personal. Una forma de trabajar que me ha dado muy buen resultado es usar un editor externo que manejo con soltura, utilizar la característica de la implantación que permite ejecutar cierto objetivo especial al inicio de un programa, y llamar al intérprete desde dentro del editor. Las facilidades de depuración merecen un artículo aparte, para cada implantación. El modelo de cajas de @@@ es una descripción de alto nivel del funcionamiento paso a paso del intérprete, y la alumna debe poner especial atención a esto. La programación de computadoras tiene un componente de depuración que va desde un 40 á un 80% (si tomamos a la etapa de mantenimiento como un caso especial de depuración). Algunos programas Prolog usan las características lógicas del motor para resolver los problemas de una manera declarativa y elegante. En mi humilde experiencia, la mayoría de las veces la programadora lucha contra el motor de inferencias para lograr la secuencia de ejecución que tiene en mente. Si la lectora tiene experiencia en el manejo de algún entorno Prolog y desea escribir un tutorial sobre el editor y las facilidades de depuración, su aporte será más que bienvenido. Puede ver el caso de GNU Prolog en el archivo 02-depuracion-gprolog.txt ** Use mucho de programación funcional Cuando una ve la solución al problema de calcular factoriales en Prolog y la compara con la solución en Lisp, se aprecia la gran influencia que tiene la programación funcional en la programación en Prolog. Aproveche esta circunstancia, ya que usted ha programado en Lisp antes. Un truco sencillo para escribir muchos programas en Prolog es pensar primero como resolverlo en Lisp. Si hay una forma de resolverlo de manera funcional pura y mediante algún algoritmo recursivo, es muy probable que una mera transcripción de dicho algoritmo sea también la solución en Prolog. La mayoría de los programas que tienen que ver con listas sigue este patrón de pensamiento. Puede ver que cada predicado Prolog en general tiene la forma de varias cláusulas, cada una con una cabeza y una cola: fac(0, 1). fac(N, R) :- N1 is N - 1, fac(N1,R1), R is R1 * N. Para entender como se ejecuta esto, debemos efectuar una "llamada", por ejemplo: -? fac(4,X). El motor del intérprete toma el predicado fac/2 y lo interpreta como si siguiera el siguiente seudocódigo: Definir fac(Entrada, Salida) Si (Entrada == 0) Entonces Salida <- 1 Retornar SiNo N1 <- N - 1 fac(N1, R1) Salida <- R1 * N Retornar FinSi FinDefinir Estamos ignorando el caso de una llamada del estilo fac(X,6), o una del estilo fac(X,Y), por el momento. Estos estilos de llamada en los cuales cualquier argumento, o todos ellos pueden ser argumentos de entrada y/o de salida son los estilos absolutamente declarativos, o más "puros" desde el punto de vista lógico. Si bien tienen un gran atractivo por su elegancia, no son cruciales para resolver los ejercicios de parciales y finales, así que no le prestaremos tanta atención ---al menos al principio. ** Utilice programación guiada por las comprobaciones La programación guiada por comprobaciones es aquella en la cual se escribe el código de forma modular, y cada modulo debe responder a un conjunto de comprobaciones escritas previamente. Dado un enunciado, se plantea una división en módulos del programa solución. Cada módulo estará compuesto por uno o más predicados, que deben satisfacer un cierto criterio de correctitud. Se procede a escribir casos de prueba ---pares de entradas/salidas correctas--- y se pone en su lugar la maquinaria necesaria para correr las comprobaciones de manera automática. Hasta ahora no se ha programado ninguno de los predicados del módulo, sino que sólo se escriben "esqueletos" de los predicados para permitir correr la comprobación. Una vez que la máquina de comprobar está en su lugar, se procede a escribir los predicados del módulo, y se corren las comprobaciones. Cuando todas las comprobaciones pasan satisfactoriamente, se da por concluída la tarea de desarrollo del módulo. Esto se repite con cada módulo. Al final de la escritura de los módulos, se toma a el sistema como un todo, y se escriben comprobaciones a nivel de sistema. Estas comprobaciones se corren, y se depura hasta que todas pasan satisfactoriamente. Note que al trabajar de esta manera se favorecen las soluciones basadas en predicados intermedio o auxiliares, que cada predicado haga una sola tarea, y que las interfaces entre predicados sean reducidas. La programación guiada por comprobaciones no es lo mismo que prueba y error. La programación guiada por comprobaciones exige que determinemos con anticipación la interfaz y responsabilidad (en la forma de lotes de pruebas) para cada parte importante de nuestro programa. La prueba y error es un sistema de tanteos hasta que se termina el tiempo; el tanteo carece de una manera de saber si ya logramos lo que necesitamos. ** Las cuestiones lógicas La asignatura Paradigmas de Programación propone un conjunto de primitivas "canónicas" que se pueden usar a lo largo de los ejercicios de práctica, y en parciales y finales. Toda otra primitiva de Prolog, aún cuando forme parte del estándar ISO, no está permitida. Consulte el archivo @@@ 04-primitivas-canonicas.txt para un tratamiento más extenso de esto. Hay primitivas no lógicas, o sea, que tienen efectos no lógicos. Todas estas primitivas (con la excepción del is/2) están prohibidas en la asignatura. Sin embargo, resultan útiles para el trabajo en máquina. Por ejemplo, si deseamos escribir en la pantalla un resultado intermedio, la propia escritura en pantalla es de tipo no lógico, pues lo que se busca es efectivamente un efecto lateral: que los caracteres se muestren, y no comprobar la veracidad de un hecho. A lo largo de estos textos se usarán aquellos predicados no lógicos que sean necesarios para que la alumna pueda "ver" como funciona su programa "espiando" los valores de ciertas variables durante la ejecución. En un intérprete Prolog se deja en manos de la implementación la forma de expresar la meta de más alto nivel. Cada implantación de Prolog escoge un mecanismo para decidir cuál será el objetivo a verificar cuando se cargue un programa Prolog desde un archivo. Esto también es no lógico y dependiente de la implantación, y no entra en el contenido de la asignatura, pero se lo verá a los fines de facilitar el trabajo en máquina y las etapas de depuración y comprobaciones. ** Implantaciones de Prolog Todo programa de computadora es una obra de autor en el sentido del artículo @@@ 17 de la Constitución Argentina, la ley 11.723 de derecho de autor, y @@@ poner las otras leyes y decretos relacionados. O sea que la utilización de un programa de computadora es como la puesta en escena de una obra de teatro: el autor de la obra es el que impone una licencia de cómo se puede usar su obra. Esto es independiente de sus características ténicas, o de la función para la cual fue escrito el programa. Cuando debemos elegir un programa, la principal cuestión entonces es cómo quiero usar el programa, y su consecuencia es la clase de licencias que me puedo permitir aceptar. Por ejemplo, si un programa se puede usar en ámbitos educativos sin cargo pero para usarlo en ambientes comerciales se hace necesario un desembolso importante, puede que me resulte inconveniente su aprendizaje: cuando quiera aplicar comercialmente lo que he aprendido, me veré a buscar otra alternativa y aprenderla a su vez. Sin desmerecer el asunto del precio, en un ámbito educativo el criterio más importante debe ser la capacidad de aprender que me proporciona un programa que uso. En el caso de una carrera universitaria en sistemas de información, el uso de programas cerrados es análogo a aprender mecánica manejando automóviles cuyo capot viene soldado del fábrica y es ilegal desoldar. También de mayor importancia que el precio está la cuestión de la ética del docente y de la alumna. No estoy de acuerdo en que se deban usar programas copiados sin respetar sus licencias para dictar una materia en una universidad pública. En mi opinión los alumnos no deberían aceptar trabajar con programas que restrinjan sus libertades de aprendizaje. Existen soluciones de software libre (http://www.gnu.org/@@@ free-software) apropiadas para el aprendizaje de Prolog. Me centraré en estas soluciones cuando se requiera hacer cosas que dependan de la implantación. La asignatura Paradigmas de Programación centra el aprendizaje de Prolog en las características "puras" del lenguaje, o sea las que no implican la aparición de "efectos no lógicos" o laterales. Este subconjunto del lenguaje Prolog no difiere en las implantaciones de los intérpretes particulares, razón por la cual no es tan importante cuál el el intérprete en particular que se elija para aprender. A continuación hay una lista de implantaciones de Prolog para diferentes sistemas operativos, con su licencia y URL donde conseguir más información. @@@ EOF