home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HOT Scene Stuff
/
hotscenestuffzyklop1996.iso
/
diskmags
/
deutsch
/
blckmail
/
bm07
/
prolog.bmt
< prev
next >
Wrap
Text File
|
1994-04-12
|
9KB
|
233 lines
PROLOG-Kurs Teil 1 von Chalchiuthlicue
Der gesamte Kurs bezieht sich auf den Turbo-Prolog-Compiler, der
beim CHIP Tool Informatik- Heft dabei war. Ihr könnt ihn euch von
Midnight schicken lassen ! Wer meine Adresse kennt, kann auch
mir schreiben, dann bekommt ihr ein PD-Prolog mit Beispielpro-
grammen. Dieses PD-Prolog hat Midnight natürlich auch.
Ich habe in der letzen Ausgabe ja schon ein bißchen was über das
Prinzip dieser Sprache erzählt. Besonders wichtig dabei war,
daß ein Prologprogramm keine Befehle kennt, sondern nur Regeln.
Darunter kann man sich ohne Beispiel nichts vorstellen, deshalb
gleich ein kleines Programm.
In einer Fernsehshow spielen 3 Familien mit verschieden vielen
Kindern mit:
Das Ehepaar Lisa und Hans mit Kind Nina.
Das Paar Inge und Paul mit Kind Jens.
Das Paar Thomas und Kerstin mit Claudia, Miriam und Stefan
Da gibt es jetzt verschiedene Möglichkeiten, die Beziehungen
der Familienmitglieder untereinander auszudrücken:
Vater-von, Mutter-von, Kind-von, Frau-von, Mann-von, usw !
Das muß man dem Prologsystem erst einmal erklären.
Wir geben also erstmal ein, wer von wem der Vater ist:
vater_von(hans, nina).
vater_von(paul, jens).
vater_von(thomas, claudia).
vater_von(thomas, miriam).
vater_von(thomas, stefan).
Und dann, welche Frau mit welchem Mann verheiratet ist:
frau_von(lisa, hans).
frau_von(inge, paul).
frau_von(kerstin, thomas).
Der Punkt bedeutet, daß die Regel zu Ende ist, und daß nicht
etwa noch eine Bedingung folgt.
Die Groß-/Kleinschreibung ist wichtig ! Wenn man nämlich die
Namen groß schreiben würde, stünden sie für beliebige andere
Namen, wären also eine Art Platzhalter.
Nun kann man die Regeln weiter erklären, bis man grün wird,
schließlich ist der Computer so blöd, daß er nicht von selbst
weiß, das die Frau von Hans gleichzeitig die Mutter seiner
Tochter ist. Oder weiß er es vielleicht doch ? Ja, sonst würde
ich nicht so fragen ;-) !
Übrigens gehe ich hier von den ganz klassischen Familienver-
hältnissen aus, also keine Schwulenehe oder so... oh, sorry,
ich schweife vom Thema ab.
Prolog kann also in gewisser Hinsicht 'Schlüsse ziehen'. Nur
welche Schlüsse, das muß man noch angeben. Nämlich so:
(Leerzeichen werden vom Compiler ignoriert)
mutter_von(Frau,Kind)
if frau_von(Frau,Mann) and vater_von(Mann,Kind).
Da ist auf einmal Frau groß geschrieben !? Ja, weil es in diesem
Fall eine Variable ist. Prolog setzt der Reihe nach alle
möglichen Namen für Frau und Kind und Mann ein, die man oben in
frau_von und vater_von definiert hat. Wenn also in zwei
Kombinationen (frau_von und vater_von) der gleiche Mann erscheint
(das passiert 5 mal, wegen 5 Kindern), dann merkt sich Prolog das
als Lösung für mutter_von.
Das hat für uns die gleiche Wirkung, als ob wir selbst
5 Mal z.B. mutter_von(lisa,nina) eingegeben hätten.
Jetzt geht's ähnlich weiter:
mann_von(Mann, Frau) if frau_von(Frau, Mann).
kind_von(Kind, Mann) if vater_von(Mann, Kind).
kind_von(Kind, Frau) if mutter_von(Frau, Kind).
Diese Beziehungen reichen uns für den Anfang mal, wir wollen
das Ganze nun in ein Programm fassen.
Ein einfaches Prologprogramm besteht aus zwei Teilen:
dem 'predicates'-Teil, der so etwas wie die Variablen-
deklaration in TP darstellt (also doch eine Ähnlichkeit !),
und dem 'clauses'-Teil, in dem die Regeln aufgezählt werden,
in denen Prolog nach dem Start nach Lösungen sucht.
Hier also unser Programm:
Man muß zu Verändern nach dem Start EDIT wählen. Übrigens
funkioniert der Editor ähnlich wie der in TP, er kennt also die
Word-Perfect-Befehle.
/* Beispielprogramm 1 für den Prologkurs in Blackmail 7 */
/* Die Familienshow */
predicates
vater_von(symbol,symbol) - Alle Regeln, die wir später
mutter_von(symbol, symbol) - aufstellen, müssen hier
frau_von(symbol,symbol) - deklariert werden. Symbol
mann_von(symbol, symbol) - bedeutet für uns momentan so
kind_von(symbol,symbol) - etwas wie ein String. In der
- Klammer könnte z.B. auch
- real, char, file usw stehen.
clauses
vater_von(hans, nina). - das hier sind also die
vater_von(paul, jens). - grundlegenden Vorschriften
vater_von(thomas, claudia).
vater_von(thomas, miriam).
vater_von(thomas, stefan).
frau_von(lisa, hans).
frau_von(inge, paul).
frau_von(kerstin, thomas).
- jetzt noch die Folgerungen:
mutter_von(Frau,Kind) if frau_von(Frau,Mann)
and vater_von(Mann,Kind).
mann_von(Mann, Frau) if frau_von(Frau, Mann).
kind_von(Kind, Mann) if vater_von(Mann, Kind).
kind_von(Kind, Frau) if mutter_von(Frau, Kind).
Regeln werden immer mit einem Punkt abgeschlossen !
Mit ESC kommt man aus dem Editor wieder raus, und kann das
Programm mit COMPILE kompilieren lassen. Wenn ihr das Beispiel-
programm (FAMILY1.PRO) geladen habt, das mit der Blackmail
verschickt wurde, sollte kein Fehler auftreten. Der Compiler
meldet sein O.K. links unten im MESSAGE-Fenster.
Nach dem kompilieren startet man das Programm mit RUN (in der
obersten Zeile anwählen, evtl. vorher mit ESC aus dem Editor
rausgehen). Im DIALOG-Fenster (rechts oben) erscheint folgendes:
Goal:
Prolog verlangt ein Ziel, nach dem es suchen soll.
Nun könnt ihr ein bißchen herumspielen, und ausprobieren,
was euch so einfällt. Wer Lust hat, kann versuchen, weitere
Regeln festzulegen (z.B. geschwister(Kind1, Kind2) if ...)
Wenn man alle Lösungen einer Regel wissen will, gibt man den
Namen der Regel ein, und danach entweder eine Variable (Prolog
sucht dann alle Möglichkeiten), oder einen bestimmten Namen
(wäre also eine Bedingung).
Beispiel:
Goal: kind_von(miriam, Elternteil)
'miriam' ist vom Benutzer festgelegt (klein geschrieben),
Elternteil ist dagegen ein Platzhalter.
Prolog sucht nun nach allen Symbolen, für die
die Regel kind_von(miriam, xxxx) gilt. Im Dialogfenster
erscheint:
kind_von(miriam, Elternteil)
Elternteil = Thomas
Elternteil = Kerstin
2 Solutions.
Probiert mal folgendes aus:
Goal: vater_von(Vater, Kind)
Es erscheint:
Vater= hans, Kind=nina - das hieße gesprochen: Vater
Vater= paul, Kind=jens - ist Hans und Kind ist Miriam
Vater= thomas, Kind=claudia
Vater= thomas, Kind=miriam
Vater= thomas, Kind=stefan
5 solutions
Oder gleich zwei Bedingungen:
Goal: vater_von(Vater, Kind), frau_von(kerstin, Vater)
Das Komma ist in Prolog eine Abkürzung für 'und' (AND).
Überlegt gleich voher, wieviele und welche Lösungen
erscheinen werden ! (Es sind die drei Kinder von Kerstin
und Thomas)
Um zu verhindern, daß Prolog alle Bestandteile einer
Regel aufzählt, kann man sagen, welche Teile einem egal
sind.
Um alle Frauen zu bekommen, könnte man eingeben:
Goal: frau_von(Frau,Mann).
Doch hier erscheinen jedesmal die Frau UND der Mann.
Den läßt man bei den Lösungen verschwinden :-(, indem man
bei Goal folgendes eingibt:
Goal: frau_von(Frau,_). Statt der Variablen steht hier
der Unterstrich. Prolog setzt also nicht erst alle Männer
ein, sondern ignoriert den zweiten Teil der Regel ganz.
Es sucht nur nach allen Lösungen für die Regel frau_von,
egal von wem.
Wenn man alle Kinder sehen will, die Eltern aber uninteressant
sind, tippt man folgendes:
Goal: vater_von(_,Kind).
Der Vater reicht hier, aber auch diese Frage würde zum
richtigen Ergebnis führen:
Goal: vater_von(_,Kind), mutter_von(_,Kind)
Achtung: Immer daran denken, daß das Komma für AND steht !
Man kann natürlich auch AND ausschreiben, aber Prolog selbst
wird immer das Komma benutzen.
Viel Spaß noch beim Probieren,
bis zum nächsten Mal !
Chalchiuthlicue.
Hier noch einige Möglichkeiten zum Ausprobieren:
(Vorher schon überlegen, welche Antwort kommt!)
mutter_von(Mutter,Kind),vater_von(Vater,Kind)
mutter_von(Mutter,_,),vater_von(Vater,_)
kind_von(Kind,Elternteil), vater_von(_,Kind)
vater_von(X,_), kind_von(Kind,X)