DEFINE-RULESET-TASK =================== Syntax: (define-ruleset-task <Regelmenge-Task-Name> <Task-Arguments> [:DOCUMENTATION <Dokumentation>] [:EXPLANATION <Erklärung>] [:SUBTASKS <Liste-mit-Subtasks>] :MODE {:SEQUENTIAL |:FORWARD |:BACKWARD} [:CONFLICT-RESOLUTION {NIL| :FIRST MATCH| :OLDEST-MATCH| :NEWEST-MATCH}] ACTIONS {<Vorwärts-Aktion> | <Sequentielle-Aktion>| <Rückwärts-Aktion> | <Task-Aktion>}*) Warnung: Der Erklärungseintrag wird durch EMA-XPS nicht unterstützt, d.h. :explanation und :subtasks werden ignoriert. :CONFLICT-RESOLUTION wird noch nicht unterstützt! Nur die Sequentielle-Aktion wird momentan unterstützt! Der Schlüssel :no-rules arbeitet momentan noch anders! Jede Regel, die Sie definieren, muß einer Regelmenge zugeordnet werden. In der Regel- menge wird vor allem die Abarbeitung der Regeln genauer bestimmt. Es gibt drei ver- schiedene Modi, unter denen Sie auswählen können: vorwärts, rückwärts und sequen- tiell. Wenn Sie die Vorwärtsverkettung wählen, wird eine Konfliktmenge gebildet, in der Sie festlegen, welche Suchstrategie (first match, newest-match, oldest-match) angewendet wird. <Sequentielle-Abarbeitung> Bei einer sequentiellen Abarbeitung wird die Reihenfolge der Regeln auch bei mehr- maligem Durchlaufen der Regelmenge strikt gewahrt. Dabei können Regeln wiederholt mit der gleichen Instanziierung angewendet wer- den. Die Reihenfolge wird entweder durch die Priorität der Regeln bestimmt oder durch die Aufschreibreihenfolge, wenn keine Prioritätsangabe vorhanden ist. Für die sequentielle Vorwärtsverkettung werden verschiedene Auswertungstaktiken angeboten: do-one ==> {nil | :no-rules} Das System wertet die erste ausführbare Regel aus und kehrt zum Aktionsteil der Regelmengen-Task zurück. Läßt sich keine Regel ausführen, wird ':no-rules' zurück- gegeben, andernfalls nil. do-all ==> {nil | :no-rules} Alle Regeln in der Sortierreihenfolge werden geprüft und ausgewertet. Läßt sich keine Regel ausführen, wird ':no-rules' zurückge- geben, andernfalls nil. do-while <condition> ==> {:condition-failed | :no-rules} Ist die Form <condition> erfüllt, werden die Regeln in Sortierreihenfolge geprüft und die erste ausführbare Regel ausgewertet. Anschliessend wird wie beim ersten Durchgang verfahren, bis <condition> nicht mehr erfüllt ist oder alle Regeln geprüft wurden. Im ersten Fall wird ':condition-failed' zurück- gegeben, andernfalls ':no-rules'. do-until <condition> ==>{:condition-succeded | :no-rules} Die Regeln werden in Sortierreihenfolge geprüft und die erste ausführbare Regel wird ausgewertet. Ist die Lisp-Form <condition> noch nicht erfüllt, so wird wie beim ersten Durchgang verfahren bis <con- dition> erfüllt ist oder alle Regeln ge- prüft wurden. Im ersten Fall wird ':condition-succeeded' zurückgegeben, andernfalls ':no-rules'. <Vorwärtsverkettung> Die Regeln werden in der Sortierreihenfolge getested und Regeln mit gültigen Instanzi- ierungen in eine Konfliktmenge gestellt. Aus dieser Menge wird gemäß festgelegter Konfliktlösung eine einzige Regel ausgewählt und für alle Instanziierungen ausgewertet. Nach Auswertung einer Regel werden die Regeln erneut nach Sortierreihenfolge getestet. Bei Regeln, die schon ausgewertet wurden, wird geprüft, ob sich neue Instanziierungen er- geben. Nur für diese werden Regeln erneut ausgewertet. Eine Regel ohne logische Variable wird höchstens einmal ausgewertet. Schon einmal getestete Regeln werden nur dann erneut getestet, wenn im Prämissenteil ein Prädikat auftritt, für das ein tell, untell oder retell erfolgte. do-exhaustive ==> {nil | :no-rules} Warnung: noch nicht implementiert! Der eben erläuterte Zyklus wird solange durch- laufen, bis keine Regeln mehr auswertbar sind. Läßt sich keine Regel ausführen, wird ':no-rules' zurückgegeben andernfalls nil. do-while <condition> ==> {:condition-failed | :no-rules} Vor jedem Durchlauf des oben erläuterten Zyklus wird getestet, ob die Lisp-Form <condition> erfüllt ist. Die Auswertung bricht ab, wenn <condition> nicht mehr er- füllt ist oder alle Regeln geprüft wurden. Im ersten Fall wird ':condition-failed' zurückgegeben andernfalls ':no-rules'. do-until <condition> ==> {:condition-succeded | :no-rules} Nach jedem Durchlauf des oben erläuterten Zyklus wird getestet, ob die Lisp-Form <condition> erfüllt ist. Die Auswertung bricht ab, wenn <condition> eintritt oder alle Regeln geprüft wurden. Im ersten Fall wird ':condition-succeded' zurückgegeben andernfalls ':no-rules'. Formen der Konflikt-Lösung :first-match Die erste anwendbare Regel wird ausgewertet. :newest-match Die erste anwendbare Regel im jüngsten Abarbeitungszyklus wird ausgewählt. :oldest-match Die erste anwendbare Regel im ältesten Ab- arbeitungszyklus wird angewendet. <Rückwärtsverkettung> Innerhalb von rückwärts verketteten Regel- mengen gibt es nur eine einzige Regelauswer- tungstaktik, die versucht, die continuation- form zu verifizieren. verify <verify_Ausdr> [:once] {<conti-form>}+ Warnung: noch nicht implementiert! Es wird eine gültige Instanziierung von <verify_Ausdr> ermittelt und anschliessend die <conti-form> mit dieser Instanziierung ausge- wertet. Fehlt ':once', wird nach weiteren Instanziierungen gesucht. (Es wird nicht geprüft, ob eine Instanziierung bereits aufgetreten ist.) VERIFY wertet, wie ask, die <conti-form> aus. Dabei werden alle direkt ablesbaren Instanzi- ierungen sowie alle ableitbaren Instanziierungen generiert und für jede der Instanziierungen die <continuation> Formen ausgeführt. Beispiel: >(define-ruleset-task URLAUBSANGEBOT (ein-kunde) :documentation "Bestimmt Urlaubsangebot" :explanation (:description (("Erstellt ein Urlaubsangebot"))) :mode :SEQUENTIAL actions (kb-format "~%Ich gebe Ihnen eine Auswahl von möglichen Urlaubsinteressen") (do-one) (kb-format "~%Das ist alles was ich weiß"))