Einführung
In einem ihrer bekanntesten Zitate schreibt Ada Lovelace, dass die Analytical Engine nichts selbst erfinden kann, sondern nur Sachen verfügbar machen, die der Mensch bereits kennt. Diese Aussage ist problematisch, denn sie stimmt zwar in der Theorie, aber in nicht in der Praxis.
Die moderne Informatik kennt das Teilgebiet der Wissensverarbeitung, bei dem es unter anderem darum geht, mit dem Computer Wissen zu aufzunehmen und daraus neues Wissen zu erzeugen. Dies geschieht auf unterschiedlichen Wegen, zum Beispiel mit Hilfe der Logik, durch die Analyse großer Datenmengen oder durch die Simulation der Abläufe im Gehirn.
Prolog
Prolog ist schon eine sehr alte Programmiersprache (sie stammt aus den frühen 1970er Jahren), mit der man sehr einfach im Computer Wissen aufbauen kann. Das Programmieren in Prolog erfolgt im Zwiegespräch mit dem Computer; Man kann dem Computer Fakten und Regeln mitteilen und Fragen zu dem so aufgebauten Wissen stellen.
Es folgt ein kleines Beispiel in Prolog. Diese ist das Standardbeispiel am Anfang eines Programmierkurses, das die drei Kernelemente der Sprache zeigt: Fakten, Regeln und Anfragen.
Es gibt im Internet viele Websites, bei denen man Prolog-Programme wie dieses online eingeben und ausführen kann, zum Beispiel bei swi-prolog.org.
Beispiel
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]mutter(anne, monika).[/otw_shortcode_info_box]
Wir teilen dem Computer mit, dass Anne Mutter von Monika ist.
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]mutter(monika, susi).[/otw_shortcode_info_box]
Wir teilen dem Computer mit, dass Monika Mutter von Susi ist.
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]grossmutter(X,Z):- mutter(X,Y), mutter(Y,Z).[/otw_shortcode_info_box]
Wir bringen dem Computer eine Regel bei: Wenn er Objekte X, Y und Z findet, sodass X Mutter von Y ist und Y Mutter von Z ist, dann ist X Großmutter von Z.
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]? grossmutter(anne, susi).[/otw_shortcode_info_box]
Mit einem Fragezeichen leiten wir eine Frage an den Rechner ein: Ist Anne Großmutter von Susi?
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]Ja [/otw_shortcode_info_box]
Der Computer kann das bestätigen.
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]? grossmutter(X, susi).[/otw_shortcode_info_box]
Kann der Computer herausfinden, wer Großmutter von Susi ist? (Genauer: Gibt es ein X, für das gilt, X ist Großmutter von Susi?)
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]X = anne[/otw_shortcode_info_box]
Der Computer findet Anne als Großmutter von Susi.
Kommentar
Das Beispiel mit der Großmutter ist sehr einfach. Es vermittelt aber sehr gut einen Eindruck, wie ein Computer mit Hilfe einer eigens entwickelten Sprache eine Aufgabe erfüllen kann, die nichts mit der Arithmetik zu tun hat, auch wenn die Befehle, die der Computer ausführt arithmetischer Art sind. Dies war ja die große Erkenntins von Ada Lovelace: dass man andere Bereiche auf die einfachen Befehle und Daten eines Computers abbilden kann.
Beispiel 2: Welche Haarfarbe hat Anne?
Wir zeigen jetzt ein zweites Beispiel für die Arbeit mit der Sprache Prolog. Es geht um eine beliebte Art von Rätsel, bei dem man aus unvollständigen Angaben Schlussfolgerungen ziehen muss.
Es gibt ein Büro, in dem drei Menschen arbeiten. Von diesen drei Menschen ist Folgendes bekannt:
- Ada trinkt Saft
- Der mensch, der Kaffee trinkt, hat blonde Haare.
- Der Mensch, der Tee trinkt, sitzt hinten.
- Der Mensch, der am Fenster sitzt, hat braune Haare.
- Anne sitzt am Eingang.
- Markus hat rote Haare.
Die Aufgabe besteht nun darin, herauszufinden, welche Haarfarbe Anne hat. (Man kann in diesem Fall sogar sämtliche Informationen über die drei Leute ermitteln.)
Die Information kann man in Prolog sehr einfach formulieren:
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]
buero(P) :-
length(P, 3),
member(person( ada, saft, _, _), P),
member(person( _,kaffee, _,blond), P),
member(person( _, tee, hinten, _), P),
member(person( _, _,fenster,braun), P),
member(person( anne, _,eingang, _), P),
member(person(markus, _, _, rot), P).
[/otw_shortcode_info_box]
Fragen wir dann den Rechner nach dem Büro:
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]buero(X)[/otw_shortcode_info_box]
antwortet er mit einer vollständigen Beschreibung aller drei Personen:
[otw_shortcode_info_box border_style=”bordered” background_color=”#eeeeee”]X = [person(ada, saft, fenster, braun), person(anne, kaffee, eingang, blond), person(markus, tee, hinten, rot)][/otw_shortcode_info_box]
Dieses Rätsel ist schon kniffelig: nicht jeder Mensch kann es lösen. Erhöht man die Anzahl der Unbekannten, wie beim berühmten Zebra-Rätsel (das angeblich von Albert Einstein erwähnt wurde), werden solche Rätsel für den Menschen schnell völlig unübersichtlich, für den Computer aber ändert sich praktisch nichts. Dann wirken die Erkenntnisse, die der Computer produzieren kann für den Menschen schon überraschend.