home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / diskmags / deutsch / blckmail / bm07 / prolog.bmt < prev    next >
Text File  |  1994-04-12  |  9KB  |  233 lines

  1.      PROLOG-Kurs Teil 1                            von Chalchiuthlicue
  2.  
  3.  
  4.      Der gesamte Kurs bezieht sich auf den Turbo-Prolog-Compiler, der
  5.      beim CHIP Tool Informatik- Heft dabei war. Ihr könnt ihn euch von
  6.      Midnight schicken lassen ! Wer meine Adresse kennt, kann auch
  7.      mir schreiben, dann bekommt ihr ein PD-Prolog mit Beispielpro-
  8.      grammen. Dieses PD-Prolog hat Midnight natürlich auch.
  9.  
  10.      Ich habe in der letzen Ausgabe ja schon ein bißchen was über das
  11.      Prinzip dieser Sprache erzählt. Besonders wichtig dabei war,
  12.      daß ein Prologprogramm keine Befehle kennt, sondern nur Regeln.
  13.      Darunter kann man sich ohne Beispiel nichts vorstellen, deshalb
  14.      gleich ein kleines Programm.
  15.  
  16.      In einer Fernsehshow spielen 3 Familien mit verschieden vielen
  17.      Kindern mit:
  18.  
  19.      Das Ehepaar Lisa und Hans mit Kind Nina.
  20.      Das Paar Inge und Paul mit Kind Jens.
  21.      Das Paar Thomas und Kerstin mit Claudia, Miriam und Stefan
  22.  
  23.      Da gibt es jetzt verschiedene Möglichkeiten, die Beziehungen
  24.      der Familienmitglieder untereinander auszudrücken:
  25.      Vater-von, Mutter-von, Kind-von, Frau-von, Mann-von, usw !
  26.  
  27.      Das muß man dem Prologsystem erst einmal erklären.
  28.      Wir geben also erstmal ein, wer von wem der Vater ist:
  29.  
  30.      vater_von(hans, nina).
  31.      vater_von(paul, jens).
  32.      vater_von(thomas, claudia).
  33.      vater_von(thomas, miriam).
  34.      vater_von(thomas, stefan).
  35.  
  36.      Und dann, welche Frau mit welchem Mann verheiratet ist:
  37.  
  38.      frau_von(lisa, hans).
  39.      frau_von(inge, paul).
  40.      frau_von(kerstin, thomas).
  41.  
  42.      Der Punkt bedeutet, daß die Regel zu Ende ist, und daß nicht
  43.      etwa noch eine Bedingung folgt.
  44.      Die Groß-/Kleinschreibung ist wichtig ! Wenn man nämlich die
  45.      Namen groß schreiben würde, stünden sie für beliebige andere
  46.      Namen, wären also eine Art Platzhalter.
  47.  
  48.      Nun kann man die Regeln weiter erklären, bis man grün wird,
  49.      schließlich ist der Computer so blöd, daß er nicht von selbst
  50.      weiß, das die Frau von Hans gleichzeitig die Mutter seiner
  51.      Tochter ist. Oder weiß er es vielleicht doch ? Ja, sonst würde
  52.      ich nicht so fragen ;-) !
  53.      Übrigens gehe ich hier von den ganz klassischen Familienver-
  54.      hältnissen aus, also keine Schwulenehe oder so... oh, sorry,
  55.      ich schweife vom Thema ab.             
  56.  
  57.      Prolog kann also in gewisser Hinsicht 'Schlüsse ziehen'. Nur
  58.      welche Schlüsse, das muß man noch angeben. Nämlich so:
  59.      (Leerzeichen werden vom Compiler ignoriert)
  60.  
  61.      mutter_von(Frau,Kind)
  62.      if frau_von(Frau,Mann) and vater_von(Mann,Kind).
  63.  
  64.      Da ist auf einmal Frau groß geschrieben !? Ja, weil es in diesem
  65.      Fall eine Variable ist. Prolog setzt der Reihe nach alle 
  66.      möglichen Namen für Frau und Kind und Mann ein, die man oben in 
  67.      frau_von und vater_von definiert hat. Wenn also in zwei 
  68.      Kombinationen (frau_von und vater_von) der gleiche Mann erscheint 
  69.      (das passiert 5 mal, wegen 5 Kindern), dann merkt sich Prolog das 
  70.      als Lösung für mutter_von.
  71.      Das hat für uns die gleiche Wirkung, als ob wir selbst
  72.      5 Mal z.B. mutter_von(lisa,nina) eingegeben hätten.
  73.  
  74.      Jetzt geht's ähnlich weiter:
  75.  
  76.      mann_von(Mann, Frau) if frau_von(Frau, Mann).
  77.      kind_von(Kind, Mann) if vater_von(Mann, Kind).
  78.      kind_von(Kind, Frau) if mutter_von(Frau, Kind).
  79.  
  80.      Diese Beziehungen reichen uns für den Anfang mal, wir wollen
  81.      das Ganze nun in ein Programm fassen.
  82.      Ein einfaches Prologprogramm besteht aus zwei Teilen:
  83.      dem 'predicates'-Teil, der so etwas wie die Variablen-
  84.      deklaration in TP darstellt (also doch eine Ähnlichkeit !),
  85.      und dem 'clauses'-Teil, in dem die Regeln aufgezählt werden,
  86.      in denen Prolog nach dem Start nach Lösungen sucht.
  87.  
  88.      Hier also unser Programm:
  89.      Man muß zu Verändern nach dem Start EDIT wählen. Übrigens 
  90.      funkioniert der Editor ähnlich wie der in TP, er kennt also die 
  91.      Word-Perfect-Befehle.
  92.  
  93.      /* Beispielprogramm 1 für den Prologkurs in Blackmail 7 */
  94.      /* Die Familienshow */
  95.  
  96.      predicates
  97.  
  98.      vater_von(symbol,symbol)       - Alle Regeln, die wir später
  99.      mutter_von(symbol, symbol)     - aufstellen, müssen hier
  100.      frau_von(symbol,symbol)        - deklariert werden. Symbol
  101.      mann_von(symbol, symbol)       - bedeutet für uns momentan so
  102.      kind_von(symbol,symbol)        - etwas wie ein String. In der
  103.                                     - Klammer könnte z.B. auch
  104.                                     - real, char, file usw stehen.
  105.  
  106.      clauses
  107.  
  108.      vater_von(hans, nina).         - das hier sind also die
  109.      vater_von(paul, jens).         - grundlegenden Vorschriften
  110.      vater_von(thomas, claudia).
  111.      vater_von(thomas, miriam).
  112.      vater_von(thomas, stefan).
  113.      frau_von(lisa, hans).
  114.      frau_von(inge, paul).
  115.      frau_von(kerstin, thomas).
  116.                                     - jetzt noch die Folgerungen:
  117.  
  118.      mutter_von(Frau,Kind) if frau_von(Frau,Mann)
  119.                            and vater_von(Mann,Kind).
  120.      mann_von(Mann, Frau) if frau_von(Frau, Mann).
  121.      kind_von(Kind, Mann) if vater_von(Mann, Kind).
  122.      kind_von(Kind, Frau) if mutter_von(Frau, Kind).
  123.  
  124.      Regeln werden immer mit einem Punkt abgeschlossen !
  125.      Mit ESC kommt man aus dem Editor wieder raus, und kann das
  126.      Programm mit COMPILE kompilieren lassen. Wenn ihr das Beispiel-
  127.      programm (FAMILY1.PRO) geladen habt, das mit der Blackmail
  128.      verschickt wurde, sollte kein Fehler auftreten. Der Compiler
  129.      meldet sein O.K. links unten im MESSAGE-Fenster.
  130.      Nach dem kompilieren startet man das Programm mit RUN (in der
  131.      obersten Zeile anwählen, evtl. vorher mit ESC aus dem Editor
  132.      rausgehen). Im DIALOG-Fenster (rechts oben) erscheint folgendes:
  133.  
  134.      Goal:
  135.  
  136.      Prolog verlangt ein Ziel, nach dem es suchen soll.
  137.      Nun könnt ihr ein bißchen herumspielen, und ausprobieren,
  138.      was euch so einfällt. Wer Lust hat, kann versuchen, weitere
  139.      Regeln festzulegen (z.B. geschwister(Kind1, Kind2) if ...)
  140.  
  141.      Wenn man alle Lösungen einer Regel wissen will, gibt man den
  142.      Namen der Regel ein, und danach entweder eine Variable (Prolog
  143.      sucht dann alle Möglichkeiten), oder einen bestimmten Namen
  144.      (wäre also eine Bedingung).
  145.  
  146.      Beispiel:
  147.      Goal: kind_von(miriam, Elternteil)
  148.  
  149.      'miriam' ist vom Benutzer festgelegt (klein geschrieben),
  150.      Elternteil ist dagegen ein Platzhalter.
  151.      Prolog sucht nun nach allen Symbolen, für die
  152.      die Regel kind_von(miriam, xxxx) gilt. Im Dialogfenster
  153.      erscheint:
  154.  
  155.      kind_von(miriam, Elternteil)
  156.  
  157.      Elternteil = Thomas
  158.      Elternteil = Kerstin
  159.  
  160.      2 Solutions.
  161.  
  162.      Probiert mal folgendes aus:
  163.      
  164.      Goal: vater_von(Vater, Kind)
  165.      
  166.      Es erscheint: 
  167.      
  168.      Vater= hans, Kind=nina         - das hieße gesprochen: Vater 
  169.      Vater= paul, Kind=jens         - ist Hans und Kind ist Miriam
  170.      Vater= thomas, Kind=claudia
  171.      Vater= thomas, Kind=miriam
  172.      Vater= thomas, Kind=stefan
  173.      5 solutions
  174.  
  175.      Oder gleich zwei Bedingungen:
  176.  
  177.      Goal: vater_von(Vater, Kind), frau_von(kerstin, Vater)
  178.      
  179.      Das Komma ist in Prolog eine Abkürzung für 'und' (AND).
  180.      Überlegt gleich voher, wieviele und welche Lösungen
  181.      erscheinen werden ! (Es sind die drei Kinder von Kerstin
  182.      und Thomas)
  183.  
  184.      Um zu verhindern, daß Prolog alle Bestandteile einer
  185.      Regel aufzählt, kann man sagen, welche Teile einem egal
  186.      sind.
  187.      Um alle Frauen zu bekommen, könnte man eingeben:
  188.  
  189.      Goal: frau_von(Frau,Mann).
  190.      
  191.      Doch hier erscheinen jedesmal die Frau UND der Mann.
  192.      Den läßt man bei den Lösungen verschwinden :-(, indem man
  193.      bei Goal folgendes eingibt:
  194.  
  195.      Goal: frau_von(Frau,_). Statt der Variablen steht hier
  196.      der Unterstrich. Prolog setzt also nicht erst alle Männer
  197.      ein, sondern ignoriert den zweiten Teil der Regel ganz.
  198.      Es sucht nur nach allen Lösungen für die Regel frau_von,
  199.      egal von wem.
  200.  
  201.      Wenn man alle Kinder sehen will, die Eltern aber uninteressant 
  202.      sind, tippt man folgendes:
  203.  
  204.      Goal: vater_von(_,Kind). 
  205.  
  206.      Der Vater reicht hier, aber auch diese Frage würde zum
  207.      richtigen Ergebnis führen:
  208.      
  209.      Goal: vater_von(_,Kind), mutter_von(_,Kind) 
  210.      
  211.      Achtung: Immer daran denken, daß das Komma für AND steht !
  212.      Man kann natürlich auch AND ausschreiben, aber Prolog selbst
  213.      wird immer das Komma benutzen.
  214.  
  215.      Viel Spaß noch beim Probieren,
  216.      bis zum nächsten Mal !
  217.  
  218.                                                     Chalchiuthlicue.
  219.  
  220.  
  221.  
  222.      Hier noch einige Möglichkeiten zum Ausprobieren:
  223.      (Vorher schon überlegen, welche Antwort kommt!)
  224.  
  225.      mutter_von(Mutter,Kind),vater_von(Vater,Kind)
  226.      
  227.      mutter_von(Mutter,_,),vater_von(Vater,_)
  228.      
  229.      kind_von(Kind,Elternteil), vater_von(_,Kind)
  230.      
  231.      vater_von(X,_), kind_von(Kind,X)
  232.  
  233.