• No se han encontrado resultados

Programación lógica versus programación algorítmica

In document Logica Computacional UNED (página 134-136)

Parte II. FORMALISMOS PARA PROGRAMACIÓN

3.1 Cómo interpretar una fórmula lógica como un programa

3.1.3 Programación lógica versus programación algorítmica

La programación lógica nace a principios de los años 70 fruto de los primeros trabajos sobre demos- tradores automáticos de teoremas, que culminan con la regla de resolución publicada por Robinson en 1965. En 1972, Kowalski publica las primeras ideas acerca de cómo la lógica de primer orden podría ser usada como un lenguaje de programación. Poco después Colmerauer lleva a la práctica estas ideas con la implementación del lenguaje PROLOG (PROgramming in LOGic), el primer y más difundido lenguaje de programación lógica, cuyo intérprete primitivo se desarrolló en el lenguaje ALGOL-W (Roussel, Universidad de Marsella).

El paradigma de la programación lógica se encuadra dentro del paradigma más general de la pro- gramación declarativa, cuyo enfoque es esencialmente distinto del de la convencional programación algorítmica. Frente a los lenguajes algorítmicos (tales como Modula-2, C++, Java, etc), también llamados procedimentales o imperativos, los lenguajes declarativos no sirven para especificar cómo resolver un problema, sino qué problema se desea resolver. En la programación algorítmica un pro- grama consiste en una secuencia de instrucciones que una computadora ha de ejecutar para resolver un problema. El diseño del control de ejecución de tales instrucciones forma también parte del programa. Por el contrario, idealmente en la programación declarativa la labor del programador no consiste en codificar instrucciones explícitas, sino en especificar conocimiento y suposiciones acerca del proble- ma. Los intérpretes de los lenguajes declarativos tienen incorporado un motor de inferencia genérico que resuelve los problemas a partir de su especificación.

Entre los lenguajes declarativos se distinguen los lenguajes funcionales y los lenguajes lógicos. Mientras que en la programación funcional el mecanismo de inferencia genérico se basa en la reduc- ción de una expresión funcional a otra equivalente simplificada, en el paradigma de la computación lógica, un problema se formaliza como una sentencia lógica que ha de probarse bajo los supuestos de un sistema axiomático, que constituye el programa. La ejecución del programa consiste en la prueba de satisfacibilidad de la sentencia.

El paradigma lógico, independiente del modelo de máquina En los párrafos anteriores hemos presentado el paradigma de programación lógica en su forma más pura. Los programas lógicos no in- cluyen instrucciones explícitas de operación, considerándose que el conocimiento y las suposiciones acerca del problema, proporcionados en forma de axiomas lógicos, son suficientes para resolverlo. El conjunto de axiomas describe así la relación entre la entrada y salida del programa, y constituye la al- ternativa al programa convencional. El programador escribe el conjunto de axiomas, y el compilador o intérprete utilizado incorpora un motor de inferencia de resolución que, junto con las correspon- dientes reglas de búsqueda y computación, constituye una estructura de control única, sea cual sea el programa ejecutado. El problema que se desea resolver se formaliza como una sentencia lógica (la sentencia objetivo) que ha de probarse en el sistema axiomático que constituye el programa lógico. Su computación es un intento de resolver el problema, es decir, de probar la sentencia objetivo dados los supuestos del programa lógico o, dicho de otro modo, de ”deducir” las consecuencias del programa.

Mencionamos anteriormente que la diferencia esencial entre la programación lógica y la progra- mación algorítmica radica en que en la programación algorítmica el programador diseña el conoci- miento del problema en forma de instrucciones explícitas, y diseña también el control de la com- putación como parte esencial del programa. Existe, sin embargo otra diferencia clave entre ambos paradigmas de programación: los lenguajes algorítmicos sólo tienen significado con referencia al procedimiento que realizan en una máquina Von Neumann. La mayoría de los ordenadores modernos se basan en este modelo de máquina, caracterizado por un conjunto homogéneo de celdas de me- moria y una unidad de procesamiento con algunas celdas locales denominadas registros. La unidad de procesamiento puede cargar datos desde la memoria a los registros, realiza operaciones lógicas y aritméticas en éstos y almacena valores en la memoria. Los lenguajes de programación se han di- señado para ”comunicar” al ordenador los procedimientos de resolución de los problemas desde la perspectiva de la ingeniería del ordenador. De este modo, un programa diseñado para una máquina Von Neumann consiste en una secuencia de instrucciones encaminadas a realizar las operaciones an- teriores y un conjunto adicional de instrucciones de control. Para alguien no familiarizado con las restricciones de la ingeniería que conducen al diseño von Neuman, pensar en términos de un conjunto restringido de operaciones no resulta nada fácil. De ahí que surja la división de tareas entre el diseño de métodos de solución y la codificación o traducción de las instrucciones de los diseñadores a las instrucciones que puede ”entender” el ordenador.

Partiendo del denominado ”lenguaje máquina”, directamente comprendido por el ordenador, se han ido desarrollando formalismos y notaciones más convenientes para la expresión humana, aunque en un principio también en correspondencia bastante directa con el lenguaje subyacente de la máquina, al que los programas deben finalmente traducirse para ser ejecutados. Los lenguajes de programación lógica, por el contrario, se derivan del lenguaje abstracto de la lógica matemática, y no guardan de- pendencia ni relación directa con ningún modelo de máquina. La lógica proporciona un lenguaje preciso para expresar explícitamente los objetivos, conocimiento y presunciones característicos de un problema, en términos más cercanos a los que un ser humano utiliza en sus razonamientos. De este modo, no obliga al programador a pensar en términos de las operaciones de un ordenador.

El compromiso entre programación lógica y procedimental La indiscutible ventaja de dejar el control de la ejecución al completo cuidado de un intérprete tiene, no obstante una importante contra- partida. Obviamente, por muy eficiente que sea un compilador de programas lógicos, su predetermi- nada estructura de control nunca podrá equipararse a una estructura específicamente concebida para una cierta computación. Los investigadores en programación lógica han explorado los compromisos entre la pura lógica declarativa y las construcciones procedimentales que permiten a los programado- res escribir programas de eficiencia razonable frente a la de los lenguajes procedimentales.

3.2. Formalismo lógico para la representación de problemas 125

In document Logica Computacional UNED (página 134-136)