|
Die Idee der Formalisierung logischer Schlußweisen läßt sich bis in die Antike zu den Arbeiten von Aristoteles (gest. 322 v.Chr.) zurückverfolgen. Die damals entscheidende Entdeckung war, daß logische Schlüsse allein von der Form der beteiligten Aussagen abhängen und damit vom Inhalt der Aussagen unabhängig sind - eine für die Automatisierung durch Rechenmaschinen unabdingbare Voraussetzung! Es war dann Leibniz (1646-1716), der als erster den Traum einer voll automatisierten Denkmaschine formulierte. Der effektive Durchbruch bei der Abbildung logischer Schlußweisen auf ausführbare Rechenoperationen gelang allerdings erst Robinson im Jahre 1965 mit dem sogenannten Resolutionskalkül. Im Gegensatz zu den bis dato dem menschlichen Vorgehen nachempfundenen Schlußregeln, ist die Resolutionsregel bestens für die mechanische Abarbeitung durch Computer geeignet. Genauso wie eine Vielzahl heutiger Hochleistungsbeweiser basiert auch die Programmiersprache Prolog auf dem Resolutionskalkül.
Mit der Erfindung von Prolog Anfang der 70er Jahre haben Colmerauer und Kowalski gezeigt, wie Logik zum Programmieren verwendet werden kann. Damit gelang eine erfolgreiche Synthese deklarativer und prozeduraler Programmierung. Grob gesprochen kann man damit eine Prolog-Regel, wie
verstehen. Prozedural kann die Regel auch als (Teil einer) Prozedur "über" mit zwei Parametern X und Y, einer lokalen Variable Z und zwei Prozeduraufrufen auf(X,Z) und über(Z,Y), ähnlich wie in der Programmiersprache Pascal, interpretiert werden.
Prolog ist allerdings nicht rein deklarativ, was man daran erkennen kann, daß die beiden Programme
über(X,Y) :- auf(X,Y). |
über(X,Y) :- auf(X,Z),über(Z,Y). |
über(X,Y) :- über(Z,Y),auf(X,Z). |
über(X,Y) :- auf(X,Y). |
zu beiden Programmen hinzu und stellt dann die Anfrageauf(buch,tisch)
so wird dies durch das erste Programm bejaht, während sich das zweite in einer Endlosschleife verirrt und nicht terminiert. Dies liegt daran, daß in Prolog die Abarbeitung der Regeln durch ihre Reihenfolge bestimmt wird. Doch auch wenn dies aus Sicht eines Programmierers durchaus legitim erscheint, so genügt es nicht den Ansprüchen einer rein deklarativen Sicht der Programmierung.über(buch,tisch),
Bis zum Ende der 90er Jahre wurde deshalb eine Vielzahl von Alternativen untersucht, um diese Abweichung der deklarativen Bedeutung eines logischen Programms von seiner prozeduralen Ausführung zu beseitigen. Die Antwortmengenprogrammierung kann als ein erfolgreiches Resultat dieses Forschungsvorhabens gesehen werden; sie vereint Techniken aus der logischen Programmierung mit denen aus den Gebieten der Wissensrepräsentation, der deduktiven Datenbanken und des nichtmonotonen Schließens. Regeln der Form
(mit atomaren Aussagen Lk für 0<=k<=m über endlichem Gegenstandbereich) werden hier jeweils als Randbedingungen (engl.: constraints) an zu formende Antwortmengen A aufgefasst: Wenn LiA für 1<=i<=m und LjA für m<j<=n, dann ist L0A. Logische Programme bestehen dann aus einer Menge solcher Regeln und haben keine, eine oder gar mehrere Antwortmengen. Zum Beispiel hat das ProgrammL0 <-- L1, ..., Lm, not Lm+1,..., not Ln
eine einzige Antwortmenge, nämlich {q}. Denn nur mittels der zirkulären Regel (1) kann p nicht zur Antwortmenge gehören, und nach Regel (2) gehört q zur Antwortmenge, falls p nicht dazugehört. Das Programm
(1) p <-- p (2) q <-- not p
besitzt zwei Antwortmengen {p} und {q}. Auch können Integritätsbedingungen durch "kopflose" Regeln (d.h. unter Weglassen von L0) formuliert werden. Das Programmp <-- not q
q <-- not p
hat dann nur eine Antwortmenge: {p}. Die Integritätsbedingung wird immer dann verletzt, wenn p nicht zur Antwortmenge gehört; dies führt zur Elimination der Antwortmenge {q}.p <-- not q
q <-- not p
<-- not p
Formal wird die Semantik von Antwortmengen durch Fixpunkte nichtmonotoner Operatoren beschrieben. Man kann zeigen, daß alle Entscheidungs- und Suchprobleme in der Problemklasse NP (auch salopp als die Klasse der in einfach exponentieller Zeit lösbaren Probleme bezeichnet) durch die Berechnung von Antwortmengen entsprechender (aussagen)logischer Programme gelöst werden können. Interessanterweise erhöht weder die Verwendung von Integritätsbedingungen noch die Erweiterung der Sprache um die explizite Negation die Komplexität und damit die eigentliche Ausdrucksstärke des Formalismus. Mit letzterem kann man etwa leicht Weltabgeschlossenheitsaxiome, wie
formulieren, frei nach dem Motto: "Ist p(x) nicht beweisbar, dann ist p(x) falsch". Die Komplexität und damit einhergehend die Ausdruckskraft wird erst durch die Hinzunahme von Regeln mit Disjunktion auf der linken Seite der Regel erhöht. Man befindet sich dann in der Problemklasse NPNP. Daran ändert auch die Hinzunahme des Operators not auf der linken Seite und sogar die beliebige Schachtelung von Formeln mit not, , sowie Disjunktion und Konjunktion nichts mehr. Zum Beispiel kann die Frage nach einer Belegung von a und b mit wahr/falsch, die die Formelp(x) <-- not p(x)
wahr macht, wie folgt repräsentiert werden:
Während die beiden Regeln auf der linken Seite den (zweiwertigen) Wertebereich von a und b, also die Menge aller möglichen Belegungen beschreiben, eliminieren die beiden Integritätsbedingungen rechts alle unzulässigen Kandidaten. Hieraus resultieren zwei Antwortmengen A1={a,b} und A2=, die den beiden Lösungen unseres Problems entsprechen.
Ein in der Praxis enorm hilfreiches und erfreulicherweise komplexitätsneutrales Sprachkonstrukt ist die Kardinalitätsbeschränkung. Grob gesprochen steht ein Kardinalitätsliteral, wie m{p(x)}n, für jede Menge mit mindestens m und höchstens n Instanzen von p(x). Zur Illustration wollen wir das oft in der Informatik behandelte n-Damenproblem verwenden. Es geht darum, n Damen so auf einem n*n-Schachbrett zu plazieren, daß keine Dame eine andere bedroht. Folgendes Programm realisiert das Gewünschte:
Während das Prädikat d den Wertebereich fixiert -- es gibt also n Damen, die von 1 bis n durchnumeriert sind --, beschreibt q die Positionen der Damen. Die zweite und dritte Regel generieren sozusagen alle Schachbretter, in deren Spalten und Zeilen genau eine Dame steht. Steht die Dame mit der Nummer x in der Spalte (bzw. Zeile) x, so ist die Zahl der Felder q(x,y), auf der eine Dame steht, mindestens und höchstens 1. Die Integritätsbedingung eliminiert dann noch solche, bei denen sich zwei Damen auf derselben Diagonale befinden. Jede Antwortmenge repräsentiert dann eine Lösung des n-Damenproblems.d(1..n) <--
1{q(x,y)}1 <-- d(x)
1{q(x,y)}1 <-- d(y)
<-- q(x,y),q(x',y'), xx', yy', |x-x'|=|y-y'|
Oft wird die Modellierung spezieller Problemklassen durch abstrakte Sprachkonstrukte unterstützt. Bei der Handlungsplanung setzt man beispielsweise zur Modellierung kausaler Abläufe Konstrukte wie
bewege(b,l) | causes | auf(b,l) |
---|---|---|
inertial | auf(b,l) |
auf(b,l,t+1) | <-- | bewege(b,l,t). |
auf(b,l,t+1) | <-- | auf(b,l,t), not auf(b,l,t+1). |
Neben der Handlungsplanung ist die Antwortmengenprogrammierung für viele weitere Anwendungen geeignet, etwa Diagnose, Scheduling, Konfigurierung, Stundenplanprobleme, Model Checking, Kryptographie u.v.m. Zu den interessantesten Anwendungen der Antwortmengenprogrammierung zählen momentan die Konfigurierung von (Debian) Linux und Schedulingaufgaben beim Space Shuttle der NASA. Die Vorteile des Ansatzes liegen sicherlich in seiner Einfachheit und der daraus resultierenden Transparenz. Mit der Verfügbarkeit effizienter Systeme dringt die Methodik auch immer mehr in Anwendungsgebiete vor, wo es gilt, komplexe Systeme qualitativ zu modellieren.
deklarative Programmierung: Form der Programmierung, bei der zunächst alle Randbedingungen des Problems beschrieben werden. Die Aufgabe der Maschine besteht dann darin, innerhalb dieses Rahmens selbständig eine Lösung zu ermitteln. Zur Klasse der deklarativen Programmiersprachen rechnen mit Einschränkungen die logischen Programmiersprachen (z.B. Prolog) und die funktionalen Programmiersprachen.
prozedurale Programmierung: Form der Programmierung, bei der der Weg, auf dem zu einem gegebenen Problem eine Lösung zu ermitteln ist, beschrieben wird. Traditionelle imperative Programmiersprachen, wie Pascal, C, Modula, gehören zur Kategorie der prozeduralen Programmiersprachen.
Integritätsbedingung: Integrität von Datenbeständen ist gegeben, wenn eine korrekte und widerspruchsfreie Speicherung der Daten gewährleistet ist. Integritätsbedingungen beschreiben Eigenschaften möglicher Zustände der abgespeicherten Daten sowie von Beziehungen zwischen Daten.
NP: Klasse aller Probleme, die durch nichtdeterministische
Programme in polynomieller Zeit gelöst werden können. Man geht
davon aus (kann es aber bisher nicht beweisen), daß alle Probleme
dieser Klasse mit deterministischen Programmen nicht schneller als in exponentieller
Zeit gelöst werden können.
|