Prolog
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Prolog ist eine logische Programmiersprache, die Anfang der 1970er Jahre vom Franzosen Alan Colmerauer entwickelt wurde. Der Name des Programms ergibt sich aus dem Französischen "Programmation en Logique" (Programmieren in Logik). Prolog dient der deklarativen Programmierung, d.h. dass hierbei die Problembeschreibung im Vordergrund steht und das Programm die Problemlösung selbstständig findet.
Prolog baut auf Wissensbasen auf. Wissenbasen sind einfache Textdokumente, die in einem Texteditor erstellt werden. Hierin werden Fakten und Regeln festgehalten. Um Regeln formulieren und verstehen zu können, sollten Kenntnisse in derPrädikatenlogik vorhanden sein. Die Datei muss als .pl gespeichert werden, wodurch unter Umständen Verwechslungsmöglichkeiten mit Perl-Skripten auftreten können.
Dieser Artikel befasst sich vor allem mit der Prolog-Implementierung durch SWI 🇬🇧 . Das GNU-Projekt bietet aber auch Prolog-Pakete an: GNU Prolog 🇬🇧, welches ebenfalls über die offiziellen Paketquellen installierbar ist)
Leider gibt es keinen einheitlichen Prolog-Standard, sondern verschiedene Dialekte, die nicht 100% zueinander kompatibel sind.
Installation¶
Um SWI-Prolog nutzen zu können, muss das folgende Paket mit seinen Abhängigkeiten installiert [1] werden:
swi-prolog (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install swi-prolog
Oder mit apturl installieren, Link: apt://swi-prolog
Starten des Programmes¶
Am Besten navigiert man direkt in den Ordner, in dem sich die Wissensbasen befinden und startet hier Prolog auf der Kommandozeile [3]:
swipl
Das Programm öffnet sich nun in der Konsole und lässt sich hierin bedienen. Zum Stoppen des Programms muss der Befehl halt.
eingegeben werden.
Prolog nutzen¶
Allgemeine Hinweise¶
Bei Prolog werden Befehle immer mit einem Punkt (.
) abgeschlossen. Fehlt dieser wird der Befehl nicht ausgeführt. Das ist eine häufige Fehlerquelle. Das Programm besitzt ähnliche Merkmale wie die Bash, so kann durch Betätigen der Pfeiltasten durch die eingegebenen Befehle navigiert werden und durch die Tab-Taste
Tab ⇆ Dateinamen vervollständigt werden.
Prolog kennt drei unterschiedliche Zustände: den Start- bzw. Normalzustand, "trace" - hierbei zeigt Prolog die einzelnen Schritte, die es ausführt an - und "debug" - der Modus zur Fehlerbehebung. Diese Zustände können durch die Eingabe des Wortes aufgerufen werden. Beendet werden sie mit einem no
vor dem jeweiligen Wort, bspw. notrace
oder nodebug
.
Prädikate besitzen in Prolog eine Stelligkeit. Sie wird beispielsweise durch NAME/1
gekennzeichnet, d.h. das Prädikat NAME
ist einstellig.
Befehlsübersicht¶
Hier ist eine unvollständige Auflistung der Befehle, die Prolog von Haus aus kennt.
Übersicht | |
Befehl | Beschreibung |
[DATEINAME]. | Lädt die aktuelle Wissensbasis ein, wenn man Prolog im richtigen Verzeichnis gestartet hat. Der Dateiname muss ohne .pl eingegeben werden und darf nur kleingeschrieben werden. |
['/PFAD/ZU/DATEINAME.pl']. | Lädt die aktuelle Wissensbasis ein, ohne im selben Verzeichnis zu sein. |
, | Konjunktion (Logisches Und) |
; | Disjunktion (Logisches Oder) |
:- | Implikation (Wenn, dann) |
\= | Negation (Logische Verneinung) |
[H|T]. bzw. [X,Y,Z] bzw. [1,2,3] | Listennotation, | ist der Trenner für Kopf (H) und Rest der Liste (T). |
_ | Meint eine anonyme Variable (hier ist der Wert, den die Variable einnimmt, nicht von Interesse). |
! | cut, Der Cut kann in einem komplexen Term eingebracht werden. Wenn Prolog bei der Abarbeitung der Klauseln hinter die Stelle des Cuts gelangt, ist es für das Programm nicht mehr möglich, davor zu gelangen. |
\+ | schwache Negation, Durch die Resolution kann der Satz nicht als wahr belegt werden, so dass davon ausgegangen wird, dass der Satz unwahr ist. |
listing. | Zeigt den Inhalt der aktuellen Wissensbasis an. |
listing(TERM). | Prüft, ob ein bestimmter Term in der Wissensbasis ist. |
trace. bzw. notrace. | Startet und beendet den Tracemodus. |
'ATOMNAME' | Einfache Anführungszeichen oben kennzeichnen ein Atom. |
asserta() | Fügt einen Term oder einen Fakt an den Anfang die aktuelle Wissensbasis an. |
assertz() | Fügt einen Term oder einen Fakt ans Ende der aktuellen Wissensbasis an. |
append/3 | Definition:append([],L,L). (Abbruchbedingung)append([H|T],L2,[H|L3]):- append(T,L2,L3). fügt zwei Listen zusammen und ist ein dreistelliger Term |
prefix/2 | Baut auf append auf und gibt die Prefixe einer Liste an:prefix(P,L):- append(P,_,L). |
suffix/2 | Baut ebenfalls auf append/3 auf; gibt aber das Ende einer Liste aus.suffix(S,L):- append(_,S,L). |
Beispiel¶
Zuerst wird mit einem Editor[5] die Wissensbasis erstellt und unter einem frei wählbaren Namen mit der Dateiendung .pl
gespeichert:
1 2 3 4 5 6 7 8 9 10 11 12 | lernt(otto, mathe). lernt(paula, englisch). lernt(rainer, mathe). lernt(bibi, biologie). lehrt(heinz, mathe). lehrt(friedrich, physik). lehrt(sleiglinde, englisch). lehrer(X, Y) :- lehrt(X, C), lernt(Y, C). gleiches_fach(X, Y) :- lernt(X, C), lernt(Y, C). |
Es werden vier Lernende mit Name und Fach definiert, dann werden drei Lehrer, auch wieder mit Name und Fach definiert. Dann werden zwei Regeln definiert: zum einen eine Regel zum Testen zur Beziehung Lehrer - Schüler, zum anderen, ob zwei Lernende das gleiche Fach lernen.
Zuerst wird Prolog mit der Wissensbasis gestartet:
swipl name_der_wissensdatei.pl
Die erste Zeile der Ausgabe sollten dann lauten
Welcome to SWI-Prolog
und der Prompt ?-
sollte erscheinen. Hier werden anschließend die Anfragen gestellt, wie z.B.:
?- lehrer(heinz, otto). true. ?- lehrer(heinz, paul). false. ?- lehrer(heinz, ute). false. ?- gleiches_fach(otto, rainer). true. ?- gleiches_fach(otto, bibi). false. ?-
Links¶
SWI-Prolog 🇬🇧 - Projektwebseite
GNU-Prolog 🇬🇧
Learn Prolog Now 🇬🇧 - ein Onlinekurs mit 12 Kapiteln