Drools 6.0 (Red Hat Summit)

22,860 views

Published on

Introduction to Drools 6.0, given at Red Hat Summit 2014.

Published in: Technology, Education
0 Comments
19 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
22,860
On SlideShare
0
From Embeds
0
Number of Embeds
137
Actions
Shares
0
Downloads
759
Comments
0
Likes
19
Embeds 0
No embeds

No notes for slide

Drools 6.0 (Red Hat Summit)

  1. 1. Not Quite There Yet •The SkyNet funding bill is passed. ! •The system goes online on August 4th, 1997. ! •Human decisions are removed from strategic defense. ! •SkyNet begins to learn at a geometric rate. ! •It becomes self-aware at 2:14am Eastern time, August 29th ! •In a panic, they try to pull the plug. ! •And, Skynet fights back
  2. 2. Who am I? • Drools co-founder ! • JBoss (2005) ! • Red Hat (2006) ! • Polymita Acquisition 2012 ! • Red Hat Platform Architect
  3. 3. KIE - Knowledge Is Everything KIE Drools jBPMOptaPlanner UberFire Guvnor Drools-WB jBPM-WB KIE-WB
  4. 4. KIE - Knowledge Is Everything
  5. 5. KIE - Knowledge Is Everything
  6. 6. GitHub • URL: • https://github.com/droolsjbpm/ ! • Bootstrap project: • https://github.com/droolsjbpm/droolsjbpm- build-bootstrap
  7. 7. Serious Bits :) http://www.youtube.com/watch?v=Omj4PR3v-nI http://www.youtube.com/watch?v=4CvjKqUOEzM http://www.youtube.com/watch?v=wORlAZoxttA
  8. 8. Technical Language
  9. 9. 9 Classes Account long accountNo int balance CashFlow Date date int amount AccountPeriod Date start Date end CashFlow Example
  10. 10. select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end 10 acc.balance += cf.amount CashFlow Rule
  11. 11. select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end 11 acc.balance += cf.amount CashFlow Rule
  12. 12. select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end 12 acc.balance += cf.amount CashFlow Rule
  13. 13. select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end 13 acc.balance += cf.amount CashFlow Rule
  14. 14. select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end 14 acc.balance += cf.amount CashFlow Rule
  15. 15. 15 rule "Increase balance for AccountPeriod Credits"
 when
 ap : AccountPeriod( )
 acnt : Account( )
 cf : CashFlow( type == CashFlowType.CREDIT,
 accountNo == acnt.accountNo,
 date >= ap.start && <= ap.end )
 then
 modify(acnt) { balance = acnt.balance + cf.amount; }
 end rule "Decrease balance for AccountPeriod Debits"
 when
 ap : AccountPeriod( )
 acnt : Account( )
 cf : CashFlow( type == CashFlowType.DEBIT, accountNo == acnt.accountNo, date >= ap.start && <= ap.end )
 then
 modify(acnt) { balance = acnt.balance - cf.amount }
 end CashFlow date amount type accountNo 12-Jan-12 100 CREDIT 1 2-Feb-12 200 DEBIT 1 18-May-12 50 CREDIT 1 9-Mar-12 75 CREDIT 1 AccountingPeriod start end 01-JAN-2012 31-MAR-2012 Account accountNo balance 1 0 CashFlow date amount type accountNo 12-Jan-12 100 CREDIT 1 9-Mar-12 75 CREDIT 1 CashFlow date amount type accountNo 2-Feb-12 200 DEBIT 1 Account accountNo balance 1 -25 CashFlow Example
  16. 16. 16 rule "Print balance for AccountPeriod" salience -50
 when
 ap : AccountPeriod()
 acnt : Account( )
 then
 System.out.println( "Account Number " + acnt.accountNo + " balance " + acnt.balance );
 end Agenda 1 increase balance arbitrary2 decrease balance 3 increase balance 4 print balance CashFlow Example
  17. 17. CashFlow Example rule “Account in Negative send Warning"
 when
 ap : AccountPeriod()
 acnt : Account( balance < 0 )
 then insert( new NegativeWarning( acnt ) );
 end
  18. 18. Accumulate rule “accumulate"
 when acc( b : Bus( color == “red” ); sumTakings : sum(b.takings);)
 then System.out.println( “sum is " + sumTakings );
 end acc( b : Bus( color == “red” ); sumTakings : sum(b.takings), minTakings : min(b.takings), maxTakings : max(b.takings); minTakings < 100 and maxTakings < 200;)
  19. 19. CashFlow Example rule “Account in Negative send Warning"
 when
 ap : AccountPeriod()
 acnt : Account( balance < 0 )
 then insert( new NegativeWarning( acnt ) );
 end rule “Issue Warning"
 when
 ap : AccountPeriod()
 acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ); totalWarnings : count(n); totalWarnings > 0; )
 then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + “ Warnings “ + totalWarnings ); ! insert( TotalWarnings( acnt, totalWarnings );
 end
  20. 20. Conditional Elements not Bus ( color == “red” ) ! ! exists Bus ( color == “red” ) ! ! forall ( Bus ( color == “red” ) ! ! forall ( b : Bus ( floors == 2 ) Bus( this == b, color == “red” ) )
  21. 21. CashFlow Example rule “Issue Warning"
 when
 ap : AccountPeriod()
 acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ); totalWarnings : count(n); totalWarnings > 0; )
 then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + “ Warnings “ totalWarnings ); ! insert( TotalWarnings( acnt, totalWarnings );
 end rule “Cleanup Warnings"
 when
 ap : AccountPeriod()
 acnt : Account( balance >= 0 ) exists( NegativeWarning( account == acnt ) ) n : NegativeWarning( account == acnt )
 then delete( n );
 end
  22. 22. CashFlow Example rule “Fine"
 when
 ap : AccountPeriod()
 acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ) over window:time(4w); totalWarnings : count(n); totalWarnings > 3 ) TotalWarnings( total < totalWarnings )
 then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + Warnings “ totalWarnings );
 end rule “Issue Warning"
 when
 ap : AccountPeriod()
 acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ) over window:time(4w); totalWarnings : count(n); totalWarnings > 0; )
 then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + “ Warnings “ totalWarnings ); ! insertLogical( new TotalWarnings( acnt, totalWarnings );
 end
  23. 23. Graphical Editors
  24. 24. Data Modeller
  25. 25. Guided Editors
  26. 26. Decision Table (Extended)
  27. 27. Decision Table (Extended)
  28. 28. Decision Table (Square)
  29. 29. Rule Templates
  30. 30. Rule Templates
  31. 31. Decision Table Wizards
  32. 32. Score Cards • a) Setup Parameters • b) Characteristic Section
  33. 33. Score Cards • UI Generates PMML • DRL Generated from PMML • DRL results in • Calculated Score • Ranked Reason Codes • Can import PMML 4.1 • but not exposed yet • Calculated Scores • Currently Summations • Weight coming • Not in PMML standard
  34. 34. Scenarios
  35. 35. Architecture
  36. 36. GIT + Maven Organization Unit GIT Repository GIT Repository Projects Projects Projects GIT Repository
  37. 37. KIE Installation KIE Installation Organization Unit GIT Repository Reposiotry Projects Projects Projects GIT Repository Organization Unit GIT Repository Reposiotry Projects Projects Projects GIT Repository Organization Unit GIT Repository GIT Repository Projects Projects Projects GIT Repository
  38. 38. Application Architecture KIE Installation Application Installation Maven Repository (local) ApplicationProject mvn install mvn install Maven Repository (local) Maven Repository (remote) mvn deploy Http
  39. 39. Workbench
  40. 40. 5.x Critique
  41. 41. 5.x Critique JCR • Performance Issues • Everything stored as blob • No tagging, branching etc. • Webdav • Limited team providers Content • Single tree structure (packages) • Packages created project deployment units • No easy rule use • Loading “model” jars into packages UI • Not easily extended • Fixed layouts • No perspectives • Hard to change • Too many hacks Deployment • Binary blobs, on url • Simple Snapshot system • No real methodology • Doesn’t align with any industry standards
  42. 42. UF UberFire
  43. 43. KIE - Knowledge Is Everything
  44. 44. KIE - Knowledge Is Everything
  45. 45. KIE - Knowledge Is Everything
  46. 46. UberFire Architecture Overview
  47. 47. High Availability
  48. 48. Workbench Screens
  49. 49. Workbench Screens • Workbench Screen • DIV • Lifecycle events • OnStartUp, OnShutDown • OnOpen, OnMayClose, OnClose • OnFocus, OnLostFocus
  50. 50. Workbench Screens @WorkbenchScreen(identifier = "MyFirstPanel")! public class MyFirstPanel extends SimplePanel {! ! public MyFirstPanel() {! setWidget( new Label("Hello World 1") );! }! ! @WorkbenchPartTitle! public String myTitle() {! return "My First Panel!";! }! ! }
  51. 51. Workbench Editor
  52. 52. Workbench Editor • Workbench Screen • DIV • Lifecycle events • OnStartUp, OnShutDown • OnOpen, OnMayClose, OnClose • OnFocus, OnLostFocus • IsDirty, OnSave
  53. 53. Life Cycle Annotation @WorkbenchEditor(identifier = "TextEditor", ! supportedTypes = { TextResourceType.class, ! DotResourceType.class })
 public class TextEditorPresenter {
 (...)
 @OnStart
 public void onStart( final Path path ) {
 this.path = path;
 }
 
 @OnSave
 public void onSave() {! }
 
 @IsDirty
 public boolean isDirty() {
 return view.isDirty();
 }
 }
  54. 54. Life Cycle Annotation @WorkbenchEditor(identifier = "TextEditor", ! supportedTypes = { TextResourceType.class, ! DotResourceType.class })
 public class TextEditorPresenter {
 (...)
 @OnStart
 public void onStart( final Path path ) {
 this.path = path;
 }
 
 @OnSave
 public void onSave() {! }
 
 @IsDirty
 public boolean isDirty() {
 return view.isDirty();
 }
 }
  55. 55. Workbench Perspective
  56. 56. Workbench Perspective $registerPerspective({ "id": "Markdown Editor", "view": { "parts": [ { "place": "MarkdownLiveViewer", "parameters": {} } ], "panels": [ { "width": 600, "min_width": 300, "position": "west", "parts": [ { "place": "MarkdownLiveEditor", "parameters": {} } ] } ] }, on_close: function () { } });
  57. 57. Workbench Home Page
  58. 58. Helpful InfoPops
  59. 59. Authoring Perspective Project Explorer Use the project explorer to navigate projects for your organizational’s repository and create assets to author. Problems When you save, validation errors for the current project are shown here Content Area Opened assets are added here
  60. 60. Tab Stack Tab Stack Button Click the button to see the list of opened assets Asset List The opened assets are shown here. Click to continue authoring.
  61. 61. Project Explorer Organizational Unit Lists the organizational units. Repositories Lists the repositories for the selected organisational unit. Projects Lists the projects for the selected repository. Folder Navigation Click to expand, to see folders.
  62. 62. Project View Show as Folders Show as Links Compact view, that displays the folders as a single line path. Project View The project view is a simplified and hides many technical aspects of the project. Such as merging multiple paths into one tree. Shows the project folders using a tree view.
  63. 63. Repository View Repository View The repository view provides raw access to the project structure and files, nothing is hidden. And all paths are visible separately; see the java and resources folders. Show as Folders Show as Links Compact view, that displays the folders as a single line path. Shows the project folders using a tree view.
  64. 64. New Projects and Other Items New Projects Launches the new project wizard. Once created it appears under the project list for the target repository
  65. 65. Project Editor
  66. 66. Project Dependencies
  67. 67. Build and Deploy
  68. 68. Repository Manager
  69. 69. Repository Manager
  70. 70. GIT Repositories Repositories Create or clone GIT repositories
  71. 71. Organizational Units Manage Organizational Units Create Organizational Units and associate repositories with them.
  72. 72. End Users - Task Lists
  73. 73. End Users - Task Lists
  74. 74. Videos
  75. 75. KIE WorkbenchVideos http://www.youtube.com/watch?v=vj3MNmiUnvY&index=2&list=PLb9jQNHBKBRj9IJkc_F5nCJAvXaegOGW8
  76. 76. Drools EditorVideos http://www.youtube.com/playlist?list=PLb9jQNHBKBRipbtadRC-UaUObjwp0aBHJ
  77. 77. Build Deploy Utilize API
  78. 78. BRMS 5.0 Programmatic API KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
 
 kbuilder.batch().add( newClassPathResource( "Model.drl", getClass() ), DRL )
 .add( newClassPathResource( "Queries.drl", getClass() ), DRL )
 .add( newClassPathResource( "General.drl", getClass() ), DRL )
 .add( newClassPathResource( "Response.drl", getClass() ), DRL )
 .add( newClassPathResource( "Events.drl", getClass() ), DRL )
 .add( newClassPathResource( "UiView.drl", getClass() ), DRL )
 .add( newClassPathResource( "Commands.drl", getClass() ), DRL ).build();
 
 if ( kbuilder.hasErrors() ) {
 System.out.println( kbuilder.getErrors().toString() );
 System.exit( 1 );
 }
 
 KieBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
 kbaseConf.setOption( EqualityBehaviorOption.EQUALITY );
 
 KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
 kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
 
 Counter c = new Counter();
 ksession = kbase.newStatefulKnowledgeSession();
  79. 79. KieModules • Discovery • META-INF/kmodule.xml • Convention based • No programmatic api for building • Multiple Named entities • Inheritence of Resources • Defaults for lazy people • Version built in a standard
  80. 80. Git Hub Examples• https://github.com/droolsjbpm/drools/tree/master/drools- examples-api
  81. 81. KieModules <kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://jboss.org/kie/6.0.0/kmodule">
 
 </kmodule> KieServices ks = KieServices.Factory.get();
 KieContainer kContainer = ks.getKieClasspathContainer();
 
 KieSession kSession = kContainer.newKieSession();
 kSession.setGlobal("out", out);
 kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
 kSession.fireAllRules();
  82. 82. KieModules • Named Entities and JAR on Classpath • Creates one KieBase • Includes resources from package matching kbase name <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
 
 <kbase name="kbase1">
 <ksession name="ksession1"/>
 </kbase>
 
 </kmodule> KieServices ks = KieServices.Factory.get();
 KieContainer kContainer = ks.getKieClasspathContainer();
 
 KieSession kSession = kContainer.newKieSession("ksession1");
 kSession.setGlobal("out", out);
 kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
 kSession.fireAllRules();
  83. 83. KieModules • Named Entities, with inheritence and JAR on Classpath • Two projects, one “includes” from the other <dependency>
 <groupId>org.drools</groupId>
 <artifactId>named-kiesession</artifactId>
 <version>6.0.0-SNAPSHOT</version>
 </dependency> <kbase name="kbase2" includes="kbase1">
 <ksession name="ksession2"/>
 </kbase> KieServices ks = KieServices.Factory.get();
 KieContainer kContainer = ks.getKieClasspathContainer();
 KieSession kSession = kContainer.newKieSession("ksession2");
 kSession.setGlobal("out", out);
 
 kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
 kSession.fireAllRules();
 
 kSession.insert(new Message("Dave", "Open the pod bay doors, HAL."));
 kSession.fireAllRules();
  84. 84. KieModules • Package location can over-ride kbase name defaults <kbase name="WumpusMainKB" packages="org.drools.games.wumpus.server, org.drools.games.wumpus.server.view">
 <ksession name="WumpusMainKS" />
 </kbase>
 
 <kbase name="WumpusClientKB" packages="org.drools.games.wumpus.client">
 <ksession name="WumpusClientKS"/>
 </kbase> KieContainer kc = KieServices.Factory.get().getKieClasspathContainer();
 final KieSession serverKsession = kc.newKieSession( "WumpusMainKS");
 final KieSession clientKsession = kc.newKieSession("WumpusClientKS");
  85. 85. Dynamic KieModules • JARs can be loaded from URLs into KieRepository • Once loaded they can be resolved via ReleaseId KieServices ks = KieServices.Factory.get();
 KieRepository kr = ks.getRepository();
 
 KieModule kModule = kr.addKieModule(ks.getResources().newFileSystemResource( getFile("default-kiesession")));
 
 KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
 
 KieSession kSession = kContainer.newKieSession();
 kSession.setGlobal("out", out);
 
 Object msg1 = createMessage(kContainer, "Dave", "Hello, HAL. Do you read me, HAL?");
 kSession.insert(msg1);
 kSession.fireAllRules();
  86. 86. Dynamic KieModules • kie-ci use embedded maven for remote discovery <dependency>
 <groupId>org.kie</groupId>
 <artifactId>kie-ci</artifactId>
 </dependency> KieServices ks = KieServices.Factory.get();
 
 // Install example1 in the local maven repo before to do this
 KieContainer kContainer = ks.newKieContainer( ks.newReleaseId("org.drools", "named-kiesession", "6.0.0-SNAPSHOT"));
 
 KieSession kSession = kContainer.newKieSession("ksession1");
 kSession.setGlobal("out", out);
 
 Object msg1 = createMessage(kContainer, "Dave", "Hello, HAL. Do you read me, HAL?");
 kSession.insert(msg1);
 kSession.fireAllRules();
  87. 87. Dynamic KieModules 
 
 // create a new kjar
 InternalKieModule kJar2 = createKieJar(ks, releaseId, "rule2", "rule3");
 
 // deploy it on maven
 repository.deployArtifact(releaseId, kJar2, kPom);
 
 // since I am not calling start() on the scanner it means it won't have automatic scheduled scanning
 KieScanner scanner = ks.newKieScanner(kieContainer);
 
 // scan the maven repo to get the new kjar version and deploy it on the kcontainer
 scanner.scanNow();
 
 // create a ksesion and check it works as expected
 KieSession ksession2 = kieContainer.newKieSession("KSession1");
 checkKSession(ksession2, "rule2", "rule3");
  88. 88. Maven Versions • <version>1.0.1</version> • <version>[1.0.0,2.0.0)</version> • <version>[1.0.0,)</version> • <version>LATEST</version> • <version>RELEASE</version> • <version>SNAPSHOT</version>
  89. 89. kmodule.xml Editor
  90. 90. Programmatic API • Builder API, for tooling integration • Incremental compilation, and problem reporting KieServices ks = KieServices.Factory.get();
 KieRepository kr = ks.getRepository();
 KieFileSystem kfs = ks.newKieFileSystem();
 
 kfs.write("src/main/resources/org/kie/example5/HAL5.drl", getRule());
 
 KieBuilder kb = ks.newKieBuilder(kfs);
 
 kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built.
 if (kb.getResults().hasMessages(Level.ERROR)) {
 throw new RuntimeException("Build Errors:n" + kb.getResults().toString());
 }
 
 KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());
 
 KieSession kSession = kContainer.newKieSession();
 kSession.setGlobal("out", out);
 
 kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
 kSession.fireAllRules();
  91. 91. CDI
  92. 92. CDI Context and Dependency • CDI injects named entities from the kmodule.xml ! • Injectable types • KieServices • KieContainer • KieBase • KieSession • StatelessKieSession
  93. 93. KBase @Inject 
 @KBase(value="jar1.KBase1", name="kb2") 
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0")
 private KieBase jar1KBase1kb2; 
 
 @Inject
 @KBase(value="jar1.KBase1", name="kb2") 
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0")
 private KieBase jar1KBase1kb22; @Inject
 private KieBase defaultClassPathKBase;
 
 @Inject
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0") 
 private KieBase defaultDynamicKBase; @Inject
 @KBase("jar1.KBase1") 
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0")
 private KieBase jar1KBase1v10;
 
 @Inject
 @KBase("jar1.KBase1") 
 @KReleaseId(groupId = "jar1",
 artifactId = "art1", 
 version = "1.1")
 private KieBase jar1KBase1v11; 
 
 @Inject
 @KBase(value="jar1.KBase1", name="kb1")
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0")
 private KieBase jar1KBase1kb1;
  94. 94. KSession @Inject
 @KSession("jar1.KSession2") 
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0" )
 private KieSession kbase1ksession2v10;
 @Inject
 @KSession("jar1.KSession2") 
 @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.1" )
 private KieSession kbase1ksession2v11; @Inject
 @KSession(value="jar1.KSession2", name="ks1") @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0" )
 private KieSession kbase1ksession2ks1;
 
 @Inject
 @KSession(value="jar1.KSession2", name="ks2") @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0" )
 private KieSession kbase1ksession2ks2 ; 
 
 @Inject
 @KSession(value="jar1.KSession2", name="ks2") @KReleaseId( groupId = "jar1",
 artifactId = "art1", 
 version = "1.0" )
 private KieSession kbase1ksession2ks22;
  95. 95. Spring and Camel
  96. 96. Spring and Camel <kie:kmodule id="CxfRsSpring">
 <kie:kbase name="test1" packages="test1">
 <kie:ksession name="ksession1">
 <kie:batch>
 <kie:set-global identifier="list" >
 <bean class="java.util.ArrayList" />
 </kie:set-global>
 </kie:batch>
 </kie:ksession>
 <kie:ksession name="ksession2"/>
 </kie:kbase>
 </kie:kmodule>
  97. 97. Spring and Camel <bean id="kiePolicy" class="org.kie.camel.component.KiePolicy" />
 
 <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
 
 <route>
 <from uri="cxfrs://bean://rsServer"/>
 <policy ref="kiePolicy">
 <unmarshal ref="xstream" />
 <to uri="kie:ksession1" />
 <marshal ref="xstream" />
 </policy>
 </route>
 
 <route id="x1">
 <from uri="direct://http"/>
 <policy ref="kiePolicy">
 <to uri="cxfrs://http://localhost:58001/rest"/>
 </policy> 
 </route> 
 
 </camelContext>
  98. 98. 104 Questions? • Dave Bowman: All right, HAL; I'll go in through the emergency airlock. • HAL: Without your space helmet, Dave, you're going to find that rather difficult. • Dave Bowman: HAL, I won't argue with you anymore! Open the doors! • HAL: Dave, this conversation can serve no purpose anymore. Goodbye. Joshya: Greetings, Professor Falken. Falken: Hello, Joshua. Joshya: A strange game. The only winning move is not to play. How about a nice game of chess?
  99. 99. R.I.P Rete Time to get Phreaky
  100. 100. Rete
  101. 101. ReteOO • Node sharing • Alpha indexing • Tree based graphs • Modify-in-place • Property reactive • Sub-networks • Backward Chaining • Lazy Truth Maintenance • Heap based agenda • Dynamic Rules
  102. 102. R.I.P RETE Time to get Phreaky inspirations: • Leaps, Collection Oriented Match, L/R Unlinking ! New Innovations • Full Rule, and Rule Segment Unlinking • Lazy Evaluation, with Rule scoping • Set propagations ! Previous Innovations • Modify In Place • Property Reactive • Tree Based Graphs • Subnetwork support
  103. 103. Phreak
  104. 104. Phreak
  105. 105. Phreak
  106. 106. TMS
  107. 107. Justification-based Truth • Drools 5.x • Simple logical insertion TMS, like Clips, Jess and others. ! • Drools 6.0 • Contradiction handling with JTMS • Clean separation of exception logic • TMS now has pluggable Belief System • Simple TMS support • JTMS now possible (exp) • Defeasible Logic (exp) ! • See drools-compiler • JTMSTest for lots of example tests
  108. 108. 114 TMS Couples the logic What happens when the Child stops being 16? rule "Issue Child Bus Pass" when $p : Person( age < 16 ) then insert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" when $p : Person( age >= 16 ) then insert(new AdultBusPass( $p ) ); end
  109. 109. TMS • Bad • Monolithic • Leaky • Brittle integrity - manual maintenance
  110. 110. 116 TMS de-couples the logic Maintains the truth by 
 automatically retracting •A rule “logically” inserts an object •When the rule is no longer true, the object is retracted. rule "IsChild" when $p : Person( age < 16 ) then logicalInsert( new IsChild( $p ) ) end rule "IsAdult" when $p : Person( age >= 16 ) then logicalInsert( new IsAdult( $p ) ) end
  111. 111. 117 TMS The truth maintenance cascades rule "Issue Child Bus Pass" when $p : Person( ) IsChild( person =$p ) then logicalInsert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" when $p : Person() IsAdult( person =$p ) then logicalInsert(new AdultBusPass( $p ) ); end
  112. 112. 118 TMS rule "Issue Child Bus Pass" when $p : Person( ) not( ChildBusPass( person == $p ) ) then requestChildBusPass( $p ); end The truth maintenance cascades
  113. 113. 119 TMS • Good • De-couple knowledge responsibilities • Encapsulate knowledge • Provide semantic abstractions for those encapsulation • Integrity robustness – truth maintenance
  114. 114. TMS IsChild ChildBusPas Rule : isChildRule Rule : IssueBusPas + +
  115. 115. JTMS
  116. 116. JTMS rule "Do not issue to banned people" when $p : Person( ) Banned( person =$p ) then logicalInsert(new ChildBusPass( $p ) , “neg” ); end “plus” and “neg” labels
  117. 117. JTMS IsChild ChildBusPas Rule : isChildRule Rule : IssueBusPas + + Rule : Do Not Issue to Banned People -
  118. 118. Defeasible
  119. 119. Defeasible rule "All Birds Fly" when $b : Bird( ) then logicalInsert(new Fly( $b ) ); end rule "Brocken wing" when $b : Bird( ) BrockenWing($b;) then logicalInsert(new Fly( $b ), “neg” ); end
  120. 120. Defeasible rule "All Birds Fly" @Defeasible when $b : Bird( ) then logicalInsert(new Fly( $b ) ); end rule "Brocken wing" @Defeasible @Defeater when $b : Bird( ) BrockenWing($b;) then logicalInsert(new Fly( $b ), “neg” ); end rule "Birds With Rockets Fly"@Defeasible @Defeats(“Brocken Wing”) when $b : Bird( ) Rocket($b;) then logicalInsert(new Fly( $b ) ); end
  121. 121. Decision Tables
  122. 122. Decision Table
  123. 123. Decision Table
  124. 124. Decision Table
  125. 125. Decision Table
  126. 126. Decision Table
  127. 127. Decision Table
  128. 128. Decision Table
  129. 129. Decision Table
  130. 130. Decision Table
  131. 131. Decision Table
  132. 132. Redundancy - Subsumption
  133. 133. Deficiency • Deficiency • Premium is £500 if applicant age is less than 30 • Premium is £300 if Years Without Claim is greater than or equal to 10 years. ! ! ! ! ! • Applicant is 29, premium is £500 • Applicant has 12 years without claim, premium is £300 • Applicant is 29 with 12 years without claim, premium is ?!?
  134. 134. Property Reactive
  135. 135. Loop Problem rule “Salary award for min 2 years service” when ! e : Employee( lengthOfService > 2 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end! ! ! ! ! !
  136. 136. Loop Problem rule “Salary award for min 2 years service” no-loop when ! e : Employee( lengthOfService > 2 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end! ! ! ! ! !
  137. 137. Loop Problem rule “Salary award for min 2 years service” no-loop when ! e : Employee( lengthOfService > 2 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end! ! rule “Salary award for min 8 years service” no-loop when ! e : Employee( lengthOfService > 8 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end
  138. 138. Loop Problem rule “Salary award for min 2 years service” when ! e : Employee( lengthOfService > 2 )! not SalaryMin2Years( employee == e )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! insert ( new SalaryMin2Years(e) );! end! ! rule “Salary award for min 8 years service” when ! e : Employee( lengthOfService > 8 )! not SalaryMin8Years( employee == e )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! insert ( new SalaryMin8Years(e) );! end
  139. 139. Loop Problem rule “Year End” when ! d : ChangeDate( )! e : Employee( )! then ! modify( e ) { lengthOfService( ! d.getYear() - e.getStartYear() ) };! end! ! rule “Salary award for min 8 years service” when ! e : Employee( lengthOfService > 8 )! not SalaryMin8Years( employee == e )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! insert ( new SalaryMin8Years(e) );! end
  140. 140. Refraction This term comes from the neurobiological observation of a refractory period for a neuron, which means that the neuron is not able to fire immediately without first going through a relaxation process. ! In a similar way, OPS5 will not allow the same instantiation in the conflict set from firing twice in a row. This prevents the inference engine from entering into an infinite loop.
  141. 141. W3C RIF Refraction • Refraction When a rule instance is fired, it is removed from the conflict set (and thus will not be created again even its condition part remains true), unless one of the objects in its condition part is modified again. In the later case, the repeatability concept determines how the rule instance is treated
  142. 142. W3C RIF Refraction • Repeatability After the execution of a rule instance, the rule instance is removed from the conflict set by the refraction. Later on, if one of the objects in the condition part is modified and if the rule evaluates to true, the repeatability controls whether if the rule instance can be created again.
  143. 143. Loop Problem (Refraction) rule “Salary award for min 2 years service” ! repeatable false when ! e : Employee( lengthOfService > 2 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end! ! rule “Salary award for min 8 years service” ! repeatable false when ! e : Employee( lengthOfService > 8 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end
  144. 144. AAAAAAhhhhhhhhhh
  145. 145. Annotate Class @PropertyReactive! public class Employee {! int salary;! int lengthOfService! ! // getters and setters below! }
  146. 146. Loop Problem Fixed rule “Salary award for min 2 years service” when ! e : Employee( lengthOfService > 2 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end! ! rule “Salary award for min 8 years service” when ! e : Employee( lengthOfService > 8 )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end
  147. 147. @Watch rule “Salary award for min 2 years service” when ! e : Employee( salary < 1000, lengthOfService > 2 )! @Watch( !salary )! then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! end
  148. 148. @Watch rule “Record Salary Changes” when ! e : Employee( ) @Watch( salary )! then ! insert( new SalaryChange( e, e.getSalary() );! end
  149. 149. @Watch @Watch( salary, lengthOfService, age )! ! @Watch( * )! ! @Watch( !* )! ! @Watch( *, !salary )! ! @Watch( !*, salary )
  150. 150. Backward Chaining
  151. 151. 158 Reasoning with Graphs House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  152. 152. 159 Backward Chaining query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  153. 153. Backward Chaining 160 ksession.insert( new Location("Office", "House") );
 ksession.insert( new Location("Kitchen", "House") );
 ksession.insert( new Location("Knife", "Kitchen") );
 ksession.insert( new Location("Cheese", "Kitchen") );
 ksession.insert( new Location("Desk", "Office") );
 ksession.insert( new Location("Chair", "Office") );
 ksession.insert( new Location("Computer", "Desk") );
 ksession.insert( new Location("Draw", "Desk") ); House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  154. 154. Backward Chaining 161 rule "go" salience 10
 when
 $s : String( )
 then
 System.out.println( $s );
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  155. 155. Backward Chaining 162 rule "go1"
 when
 String( this == "go1" )
 isContainedIn("Office", "House"; )
 then
 System.out.println( "office is in the house" );
 end rule "go" salience 10
 when
 $s : String( )
 then
 System.out.println( $s );
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  156. 156. Backward Chaining 163 rule "go1"
 when
 String( this == "go1" )
 isContainedIn("Office", "House"; )
 then
 System.out.println( "office is in the house" );
 end rule "go" salience 10
 when
 $s : String( )
 then
 System.out.println( $s );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  157. 157. Backward Chaining 164 rule "go1"
 when
 String( this == "go1" )
 isContainedIn("Office", "House"; )
 then
 System.out.println( "office is in the house" );
 end rule "go" salience 10
 when
 $s : String( )
 then
 System.out.println( $s );
 end ksession.insert( "go1" );
 ksession.fireAllRules(); --- go1 office is in the house query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  158. 158. Backward Chaining 165 rule "go1"
 when
 String( this == "go1" )
 isContainedIn("Office", "House"; )
 then
 System.out.println( "office is in the house" );
 end rule "go" salience 10
 when
 $s : String( )
 then
 System.out.println( $s );
 end ksession.insert( "go1" );
 ksession.fireAllRules(); --- go1 office is in the house query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end isContainedIn(x==Office, y==House) House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  159. 159. Backward Chaining 166 rule "go1"
 when
 String( this == "go1" )
 isContainedIn("Office", "House"; )
 then
 System.out.println( "office is in the house" );
 end rule "go" salience 10
 when
 $s : String( )
 then
 System.out.println( $s );
 end ksession.insert( "go1" );
 ksession.fireAllRules(); --- go1 office is in the house query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(x==Office, y==House) isContainedIn(x==Office, y==House) House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  160. 160. Backward Chaining 167 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  161. 161. Backward Chaining 168 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  162. 162. Backward Chaining 169 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  163. 163. Backward Chaining 170 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end isContainedIn(x==Draw, y==House) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  164. 164. Backward Chaining 171 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(z==Office, y==House) isContainedIn(x==Draw, y==House) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  165. 165. Backward Chaining 172 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(z==Office, y==House) isContainedIn(x==Draw, z==Office) isContainedIn(x==Draw, y==House) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  166. 166. Backward Chaining 173 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(z==Office, y==House) isContainedIn(x==Draw, z==Office) Location(z==Kitchen, y==House) isContainedIn(x==Draw, z==Kitchen) isContainedIn(x==Draw, y==House) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  167. 167. Backward Chaining 174 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end isContainedIn(x==Draw, y==Office) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  168. 168. Backward Chaining 175 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(z==Desk, y==Office) isContainedIn(x==Draw, y==Office) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  169. 169. Backward Chaining 176 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(z==Desk, y==Office) isContainedIn(x==Draw, z==Desk) isContainedIn(x==Draw, y==Office) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  170. 170. Backward Chaining 177 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end isContainedIn(x==Draw, y==Desk) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  171. 171. Backward Chaining 178 rule "go2"
 when
 String( this == "go2" )
 isContainedIn("Draw", "House"; )
 then
 System.out.println( "Draw in the House" );
 end query isContainedIn( String x, String y )
 Location( x, y; )
 or
 ( Location( z, y; ) and isContainedIn( x, z; ) )
 end Location(x==Draw, y==Desk) isContainedIn(x==Draw, y==Desk) ksession.insert( "go2" );
 ksession.fireAllRules(); --- go2 Draw in the House House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  172. 172. Backward Chaining 179 rule "go3"
 when
 String( this == "go3" )
 isContainedIn("Key", "Office"; )
 then
 System.out.println( "Key in the Office" );
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  173. 173. Backward Chaining 180 rule "go3"
 when
 String( this == "go3" )
 isContainedIn("Key", "Office"; )
 then
 System.out.println( "Key in the Office" );
 end ksession.insert( "go3" );
 ksession.fireAllRules(); --- go3 House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  174. 174. Backward Chaining 181 rule "go3"
 when
 String( this == "go3" )
 isContainedIn("Key", "Office"; )
 then
 System.out.println( "Key in the Office" );
 end ksession.insert( "go3" );
 ksession.fireAllRules(); --- go3 ksession.insert( new Location("Key", "Draw") );
 ksession.fireAllRules(); --- Key in the Office House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  175. 175. Backward Chaining 182 rule "go4"
 when
 String( this == "go4" )
 isContainedIn(thing, "Office"; )
 then
 System.out.println( "thing " + thing + " is in the Office" );
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  176. 176. Backward Chaining 183 rule "go4"
 when
 String( this == "go4" )
 isContainedIn(thing, "Office"; )
 then
 System.out.println( "thing " + thing + " is in the Office" );
 end Out Var (unbound) House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  177. 177. Backward Chaining 184 rule "go4"
 when
 String( this == "go4" )
 isContainedIn(thing, "Office"; )
 then
 System.out.println( "thing " + thing + " is in the Office" );
 end ksession.insert( "go4" );
 ksession.fireAllRules(); --- go4 thing Key is in the Office thing Computer is in the Office thing Draw is in the Office thing Desk is in the Office thing Chair is in the Office Out Var (unbound) House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  178. 178. Backward Chaining 185 rule "go5"
 when
 String( this == "go5" )
 isContainedIn(thing, location; )
 then
 System.out.println( "thing " + thing + " is in " + location );
 end House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  179. 179. Backward Chaining 186 rule "go5"
 when
 String( this == "go5" )
 isContainedIn(thing, location; )
 then
 System.out.println( "thing " + thing + " is in " + location );
 end Out Var (unbound) House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  180. 180. Backward Chaining 187 rule "go5"
 when
 String( this == "go5" )
 isContainedIn(thing, location; )
 then
 System.out.println( "thing " + thing + " is in " + location );
 end Out Var (unbound) Out Var (unbound) House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  181. 181. Backward Chaining 188 rule "go5"
 when
 String( this == "go5" )
 isContainedIn(thing, location; )
 then
 System.out.println( "thing " + thing + " is in " + location );
 end ksession.insert( "go5" );
 ksession.fireAllRules(); --- go5 thing Knife is in House thing Cheese is in House thing Key is in House thing Computer is in House thing Draw is in House thing Desk is in House thing Chair is in House thing Key is in Office thing Computer is in Office thing Draw is in Office thing Key is in Desk thing Office is in House Out Var (unbound) Out Var (unbound) ! thing Computer is in Desk thing Knife is in Kitchen thing Cheese is in Kitchen thing Kitchen is in House thing Key is in Draw thing Draw is in Desk thing Desk is in Office thing Chair is in Office House Location("Office", "House ") Location("Kitchen", "House") Location("Desk", "Office") Location("Chair", "Office") Location("Computer", "Desk") Location("Draw", "Desk") Location("Knife", "Kitchen") Location("Cheese", "Kitchen") Location("Key", "Draw")
  182. 182. 189 Questions? • Dave Bowman: All right, HAL; I'll go in through the emergency airlock. • HAL: Without your space helmet, Dave, you're going to find that rather difficult. • Dave Bowman: HAL, I won't argue with you anymore! Open the doors! • HAL: Dave, this conversation can serve no purpose anymore. Goodbye. Joshya: Greetings, Professor Falken. Falken: Hello, Joshua. Joshya: A strange game. The only winning move is not to play. How about a nice game of chess?

×