Was ist logische Programmierung mit Prolog?
Prolog ist eine Programmiersprache, in der ein Programm aus Fakten und Regeln besteht. Sie stellen eine Frage, und Prolog sucht selbst alle passenden Antworten.
Ein Beispiel: Eine Bäckerei kennt die Preise ihrer Waren. Sie fragen „Was kostet Brot?“ und bekommen die Antwort aus den bekannten Tatsachen, ohne eine Suchschleife zu schreiben.
Am Ende dieser Lektion
Notiz
Ich kann Fakten in Prolog aufschreiben und dem System eine Frage dazu stellen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Fakt | eine Aussage, die wir als wahr festlegen | preis(brot, 3). |
| Prädikat | der Name vor der Klammer, er sagt, wovon der Fakt handelt | |
| Atom | ein Name in Kleinbuchstaben ohne weitere Bedeutung | brot |
| Variable | ein Platzhalter, der mit einem Großbuchstaben beginnt | Preis |
| Anfrage | eine Frage, die wir Prolog stellen | |
| Unifikation | der Abgleich, ob zwei Ausdrücke gleich werden können |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Fakt hält eine Tatsache fest
Ein Fakt ist eine Aussage, die wir als wahr festlegen. Er besteht aus einem Prädikat und Werten in Klammern, am Ende steht ein Punkt.
preis(brot, 3). liest sich: „Der Preis von Brot ist 3.“ Die Werte brot und 3 heißen Atome und Zahlen. Ein Atom beginnt mit einem Kleinbuchstaben.
Drei Fakten einer Bäckerei
% Beispiel: Fakten einer Bäckerei.
preis(brot, 3).
preis(milch, 2).
vorrat(brot, ja).Das Lab spricht Englisch
Tipp
Die Dateien des Labs und alles, was Prolog ausgibt, sind englisch: Namen wie parent und colour, Fehlermeldungen, die Wörter true und false. Das ist die Sprache des Werkzeugs. Die Erklärungen hier bleiben deutsch.
Die Fakten des Labs ansehen
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 mit einer Variable
Eine Anfrage sieht aus wie ein Fakt, aber mit einer Variablen an der Stelle, die Sie wissen wollen. Eine Variable beginnt mit einem Großbuchstaben, etwa X oder Preis.
Prolog sucht alle Fakten, die passen, und füllt die Variable mit dem, was dort steht. Die Anfrage parent(tom, X) fragt: „Wer ist ein Kind von tom?“
Alle Antworten einer Anfrage ausgeben
docker exec prolog swipl -q -g "forall(parent(tom, X), (write(X), nl))" -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.
Die Antworten in einer Liste sammeln
docker exec prolog swipl -q -g "findall(K, parent(ben, K), L), write(L), nl" -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.
Prolog gleicht Muster mit Fakten ab
Hinter jeder Anfrage steht die Unifikation: Prolog prüft, ob sich Anfrage und Fakt durch Einsetzen für Variablen gleich machen lassen. Die Namen müssen gleich sein, die Zahl der Werte auch.
Passt es, erhält die Variable den Wert. Passt es nicht, probiert Prolog den nächsten Fakt.
Beispiel: wann ein Muster passt
| Muster | Fakt | Passt? |
|---|---|---|
| preis(brot, X) | preis(brot, 3) | Ja, X ist 3 |
| preis(milch, 3) | preis(milch, 2) | Nein, 3 ist nicht 2 |
| preis(W, P) | preis(brot, 3) | Ja, W ist brot und P ist 3 |
| preis(brot, X) | vorrat(brot, ja) | Nein, anderes Prädikat |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zwei Muster gleich machen
docker exec prolog swipl -q -g "preis(brot, P) = preis(W, 3), write(W-P), nl" -t haltHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Muster, die nicht passen
docker exec prolog swipl -q -g "( preis(brot, 3) = preis(milch, 3) -> writeln(passt) ; writeln(passt_nicht) )" -t haltHier 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 glauben, die Antwort „nein“ heiße, die Aussage sei falsch in der Wirklichkeit. Prolog kennt nur seine Fakten. Steht kein passender Fakt da, lautet die Antwort nein, auch wenn die Sache stimmen könnte. Fehlt der Preis von Käse, ist „Käse kostet etwas“ für Prolog nicht beweisbar.
Kein Fakt, also keine Antwort
docker exec prolog swipl -q -g "assertz(preis(brot, 3)), ( preis(kaese, _) -> writeln(ja) ; writeln(nein) )" -t haltHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Abgleichen selbst nachbauen
Um zu sehen, was Prolog tut, bauen Sie das Abgleichen in Python nach. Ein Fakt ist eine Liste von Wörtern, ein Muster ebenso. Ein Wort mit Großbuchstaben vorn ist eine Variable und passt auf alles.
Sie schreiben drei kleine Funktionen: ist_variable, passt und treffer. Danach ist Prologs Anfrage kein Zauber mehr, sondern eine Schleife über die Fakten.