Gödel (programming language)

Paradigm declarative, logic John Lloyd & Patricia Hill John Lloyd & Patricia Hill 1992 1.5 / August 11, 1995 strong Unix-like Non-commercial research/educational use only Gödel with Generic (Parametrised) Modules

Gödel is a declarative, general-purpose programming language that adheres to the logic programming paradigm. It is a strongly typed language, the type system being based on many-sorted logic with parametric polymorphism. It is named after logician Kurt Gödel.

Features

Gödel has a module system, and it supports arbitrary precision integers, arbitrary precision rationals, and also floating-point numbers. It can solve constraints over finite domains of integers and also linear rational constraints. It supports processing of finite sets. It also has a flexible computation rule and a pruning operator which generalises the commit of the concurrent logic programming languages.

Gödel's meta-logical facilities provide support for meta-programs that do analysis, transformation, compilation, verification, and debugging, among other tasks.

Sample code

The following Gödel module is a specification of the greatest common divisor (GCD) of two numbers. It is intended to demonstrate the declarative nature of Gödel, not to be particularly efficient. The `CommonDivisor` predicate says that if `i` and `j` are not zero, then `d` is a common divisor of `i` and `j` if it lies between `1` and the smaller of `i` and `j` and divides both `i` and `j` exactly. The `Gcd` predicate says that `d` is a greatest common divisor of `i` and `j` if it is a common divisor of `i` and `j`, and there is no `e` that is also a common divisor of `i` and `j` and is greater than `d`.

```MODULE      GCD.
IMPORT      Integers.

PREDICATE   Gcd : Integer * Integer * Integer.
Gcd(i,j,d) <-
CommonDivisor(i,j,d) &
~ SOME [e] (CommonDivisor(i,j,e) & e > d).

PREDICATE   CommonDivisor : Integer * Integer * Integer.
CommonDivisor(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.
```