Mel'cuk und Mercury-Prolog
Proseminar
CIS, WS 2002/03

Jörg Schuster und Hans Leiß

1  Mel'cuk

Skriptum zum linguistischen Teil des Seminars

2  Was ist Mercury-Prolog?

Mercury-Prolog ist eine neue Programmiersprache, die seit 1995 an der Universität Melbourne entwickelt wird. Sie ist syntaktisch stark an Prolog angelehnt, unterstützt aber neben Relationen auch Funktionen (und höherstufige Funktionen und Prädikate), ist getypt und wird compiliert statt interpretiert.

Näheres siehe: Mercury-Homepage

Der Hauptgrund, Mercury-Prolog statt SWI-Prolog zu benutzen, ist das Typ- und Modulsystem von Mercury. Es erlaubt (und zwingt) uns, Datentypen und Modulschnittstellen festzulegen.

Das sollte die Programmierung mit mehreren Programmierern und die Fehlersuche unterstützen. Der Compiler gibt ziemlich genaue Hinweise auf Fehlerquellen. Der Preis für diese Hilfe ist, daß der Programmierer ziemlich viele Typ-, Modul-, Modus- und Determinismusdeklarationen schreiben muß.

Ein anderer Grund war, daß man mit Mercury-Prolog immer noch die DCG-Grammatiken hat, die wir zum Parsen und Matchen verwenden wollen. Wir sparen uns damit, einen eigenen Parser zu programmieren.

3  Installation von Mercury-Prolog

  1. Mercury bekommt man kostenlos über die Homepage des Mercury-Prjekts. Am einfachsten nimmt man die letze Release-Version, 0.10.1. Den Quellcode brauchen wir nicht. Man kopiert sich (unter Linux, eine Windows-Version gibt es auch)

    Unter linux ist das Installieren mit rpm -i mercury-compiler-0.10.1-1.i386.rpm (vgl. man rpm) problemlos. Man muß mindestens ein Verzeichnis <install-prefix> angeben, wohin das System installiert werden soll, z.B. /usr/lib/mercury.

    Je nachdem, ob man die Info-Seiten installiert, braucht man auch noch Pfadangaben dafür (glaube ich).

    Von den Ergänzungen aus mercury-0.10/mercury-extras-0.10.1 brauchen wir mindestens den Lexer aus mercury-extras-0.10.1/lex.

  2. Die Dokumentation, insbesondere

    werden in .html-Version unter <install-prefix>/lib/mercury/html installiert. Man kann sie auch über das Internet unter http://www.cs.mu.oz.au/research/mercury/information/documentation.html einsehen.

    (Unter <install-prefix>/doc/.. findet man auch .dvi und .ps Versionen der Dokumentation. Zur Installation der Info-Seiten s.u.)

4  Benutzung

Im Arbeitsverzeichnis, in dem man seine Programme schreibt, sollte man ein Unterverzeichnis Mercury haben, in das der Mercury-Compiler alle möglichen Hilfsdateien schreiben kann. (Sonst werden diese Hilfsdateien ins Arbeitsverzeichnis geschrieben, und man verliert den Überblick.)


    1. Eine Programmdatei <code>.m schreiben.
    2. In der Shell mmake <code>.depend aufrufen.
    3. In der Shell mmake <code> aufrufen.
    4. Fehler im Programm korrigieren und wieder 3. ausführen.
    5. Falls die Compilierung keine Fehler mehr meldet, in der Shell <code> aufrufen.

Bemerkung: Schritt 2. schreibt Hilfsdateien <code>.dep, <code>.dv in Mercury/deps und <code>.d in Mercury/ds. Schritt 3. schreibt Fehler in die Hilfsdatei <code>.err, schreibt <code>.o, <code>_init.o in Mercury/os und <code>.c, <code>_init.c in Mercury/cs.

Wenn man die Emacs-Unterstützung installiert, kann man im Menupunkt Tools durch Compile den Aufruf von mmake starten und im Minipuffer die jeweilige Ergänzung <code>.depend oder <code> angeben. (Was man nur bei neuen Compilerzielen explizit eingeben muß.)

5  Emacs-Unterstützung

  1. Man ergänze seine Datei  /.emacs wie folgt:

    ; ------------Unterstützung der Programmierung mit Mercury-Prolog--------------
    ;
    ; In welchem Verzeichnis liegt der Prolog-Modus prolog.el:
    
    (setq load-path (cons "/usr/local/lib/emacs/site-lisp" load-path))
    
    ; Beim Laden von Dateien mit Suffix .m soll Emacs in den Mercury-Mode
    ; wechseln:
    
    (setq auto-mode-alist (append '(("\\.pl$" . prolog-mode) 
                                    ("\\.pro$" . prolog-mode) 
                                    ("\\.m$" . mercury-mode))
                           auto-mode-alist))
    
    ; Um Syntax-Markierung im Emacs zu bekommen, setze: 
    (add-hook 'prolog-mode-hook 'turn-on-font-lock)
    
    ; (autoload 'run-prolog "prolog" "Start a Prolog sub-process." t)
    
    (setq prolog-system 'mercury)  ; Mercury-Prolog 0.10 (2001)
    (autoload 'mercury-mode "prolog" "Major mode for editing Mercury programs." t)
    (setq prolog-program-name nil) ; Mercury
    
    ; Damit von Fehlermeldungen automatisch an die Fehlerstelle im 
    ; Quelltext gesprungen werden kann:
    
    (defcustom prolog-use-standard-consult-compile-method-flag t
      "*Non-nil means use the standard compilation method.
    Otherwise the new compilation method will be used. The recommended setting
      for the novice user is non-nil for this variable."
      :group 'prolog-inferior
      :type 'boolean)
    

    Damit man das automatisch an die Fehlerstelle springen kann, muss aber die Fehlerausgabe im Puffer *compilation* erscheinen, nicht in de Datei <code>.err, wohin sie laut <install-prefix>/lib/mercury/Mmake.rules umgelenkt wird. Man kann im aktuellen Verzeichnis eine Kopie von Mmake.rules anlegen, in der man die Umleitung der Fehlermeldungen mit > $*.err 2> 1 beseitigt. Ob das reicht, habe ich nicht versucht.

    Stattdessen kann man auch im *compilation*-Fenster den ersten Aufruf von mmc nehmen und nach Anklicken von Compile... im Minipuffer den Teil > <code>.err 2> 1 weglassen. Dann werden die Fehler im *compilation*-Puffer erscheinen und Compile/Next error funktioniert. Nach Programmkorrekturen kann man mit Recompile diesen Aufruf wiederholen.

  2. Man kann die Dokumentation auch als Info-Seiten installieren, so daß man sie im Emacs mit C-h i Mercury zur Verfügung hat. (Ob rpm die info-Seiten unter ein Default-Verzeichnis /usr/info/mercury oder /usr/share/info/mercury installiert, habe ich vergessen.)

    Am CIS sind die Info-Seiten unter /usr/local/mercury-0.10.1/info, in der Informatik unter /soft/IFI/lang/mercury-0.10.1/iX86-unknown-linux/info.

    Damit das Info-System sie findet, muß man die Umgebungsvariable(n) INFOPATH bzw. INFODIR um diese Verzeichnisse erweitern.

6  Kursunterlagen mit Aufgaben

  1. mercury-kurs.tgz: Dokumentation (doku.dvi oder doku.ps) der bisherigen Programme mit ein paar Aufgaben, eine Installationsanleitung (genauer für den Lexer lex), und ein paar Folien.

  2. refcorp.tag: Ein Beispieltext, dessen Wörter vom CIS-Tagger mit lexikalischen Markierungen versehen sind. Die Datei ist 6.3 MB groß. Es reicht vorerst, Tests an einem kuzen Anfangstück von 30 Sätzen (50 KB) refcorp.anfang.tag zu machen.

  3. grammatik.js.ps: Die Beispielgrammatik von Jörg Schuster. Wir müssen sie aber um Merkmale erweitern, die mit dem getaggten Referenztext abgestimmt werden müssen.

  4. suche.tgz: Neueste Version mit Parsergenerator und Generator des Suchprogramms für die modifizierte Beispielgrammatik. Diese Version benutzt den Lexer von mercury-0.11.0-extras/lex/ (im Unterverzeichnis dabei), aber ansonsten mercury-0.10.1. (Mit tar -xvfz suche.tgz auspacken und dann make unpack und make suche-10 aus dem Makefile anwenden.)

    Es ist (noch) nicht allein mit mercury-0.11.0 verwendbar, weil der Reader von 0.11.0 die Pseudodeklarationen :- syncat .[<Cat1>,...,<Catn>] der Grammatik anders parst als 0.10.1.

  5. Dokumentation syntaktischeSuche.ps


File translated from TEX by TTH, version 2.54.
On 8 May 2003, 13:41.