Wer ist Cats Großelternteil?
In einem Stammbaum siehst du es, wenn du zwei Linien nach oben folgst. Ein Programm in den meisten Sprachen bräuchte Schritt-für-Schritt-Anweisungen, um dasselbe zu tun. Prolog arbeitet anders: Du schreibst auf, was wahr ist, stellst dann eine Frage, und es findet die Antwort.
Am Ende dieser Lektion
Notiz
Ich kann einem Prolog-Programm Fragen zu Fakten und Regeln stellen.
Schlüsselwörter
- Fakt: etwas, das dem Programm als wahr mitgeteilt wird.
- Regel: eine Aussage, die wahr ist, wenn andere Aussagen wahr sind.
- Anfrage: eine Frage, die du dem Programm stellst.
- Variable: ein Name, der mit einem Großbuchstaben beginnt und für eine gesuchte Antwort steht, zum Beispiel
X. - Rekursion: eine Regel, die sich selbst benutzt.
Zum Einstieg: was du schon weißt
Notiz
Antworte im Kopf. 1. Wenn x + 2 = 5, was ist x? 2. Was muss in „Wenn es regnet, nimm einen Schirm“ wahr sein, bevor du einen nimmst? 3. Was ist in einem Stammbaum ein Großelternteil? Antworten: 3, weil x für eine Zahl steht, die die Gleichung wahr macht; dass es regnet; ein Elternteil eines Elternteils.
Bevor du anfängst
Notiz
Klicke oben in der Leiste dieser Lektion auf Lab starten und warte, bis dort steht, dass es läuft. Es gibt einen Container, prolog. Im Browser öffnet sich nichts, also nutze das Terminal, in dem docker exec prolog einen Befehl darin ausführt. Jeder Befehl lädt eine Datei, stellt eine Frage und endet. Alles, was ausgegeben wird, ist Englisch, egal in welcher Sprache diese Seite steht. Jede Schaltfläche Ausführen unten tippt ihren Befehl ins Terminal deines Labs, einen nach dem anderen in derselben Sitzung. Wenn du zuschauen oder eigene Befehle tippen willst, klicke in der Leiste auf Terminal öffnen (neuer Tab).
Ein Fakt ist eine Zeile, die wahr ist
Dieser Befehl gibt die Datei mit den Fakten aus. Jede Zeile wie parent(tom, ann). ist ein Fakt, gelesen als „tom ist ein Elternteil von ann“, und endet mit einem Punkt. Zeilen, die mit % beginnen, sind Kommentare. Prolog weiß nur, was in der Datei steht.
docker exec prolog cat facts.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Anfrage fragt, ob etwas wahr ist
Der erste Befehl lädt facts.pl und fragt, ob tom ein Elternteil von ann ist. Die Option -g ist das Ziel, das ausgeführt wird, und -t halt beendet danach. Er gibt yes aus, weil der Fakt da ist. Der zweite fragt, ob ann ein Elternteil von dan ist. Das steht nicht in den Fakten: Das Ziel scheitert und es wird nichts ausgegeben. Keine Ausgabe heißt „lässt sich nicht als wahr zeigen“.
docker exec prolog swipl -q -g "parent(tom, ann), writeln(yes)" -t halt facts.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec prolog swipl -q -g "parent(ann, dan), writeln(yes)" -t halt facts.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Variable fragt „wer?“
Ein Großbuchstabe macht eine Variable, die Prolog füllt, indem es alle passenden Fakten findet. forall geht jede Antwort durch und writeln gibt sie aus. Der erste Befehl gibt toms Kinder aus, ann und dann ben, in der Reihenfolge, in der die Fakten stehen. Der zweite dreht die Frage um: Wer ist ein Elternteil von ben? Er gibt tom aus.
docker exec prolog swipl -q -g "forall(parent(tom, X), writeln(X))" -t halt facts.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec prolog swipl -q -g "forall(parent(X, ben), writeln(X))" -t halt facts.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Prüfe dich
Tipp
Welche Kinder hat ben, und in welcher Reihenfolge würden sie ausgegeben? Antwort: dan und dann eve, weil diese Fakten in dieser Reihenfolge stehen. Für jemanden ohne Kinder wird nichts ausgegeben.
Eine Regel ist wahr, wenn ihre Teile wahr sind
family.pl enthält Regeln. Die Regel grandparent(X, Z) :- parent(X, Y), parent(Y, Z). liest sich „X ist ein Großelternteil von Z, wenn X ein Elternteil von einem Y ist und Y ein Elternteil von Z“. Das :- heißt „wenn“ und das Komma „und“. Niemand hat einen Fakt über Großeltern geschrieben. Dieser Befehl fragt nach toms Enkeln und gibt cat, dan und eve aus.
docker exec prolog swipl -q -g "forall(grandparent(tom, X), writeln(X))" -t halt family.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Regel kann sich selbst benutzen
Ein Vorfahr ist ein Elternteil oder ein Elternteil eines Vorfahren. Die zweite Regel ruft sich selbst auf, sie folgt dem Baum also so weit nach unten, wie er geht. findall sammelt alle Antworten in einer Liste. Der erste Befehl gibt [ann,ben,cat,dan,eve] aus, der zweite, für ann, [cat].
docker exec prolog swipl -q -g "findall(X, ancestor(tom, X), L), writeln(L)" -t halt family.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec prolog swipl -q -g "findall(X, ancestor(ann, X), L), writeln(L)" -t halt family.plHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein Prolog-Programm laufe von oben nach unten, Zeile für Zeile, wie ein Rezept. Das stimmt nicht. Fakten und Regeln sagen, was wahr ist, und die Frage entscheidet, was berechnet wird. Und eine Anfrage, die nichts ausgibt, heißt nicht, dass das Programm kaputt ist oder die Antwort im echten Leben falsch wäre: Sie heißt, dass sich die Antwort aus den aufgeschriebenen Fakten nicht beweisen lässt. Füge einen Fakt hinzu, und dieselbe Frage kann gelingen.
Abschlusskontrolle
Tipp
Antworte, ohne zurückzublättern. 1. Was sagt parent(tom, ann).? 2. Was unterscheidet X von tom? 3. Was bedeutet :- in einer Regel? 4. Wie heißt es, wenn eine Regel sich selbst benutzt? Antworten: tom ist ein Elternteil von ann, und es ist ein Fakt; X beginnt mit einem Großbuchstaben, ist also eine gesuchte Variable; „wenn“; Rekursion.
Für Lehrkräfte
Tipp
Diese Lektion ist ein kleines Beispiel für eine Lektion, die in einem Lab durchgeführt wird: Die Schritte und die Schaltflächen Ausführen sind die Lektion, und das Lab ist die Kopie jedes Lernenden. Das Lab ist ein Container mit dem Interpreter SWI-Prolog und drei kleinen Dateien, und hier wird nichts automatisch bewertet: Die Lernenden geben die Fragen ab, die sie gestellt haben, mit der jeweiligen Antwort, eine eigene Regel in family.pl mit einer Frage, die sie in Aktion zeigt, und einen Satz dazu, wie sich ein Fakt von einer Regel unterscheidet. Kernpunkte: 1. Ein Fakt ist eine Aussage, die wahr ist. 2. Eine Anfrage fragt, ob etwas wahr ist, und eine Variable fragt „wer“. 3. Eine Regel ist wahr, wenn ihre Teile wahr sind. 4. Eine Regel, die sich selbst benutzt, folgt einer Struktur so weit, wie sie geht. Häufiger Fehler: ein Programm als Liste von Anweisungen zu lesen oder keine Ausgabe als „falsch“. Material: das Lab und sein Terminal. Tipp: Lassen Sie die Antworten vor dem Ausführen vorhersagen, dann einen Fakt hinzufügen und sehen, was sich ändert. Die Antworten sind genau und jedes Mal gleich, in der Reihenfolge der Fakten. Namen und alle Meldungen sind Englisch, egal in welcher Sprache die Seite steht.