home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / language / prolog68.zoo / doc / liesmich next >
Text File  |  1992-02-23  |  21KB  |  643 lines

  1. -------------------------------------------------------------------------------
  2.  
  3.  
  4.        /¯¯¯¯¯)          /¯)                /¯¯¯¯¯) /¯¯¯¯¯)
  5.       / /¯) /         / /               / ____/ / /¯) /
  6.      / (_/ /        / /              / /      / (_/ /
  7.     / ____/ /¯¯¯¯) /¯¯¯¯¯) / / /¯¯¯¯¯) /¯¯¯¯¯) /¯¯¯) /  ¯¯¯) /     /
  8.        / /     / /¯¯¯ / /¯) / / / / /¯) / / /¯) / (___/ / /¯) / / /¯) /
  9.       / /     / /    / (_/ / / / / (_/ / / (_/ /       / (_/ / / (_/ /
  10.      (_/     (_/    (_____/ (_/ (_____/ (___  /       (_____/ (_____/
  11.                        / /
  12.                       /¯¯¯¯ /
  13.                      (_____/
  14.  
  15.                 (Vorab-Version)
  16.  
  17.  
  18.  
  19.          © Copyright 1989,1990,1991,1992 Jens Kilian
  20.                Alle Rechte vorbehalten
  21.  
  22.  
  23. -------    Inhaltsverzeichnis ----------------------------------------------------
  24.  
  25.     DEMO            Demonstrationsprogramme
  26.         QUEENS.PL
  27.         RANDOM.PL
  28.         WORM.PL
  29.  
  30.     CODES            Vorübersetzte Versionen von Compiler und
  31.         BUILTINS.WAM    Laufzeitsystem
  32.         DEBUGGER.WAM
  33.         DRIVER.WAM
  34.         DSTRUCT.WAM
  35.         ENCODER.WAM
  36.         INDEXER.WAM
  37.         LIBRARY.WAM
  38.         SHELL.WAM
  39.         TMPALLOC.WAM
  40.         XLATOR.WAM
  41.  
  42.     DOC
  43.         LIESMICH        Dieses Dokument (deutsche Version)
  44.         README        Dieses Dokument (englische Version)
  45.         PROLOG68.DVI    Vorläufige Dokumentation
  46.  
  47.     INIT.WAM        Initialisierungsdateien
  48.     PROLOG.LST
  49.  
  50.     WAM.TOS         Hauptprogramm (Emulator, Systemfunktionen)
  51.  
  52. -------    Kurzbeschreibung ------------------------------------------------------
  53.  
  54.   Diese Diskette enthält die Vorabversion 0.9.126 von Prolog-68, einem neuen
  55. Prolog-System für den ATARI ST. Wenn das Programm fertiggestellt ist, wird es
  56. als freie Software (NICHT als Public-Domain-Software !) zusammen mit dem
  57. Quellcode öffentlich zugänglich sein.
  58.  
  59.   Die vorliegende Version darf frei verbreitet, aber NICHT verändert oder
  60. kommerziell genutzt werden. Als kommerzielle Nutzung gilt auch der Vertrieb
  61. über einen Public-Domain-Versand, sofern die erhobene Gebühr für den Versand
  62. einer Einzeldiskette die Summe aus Diskettenpreis und Versandkosten um mehr
  63. als DM 2,- übersteigt.
  64.  
  65. Noch einmal:    Dies ist eine Vorabversion, d.h. daß ich noch nicht einmal
  66.         dafür garantiere, daß die hier gemachten Aussagen zutreffen !
  67.  
  68.   Prolog-68 basiert auf der `Warren Abstract Machine'; es enthält einen (in
  69. Prolog geschriebenen) Compiler, der die Programmklauseln in einen Zwischencode
  70. übersetzt. Der Zwischencode wird als `direct threaded code' gespeichert und von
  71. einem Simulator abgearbeitet. Das Systemm erreicht so eine Geschwindigkeit
  72. von 12 kLIPS unter dem 'nrev'-Benchmark, was für Prolog auf dem Atari ST einen
  73. durchaus annehmbaren Wert darstellt. Das Programm wurde auf einem Atari ST mit
  74. 4MB Hauptspeicher getestet, sollte aber auf allen ST-Modellen mit
  75. 68000-Prozessor (!) lauffähig sein. Wie üblich gilt für den verfügbaren
  76. Speicher `mehr ist besser'; benötigt werden mindestens 250 KByte, um das
  77. Programm überhaupt laden zu können. Die Dateien im Ordner 'CODES' enthalten
  78. eine bereits übersetzte Version des Compilers und der Benutzerschnittstelle.
  79. DIESE DATEIEN DÜRFEN AUF KEINEN FALL VERÄNDERT WERDEN !
  80.  
  81.   Da weder Compiler noch Laufzeitsystem fertig sind, muß der Benutzer momentan
  82. auf Datenbankfunktionen ('assert', 'retract') und einige andere Features
  83. verzichten. Außerdem sind die Namen der Prädikate des Compilers offen sichtbar
  84. (jedenfalls für ein Programm), so daß man den Compiler durch Benutzung
  85. von 'consult' wunderbar zerschießen kann.
  86.  
  87. -------    Bekannte Fehler -------------------------------------------------------
  88.  
  89.   Die vorliegende Version 0.9.126 hat folgende Fehler, die in zukünftigen
  90. Versionen behoben sein werden:
  91.  
  92.     * erase/1 gibt den Speicher für gelöschte Terme nicht wieder frei
  93.  
  94. -------    Vordefinierte Prädikate -----------------------------------------------
  95.  
  96.   Ich bemühe mich, ein möglichst vollständiges Prolog zu erstellen, das zu den
  97. Standard-Dialekten wie Prolog-10 und Quintus Prolog weitgehend kompatibel ist.
  98. Die meisten vordefinierten Prädikate sind bereits implementiert, können aber
  99. hier nur kurz beschrieben werden:
  100.  
  101.     - Steuerung:
  102.  
  103.     ','/2
  104.     ';'/2
  105.     '!'/2            (s.u.)
  106.     '->'/2            (s.u.)
  107.     call/1
  108.     '\+'/1            (wie not/1 in TOY Prolog)
  109.     true/0
  110.     otherwise/0        (= true/0)
  111.     fail/0
  112.     false/0         (= fail/0)
  113.     repeat/0
  114.     if_exception/3        (Fehlerbehandlung, s.u.)
  115.     signal_exception/1
  116.     signal_error/3
  117.     propagate_error/4
  118.     trap/2
  119.     set_error_handler/3
  120.     once/1            (wie in TOY Prolog)
  121.  
  122.       if_exception/3 und signal_exception/1 wirken ähnlich wie tag/1 und
  123.     tagexit/1 in TOY Prolog. Mit
  124.  
  125.         if_exception(?ErrorTerm, +Goal, +Recovery)
  126.  
  127.     kann man 'Goal' aufrufen. Wird während der Abarbeitung von 'Goal'
  128.  
  129.         signal_exception(?Term)
  130.  
  131.     aufgerufen, dann wird 'Term' mit 'ErrorTerm' unifiziert und danach
  132.     'Recovery' aufgerufen und der ursprüngliche Aufruf von if_exception/3
  133.     verlassen. Alle in 'Goal' vorgenommenen Variablenbindungen werden dabei
  134.     (wie bei einem Fehlschlag) rückgängig gemacht.
  135.  
  136.       Die Prädikate
  137.  
  138.         signal_error(+Type, +Arg, +Goal)
  139.         propagate_error(+Type, +Arg, +Goal, +Context)
  140.         trap(+Goal, +Handler)
  141.         set_error_handler(+Type, -OldHandler, +NewHandler)
  142.  
  143.     dienen zur Fehlerbehandlung. Die Details können sich noch ändern,
  144.     deshalb sollten diese Prädikate momentan noch nicht benutzt werden.
  145.  
  146.       Der 'cut' funktioniert auch innerhalb von Metacalls, er ist dort
  147.     aber in seiner Reichweite beschränkt. Im Aufruf 'call(X)' wirkt ein
  148.     in 'X' vorkommender 'cut' nur innerhalb der Klammern. Eine Faustregel:
  149.     `Buchstaben blockieren den cut'.
  150.  
  151.       '->'/2 wirkt wie ein 'cut', der auf einen Teil einer Klausel
  152.     beschränkt ist. Der Aufruf  (P -> Q; R)  wirkt wie ein IF/THEN/ELSE-
  153.     Konstrukt: kann P erfüllt werden, dann wird Q aufgerufen, andern-
  154.     falls R. (P -> Q) allein wirkt wie (P -> Q; fail).
  155.  
  156.     - Ein-/Ausgabe:
  157.  
  158.       Dieser Teil des Programms ist fast vollständig. Kennt jemand ein
  159.     Prolog-System auf dem ST, das noch mehr bietet ?
  160.  
  161.     read/1            Ein-/Ausgabe von Termen
  162.     write/1
  163.     writeq/1
  164.     display/1        (Ausgabe immer nach 'user' !)
  165.     write_canonical/1   (Ausgabe in Präfixform, heißt auch displayq/1)
  166.     print/1         (Ausgabe über portray/1, falls vom Benutzer
  167.                  definiert)
  168.     portray_clause/1    (Ausgabe von Klauseln in leicht lesbarer Form)
  169.  
  170.     get0/1            Ein-/Ausgabe von Zeichen (als ASCII-Werte)
  171.     get/1
  172.     skip/1            *
  173.     put/1            *
  174.     nl/0
  175.     tab/1            * diese Prädikate können einen arithmetischen
  176.                   Ausdruck als Parameter erhalten.
  177.  
  178.     is_endfile/1        Dateiendezeichen festlegen
  179.     is_newline/1        Zeilenendezeichen festlegen
  180.     is_newpage/1        Seitenendezeichen festlegen
  181.     is_endline/1        Zeilenende erkennen (nur mit instantiiertem
  182.                 Argument aufrufen !)
  183.  
  184.     open/3            Verwaltung von Datenströmen (s.u.)
  185.     open_null_stream/1
  186.     close/1
  187.     current_stream/3
  188.     nofileerrors/0
  189.     fileerrors/0
  190.     flush_output/1
  191.     set_input/1
  192.     set_output/1
  193.     current_input/1
  194.     current_output/1
  195.     absolute_file_name/2
  196.  
  197.     read/2            Ein-/Ausgabe von Termen auf beliebige Datenströme
  198.     write/2
  199.     writeq/2
  200.     display/2
  201.     write_canonical/2   (heißt auch displayq/2)
  202.     print/2
  203.  
  204.     get0/2            Ein-/Ausgabe von Zeichen auf beliebige Datenströme
  205.     get/2
  206.     skip/2            *
  207.     put/2            *
  208.     nl/1
  209.     tab/2            * (siehe oben)
  210.  
  211.     character_count/2   Abfrage von Datenströmen
  212.     line_count/2
  213.     line_position/2
  214.     stream_position/3   Schreib-/Leseposition abfragen und setzen
  215.     stream_position/2   Positionen aller offenen Dateien abfragen
  216.  
  217.     see/1            Prolog-10-kompatible Dateiverwaltung
  218.     seeing/1
  219.     seen/0
  220.     tell/1
  221.     telling/1
  222.     told/0
  223.  
  224.     ttyget0/1        Prolog-10-kompatible Ein-/Ausgabe von Zeichen auf
  225.     ttyget/1        den Datenstrom 'user'
  226.     ttyskip/1
  227.     ttyput/1
  228.     ttynl/0
  229.     ttytab/1
  230.  
  231.     biosget0/1        (nur für Demoprogramme)
  232.     biosput/1
  233.     biosstat/0
  234.  
  235.     op/3            (Operatoren definieren & löschen)
  236.     current_op/3        (Operatoren abfragen)
  237.  
  238.     sread/2         (Term mit Symboltabelle lesen)
  239.     sread/3         (dasselbe mit Angabe eines Datenstroms)
  240.  
  241.       Die Prädikate zur Arbeit mit Datenströmen stammen aus Quintus Prolog.
  242.     Ein Datenstrom ist ein spezielles Objekt, das z.B. mit
  243.  
  244.         open(+Dateiname, +Modus, -Datenstrom)
  245.  
  246.     erzeugt werden kann. `Dateiname' ist der Name einer Datei, `Modus' muß
  247.     eines der Atome 'read', 'write', 'append', 'read_binary',
  248.     'write_binary' oder 'append_binary' sein. Der erzeugte Datenstrom kann
  249.     in Prädikaten wie z.B.
  250.  
  251.         write(+Datenstrom, ?Term)
  252.  
  253.     benutzt und mit
  254.  
  255.         close(+Datenstrom)
  256.  
  257.     wieder geschlossen werden.
  258.  
  259.       Neben diesen Datenströmen für Dateien gibt es noch vordefinierte
  260.     Datenströme, die über folgende Namen angesprochen werden:
  261.  
  262.         user        (kompatibel zu Quintus Prolog)
  263.         user_input
  264.         user_output
  265.         user_error
  266.  
  267.         printer_output  (Erweiterung für den Zugriff auf ST-Schnittstellen)
  268.         modem_input
  269.         modem_output
  270.         midi_input
  271.         midi_output
  272.         ikbd_output
  273.  
  274.       Mit  write(printer_output, T)  wird beispielsweise der Term T auf
  275.     den Druckerport ausgegeben.
  276.  
  277.       Die 'read'-Prädikate sind in der vorliegenden Version vollständig
  278.     kompatibel zur Edinburgh-Syntax (wie sie z.B. in C-Prolog oder Quintus
  279.     Prolog benutzt wird).
  280.  
  281.     - Arithmetik
  282.  
  283.     'is'/2            Auswertung von Ausdrücken
  284.  
  285.     '=:='/2         Vergleich von Ausdrücken
  286.     '=\='/2
  287.     '<'/2
  288.     '=<'/2
  289.     '>'/2
  290.     '>='/2
  291.  
  292.     - Termklassifizierung:
  293.  
  294.     var/1            (wie üblich)
  295.     nonvar/1
  296.     atom/1
  297.     integer/1
  298.     atomic/1
  299.  
  300.     nonatomic/1        (Verneinung von atomic/1)
  301.     constant/1        (NICHT dasselbe wie atomic/1)
  302.     nonconstant/1
  303.     composite/1        (prüft, ob Term zusammengesetzt)
  304.     simple/1        (Verneinung von composite/1)
  305.     callable/1        Aufrufbarer Term (nonvarint/1 in TOY Prolog)
  306.  
  307.     - Strukturzugriff:
  308.  
  309.     functor/3
  310.     arg/3
  311.     '=..'/2
  312.  
  313.     name/2            Konvertierung zwischen Konstanten und Strings
  314.     atom_chars/2
  315.     number_chars/2
  316.  
  317.     numbervars/3        Variablen numerieren (z.B. für write/1)
  318.  
  319.     - Vergleiche von beliebigen Termen:
  320.  
  321.     '=='/2
  322.     '\=='/2
  323.     '@<'/2
  324.     '@=<'/2
  325.     '@>'/2
  326.     '@>='/2
  327.     compare/3
  328.     sort/2
  329.     msort/2
  330.     keysort/2
  331.  
  332.       Beim Vergleichen von Termen mit '@<', ..., '@>=' wird folgende
  333.     totale Ordnung über der Menge aller Terme benutzt:
  334.  
  335.     a) Variablen @< Zahlen @< Atome @< Zusammengesetzte Terme
  336.  
  337.     b) Variable1 @< Variable2    ist eindeutig definiert, hat aber
  338.                      keine Aussagekraft für den Benutzer
  339.                      (... in der Edinburgh-Bibliothek wird
  340.                      dieses Feature für einige Tricks benutzt,
  341.                      für die `schmutzig' noch eine zu milde
  342.                      Bezeichnung ist)
  343.  
  344.     c) Zahl1 @< Zahl2    wenn Zahl1 < Zahl2
  345.  
  346.     d) Atom1 @< Atom2    wenn der Name von Atom1 lexikographisch
  347.                 kleiner ist als der Name von Atom2 (wie in TOY
  348.                 Prolog)
  349.  
  350.     e) Term1 @< Term2    wenn i) die Stelligkeit von Term1 kleiner als
  351.                      die Stelligkeit von Term2 ist
  352.                  ii) die Stelligkeiten gleich sind und
  353.                      Funktor(Term1) @< Funktor(Term2)
  354.                 iii) die Stelligkeiten und Funktoren gleich
  355.                      sind und es ein i gibt, so daß
  356.  
  357.                        für alle j, 1 ≤ j < i:
  358.                        Argument(Term1, j) == Argument(Term2, j)
  359.  
  360.                        und
  361.                        Argument(Term1, i) @< Argument(Term2, i)
  362.  
  363.     compare/3 verhält sich so, als ob es wie folgt definiert wäre:
  364.  
  365.         compare('<', X, Y) :- X @< Y.
  366.         compare('=', X, Y) :- X == Y.
  367.         compare('>', X, Y) :- X @> Y.
  368.  
  369.       sort/2, msort/2 und keysort/2 sortieren Listen gemäß der obigen
  370.     Ordnungsrelation. sort/2 entfernt doppelt vorkommende Elemente,
  371.     msort/2 tut dies nicht; keysort/2 erwartet eine Liste, deren Elemente
  372.     die Form
  373.  
  374.         Key - Value
  375.  
  376.     besitzen. Dabei werden die 'Values' ignoriert, die 'Keys' dienen als
  377.     Sortierschlüssel. keysort/2 behält doppelt auftretende Elemente bei;
  378.     diese erscheinen im Ergebnis in derselben Reihenfolge wie im Original.
  379.     Beispiel:
  380.  
  381.         | ?- keysort([4-a, 1-b, 5-c, 1-d, 4-e, 0-f], Sorted).
  382.         Sorted = [0-f, 1-b, 1-d, 4-a, 4-e, 5-c]
  383.  
  384.     Diese drei Prädikate haben im besten Fall linearen Aufwand, im
  385.     schlechtesten Fall sind sie O(NlogN) (woraus messerscharf geschlossen
  386.     werden kann, daß es sich hierbei NICHT um 'Quicksort' handelt).
  387.  
  388.     - Programmzustand:
  389.  
  390.     listing/0        Alle Prädikate auflisten
  391.     listing/1        Einige Prädikate auflisten
  392.  
  393.     current_atom/1        (Abfrage von momentan bekannten Atomen etc.)
  394.     current_predicate/2
  395.  
  396.     halt/0            (Programm anhalten)
  397.     halt/1            (dito, mit Angabe des Exit-Codes)
  398.     break            (Verschachtelte Instanz von Prolog aufrufen)
  399.     abort            (Programmabbruch und zurück zum ersten Prompt)
  400.  
  401.     - Debugger:
  402.  
  403.       Jaha, es gibt endlich einen, auch wenn er ein bißchen anders
  404.     funktioniert als allgemein üblich (seufz).
  405.  
  406.     trace/1            (Debugger starten)
  407.     debug/1
  408.  
  409.     nodebug/0        (s.u.)
  410.     trace/0
  411.     debug/0
  412.  
  413.     spy/1            (Haltepunkte setzen & löschen)
  414.     nospy/1
  415.     nospyall/0
  416.     leash/1            (Gibt an, wo der Debugger anhält)
  417.     harness/1        (wie leash/1, für Spypoints)
  418.     debugging/1
  419.     unknown/2        (Überwachung undefinierter Prädikate)
  420.  
  421.       Der Debugger wird mit  trace(+Goal)  im Einzelschrittmodus (creep),
  422.     mit  debug(+Goal)  im Ablaufmodus (leap) gestartet und auf den Aufruf
  423.     'Goal' angesetzt. trace/0, debug/0 und nodebug/0 funktionieren nur,
  424.     wenn der Debugger bereits aktiv ist. Bei Fehlern wird NICHT automatisch
  425.     der Debugger aktiviert.
  426.  
  427.       unknown(-OldAction, +NewAction) ist eine abgekürzte Version von
  428.     prolog_flag(unknown, -OldAction, +NewAction) (siehe dort).
  429.  
  430.       Nähere Informationen kann ich hier nicht geben, sie sollten aber
  431.     in jedem besseren Prolog-Lehrbuch stehen.
  432.     
  433.     - Datenbank:
  434.  
  435.       Es gibt im Moment keine Datenbankfunktionen ! (siehe aber unten)
  436.  
  437.     - Datenbankverweise:
  438.  
  439.       Datenbankverweise dienen zum schnellen Zugriff auf gespeicherte
  440.     Klauseln, Terme etc. Es gibt zwar noch keine Datenbankfunktionen
  441.     für Klauseln, aber die interne Datenbank ist vollständig implementiert.
  442.     Deshalb gibt es das Prädikat
  443.  
  444.     erase/1         (lösche einen Datenbankverweis)
  445.  
  446.     - Interne Datenbank:
  447.  
  448.       Die interne Datenbank gibt es nur aus Effizienzgründen. Mit den
  449.     zugehörigen Prädikaten können nur Terme, keine Klauseln gespeichert
  450.     werden.
  451.       Auch dieser Teil des Programms ist so gut wie komplett.
  452.  
  453.     recorda/3        (s.u.)
  454.     recordz/3        (s.u.)
  455.     recorded/3        (s.u.)
  456.     current_key/2
  457.  
  458.     Mit    recorda(+Schlüssel, +Term, -Verweis)
  459.     bzw.    recordz(+Schlüssel, +Term, -Verweis)
  460.     kann der `Term' unter dem `Schlüssel' in der internen Datenbank
  461.     gespeichert werden. Als Ergebnis erhält man einen `Verweis' auf
  462.     den gespeicherten Term, der zum Löschen über erase/1 verwendet
  463.     werden kann. Mit  recorded(+S, ?T, ?V)  kann man den gespeicherten
  464.     Term wieder zurückholen.  current_key(?KeyName, ?KeyTerm)  ermöglicht
  465.     die Abfrage aller vorhandenen Schlüssel.
  466.  
  467.     - Mengenoperationen:
  468.  
  469.       setof/3 und bagof/3 sind noch nicht implementiert. Es gibt eine
  470.     abgemagerte Version von bagof/3, die identisch mit dem bagof/3
  471.     von TOY Prolog ist (aber nicht dem Standard entspricht).
  472.  
  473.     findall/3        Ersatz für bagof/3
  474.  
  475.       Der Unterschied zwischen dem Standard-bagof und dem von TOY Prolog
  476.     liegt in der Behandlung freier Variablen in dem Aufruf, der als zweiter
  477.     Parameter übergeben wird. Das Standard-bagof sammelt alle Lösungen,
  478.     für die sich für diese Variablen der gleiche Wert ergibt, während
  479.     findall/3 (und bagof/3 in TOY Prolog) alle diese Variablen als
  480.     existenzquantifiziert ansieht.
  481.  
  482.     - Grammatikregeln:
  483.  
  484.     expand_term/2        Wird aufgerufen, bevor eine eingelesene Klausel
  485.                 kompiliert wird; erledigt die Umsetzung von
  486.                 Grammatikregeln. Der Benutzer kann das Prädikat
  487.                 term_expansion/2 definieren, um zusätzliche
  488.                 Umsetzungen vorzunehmen.
  489.  
  490.     phrase/3        Aufruf einer Grammatikregel
  491.     phrase/2
  492.  
  493.       Bei phrase/[2,3] darf statt eines einzelnen nicht-terminalen Symbols
  494.     (wie in TOY Prolog) eine ganze Phrase (rechte Seite einer Grammatik-
  495.     regel) angegeben werden. phrase/2 ist folgendermaßen definiert:
  496.  
  497.         phrase(Phrase, Liste) :- phrase(Phrase, Liste, []).
  498.  
  499.     - sonstiges:
  500.  
  501.     '='/2            (Unifikation)
  502.     length/2        (Länge einer Liste)
  503.     member/2        (Element einer Liste)
  504.     memberchk/2        (dito, aber deterministisch)
  505.     append/3        (Listenverkettung)
  506.  
  507.     - spezielle Prädikate (Kompatibilität mit Quintus Prolog)
  508.  
  509.     prolog_flag/3        (Globale Flags setzen)
  510.     prolog_flag/2        (Flags abfragen)
  511.     prompt/2        (Eingabeprompt abfragen bzw. setzen)
  512.     statistics/0        (Statistiken ausgeben)
  513.     statistics/2        (Statistiken abfragen)
  514.  
  515.       prolog_flag/2 und prolog_flag/3 verwalten globale Flags, die
  516.     bestimmte interne Abläufe steuern. Der Wert eines Flags ist - im
  517.     Gegensatz zu anderen Prolog-Systemen - immer eine Integerzahl.
  518.     Im Moment gibt es folgende Flags:
  519.  
  520.     Name            Werte (Default)    Funktion
  521.  
  522.     character_escapes    0, 1    (0)    Auswertung von Escape-Sequenzen
  523.                         bei der Ein- und Ausgabe.
  524.     fileerrors        0, 1    (1)    Ausgabe von Fehlermeldungen bei
  525.                         nichtexistierenden Dateien etc.
  526.     gc_trace        0, 1, 2    (0)    Ausgabe von Informationen über
  527.                         Speicherbereinigung (0=keine,
  528.                         1=Kurzmeldung, 2=vollständig)
  529.     unknown            0, 1    (1)    Behandlung undefinierter
  530.                         Prädikate (0=Fehlschlag,
  531.                         1=Fehler erzeugen)
  532.     error_handling        0, 1, 2    (2)    Art der Fehlerbehandlung
  533.                         (0=nur Fehlschlag, 1=Aufruf
  534.                         einer Fehlerbehandlung,
  535.                         2=zusätzliche Fehlermeldungen)
  536.  
  537.     Mit prolog_flag(+Flag, -OldValue, +NewValue) kann man den Wert eines
  538.     Flags verändern. prolog_flag(?Flag, ?Value) dient zur Abfrage ohne
  539.     Veränderung.
  540.  
  541.       statistics/2 erhält als ersten Parameter eines der folgenden
  542.     Schlüsselworte:
  543.  
  544.     'runtime'        Laufzeit wird erfragt
  545.  
  546.     'memory'        Abfrage der verschiedenen Speicherbereiche
  547.     'core'            (mehrfach belegt, z.B. heap = program)
  548.     'program'
  549.     'heap'
  550.     'global_stack'
  551.     'local_stack'
  552.     'trail'
  553.  
  554.     'garbage_collection' Statistiken über Speicherbereinigung
  555.  
  556.     Der zweite Parameter wird mit einer Liste von Zahlen unifiziert, die
  557.     das Ergebnis der Abfrage darstellen.
  558.  
  559.     - systemabhängige Prädikate:
  560.  
  561.     garbage_collect/0   Erzwingt eine Speicherbereinigung.
  562.                 Wird normalerweise nicht benötigt, ist nur aus
  563.                 Kompatibilitätsgründen vorhanden.
  564.  
  565.     system/1        Übergabe eines Atoms an eine Shell (funktioniert
  566.                 z.B. mit Guläm)
  567.  
  568.       In einer der nächsten Programmversionen wird sich der Name dieses
  569.     Prädikats aus Kompatibilitätsgründen ändern ...
  570.  
  571.  
  572.   Es ist mir klar, daß die oben gemachten Beschreibungen bei weitem nicht
  573. ausreichen. Leider habe ich noch keine vernünftige Dokumentation, die ich
  574. mitliefern könnte; ein mit LaTeX geschriebenes Handbuch ist aber zumindest
  575. in Arbeit (wer TeX noch nicht hat, sollte sich zumindest nach einer
  576. Ausgabemöglichkeit für DVI-Dateien umsehen, z.B. an der nächsten Uni). Eine
  577. vorläufige Version liegt bei.
  578.  
  579. ------- Demonstrationsprogramme -----------------------------------------------
  580.  
  581.   Der Ordner 'DEMO' enthält zwei Beispielprogramme: eine Version des bekannten
  582. n-Damen-Problems ('QUEENS.PL') und ein kleines Spiel ('WORM.PL', 'RANDOM.PL').
  583.  
  584.   Aufruf:
  585.  
  586.         | ?- ['demo\queens'].
  587.         | ?- queens(N).     für das N-Damen-Problem (N >= 4)
  588.     oder    | ?- test.        für das 5-Damen-Problem
  589.  
  590.  
  591.         | ?- ['demo\worm', 'demo\random'].
  592.         | ?- worm.    (Steuerung über die Tasten 2, 4, 6, 8 auf dem
  593.                  Ziffernblock)
  594.  
  595. -------    Sonstiges -------------------------------------------------------------
  596.  
  597.     ... Meine Adresse hat sich geändert:
  598.  
  599.          Jens Kilian
  600.          Holunderstraße 19
  601.     D-W-7033 Herrenberg-Gültstein
  602.  
  603.     ... e-mail an:
  604.  
  605.     Internet:    jensk@hpbbrn.bbn.hp.com
  606.     MausNet:    Jens Kilian @ BB
  607.  
  608.     ... Ich sehe mich zu folgenden Äußerungen gezwungen, weil es zu viele
  609.     unvernünftige Menschen gibt:
  610.  
  611.              Ausschluss der Gewährleistung
  612.  
  613. - Weil das Programm kostenlos genutzt werden darf, wird für das
  614.   Programm keinerlei Gewährleistung eingeräumt, soweit dies gesetzlich
  615.   zulässig ist. Falls nicht anderweitig schriftlich angegeben, stellen
  616.   die Urheber und/oder Dritte das Programm `so wie es ist' zur
  617.   Verfügung, ohne Gewährleistung jedweder Art, eingeschlossen die Gewähr
  618.   zur Erreichung eines bestimmten Verwendungszwecks, aber nicht
  619.   beschränkt auf diese. Die Benutzung erfolgt auf eigene Gefahr; das
  620.   gesamte Risiko in Bezug auf Qualität und Leistung des Programms liegt
  621.   bei Ihnen. Sollte sich das Programm als fehlerhaft erweisen, so tragen
  622.   Sie alle Kosten für anfallende Wartungs-, Reparatur-oder
  623.   Korrekturarbeiten.
  624.  
  625. - Soweit gesetzlich zulässig, haften die Urheber oder Dritte, die das
  626.   Programm wie oben gestattet verändern und/oder weiterverbreiten, für
  627.   keinerlei Schäden (einschliesslich irgenwelcher unmittelbaren Schäden,
  628.   mittelbaren Schäden, Folgeschäden und Drittschäden), die aus der
  629.   Benutzung oder der Unmöglichkeit der Benutzung des Programms entstehen
  630.   (einschliesslich des Verlusts oder der Verfälschung von Daten,
  631.   irgendwelcher materiellen Verluste, die Ihnen oder Dritten entstehen,
  632.   oder des Versagens des Programms, mit irgendeinem anderen Programm
  633.   zusammenzuarbeiten, aber nicht beschränkt auf diese), sogar in dem
  634.   Fall, daß besagten Urhebern oder Dritten die Möglichkeit der
  635.   Entstehung solcher Schäden bekannt war oder bekannt gemacht wurde.
  636.  
  637. -------------------------------------------------------------------------------
  638.  
  639.     Viel Spaß,
  640.  
  641.         Jens Kilian
  642.  
  643.