Harold Boley RELFUN-Einführung, 1997 Die hochintegrierte relational/funktionale KI-Sprache RELFUN Harold Boley FB Informatik Univ. Kaiserslautern Oktober 1988 (Überarbeitet: Sept. 1997) 1 Harold Boley RELFUN-Einführung, 1997 Motivation ◊ Wissensdarstellung und -verarbeitung auf einer gleichzeitig relationalen (logischen) und funktionalen (applikativen) Grundlage fundieren ◊ Konzepte und Entwicklungen zu einem gemeinsamen Nachfolger von PROLOG und LISP als Programmiersprache mit eingebauter Repräsentationssprache (bewerteten Hornklauseln): KI-Anwendungen sowie Grundlage für weitere Sprachen und Tools 2 Harold Boley ◊ RELFUN-Einführung, 1997 Querbeziehungen zwischen relational/funktionalen Sprachen niedriger (LISPLOG) mittlerer (SASLOG) hoher (FIT, RELFUN) Integrationsdichte herstellen: Know-how übertragen (Implementation bis Anwendung) Günstigste herausfinden (lokal oder global) ◊ Exploration von bewerteten Horn-Klauseln als Integrationskonzept: Aus PROLOG-Sicht: Neben der Bindung von (Relations-) Variablen: Rückgabe von (Funktions-) Werten Aus LISP-Sicht: Neben der Rückgabe von (Funktions-) Werten: Bindung von (Relations-) Variablen 3 Harold Boley RELFUN-Einführung, 1997 4 Verbindung der Vorteile relationaler und funktionaler Programmierung Vorteile relationaler Programmierung (PROLOG): R1 Da Relations-Aufrufe Anfragevariablen binden, lassen sich Ein- und Ausgabe oft invertieren R2 "Non-ground"-Operationen sind erlaubt (Patterns als Ein- und/oder Ausgabe von Operationen) Vorteile funktionaler Programmierung (LISP): F1 Da Funktions-Aufrufe Werte zurückgeben, lassen sich geschachtelte Aufrufe schreiben F2 Operationen höherer Ordnung sind erlaubt (Operatoren als Ein- und/oder Ausgabe von Operationen) Kombination der Vorteile (RELFUN): R2, F1 voll; R1 (bei Funktionen mit is), F2 (keine lambda-Ausdrücke) weitgehend Harold Boley RELFUN-Einführung, 1997 REL∫FUN-Integration von Definitionen sowie Aufrufen funktional funktional funktional ∫ KI-Sprache = ∫ Op-Definitionen + ∫ Op-Aufrufe relational relational relational Definitionen und Aufrufe von Operatoren (Relationen und Funktionen) integrieren Definitionen: Bewertete Horn-Klauseln für Relations-Definitionen: Nur Wahrheitswert-Definitionen (spezieller Fall) Bewertete Horn-Klauseln für Funktions-Definitionen: Beliebige Werte-Definitionen (allgemeiner Fall) Aufrufe: Bewertete Goals [Ziele] für Relations-Aufrufe: Beliebige Argumente vorgebbar (allgemeiner Fall) Bewertete Goals [Ziele] für Funktions-Aufrufe: Eingabeargumente vorgebbar (spezieller Fall) 5 Harold Boley RELFUN-Einführung, 1997 6 Bewertete Konjunktionen berechnen einen Rückgabewert Ausgangsentscheidung: Wenn einzelner Operator-Aufruf neben Bindungseffekt auch Rückgabewert liefert, dann soll ganze Aufruf-Konjunktion neben konsistent erweiterten Bindungen (vgl. PROLOG) den Wert des letzten Konjunkts (vgl. LISP) liefern Allg.: call1 ... callN-1 callN N=3: (is _x (gen duck)) (likes _y _x) `(marry _x _y) Falls (likes aswan aduckling) u. (gen duck) = aduckling bekannt ist, wird die Beispiel-Konjunktion so ausgewertet (links-rechts): (is _x (gen duck)) (likes _y _x) `(marry _x _y) (is _x aduckling) (likes _y _x) `(marry _x _y) (likes _y _x) `(marry _x _y) mit _x = aduckling `(marry _x _y) mit _x = aduckling und _y = aswan (marry aduckling aswan) _x = aduckling, _y = aswan Harold Boley RELFUN-Einführung, 1997 7 Nachteil dieser Festlegung: ◊ Werte von call1 bis callN-1 werden (anders als ihre Bindungs-Effekte) nicht weiterbenutzt, d.h. nur als Wahrheitswerte interpretiert Vorteile dieser Festlegung: ◊ Einfache Ermittlung Konjunktionswerts ◊ Verwandtschaft mit PROGN bzw. AND ◊ Eine spezielle Konjunktion eines solchen LISPs implizitem (is _x1 expr1) ... (is _xN-1 exprN-1) (op _x1 ... _xN-1) entspricht einem impliziten LET (let ((_x1 expr1) ... (_xN-1 exprN-1)) (op _x1 ... _xN-1)) ◊ mit dem Wert-Konjunkt (op als Rumpf und den als lokalen Bindungslieferanten Verwendbar für bewertete (s.u.) _x1 ... _xN-1) is-Konjunkten Horn-Regeln Harold Boley RELFUN-Einführung, 1997 8 Bewertete Horn-Klauseln berechnen einen Rückgabewert Bewertete Horn-Klauseln ::= ft-Regeln | hn-Fakten ft-Regeln haben die Form Allg.: (ft pattern call1 ... callN-1 callN) N=3: (ft (duckmarry _y) (is _x (gen duck)) (likes _y _x) `(marry _x _y)) wobei N>0 und Allg.: call1 ... callN-1 callN N=3: (is _x (gen duck)) (likes _y _x) `(marry _x _y) eine bewertete Konjunktion von Prämissen ist (s.o.) Falls aduckling-Fakt u. -Gleichung bekannt (duckmarry _r) (is _x (gen duck)) (likes _y _x) `(marry _x _y) mit _r = _y ... s.o. ... (marry aduckling aswan) _r = (_y =) aswan (_x-Bindung ist lokal zu Prämissen) (s.o.): Harold Boley RELFUN-Einführung, 1997 9 ft-Regeln verallgemeinern sowohl PROLOGs unbewertete Horn-Regeln pattern :- call1, ..., callN-1, callN. als auch bedingte Termersetzungs-Regeln pattern -> callN if call1 and ... and callN-1 da "Effekt-Konjunkte" call1 bis callN-1 nicht nur beliebige (sogar non-deterministische) Bedingungen, sondern gleichzeitig auch Bindungslieferanten sein können, die partielle Resultate zur Verwendung im "Effekt&Wert-Konjunkt" callN akkumulieren ft-Regeln mit einer Prämisse (d.h. N=1) haben die Form Allg.: (ft pattern call1) Z.B.: (ft (gen duck) aduckling) d.h. entsprechen unbedingten TermersetzungsRegeln pattern -> call1 Harold Boley RELFUN-Einführung, 1997 10 hn-Fakten haben die Form Allg.: (hn pattern) Z.B.: (hn (likes aswan aduckling)) entsprechend PROLOGs Horn-Klauseln mit leerer Konjunktion von Prämissen, d.h. mit N=0. Sie liefern aber ebenfalls einen Wert, true, d.h. sind äquivalent zu ft-Regeln mit einer true-Prämisse Allg.: (ft pattern true) Z.B.: (ft (likes aswan aduckling) true) Harold Boley RELFUN-Einführung, 1997 Der Instantiierungs-Operator "`" LISP: Backquote als Benutzer-Konstrukt "`" extern verwendet, aber nicht rekursiv in den generierten Variablen-Werten fortgesetzt PROLOG: Instantiierung nur als SystemKonstrukt zum Bindungsausdruck intern verwendet, aber dafür rekursiv in den generierten Variablen-Werten fortgesetzt RELFUN: Backquote als Benutzer-Konstrukt "`" extern verwendet, zusätzlich Instantiierung auch als SystemKonstrukt (Wert- und Bindungsausdruck) intern verwendet, und beides rekursiv in den generierten Variablen-Werten fortgesetzt 11 Harold Boley RELFUN-Einführung, 1997 RELFUN-Instantiierungs-Beispiele: Ohne rekursive Fortsetzung (in _x = (a b) keine Variable): (is _x `(a b)) `(1 _x 2 _x) (1 (a b) 2 (a b)) _x = (a b) Mit rekursiver Fortsetzung in _y = (1 _x 2 _x): (is _x `(a b)) (is _y `(1 _x 2 _x)) `(_y (m _x _y n) _y) ((1 (a b) 2 (a b)) (m (a b) (1 (a b) 2 (a b)) n) (1 (a b) 2 (a b))) _x = (a b) _y = (1 (a b) 2 (a b)) Analogie von ungeschachteltem "aktivem" (tup ...) und "passivem" `(...): "Aktives" mittels "passivem" tup definierbar (RELFUN-Prelude): (ft (tup | _r) `(tup | _r)) ; LISP-S-Expr. (a b . v) in RELFUN (tup a b | _v) Geschachtelt: (tup (+ 2 3) (tup 7 (1- 9)) 1) liefert (tup 5 (tup 7 8) 1) Ungeschachtelt: (is _x aduckling) (is _y aswan) (tup marry _x _y) (tup marry aduckling aswan) _x = aduckling _y = aswan (is _x aduckling) (is _y aswan) `(marry _x _y) (marry aduckling aswan) _x = aduckling _y = aswan 12 Harold Boley RELFUN-Einführung, 1997 13 Bewertete Resolution Die Resolution eines RELFUN-Ziels goal mit einer ft-Regel (N>0) (ft pattern call1 ... callN-1 callN) liefert außer etwaigen Bindungen der goal/pattern-Unifikation zunächst einmal die bewertete Konjunktion call1 ... callN-1 callN und damit dann den Wert von callN (letztlich Konstante, Variable, oder "`"-Aufruf) in der durch call1 ... callN-1 geschaffenen Umgebung Die Resolution des Ziels goal hn-Fakt (N=0) (hn pattern) liefert leere Konjunktion, d.h. konst. Wert true mit einem Harold Boley RELFUN-Einführung, 1997 Datenbank bewerteter Horn-Klauseln: (hn (likes john mary)) (ft (older john mary) `(years 3)) (ft (child john mary) ann) (ft (child john mary) bob) ; QUOTE-artige "`"-Verwendung Relations-Aufruf (PROLOG-artiges Goal): (likes john _x) wert-resolviert mit Fakt (hn (likes john mary)) mit Wert true und Bindung _x = mary Funktions-Aufruf (Goal mit allgem. Wert): (older john _x) wert-resolviert mit Regel (ft (older john mary) `(years 3)) mit Wert (years 3) und Bindung _x = mary Non-deterministischer Funktions-Aufruf: (child john _x) wert-resolviert mit Regel (ft (child john mary) ann) mit Wert ann und Bindung _x = mary und bei Backtracking wert-resolviert mit Regel (ft (child john mary) bob) mit Wert bob und Bindung _x = mary 14 Harold Boley RELFUN-Einführung, 1997 15 RELFUNs is-Terme Verallgemeinerung und PROLOGs is-Primitiv: Vereinheitlichung von ◊ Wie in vielen LISP/PROLOGKombinationen kann in RELFUN die rechte is-Seite eine beliebige OperatorAnwendung sein, nicht nur wie in PROLOG eine arithmetische ◊ Aber werden Evaluator sondern selbst diese nicht (z.B. durch Operator-Anwendungen durch einen anderen LISPs EVAL) berechnet, den RELFUN-Evaluator Mit (ft (older john mary) `(years 3)) evaluiert z.B. (is _x (older john mary)) zu (is _x `(years 3)) und bindet _x an older-Wert (years 3) Harold Boley Bewertete is-Terme RELFUN-Einführung, 1997 Resolution 16 erweitert auf Bewertete Resolution des RELFUN-Ziels goal auf der rechten Seite eines is-Terms (is ispattern goal) mit einer bewerteten Horn-Klausel (ft pattern call1 ... callN-1 callN) bzw. (hn pattern) und nach deren Erfolg Unifikation (oft nur einfache Bindung) der linken Seite ispattern des is-Terms mit dem Wert des Ziels, d.h. dem Wert von callN bzw. true Harold Boley RELFUN-Einführung, 1997 Datenbank bewerteter Horn-Klauseln: s.o. Relations-Aufruf: (is _boolean (likes john _x)) wert-resolviert mit (hn (likes john mary)) mit Wert true und Bindung _x = mary und bindet _boolean an Wahrheitswert true Funktions-Aufruf: (is _general (older john _x)) wert-resolviert mit (ft (older john mary) `(years 3)) mit Wert (years 3) und Bindung _x = mary und bindet _general an allgemeinen Wert (years 3) Non-deterministischer Funktions-Aufruf: (is _several (child john _x)) wert-resolviert mit (ft (child john mary) ann) mit Wert ann und Bindung _x = mary und bindet _several an ersten Wert ann und bei Backtracking wert-resolviert mit (ft (child john mary) bob) mit Wert bob und Bindung _x = mary und bindet _several an zweiten Wert bob 17 Harold Boley RELFUN-Einführung, 1997 18 Verfeinerung von Relationen zu Funktionen Da RELFUN-Relationen in der Art von charakteristischen Funktionen die Argumente ihres Definitionsbereichs (die allerdings auch Anfrage-Variablen sein können) in den Wertebereich {true,unknown} abbilden, lassen sie sich durch Verfeinerung des Erfolgs-Werts true zu allgemeinen Funktionen erweitern A: Definitionsbereich (z.B. von Konstanten) apprel: PROLOG-artige append-Relation pali(ndrom)Relation Funktion pali: An -> {true,unknown} pali: An -> {even,odd,unknown} (hn (pali)) ; true-Wert (ft (pali) even) ; even-Wert (hn (pali _x)) ; true-Wert (ft (pali _x) odd) ; odd-Wert (ft (pali _x | _y) (apprel _z (tup _x) _y) ; Bindung von _z (pali | _z)) ; Wert von pali Harold Boley RELFUN-Einführung, 1997 19 Faktenwissen dargestellt mit Relationen und Funktionen englisch relational funktional John likes Mary (hn (likes john mary)) (ft (likes john mary) true) John is 3 years (hn (older john mary (years 3))) (ft (older john mary) `(years 3)) older than Mary John and Mary (hn (child john mary ann)) have children (hn (child john mary bob)) Ann, Bob, ... ... ... (ft (child john mary) ann) (ft (child john mary) bob) Harold Boley RELFUN-Einführung, 1997 20 Vorteil der relationalen Darstellung: Sogar über funktional abhängiges Argument invertierbar ("Funktionswert als Input") mittels variabler Argumente Who is 3 years older than who? Whose child is Ann? (older _x _y `(years 3)) (child _x _y ann) Solche Invertierungen sind in RELFUN auch prinzipiell in funktionaler Darstellung mittels variabler Argumente und is-Primitiv simulierbar Who is 3 years older than who? Whose child is Ann? (is (years 3) (older _x _y)) (is ann (child _x _y)) Harold Boley RELFUN-Einführung, 1997 21 Vorteil der funktionalen Darstellung: Auszeichnung eines funktional abhängigen Arguments ("Funktionswert als Output") ermöglicht geschachtelte Aufrufe What is the sum of 5 years and the (dimsum `(years 5) number of years John is older than Mary? (older john mary)) wobei dimsum eine dimensionsbehaftete Additions-Funktion ist: (ft (dimsum (_dimension _num1) (_dimension _num2)) ;gleiche Dim. (is _amount (+ _num1 _num2)) ;Betrags -Erg. `(_dimension _amount)) ;Dim.-Erg. Who is a child of a child of John and Mary (child (child john mary) and Sue? sue) wobei zusätzlich verwendete Definition (ft (child bob sue) li) ist Solche Schachtelungen sind in PROLOG und RELFUN auch zu relationaler Darstellung mittels Konjunktionen und Hilfsvariablen abflachbar What is the sum of 5 years and the (older john mary _h) number of years John is older than Mary? (dimsum `(years 5) _h _r) wobei dimsum eine dimensionsbehaftete Additions-Relation ist: (hn (dimsum (_dimension _num1) (_dimension _num2) (_dimension _amount)) (is _amount (+ _num1 _num2))) ;Wert unwichtig, daher hn-Regel Who is a child of a child of John and Mary (child john mary _h) and Sue? (child _h sue _r) wobei zusätzlich verwendete Definition (hn (child bob sue li)) ist Harold Boley RELFUN-Einführung, 1997 22 Regelwissen dargestellt mit Relationen und Funktionen Relational: (hn (older _pers1 _pers2 _diff) (age _pers1 _year1) (age _pers2 _year2) (dimdifference _year1 _year2 _diff)) (hn (age john (years 48))) (hn (age mary (years 45))) (hn (dimdifference (_dimension _num1) (_dimension _num2) (_dimension _amount)) (is _amount (- _num1 _num2))) ;Wert unwichtig, daher hn-Regel Vorteil der relationalen Darstellung: Analog zu relationalen Fakten (s.o.) Harold Boley RELFUN-Einführung, 1997 Funktional: (ft (older _pers1 _pers2) (dimdifference (age _pers1) (age _pers2))) (ft (age john) `(years 48)) (ft (age mary) `(years 45)) (ft (dimdifference (_dimension _num1) (_dimension _num2)) (is _amount (- _num1 _num2)) `(_dimension _amount)) Vorteil der funktionalen Darstellung: Analog zu funktionalen Fakten (s.o.) 23 Harold Boley RELFUN-Einführung, 1997 24 Operator-Schachtelungen, v.a. Funktions-Aufruf als Argument Relations-Aufruf Datenbank enthalte: (hn (rich tom)) (ft (fatherof yin) tom) (ft (auntof tom) ann) Mögliche Operator-Schachtelungen: Unter-Aufruf HauptAufruf Relation Funktion (atom (rich tom)) (rich (fatherof yin)) (atom true) (rich tom) Relation true true Funktion (tup (rich tom)) (tup true) (tup true) (auntof (fatherof yin)) (auntof tom) ann von Harold Boley RELFUN-Einführung, 1997 25 Erlaubte Schachtelungs-Möglichkeiten: LISP: Funktions-Aufrufe als aktuelle Argumente von Funktions-Aufrufen PROLOG: Nur passive Konstruktor-Terme ("Strukturen") als aktuelle Argumente von Relations-Aufrufen RELFUN: Relations-/Funktions-Aufrufe als aktuelle Argumente von anderen Relations-/Funktions-Aufrufen (s.o.) RELFUNs Spezialfall von Funktions-Aufrufen als aktuelle Argumente von Relations-Aufrufen (Tabelle oben rechts) systematisiert "Reduktionen" in LOGLISP, LISLOG etc. Anders als bei semantischer Unifikation (FUNLOG, SASLOG) werden bereits vor dem Zeitpunkt des Haupt-Aufrufs die Unter-Aufrufe ausgewertet (call-by-value), nicht bei - dann "lazy" genannter - Unifikation (call-by-need) Strukturen als aktuelle Argumente werden in RELFUNs LISP-artiger Syntax durch "`" gekennzeichnet: Falls in der Datenbank (hn (rich (fatherof yin))) - als Fakt - steht, liefert (rich `(fatherof yin)) direkt true Harold Boley RELFUN-Einführung, 1997 26 Abflachen von Schachtelungen Für geschachtelte Terme soll die klassische Auswertungsstrategie benutzt werden, für die mehrere synonyme Bezeichnungen existieren: ◊ Call-by-value evaluation ◊ Innermost-leftmost reduction ◊ Applicative-order computation Diese Strategie wird aber anders als gewöhnlich realisiert: ◊ Während sich z.B. der LISP-Interpreter, EVAL, rekursiv in eingeschachtelte Subterme hineinarbeitet, ◊ zieht nämlich der RELFUN-Interpreter, AND-PROCESS, solche Subterme zunächst rekursiv aus dem Hauptterm heraus (mittels GENSYM-artiger Variablen und is-Primitiv), bis eine abgeflachte Konjunktion übrig bleibt, die dann wie in PROLOG links-rechts abgearbeitet wird Harold Boley RELFUN-Einführung, 1997 27 Vorteil des Abflachprinzips: Das Problem des eingebetteten Non-Determinismus in funktionalen Schachtelungen wird damit zurückgeführt auf das in PROLOG gelöste Problem von flachem Non-Determinismus in relationalen Konjunktionen Beispiel für eingebetteten Non-Determinismus: Mit der Datenbank (ft (child john mary) ann) (ft (child john mary) bob) (hn (likes bob sue)) könnte bei der Berechnung der Schachtelung (likes (child john mary) sue) der eingebettete Term (child john mary) non-deterministisch auf ann oder bob reduzieren (nur zweite Möglichkeit führt dabei zu Erfolg), so daß die übliche Evaluations-Strategie sich beim rekursiven Hineinlaufen in diesen Subterm weitere für ihn passende Definitionen irgendwie "merken" müßte Harold Boley RELFUN-Einführung, 1997 28 Abflachverfahren: In einer Schachtelung (. . . term1 . . . termM . . .) ersetze nicht mit "`" passivierte Subterme term1, ..., termM durch neue (eindeutige) Variablen, bestehend aus den Zahlen 1, ..., M, "*"-erweitert um den (z.B. aus Kahns PROLOG-in-LISP bekannten) aktuellen level-Wert, l, so daß ein flaches Ziel (. . . _1*l . . . _M*l . . .) entsteht, vor welchem dann M is-Ausdrücke (is _1*l term1), ..., (is _M*l termM) als Konjunktion erzeugt werden: (is _1*l term1) ... (is _M*l termM) (. . . _1*l . . . _M*l . . .) Falls ein termi selbst noch eine Schachtelung ist, geht das Abflachverfahren - innerhalb des is rekursiv mit diesem weiter, sobald die links-rechts-Berechnung dort ankommt Harold Boley RELFUN-Einführung, 1997 29 Lösung für das frühere (einfache) Beispiel: Die Schachtelung (likes (child john mary) sue) wird abgeflacht zu der Konjunktion (is _1*1 (child john mary)) (likes _1*1 sue) die dann mit der Datenbank (ft (child john mary) ann) (ft (child john mary) bob) (hn (likes bob sue)) zunächst über (is _1*1 ann) (likes _1*1 sue) (likes _1*1 sue) mit _1*1 = ann unknown scheitert und beim Backtracking (einfach auf der flachen Konjunktion realisiert) über (is _1*1 bob) (likes _1*1 sue) (likes _1*1 sue) mit _1*1 = bob true (_1*1-Bindung ist lokal zur Konjunktion) zum Erfolg führt Harold Boley RELFUN-Einführung, 1997 30 Zusammenfassung: Informelle Hornklausel/Gleichungs-Wissenseinheiten symbolisches numerisches relationales Faktenwissen (ancestor mary fred) (ancestor john fred) (ancestor fred rosa) (fibonacci 0 1) (fibonacci 1 1) (fibonacci 2 2) ;vgl.Regel Regelwissen (ancestor _x _y) :- (ancestor _x _h) (ancestor _h _y) (fibonacci _x _y) :- (is _h1 (1- _x)) (is _h2 (1- _h1)) (fibonacci _h1 _f1) (fibonacci _h2 _f2) (is _y (+ _f1 _f2)) Deterministischer Aufruf: (ancestor fred _wer) bindet _wer an rosa Non-deterministische Aufrufe: (ancestor mary _wer) bindet _wer an fred oder rosa (ancestor _wes fred) bindet _wes an mary oder john funktionales Faktenwissen (ancestor mary) = fred (ancestor john) = fred (ancestor fred) = rosa (fibonacci 0) = 1 (fibonacci 1) = 1 (fibonacci 2) = 2;vgl.Regel Regelwissen (ancestor _x) = (ancestor (ancestor _x) (fibonacci _x) = (+ (fibonacci (1- _x)) (fibonacci (1- (1- _x)))) Deterministischer Aufruf: (ancestor fred) liefert rosa Non-deterministische Aufrufe: (ancestor mary) liefert fred oder rosa (is fred (ancestor _wes)) bindet _wes an mary oder john Harold Boley RELFUN-Einführung, 1997 Zusammenfassung: 31 Formale RELFUN-Wissensitems symbolisches numerisches relationales Faktenwissen (hn (ancestor mary fred)) (hn (ancestor john fred)) (hn (ancestor fred rosa)) (hn (fibonacci 0 1)) (hn (fibonacci 1 1)) (hn (fibonacci 2 2));vgl.Regel Regelwissen (hn (ancestor _x _y) (ancestor _x _h) (ancestor _h _y)) (hn (fibonacci _x _y) (is _h1 (1- _x)) (is _h2 (1- _h1)) (fibonacci _h1 _f1) (fibonacci _h2 _f2) (is _y (+ _f1 _f2))) Deterministischer Aufruf: (ancestor fred _wer) bindet _wer an rosa Non-deterministische Aufrufe: (ancestor mary _wer) bindet _wer an fred oder rosa (ancestor _wes fred) bindet _wes an mary oder john funktionales Faktenwissen (ft (ancestor mary) fred) (ft (ancestor john) fred) (ft (ancestor fred) rosa) (ft (fibonacci 0) 1) (ft (fibonacci 1) 1) (ft (fibonacci 2) 2);vgl.Regel Regelwissen (ft (ancestor _x) (ancestor (ancestor _x)) (ft (fibonacci _x) (+ (fibonacci (1- _x)) (fibonacci (1- (1- _x))))) Deterministischer Aufruf: (ancestor fred) liefert rosa Non-deterministische Aufrufe: (ancestor mary) liefert fred oder rosa