Anmerkung 1:
Ein Prologprogramm ist aufgebaut aus Anweisungen, die entweder als Fakten oder als Regeln anzusehen sind. Insbesondere kennt Prolog keine Anweisungen der Art von Wertzuweisungen konventioneller Programmiersprachen, die den Inhalt des Arbeitsspeichers manipulieren.
Dadurch wird kein grundsätzlicher Unterschied zwischen dem "Programm" (als Algorithmus) und den "Daten" (die durch einen Algorithmus verarbeitet werden) gemacht. Alle PROLOG-Anweisungen sind insofern gleichartig aufgebaut, als daß die Fakten eine spezielle Darstellungsform der Regeln sind (sie sind nur der Kopf einer Regel ohne Körper).
Die Steuerung der Verarbeitung ergibt sich aus den Regeln, insbesondere solchen mit Körpern und in PROLOG eingebauten Mechanismen (wie der Unifikation und dem Backtracking).
2 Grundelemente von Prolog
Die Frage, wie aus einem Problem eine Problemlösung in PROLOG wird, wollen wir an einem Beispiel studieren.
Als Beispiel wollen wir Personen und ihre verwandtschaftliche Beziehungen untereinander betrachten. Als Ziel sollen Fragen wie
Wer ist Großvater von X ?
oder
Wer ist Tante von Y?
beantworten können.
Die einfachste systematische Lösung bestände darin eine Liste mit allen Verwandten zu einer Person aufstellen, also die Eltern, die Großeltern, alle Geschwister, alle Onkeln, alle Tanten usw.
Der Vorteil dieser Lösung besteht darin, daß man alle Fragen sehr schnell beantworten könnte.
Die Nachteile dieser Methode sind vielfältig:
Heiraten 2 Personen , ergeben sich viele neue
Verwandtschaftsbeziehungen .
Möchte man über verwandtschaftliche Beziehungen
etwas wissen, die noch nicht erfaßt wurden, so erfordert
dies eine Überarbeitung dieser Liste usw.
Beispiel:
Die Karolinger
Karl der Große (874)
|
Ludwig der Fromme (840)
|
----------------------------------------------------------------
| | | |
Lothar I. Ludwig der Deutsche Karl II.
(855) (876) (877)
| | |
| ------------------------------
| | | |
Ludwig II. Karlmann Ludwig III. Karl III.
(875) (880) (882) (888)
Arnulf(889)
|
Ludwig das Kind
(911)
Aus diesen Diagramm geht z.B. hervor, daß
Nicht erfaßt sind in diesem Diagramm , mit wem die Karolinger jeweils verheiratet sind und welche weiteren verwandtschaftliche Beziehungen sich daraus ergeben.
Eine solche Liste repräsentiert nur Faktenwissen, so müßte auch das Faktum:
und viele mehr
Diese Anhäufung von Fakten ließe sich stark reduzieren, wenn man mit Hilfe von Regeln aus vorhandenen Fakten weitere erschließen könnte:
Beispiel:
Aus:
und der Regel:
1'. Jemand ist Vorfahre von einer Person,
wenn derjenige sein Vater ist oder
wenn derjenige Vorfahre des Vaters der Person ist.
Mit Hilfe dieser Regel läßt sich folgendes aus den obigen Fakten erschließen:
3'. Karl der Große ist Vorfahre von Ludwig dem Frommen
4'. Ludwig der Fromme ist Vorfahre von Ludwig der Deutsche
und da Karl der Große Vorfahre eines Vorfahren von Ludwig der Deutsche ist, gilt:
5'. Karl der Große ist Vorfahre von Ludwig der Deutsche
Programmieren in Prolog entspricht nun durchaus der hier vorgestellten Schlußfolgerungsweise, wobei man in Prolog die Sachverhalte natürlich nicht in Umgangssprache formulieren kann.
Eine Programmiersprache und so auch Prolog, legt fest, welche Zeichenmuster zulässig sind, um daraus Folgen von Befehlen, Tatsachen oder Regeln in der Programmiersprache zu formulieren.
Die Tatsache , daß Karl (der Große ) Vater von Ludwig,(dem Frommen), ist, kann man in Prolog wie folgt formulieren:
vater(karl_der_Grosse,ludwig_der_Fromme).
oder
vater(ludwig_der_Fromme,ludwig_der_Deutsche).
Die Regel über die Vorfahren muß mit Hilfe von Variablen formuliert werden. Hierzu muß man wissen, daß in Prolog Variablen dadurch gekennzeichnet werden, daß sie mit einem Großbuchstaben beginnen.
Beispiel: Person, Name, X
Vorfahre: X ist Vorfahre von Y:
vorfahre(X,Y) :- vater(X,Y).
vorfahre(X,Y) :- vater(X,Z),vorfahre(Z,Y).
|
AND
Regeln sollte allgemeingültig formuliert werden. Diese Formulierung trifft jedoch nur für männliche Vorfahren, weibliche werden nicht erfaßt. Hierzu wäre es notwendig, die Fakten über die Mütter von Personen hinzuzufügen und eine Regel für Eltern zu formulieren:
eltern(X,Y) :- vater(X,Y);mutter(X,Y).
|
OR
mit dieser weiteren Regel läßt sich der Vorfahre wie folgt umformulieren:
vorfahre(X,Y) :- eltern(X,Y).
vorfahre(X,Y) :- eltern(X,Z),vorfahre(Z,Y).
Diese Form der Regel stellt im Gegensatz zu der Regel über die Eltern gleich eine Besonderheit dar. Während die Regel über die Eltern nur auf die Fakten über Mutter oder Vater Bezug nimmt, nimmt die Regel über die Vorfahren auf den Sachverhalt Vorfahre selber wieder Bezug.
Einen solchen Sachverhalt nennt man rekursiv. Der Vorfahre wurde rekursiv definiert.
Schlußfolgerung:
In Prolog formulierte Programme formulieren Tatsachen (Fakten) und Regeln über das zu lösende Problem.
Eine Regel ist allgemein aufgebaut aus einem Kopf(Kopfteil) und einem Rumpf(Rumpfteil):
Bei der Regel über die Eltern ist der
Kopf: eltern(X,Y)
Rumpf: vater(X,Y);mutter(X,Y)
Kopf und Rumpf werden durch ":-" miteinander verbunden.
Der Rumpf faßt die Bedingungen zusammen, unter denen die
Verlag: BookRix GmbH & Co. KG
Tag der Veröffentlichung: 19.07.2016
ISBN: 978-3-7396-6516-0
Alle Rechte vorbehalten
Widmung:
Dieses Buch widme ich allen meinen Studenten