Contenido

1. Introducción a Gödel 

Gödel es un lenguaje de programación declarativo y de propósito general de la familia de los lenguajes de programación lógica. Es un lenguaje fuertemente tipificado, el sistema de tipificación se basa en muchos tipos de lógica con polimorfismo paramétrico. Tiene un sistema de módulos. Gödel soporta una precisión infinita números enteros, racionales de precisión infinita, y también números de punto flotante. Puede resolver restricciones sobre dominios finitos de enteros y también restricciones racionales lineales. Soporta el procesamiento de conjuntos finitos. También tiene una regla de cálculo flexible y un operador de poda que generaliza el compromiso del lenguaje de programación lógica concurrente. Se hace un énfasis considerable en la meta-lógica de Gödel instalaciones que proporcionan un apoyo significativo a los meta-programas que hacen análisis, transformación, compilación, verificación, depuración, etc. El carácter declarativo de Gödel lo hace particularmente adecuado para su uso como lenguaje de enseñanza; reduce la brecha que existe actualmente entre la teoría y la práctica en la programación lógica; hace posibles herramientas avanzadas de ingeniería de software tales como depuradores declarativos y generadores de compilación; reduce el esfuerzo que supone proporcionar una aplicación paralela del lenguaje; y ofrece un margen sustancial para la paralelización en tales implementaciones.

1.1 Documento de Gödel

El lenguaje Goedel fue diseñado por P.M. Hill y J.W. Lloyd, y el lenguaje fue implementado por A. Bowers y J. Wang. SAGE fue escrito por Corin Gurr. A continuación, su documento creado en octubre de 1992 ,

Enlace de descarga

1.2 Ventajas

Gödel es un lenguaje de programación declarativo y de propósito general de la familia de los lenguajes de programación lógica. Sus principales facilidades son las siguientes:

1.3 Comparación con Prolog

Por el momento, la mayoría de los lenguajes de programación lógica prácticos se basan en un número significativo de características no lógicas para las que no hay una semántica útil. Al reducir en gran medida su dependencia de características no lógicas, Gödel proporciona así un puente sólido entre la teoría y la práctica. En tercer lugar, el El hecho de que los meta-programas de Gödel sean declarativos hace posible algunas aplicaciones deseables. Uno de estos es construir un compilador-generador evaluando parcialmente un evaluador parcial (autoaplicable) con respecto a sí mismo como entrada. Otra aplicación de este tipo es el uso de un depurador declarativo para depurar los programas de Gödel. La depuración declarativa es una atractiva técnica de depuración que sólo requiere que el programador conozca la interpretación prevista de un programa para localizar ciertos bichos. En particular, no es necesario conocer el comportamiento procesal del sistema Gödel. En cuarto lugar, Gödel permite más fácilmente una implementación paralela ya que sólo hay un par de características no lógicas que complican las cosas. Por último, dado que el lenguaje tiene tan pocas características (a saber, entrada/salida y poda) que tienen efectos secundarios o tienen efectos globales en un árbol de búsqueda, hay es muy poco para impedir innecesariamente la explotación del paralelismo en los programas.

Un lenguaje de alto nivel es aquel que proporciona conceptos tan cercanos como sea posible a los que la gente gusta de usar para expresar sus pensamientos e ideas. Un lenguaje expresivo es aquel que proporciona conceptos que pueden ser utilizados para modelar situaciones del mundo real de manera fácil y concisa. Un lenguaje eficiente es aquel en el que los programas típicos se ejecutan a velocidades y costos de memoria similares a los de los lenguajes de la competencia. Un lenguaje práctico es aquel que puede ser usado para aplicaciones a gran escala en el mundo real. Un lenguaje con una semántica simple es aquel para el cual los programadores pueden verificar y depurar fácilmente sus programas y estar seguros de la corrección de las transformaciones, optimizaciones, etc. de los programas.

Prolog ha demostrado ser un gran éxito en una amplia variedad de áreas de aplicación. Este éxito se debe sin duda al hecho de que Prolog es de alto nivel, expresivo, eficiente y práctico. La importancia y el uso generalizado de Prolog está bien justificado por estas propiedades. Sin embargo, la semántica de Prolog (y por Prolog nos referimos al lenguaje de programación práctico tal como se encarna en los sistemas Prolog actualmente disponibles, y no a los subconjuntos puros idealizados estudiados en, por ejemplo) es mucho menos satisfactoria. Los problemas con la semántica son numerosos y bien conocidos: la falta de comprobación de la ocurrencia, el uso de negación insegura, el uso de predicados no lógicos, como var, nonvar, assert, y retractarse, el uso indisciplinado del corte, y así sucesivamente. Estos aspectos problemáticos de Prolog causan muchos programas prácticos de Prolog para no tener ninguna semántica declarativa y tener innecesariamente una semántica procesal complicada. Esto significa que el análisis, la transformación, la optimización, y la depuración de muchos programas Prolog es extremadamente difícil.

1.4 Ejemplo

El siguiente ejemplo de módulo Gödel es una especificación del máximo común divisor (MCD) de dos números. Su objetivo es mostrar la naturaleza declarativa de Gödel, pero no es particularmente eficiente. El predicado DivisorComun dice que si i y j no son cero, d es un divisor común de i y j si está entre 1 y el menor entre i y j y divide a los dos en forma exacta. El predicado Mcd dice que d es el MCD de i y j si es un divisor común de i y j y no existe e que sea también divisor común de i y j y sea mayor que d.


MODULE      MCD.
IMPORT      Integers.
 
PREDICATE   Mcd : Integer * Integer * Integer.
Mcd(i,j,d) <- 
           DivisorComun(i,j,d) &
           ~ SOME [e] (DivisorComun(i,j,e) & e > d).
 
PREDICATE   DivisorComun : Integer * Integer * Integer.
DivisorComun(i,j,d) <-
           IF (i = 0 \/ j = 0)
           THEN
             d = Max(Abs(i),Abs(j))
           ELSE
             1 =< d =< Min(Abs(i),Abs(j)) &
             i Mod d = 0 &
             j Mod d = 0.

Esperamos que el tutorial haya sido de su agrado.

Este tutorial fue desarrollado por Luis gerson Avendaño Alvira.