Mercury ist eine rein deklarative Programmiersprache, die Logik- und Funktionsprogrammierung verbindet. Entwickelt wurde sie ab 1995 an der University of Melbourne von Fergus Henderson, Thomas Conway und Zoltan Somogyi. Im Gegensatz zu Prolog wird Mercury kompiliert und durch strikte Typ- und Mode-Analysen deutlich schneller — die Autoren bezeichnen sie als schnellste logische Sprache der Welt.

Modul- und Deklarationsbefehle

  • :- module — Modulnamen festlegen (Dateiname entspricht Modulnamen)
  • :- interface / :- implementation — öffentliche und interne Sektion trennen
  • :- import_module — andere Module einbinden
  • :- pred — Prädikat deklarieren (:- pred laenge(list(T), int))
  • :- mode — Argument-Modi festlegen (laenge(in, out) is det)
  • :- func — Funktion deklarieren
  • :- type — eigene Typen definieren
  • :- inst — Instanzen (Laufzeit-Informationen) beschreiben

Determinismus-Kategorien

Jedes Prädikat deklariert seine Determinismus-Klasse: det (genau eine Lösung), semidet (höchstens eine), multi (mindestens eine), nondet (beliebig viele), dazu cc_multi/cc_nondet (committed choice) sowie erroneous und failure. Diese statische Information erlaubt aggressive Optimierung und frühe Fehlererkennung.

Einstieg

:- module hallo.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
main(!IO) :-
    io.write_string("Hallo Welt", !IO).

Kompiliert wird mit dem Melbourne Mercury Compiler: mmc --make hallo.

Einordnung

Mercury erbt von Prolog die logische Programmierung und von ML/Haskell die starken Typen und funktionalen Ausdrücke. Verwandt: Prolog-Befehle — die Unterschiede liegen in Typen, Modi und Kompilierung statt Interpretation.