contents previous up next
Previous: Frame-basierte Darstellung Up: Die CycL Repräsentationssprache Next: Repräsentation von Prädikaten mit einer Stelligkeit

Die Constraint-Sprache

Folie 6

Warum Frame-Sprache und Constraint-Sprache?

CycL ist nur oberflächlich betrachtet eine Frame-Sprache, denn zur exakten Darstellung aller sprachlich möglichen Formulierungen reicht die Ausdruckskraft der Frames nicht aus. Einige Beispiele:

,,Bill ist entweder ein ziemlich guter Fischer oder ein ziemlich guter Lügner.''

,,Zwillinge haben fast nie die gleichen Vornamen.''

Die Constraint-Sprache ergänzt die Frame-Sprache, die den Hauptteil der Arbeit erledigt. In der Constraint-Sprache kann man auf einfache Art Disjunktionen, quantifizierte Aussagen, Beziehungen zwischen Slot-Werten und Negationen ausdrücken.

Anfangs wurde in Erwägung gezogen, solche Ausdrücke nicht direkt zuzulassen, sondern sie durch ein ,,Aussage''-Element in der Frame-Sprache zu notieren. Da gute Ausdrucksfähigkeit aber nötig war, wurde stattdessen eine zweite Sprache eingeführt. Dies bedeutet nicht, daß die Frame-Sprache völlig überflüssig wäre. Cyc ist eine Repräsentation der Welt, und es hat sich herausgestellt, daß es eine große Anzahl einfacher, grundlegender Aussagen gibt, die in einer vernünftigen Repräsentation der Welt Gültigkeit besitzen. Ein Großteil des Wissens, das in Cyc repräsentiert werden soll, kann als Element-Slot-Wert-Tripel ausgedrückt werden. Und obwohl die Constraint-Sprache mächtiger ist, macht die Frame-Sprache die Inferenz (Deduktion) viel einfacher und schneller. Daher ist die Constraint-Sprache eine Ergänzung der Frame-Sprache.

Syntax

Die Syntax der Constraint-Sprache ist ähnlich der des Präfix-Prädikatenkalküls. So wie jede Art von Slot durch ein Frame-Element repräsentiert wird, so wird auch jede Art von Prädikat durch ein Frame-Element repräsentiert. Jeder Slot kann als Prädikat betrachtet und auch benutzt werden. Man könnte zum Beispiel sagen (residents Texas Doug). Ein Großteil der möglichen Prädikate der realen Welt haben die Stelligkeit zwei oder weniger und können daher als Slottypen repräsentiert werden.

Folie 7

Modifizierte Versionen des All- und Existenzquantors liegen als Prädikate mit den Namen ForAll und ThereExists vor. Die Modifikation besteht darin, daß die Menge, über der quantifiziert wird, angegeben werden muß, entweder explizit oder über eine funktionale Lisp-Form. Diese modifizierten Versionen sind mindestens genauso leistungsfähig wie die Standardquantoren der Logik, denn man kann als Argument die sogenannte Universalmenge, die alle Elemente der Wissensbasis einschließt, verwenden. Und in den meisten Fällen kennt man ja ein begrenzendes ,, Universum'' für die möglichen Werte einer Variablen. Vom rechentechnischen Standpunkt ist es wesentlich günstiger, dieses Universum dann auch anzugeben. Dieses zusätzliche Argument hat keinen Einfluß auf die Semantik der Quantoren.
Es ist auch möglich, Funktionen zu benutzen, die nicht nur einen Wahrheitswert zurückgeben, sondern z. B. eine Menge. Auch in diesem Fall muß die Wissensbasis ein Frame-Element enthalten, das die Funktion repräsentiert. Ein Beispiel für eine solche Funktion ist #%TheSetOf. Es liefert die Menge aller Elemente in einer Menge, die ein bestimmtes Prädikat erfüllen. Um also die Menge der Freunde von Fred zu erhalten, die Artisten sind, könnte man schreiben

 
(#%TheSetOf z (#%Fred #%friends) 
    (#%allInstanceOf z #%Artist))

Dieses Konstrukt kann natürlich auch als zweites Argument von ForAll und ThereExists verwendet werden.
Die Constraint-Sprache ist kein reines Kalkül ersten Grades. Ein Prädikat darf in bestimmten Fällen eine quantifizierte Variable sein, wie im folgenden Beispiel:

 
(#%ThereExists z (#%ColorSlot #%allInstances) 
                 (z #%Fred #%Red))

Hier wird ausgedrückt, daß Fred den Eintrag Red für zumindest einen der Slots vom Typ ColorSlot besitzt. z könnte hierbei an den Wert #%hasSlightTintOf gebunden sein.

Folie 8

Explizit quantifizierte Variablen werden als gebunden betrachtet. Darüber hinaus gibt es freie Variablen, zum Beispiel die Variablen v1, tex2html_wrap_inline535, vn zur Bezeichnung der Argumente der Expansiongif eines Prädikats. Diese Argumentbezeichner werden von CycL standardmäßig erwartet, sie lassen sich jedoch überschreiben.
Aussagen in der Constraint-Sprache werden durch ein Frame-Element repräsentiert. Mit jeder Aussage ist eine Reihe von automatisch generierten Lisp-Funktionen verknüpft. Jede dieser Funktionen hat eine bestimmte Aufgabe, wie die Überprüfung der Korrekheit der Aussage zu einem bestimmten Zeitpunkt oder das Übersetzen der mit einer Menge von Bindungen belegten Aussage in die Frame-Sprache. Daher kann CycL meist die Aussage selbst ignorieren und nur diese Funktionen benutzen. Letzteres ist hauptsächlich aus Effizienzgründen eingeführt worden und macht einen Teil des Effizienzverlusts durch die ausdrucksstarke Repräsentation wieder wett.

Ausdrücke werden in der Constraint-Sprache für verschiedene Zwecke benutzt. Man kann mit ihnen zum Beispiel Beschränkungen für Slot-Werte festlegen, um Fehler durch Überschreiten des Wertebereichs aufzuzeigen, man kann spezifizieren, welche Frame-Elemente einen gewissen Slottypen besitzen dürfen, man kann Mengen definieren, um sie automatisch klassifizieren zu können, und man kann die Prämissen und Konklusionen für verschiedene Arten von Regeln beschreiben.

Beschränkungen für Slot-Werte können ,,sanft'', d. h. nur Standardvorgaben, sein. Dies entspricht der realen Welt, in der viele Dinge zwar vorkommen können, diese aber mit Skepsis behandelt werden sollten, wie zum Beispiel ein Mensch, der über 110 Jahre alt ist, oder Zwillingsschwestern, die den gleichen Vornamen haben.

Auch Constraints werden vererbt. Vererbung ist eine Methode zum effizienten Indizieren, so daß man immer leicht herausfinden kann, welche Regeln und Beschränkungen ein gegebenes Element betreffen.

Inferenz

Bei einer solch allgemeinen Sprache wie der hier beschriebenen Constraint-Sprache kann man natürlich nicht davon ausgehen, daß ein einigermaßen effizientes und gleichzeitig vollständiges Inferenzschema existiert. Der Versuch, ein derartiges Schema zu entwickeln, ist also von vorneherein zum Scheitern verurteilt. Der grundlegende Ansatz in CycL war daher, eine Reihe von speziellen Interpretern zu entwickeln, die bestimmte Klassen von Aufgaben mit Hilfe von Constraint-Ausdrücken bearbeiten.

Eine solche Aufgabe ist zum Beispiel die Auswertung eines gegebenen Constraint-Ausdrucks unter Verwendung einer Liste von Bindungen für seine freien Variablen. Der Rückgabewert des Ausdrucks muß bestimmt werden. Enthält der Ausdruck weitere Lisp-Formen, werden auch diese rekursiv ausgewertet.

Besitzen nicht alle betrachteten Elemente die benötigte Information, so muß die Auswertungsroutine informiert werden, ob solche Fälle als wahr oder falsch betrachtet werden sollen. Beim Überprüfen von Beschränkungen z. B. werden fehlende Informationen einfach übersprungen. In einem solchen Fall bedeutet NIL also ,,ganz sicher falsch'', und ein Rückgabewert von T bedeutet ,,möglicherweise wahr''. In anderen Fällen darf die Auswertungsroutine nur dann T zurückgeben, wenn die Tatsache ,,bekanntermaßen wahr'' ist.

Prädikate und Funktionen können ein prozedurales Element besitzen, das dann einfach ausgewertet werden kann. Da es aber nicht bei allen Funktionen und Prädikaten vorhanden ist, muß eine Möglichkeit geschaffen werden, dieses Element aus der Expansion des jeweiligen Objekts zu berechnen.

Das prozedurale Element besteht aus einer Reihe von Anfragen, die entweder zu beweisen versuchen, daß sich ein bestimmter Eintrag in einem Slot befindet, oder die den Wert eines Slots herauszufinden versuchen. Daher kann man das Constraint in vielen Fällen in eine eindeutige Menge von ui.si.vi umformen. Damit kann die Frame-Sprache das Constraint beschreiben. Bei der Auswertung können die Werte der beschriebenen Slots abgefragt und daraus der Wert des Constraints ermittelt werden. Dies ist das grundlegende Verfahren zum Auswerten von Constraints in CycL. Da ein Großteil der Informationen in Cyc in Form von Frames gespeichert sind, funktioniert dieses Auswertungsschema in sehr vielen Fällen.

Manchmal läßt sich ein gegebenes Constraint allerdings nicht in eine Menge von ui.si.vi-Tripeln umwandeln. Dies kann zum Beispiel auftreten, wenn nicht alle Variablenbindungen bekannt sind oder wenn die Frame-Sprache nicht genügend Ausdruckskraft zum Darstellen des Constraints besitzt.

Eine weitere Klasse von Aufgaben ist die Erfüllung eines Constraints, z. B. durch Auffüllen von fehlenden Informationen in Slots.

Für jede dieser speziellen Aufgaben wurde ein Compiler zuätzlich zu dem vorhandenen Interpreter geschrieben. Der Compiler erzeugt für jedes Constraint eine Common Lisp-Funktion, die es testet oder erfüllt. Diese Funktion wird beim Erzeugen des Constraints gespeichert und bei Bedarf ausgeführt.


contents previous up next
Previous: Frame-basierte Darstellung Up: Die CycL Repräsentationssprache Next: Repräsentation von Prädikaten mit einer Stelligkeit