[[Vorlage(getestet, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme_starten: Starten von Programmen] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] [:Editor: einen Editor starten] }}} [[Inhaltsverzeichnis()]] [[Bild(swipl.png,,align=left)]] [wikipedia:Prolog_(Programmiersprache):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 "'''Pro'''grammation en '''Log'''ique" (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 [:Editor:Texteditor] erstellt werden. Hierin werden Fakten und Regeln festgehalten. Um Regeln formulieren und verstehen zu können, sollten Kenntnisse in der[wikipedia:Prä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 [http://www.swi-prolog.org/ SWI] {en} . Das GNU-Projekt bietet aber auch Prolog-Pakete an: [http://www.gprolog.org/ GNU Prolog] {en}, 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: {{{#!vorlage Paketinstallation swi-prolog, universe }}} =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]: {{{#!vorlage Befehl 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 [[Vorlage(Tasten, 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. {{{#!vorlage Tabelle Ü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. +++ `,` [wikipedia:Konjunktion:] (Logisches Und) +++ `;` [wikipedia:Disjunktion:] (Logisches Oder) +++ `:-` [wikipedia:Implikation:] (Wenn, dann) +++ `\=` [wikipedia: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. +++ `\+` [wikipedia:schwache Negation:], Durch die [wikipedia: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:[[BR]]`append([],L,L).` (Abbruchbedingung)[[BR]]`append([H|T],L2,[H|L3]):- append(T,L2,L3).`[[BR]]fügt zwei Listen zusammen und ist ein dreistelliger Term +++ `prefix/2` Baut auf `append` auf und gibt die Prefixe einer Liste an:[[BR]]`prefix(P,L):- append(P,_,L).` +++ `suffix/2` Baut ebenfalls auf `append/3` auf; gibt aber das Ende einer Liste aus.[[BR]]`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: {{{#!code prolog 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: {{{#!vorlage Befehl 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.: {{{#!vorlage Befehl ?- lehrer(heinz, otto). true. ?- lehrer(heinz, paul). false. ?- lehrer(heinz, ute). false. ?- gleiches_fach(otto, rainer). true. ?- gleiches_fach(otto, bibi). false. ?- }}} = Links = * [http://www.swi-prolog.org/ SWI-Prolog] {en} - Projektwebseite * [http://www.gprolog.org/ GNU-Prolog] {en} * [http://www.learnprolognow.org/ Learn Prolog Now] {en} - ein Onlinekurs mit 12 Kapiteln #tag: Programmierung, Prolog