summaryrefslogtreecommitdiff
path: root/doc/prolog/prolog handbuch
diff options
context:
space:
mode:
Diffstat (limited to 'doc/prolog/prolog handbuch')
-rw-r--r--doc/prolog/prolog handbuch581
1 files changed, 0 insertions, 581 deletions
diff --git a/doc/prolog/prolog handbuch b/doc/prolog/prolog handbuch
deleted file mode 100644
index ea7c6a5..0000000
--- a/doc/prolog/prolog handbuch
+++ /dev/null
@@ -1,581 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#Prolog
-
-
-
-
-#off("b")#
-#center#Lizenzfreie Software der
-#on ("b")#
-
-#center#Gesellschaft für Mathematik und Datenverarbeitung mbH,
-#center#5205 Sankt Augustin
-
-
-#off("b")#
-#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für
-#center#nichtkommerzielle Zwecke gestattet.
-
-#center#Gewährleistung und Haftung werden ausgeschlossen
-
-
-____________________________________________________________________________
-#page#
-
-Dr.P.Heyderhoff 12.03.1987
-GMD.F2.G2
-
-
-
-
-
-
- E L A N - P R O L O G
- _____________________
-
- (Die Fachsprache der künstlichen Intelligenz)
-
-#on("u")#Benutzungsanleitung und technische Beschreibung#off("u")#
-
-
-Elan-Prolog ist eine Computersprache der fünften Generation, die für
-die Praxis der Programmierung und die Lehre in Informatik eine neue
-Dimension erschließt. Für den professionellen Programmierer eröffnet sie
-neue Möglichkeiten, mächtige Anwendungen, wie Expertensysteme und andere
-neuartige Systeme der Wissensverarbeitung zu entwickeln.
-
-Elan-Prolog unterscheidet sich grundsätzlich von üblichen konventionellen
-Programmiersprachen. In Sprachen wie Elan und Pascal muß der Programmierer
-genau angeben, wie ein gewünschtes Ergebnis errechnet werden soll. Um was es
-sich dabei handelt, steht bestenfalls dann in der Dokumentation. Ganz anders
-ist es in Prolog. PROLOG steht für PROgrammieren in LOgik und basiert auf
-dem Prädikaten-Kalkül, der bekanntesten Form der formalen Logik. Also in
-Prolog schreibt der Programmierer hin, worin das Problem besteht. Er bedient
-sich dabei dieser formalen Logik. Prolog versucht dann eine Lösung zu
-finden. Der Lösungsweg ist dabei im Programm nicht vorgeschrieben. Das
-entlastet den Programmierer, und er kann seine ganze Kraft auf die logische
-Beschreibung des Problems konzentrieren.
-
-Elan-Prolog ist ein interpretatives System, das voll kompatibel ist mit dem
-Edinburgh Standard Prolog und in in komfortabler Weise in das Betriebssystem
-Eumel eingebettet ist.
-
-Eigenschaftes von Elan-Prolog:
-
-- Syntax gemäß dem Edinburgh Standard Prolog nach Clocksin-Mellish
-
-- Interpretierendes System mit inkrementellem Einpass-Compiler
-
-- Interaktiver Mehrfenster-Texteditor des Eumelsystems
-
-- Zugriff auf Elan-Prozeduren als Prolog-Regeln
-
-- Geschwindigkeit ca. 100 LIPS auf IBM/PC-XT
-
-- optionale dynamische Ablaufverfolgung
-
-- Erklärungskomponente
-
-- Eingabe und Ausgabe von Prolog-Ausdrücken und Klartext
-
-- Programmiert und dokumentiert in ELAN (über 2000 Zeilen)
-
-- daher besonders für den Informatik-Unterricht geeignet
-#page#
-#on("u")#Beschränkungen des Elan-Prolog:#off("u")#
-
-Folgende Beschränkungen gelten für die Implementierung von Elan-Prolog im
-Eumel-Systems:
-
-- Maximal 16000 Fakten und Regeln
-
-- Maximal 16000 Terme zur Konstruktion von Ausdrücken, Listen und Regeln
-
-- Maximal 800 Variablenbindungen
-
-- Maximal 800 Einträge im Beweisbaum
-
-- Maximal 4000 Bezeichner für Atome und Variablen
-
-- Maximal 16000 Buchstaben für alle Bezeichner zusammen
-
-
-Wie sieht ein Prolog-Programm aus?
-
-Ein Prolog-Programm besteht aus
-
- - Fakten über Objekte und ihre Beziehungen
-
- - Regeln über Objekte und ihre Beziehungen
-
-und besonders wichtig:
-
- - Der Benutzer kann Prolog über die Fakten und Regeln ausfragen.
-
-Fakten aus einer Wissensbasis, nämlich dem Prolog-Programm, sind z.B.:
-
- enthaelt (wisky, aethanol).
-
-Das wird gelesen als: "Wisky enthält Aethanol.". Grundzüge der sehr
-einfachen Syntax lassen sich hieran erklären. Ein Faktum wird geschrieben
-wie in diesem Beispiel:
-
- - Erst kommt der Name der Relation, geschrieben wie ein Elan-Name in
- kleinen Buchstaben.
-
- - Dann folgt in runden Klammern und durch Kommata getrennt eine Liste
- von Objektnamen.
-
- - Zum Schluß steht ein Punkt.
-
-Regeln sind Problembeschreibungen in der Form von logischen Ausdrücken der
-symbolischen Logik, wie z.B. die folgende Regel:
-
- bewirkt (A, B, kopfschmerz) :- enthaelt (A, aethanol),
- enthaelt (B, aspirin ).
-
-Das wird gelesen als: "Wenn man eine Droge A, die Aethanol enthält,
-und eine Droge B, die Aspirin enthält gleichzeitig einnimmt, dann bewirkt
-das Kopfschmerzen." Wie man sieht werden logische Variablen mit großen
-Buchstaben (wie Elan-Operatoren) geschrieben. Das Zeichen ":-" steht für das
-logische Wenn, und das Komma(",") für die logische Konjunktion. Die logische
-Disjunktion wird durch Semikolon(";") ausgedrückt.
-#page#
-Neben der hiermit vorgestellten Prefix-Schreibweise für Relationen gibt es in
-ELAN-Prolog auch noch eine Infix-Schreibweise für zweistellige Relationen.
-Hierbei werden die Relationen als Infix-Operatoren in großen
-Buchstaben geschrieben (wie in ELAN) und zwischen die beiden Operanden
-gesetzt. Als Operatoren sind auch die in Elan üblichen Operatoren
-
- ( +, -, *, /, MOD, =, <, >, <=, >=, <> )
-zulässig.
-
-In Infixausdrücken (wie z.B. 2+3*4) gelten die bekannten Vorrangregeln. Auch
-Klammern sind zulässig. Selbstdefinierte Operatoren haben niedrigste
-Priorität.
-
-Obiges Beispiel in Infix-Schreibweise:
-
- wisky ENTHAELT aethanol.
-
- bewirkt (A, B, kopfschmerz) :- A ENTHAELT aethanol,
- B ENTHAELT aspirin.
-
-
-Objekte in Prolog können Atome oder Listen sein. Für Atome gibt es zwei
-Schreibweisen:
-
- - genau so wie Elan-Bezeichner, also bestehend aus kleinen Buchstaben
- und Blanks. Dabei werden die Blanks eliminiert.
-
- - genauso wie Elan-Texte, nämlich in Gänsefüßchen eingeschlossen.
-
-Für Listen von Objekten gibt es wiederrum zwei Schreibweisen, wie folgende
-zwei unterschiedlichen Notationen des gleichen Beispiels zeigen:
-
- - [ das, ist, [ zum, beispiel ], eine, liste ]
-
- - [ das, ist, [ zum | [ beispiel | [] ] ], eine, liste ]
-
-Im zweiten Fall ist die als drittes Element in der Gesamtlisten enthaltene
-Teilliste mit dem Konstruktor "|" und der leeren Liste "[]" zusammengesetzt.
-Die Grundoperationen, die aus der Programmiersprache LISP bekannt sind,
-können als Prolog-Fakten unmittelbar wie folgt definiert werden:
-
- eq (X, X).
- head ([X|Y], X).
- tail ([X|Y], Y).
- cons (X, Y, [X|Y]).
-#page#
-#on("u")#Standard - Operatoren von Elan-Prolog:#off("u")#
-
-Im System sind nur ganz wenige Standardoperatoren eingebaut. Es sind die
-folgenden Fakten:
-
- - ! . der CUT-Operator schaltet des Backtracking ab.
-
- - bye. beendet die prolog Anwendung.
-
- - listing. zeigt alle insertierten Regeln.
-
- - listing (X). zeigt alle insertierten Regeln über X.
-
- - call (X). X wird ausgeführt.
-
- - write (X). das an X gebundenen Prolog-Objekts wird ausgegeben,
- writeq (X). und wenn nicht eindeutig, gequotet,
- put (X). das Zeichen, dessen ASCII-Code X ist wird ausgegeben,
- name (X,[Y]). unifiziert das Atom X mit der Liste seiner Buchstaben.
-
- - read (X). ein Objekt wird gelesen und an die Variable gebunden.
- get0 (X). das nächste Zeichen wird gelesen,
- get (X). das nächste druckbare Zeichen wird gelesen,
-
- - X = Y . Die an X und Y gebundenen Objekte sind gleich,
- X <> Y . sie sind ungleich,
- X <= Y . sie sind kleiner oder gleich,
- X == Y . sie sind wörtlich gleich,
- X =.. [F|A] . X ist der Term mit Funktor F und Argumentliste A.
-
- - X + Y . sie sollen addiert,
- X - Y . subtrahiert,
- X * Y . multipliziert,
- X / Y . dividiert,
- X MOD Y . der Divisionsrest soll ermittelt werden,
- die Auswertung geschieht durch den 'is'-Operators.
-
- - X IS EXPR . Das Ergebnis des arithmetischen Ausdrucks EXPR wird
- gebildet und mit X unifiziert.
-
- - incr (X). der arithmetische Wert von X wird um eins erhöht.
-
- - assertz ([X]). insertiert die Regel X am Ende einfügend.
- asserta ([Χ]). insertiert die Regel X am Anfang einfügend.
- retract ([X]). entfernt die Regel X wieder.
- clause (X,[Y]). holt die Regel Y mit dem Kopf X aus der Knowledgebase.
-
- - functor (X,Y,Z) Y ist der Funktor von X und Z ist seine Arität.
- arg (X,Y,Z). Z ist das x-te Argument der Funktion Y.
-
- - elan (X). Ausführung der insertierten ELAN-Prozedur X
- elan (X,Y). Ausführung von X mit dem TEXT-CONST-Parameter Y
-
- - elan(trace,on). schaltet den dynamischen Ablaufverfolger ein und
- elan(trace,off) schaltet ihn wieder ab.
-
- - elan(consult,X) lädt das Prologprogramm aus der Datei namens X hinzu.
- elan(reconsult,X) ersetzt das Prologprogramm aus der Datei X.
- elan(abolish,X) entfernt alle Regeln mit dem Namen X.
-#page#
-#on("u")#Das Dialogverhalten von Elan-Prolog:#off("u")#
-
-Elan-Prolog wird, sobald es in das Eumel-System insertiert ist, als Prozedur
-mit dem Namen "prolog" und einem optionalen TEXT-Parameter aufgerufen. Der
-Textparameter enthält den Namen einer Datei, die ein Prolog-Programm enthält,
-das geladen werden soll. Fehlt der Parameter, wird, wie üblich, die zuletzt
-bearbeitete Datei genommen. Im Prolog-Dialog können später weitere
-Prolog-Programme mit der Prozedur namens "consult" hinzugeladen werden.
-
-Also
-einfachster Aufruf: prolog ("")
-
-Antwort: ?-
-Beispiel-Eingabe: 3 = 3
-Antwort: yes
- ?-
-Eingabe: 4 = -5
-Antwort: no
- ?-
-
-Besondere Dialogkommandos:
-
- ?-
-Eingabe: ?
-Antwort z.B.: 13.5 SEC
- ?-
-Eingabe: listing
-Antwort: { zeigt alle aktuell verfügbaren Regeln }
- ?-
-Eingabe: {ESCAPE} q
-Ausgabe: gib kommando:
-
-Eingabe: prolog again
-Ausgabe: ?-
-Eingabe: [sum, permute] {in eckigen Klammern!}
- { konsultiert diese beiden Dateien }
-Antwort z.B.: 25 rules inserted.
- ?-
-Eingabe: [-sum, -permute]
- { löscht und rekonsultiert aus diesen Dateien }
-Antwort z.B.: 25 rules inserted.
-
-Eingabe: {ESCAPE} {ESCAPE}
-Antwort: gib kommado:
-Elan-Eingabe z.B.: show ("standard")
- { zeigt die Datei dieses Namens }
- ?-
-
-Auf diese Weise können bequem Eumel-Kommandos gegeben werden. Die
-Umschaltung vom Prolog- zum Eumelmonitor-Betrieb erfolgt durch die Tasten
-{ESCAPE},{ESCAPE} und {RETURN}. Wie üblich ist das zuletzt verwendete
-Kommando auch im Prolog-Dialog mit dem Escapekommando "{ESCAPE} k"
-wiederzubekommen. Das Kommando "{ESCAPE} q" beendet den Dialog.
-#page#
-#on("u")#Ausprobieren der Prolog-Programmbeispiele:#off("u")#
-
-Zum Ausprobieren sind die Prologbeispiele "eq", "permute" und "mann"
-beigefügt.
-
-Beispiel: ?-
-Eingabe: [permute] {in eckigen Klammern!}
-Antwort: 5 rules inserted.
- ?-
-Eingabe: marquise(X)
-Antwort: beautiful marquise your beautiful eyes make me die of love
-Eingabe: {Semicolon}
-Antwort: your beautiful eyes beautiful marquise make me die of love
- { usw }
-Eingabe: {Return}
-Antwort: ?-
-
-Jede #on("u")#Eingabe von Semicolon#off("u")# liefert als Antwort die nächste Permutation. Wenn
-eine andere Taste gedrückt wird, bricht die Ausgabe weiterer Ergebnisse ab.
-
-#on("u")#Eingabe von Fragezeichen#off("u")# liefert neben der Angabe der benötigten
-Rechenzeit eine Erklärung der letzten Antwort durch Ausgabe aller zu dieser
-Antwort führenden Schlußfolgerungen. Dabei wird der Beweisbaum in Form einer
-Einrückstruktur dargestellt. Die Einrückung stellt die Erklärungstiefe dar.
-
-
-#on("u")#Benutzung von Prolog von Elan-Programmen aus#off("u")#
-
-Wenn man Prolog als Unterprogramm von Elan aus aufrufen will, geht man
-folgendermaßen vor:
-
-1. Laden einer Wissensbasis,
- die in einer Datei namens <knowledgebase> z.B."permute" bereitsteht:
-
- push ("bye"13"");
- prolog ("permute");
-
-
-2. Abfragen an diese Wissensbasis:
-
- TEXT VAR query, answer;
- query:= "marquise (X)";
- IF prolog ( query, answer)
- THEN put (answer)
- ELSE put ("NO")
- FI;
-
-In diesem Anwendungsbeispiel liefert die Ausgabeanweisung 'put (answer)':
-
- beautiful marquise your beatiful eyes make me die of love
-
-#page#
-#on("u")#Literatur:#off("u")#
-
-
-1.) W.F.Clocksin, C.S.Mellish:
- Programming in Prolog
- Springer 1984
-
-2.) M.H.van Emden:
- An interpreting algorithm for prolog programs
- in Implementations of Prolog, Ellis Herwood Ltd, 1984
-
-3.) Alain Colmerauer:
- Prolog in 10 Figures
- Communications of the ACM December 1985
-
-4.) J. Cohen:
- Describing Prolog by its Interpretation and Compilation
- Communications of the ACM December 1985
-
-5.) Alain Colmerauer:
- Les system q ou un formalisme pour alalyser et synthetiser des phrases
- sur ordinateur.
- Intern.Rep. 43, Departement d'informatique. Universite de Montreal
- Sept. 1970
-#page#
-(*************************************************************************)
-(* *)
-(* Elan-Prolog *)
-(* *)
-(* Programm-Beispiele: *)
-(* *)
-(****************** standard (nach Clocksin-Mellish) ********************)
-
-abolish (X) :- elan (abolish, X).
-append ([], X, X) :- !.
-append ([X|Y], Z, [X|W]) :- append (Y, Z, W).
-atom (X) :- functor (X, Y, 0).
-atomic (X) :- atom (X); integer (X).
-consult (X) :- elan (consult, X).
-end :- bye.
-fail :- [].
-findall (X, Y, Z) :- tell ("$$"), write ("("), findall (X,Y);
- write (")"), told, see ("$$"), read (Z),
- seen, elan (forget, "$$").
-findall (X, Y) :- call (Y), writeq (X), write (","), [].
-integer (X) :- functor (X, Y, -1).
-listing (X).
-member (X, [X|Z]).
-member (X, [Y|Z]) :- member (X, Z).
-nl :- elan (line).
-non var (X) :- var (X), !, []; .
-not (X) :- call (X), !, []; .
-notrace :- elan (trace, off).
-reconsult (X) :- elan (reconsult, X).
-repeat.
-repeat :- repeat.
-see (X) :- elan (sysin, X).
-seen :- elan (sysin, "").
-tab (X) :- tab(X,1).
-tab (X,Y) :- Y<=X, !, put (32), incr(Y), tab(X,Y);.
-tell (X) :- elan (sysout, X).
-told :- elan (sysout, "").
-trace :- elan (trace, on).
-true.
-< (X, Y) :- <= (X, Y), <> (X, Y).
-> (X, Y) :- <= (Y, X).
->= (X, Y) :- < (Y, X).
-#page#
-(**************************** sum ***********************************)
-
-suc (0, 1). suc (1, 2). suc (2, 3). suc (3, 4). suc (4, 5).
-suc (5, 6). suc (6, 7). suc (7, 8). suc (8, 9).
-sum (0, X, X).
-sum (X, Y, Z):- suc (V, X), sum (V, Y, W), suc (W, Z).
-plus (X, [0,0], X):- !.
-plus (X, Y, Z):- plus one (V, Y), plus (X, V, W), !, plus one (W, Z).
-plus one ([X, Y], [V, W]):- suc (Y, W), X = V, !;
- Y = 9, suc (X, V), W = 0.
-treereverse (X,Y):- rev (X,Y), !; rev (Y,X), !.
-rev ([], []).
-rev ([X|Y], Z):- X <> [H|T], rev (Y, W), !, append (W, [X], Z);
- rev (X, V), rev (Y, W), !, append (W, [V], Z).
-
-(**************************** permute ************************************)
-
-permute ([], []).
-permute ([E|X], Z):-
- permute (X, Y), insert (E, Y, Z).
-insert (E, X, [E|X]).
-insert (E, [F|X], [F|Y]):-
- insert (E, X, Y).
-marquise(RESULT):-
- permute (["beautiful marquise",
- "your beautiful eyes",
- "make me",
- "die",
- "of love"
- ],
- RESULT).
-
-(**************************** puzzle ************************************)
-
- {Solution: 9,5,6,7,0,8,2}
-puzzle:- repeat, permute ((9,8,7,6,5,2,0), SENDMORY),
- write (SENDMORY),
- puzzle (SENDMORY, SEND, MORE, MONEY),
- elan (line),
- write (SEND), write (+),
- write (MORE), write (=),
- write (MONEY).
-
-puzzle([S,E,N,D,O,R,Y], SEND, MORE, MONEY):-
- SEND IS ((S * 10 + E) * 10 + N) * 10 + D,
- MORE IS ((10 + O) * 10 + R) * 10 + E,
- MONEY IS (((10 + O) * 10 + N) * 10 + E) * 10 + Y,
- MONEY IS SEND + MORE.
-
-permute ([], []).
-permute ([E|X], Z):- permute (X, Y), insert (E, Y, Z).
-
-insert (E, X, [E|X]).
-insert (E, [F|X], [F|Y]):- insert (E, X, Y).
-
-repeat.
-repeat:- repeat.
-#page#
-(**************************** prieks ***********************************)
-
-ist priek (bo priek).
-ist priek (ki priek).
-ist priek (bla priek).
-
-WER GNASELT WEN :- population (B),
- member ([WEN, WER, _], B),
- bedingungen (B).
-
-WER KNAUDERT WEN:- population (B),
- member ([WER, _, WEN], B),
- bedingungen (B).
-
-population (B):- sind prieks (U, V, W),
- sind knauderarten (R, S, T),
- B = [ [drausla puemfe, U, R],
- [glessla puemfe, V, S],
- [hapla puemfe, W, T] ].
-
-sind prieks (X,Y,Z):- ist priek (G),
- ist priek (H), H<>G,
- ist priek (I), I<>G, I<>H, !,
- permute ([G,H,I], [X,Y,Z]).
-
-sind knauderarten (X,Y,Z):- ist knauderart (G),
- ist knauderart (H), H<>G,
- ist knauderart (I), I<>G, I<>H, !,
- permute ([G,H,I],[X,Y,Z]).
-
-ist knauderart (an).
-ist knauderart (ab).
-ist knauderart (ueber).
-
-bedingungen (B):- not member ([hapla puemfe,ki priek,_],B) ,
- not member ([hapla puemfe,_,ueber],B) ,
- not member ([drausla puemfe,bo priek,_],B) ,
- not member ([_,bo priek,ab],B) ,
- noch ne bedingung (B) ,
- weitere bedingungen (B) , !.
-
-weitere bedingungen (B):- not member([_,ki priek,ueber],B),
- not member([_,bo priek,ueber],B)
- ;
- member([drausla puemfe,_,an],B).
-
-noch ne bedingung (B):- not member ([drausla puemfe,ki priek,_],B)
- ;
- not member ([glessla puemfe,_,ueber],B).
-
-permute ([], []).
-permute (X, [Y|Z]):- delete (Y ,X, E), permute (E, Z).
-delete (X, [X|Z], Z).
-delete (X, [Y|Z], [Y|E]):- delete (X, Z, E).
-member (X, [X|Z]).
-member (X, [Y|Z]):- member (X, Z).
-not member (X, []).
-not member (X, [Y|Z]):- X <> Y, not member (X,Z).
-#page#
-(**************************** calc ************************************)
-
-{ CALC evaluates arithmetic expressions with store }
-
-calc:- eval ([], RS), write (result store), write (RS), nl.
-
-eval (SI, SO):-
- read (CALC), nonvar (CALC), eval member (CALC, SI, SO).
-
-eval member (CALC, SI, SO):-
- member (CALC, [stop,end,bye,eof]), SO=SI;
- eval (CALC,I,SI,ST), write (I), eval (ST,SO);
- write (error in), write (CALC), nl, eval (SI, SO).
-
-eval (I, I, S, S):- integer (I).
-eval (N, I, S, S):- atom (N), eval atom (N, I, S).
-
-eval atom (N, I, S):-
- member (N=I, S);
- write ("error: Cell"), write (N),
- write("not found in store. 0 substituted."), nl, I=0.
-
-eval ( L+R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J+K.
-eval ( L-R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J-K.
-eval ( L*R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J*K.
-eval ( L/R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J/K.
-
-eval (N=O, I, SI, SO):-
- atom (N), eval (O,I,SI,ST), eval repl (N,I,ST,SO).
-
-eval repl (N, I, [], [=(N,I)]).
-eval repl (N, I, [=(N,_)|S], [=(N,I)|S]).
-eval repl (N, I, [=(M,J)|SI], [=(M,J)|SO]):- eval repl (N, I, SI, SO).
-