Post on 05-Dec-2014
description
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
Monday, 2 September 13
Who am I?
• Drools co-founder
• JBoss (2005)
• Red Hat (2006)
• Polymita Acquisition 2012
• Red Hat Platform Architect
Monday, 2 September 13
KIE - Knowledge Is EverythingKIE
Drools jBPMOptaPlanner UberFire
Guvnor
Drools-WB jBPM-WB
KIE-WB
Monday, 2 September 13
KIE - Knowledge Is Everything
Monday, 2 September 13
KIE - Knowledge Is Everything
Monday, 2 September 13
GitHub• URL:• https://github.com/droolsjbpm/
• Bootstrap project:• https://github.com/droolsjbpm/droolsjbpm-
build-bootstrap
Monday, 2 September 13
Serious Bits :)
http://www.youtube.com/watch?v=Omj4PR3v-nI
http://www.youtube.com/watch?v=4CvjKqUOEzM
Monday, 2 September 13
What’s a Rule
Monday, 2 September 13
This is a Rule
Monday, 2 September 13
This is another Rule
function checkemail(email){ var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i if ( filter.test(email) ) { return true } else{ return false }}
Monday, 2 September 13
This is a Rule Enginevar validator = new FormValidator('example_form', [{ name: 'req', display: 'required', rules: 'required'}, { name: 'alphanumeric', rules: 'alpha_numeric'}, { name: 'password', rules: 'required'}, { name: 'password_confirm', display: 'password confirmation', rules: 'required|matches[password]'},
Monday, 2 September 13
These are Rules too
Monday, 2 September 13
What is a Rule
rule <rule_name> <attribute><value> when <conditions> then <actions>end
Monday, 2 September 13
Pattern Matching
Person(age >= 18)field name restriction
constraintobject type
pattern
Monday, 2 September 13
Pattern Matching ?
case class Grade( letter : String, passed : Boolean ) def check( grade : Grade ) = { grade match { case Grade(letter,true) => printf( "You have passed with grade: %s", letter ) case Grade(letter,false) => printf( "You have failed with grade: %s", letter ) }}
Monday, 2 September 13
Hybrid Reasoning
Monday, 2 September 13
Types of Reasoning
•Production Rule Systems PRD (forward chaining)•Reactive
•when Alarm( status == “alert” ) •then send( “warning” )
•Logic Programming LP (backward chaining)•Query
•descendant( “mary”, “jane”)
•Functional Programming FP•Map,Fold, Filter•avg([12, 16, 4, 6])
•Returns single value 9.5
•round([10.3, 4.7, 7.8] )•Returns List [10, 5, 8]
17
Monday, 2 September 13
Quick IntroWhat are Rule Based Systems
Monday, 2 September 13
19
VisionRobotics
Speech
Neural Nets Rule Base Systems/Expert System Tools
Understanding
NaturalLanguageSome Areas of
Artificial Intelligence
Some Areas of Artificial Intelligence
Monday, 2 September 13
20
Knowledge Representation and Reasoning
The study of Knowledge is Epistemology● Nature Structure and Origins of Knowledge● Core or AI
Rule based systems● Expert System tools● Knowledge Representation and Reasoning● Facilitate the codification of knowledge into a knowledge
base which can be used for reasoning
Monday, 2 September 13
21
It All Started Here Birth of CDSS
Dendral
Mycin
Baobab
Guidon
Neomycin
Teiresias Emycin WM
Puff
Sacon
Centaur
Gravida
Wheeze Clot
Onccocin
1970s
1980s
Monday, 2 September 13
22
Because Not Everyone Is As Smart As He Is
Monday, 2 September 13
1979 Rete Algorithm by Charles Forgy 23
Monday, 2 September 13
Clips and Jess
Clips 1986
24
Clips 1995
Monday, 2 September 13
Technical Language
Monday, 2 September 13
26
Classes
AccountAccount
long accountNo
int balance
CashFlowCashFlow
Date date
int amount
AccountPeriodAccountPeriod
Date start
Date end
CashFlow Example
Monday, 2 September 13
select * from Account acc, Cashflow cf, AccountPeriod apwhere 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
27
acc.balance += cf.amount
CashFlow Rule
Monday, 2 September 13
select * from Account acc, Cashflow cf, AccountPeriod apwhere 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
28
acc.balance += cf.amount
CashFlow Rule
Monday, 2 September 13
select * from Account acc, Cashflow cf, AccountPeriod apwhere 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
29
acc.balance += cf.amount
CashFlow Rule
Monday, 2 September 13
select * from Account acc, Cashflow cf, AccountPeriod apwhere 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
30
acc.balance += cf.amount
CashFlow Rule
Monday, 2 September 13
select * from Account acc, Cashflow cf, AccountPeriod apwhere 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
31
acc.balance += cf.amount
CashFlow Rule
Monday, 2 September 13
32
rule "Increase balance for AccountPeriod Credits"when ap : AccountPeriod( ) acc : Account( ) cf : CashFlow( type == CashFlowType.CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end )then acc.balance = acc.balance + cf.amount;end
rule "Decrease balance for AccountPeriod Debits"when ap : AccountPeriod( ) acc : Account( ) cf : CashFlow( type == CashFlowType.DEBIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end )then acc.balance = acc.balance - cf.amount;end
CashFlowCashFlowCashFlowCashFlow
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
AccountingPeriodAccountingPeriod
start end
01-JAN-2012 31-MAR-2012
AccountAccount
accountNo balance
1 0
CashFlowCashFlowCashFlowCashFlow
date amount type accountNo
12-Jan-12 100 CREDIT 1
9-Mar-12 75 CREDIT 1
CashFlowCashFlowCashFlowCashFlow
date amount type accountNo
2-Feb-12 200 DEBIT 1
AccountAccount
accountNo balance
1 -25
CashFlow Example
Monday, 2 September 13
33
rule "Print blance for AccountPeriod" salience -50when ap : AccountPeriod() acc : Account( )then System.out.println( "Account Number " + acc.accountNo + " balance " + acc.balance );end
AgendaAgendaAgenda
1 increase balance
arbitrary2 decrease balance arbitrary
3 increase balance
arbitrary
4 print balance
CashFlow Example
Monday, 2 September 13
Timers
Monday, 2 September 13
Timers
Monday, 2 September 13
CEP
Monday, 2 September 13
Graphical Metaphores
Monday, 2 September 13
Graphical Metaphores• Decision Tables• Guided Editors• Rule Templates
• Guided Editor + Decision Table• Score Cards• Decision Trees
• We don’t do these yet
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Guided Editors
Monday, 2 September 13
Rule Templates
Monday, 2 September 13
Rule Templates
Monday, 2 September 13
Decision Table Wizards
Monday, 2 September 13
Score Cards• a) Setup Parameters• b) Characteristic Section
Monday, 2 September 13
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
Monday, 2 September 13
Scenarios
Monday, 2 September 13
Decision Trees
Monday, 2 September 13
Decision Tables
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
Decision Table
Monday, 2 September 13
WorkbenchOpenShift Ready
Monday, 2 September 13
5.x Critique
Monday, 2 September 13
5.x CritiqueUI
• GWT• but not easily extended• fixed layouts• no perspectives
Monday, 2 September 13
5.x CritiqueUI
• GWT• but not easily extended• fixed layouts• no perspectives
JCR• Performance Issues• Everything stored as blob• No tagging, branching etc.• Webdav• Limited team providers
Monday, 2 September 13
5.x CritiqueUI
• GWT• but not easily extended• fixed layouts• no perspectives
JCR• Performance Issues• Everything stored as blob• No tagging, branching etc.• Webdav• Limited team providers
Deployment• Binary blobs, on url
Monday, 2 September 13
5.x CritiqueContent• Single tree structure (packages)• Packages created project deployment units
• no real alignment with industry stadard• No easy rule use (only a single global area)• Loading “model” jars into packages
• Poor hack, for dependency management
Monday, 2 September 13
5.x CritiqueDeployment
•Simple Snapshot system
•No real methodology
•Doesn’t align with any industry standards
Monday, 2 September 13
UF UberFire
Monday, 2 September 13
Requirements• Modular design
• Plugins• Common Life cycles• Compile time composition of plugins, via maven
• Menus• contextual to perspective and focus panel• Visibility Security
• Toolbars• contextual to perspective and focus panel• Visibility Security
• Twitter Bootstrap UI• Flexible layouts• Perspectives
Monday, 2 September 13
Requirements• Security
• Authorization, Authentication• Seamless API for client and server
• MetaData• Everything is a file, DB just for fast searching
• GIT Backend• High Availability
• GIT Cluster• Apache Helix
• Maven integration for “projects”
Monday, 2 September 13
UberFire Architecture Overview
Monday, 2 September 13
KIE - Knowledge Is Everything
Monday, 2 September 13
KIE - Knowledge Is Everything
Monday, 2 September 13
KIE - Knowledge Is Everything
Monday, 2 September 13
Workbench Screens
Monday, 2 September 13
Workbench Screens• Workbench Screen
• DIV• Lifecycle events
• OnStartUp, OnShutDown• OnOpen, OnMayClose, OnClose• OnFocus, OnLostFocus
Monday, 2 September 13
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!"; }
}
Monday, 2 September 13
Workbench Editor
Monday, 2 September 13
Workbench Editor• Workbench Screen
• DIV• Lifecycle events
• OnStartUp, OnShutDown• OnOpen, OnMayClose, OnClose• OnFocus, OnLostFocus• IsDirty, OnSave
Monday, 2 September 13
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(); }}
Monday, 2 September 13
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(); }}
Monday, 2 September 13
Workbench Perspective
Monday, 2 September 13
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 () { }});
Monday, 2 September 13
Simple POM Editor
Monday, 2 September 13
Build and Deploy
Monday, 2 September 13
Local Maven Repository and Manager
Monday, 2 September 13
Create or Clone Git Repos
Monday, 2 September 13
Legacy Systems and Migration• Legacy API Adapter JAR• Most API’s should work with legacy adapter• KnowledegAgents have not been ported,
PKG’s are not longer the unit of deployment
• JCR Migration Tool• Command Line Java code• Each Package maps to a GIT project
Monday, 2 September 13
BPM Integration
Monday, 2 September 13
Work - Task Lists
Monday, 2 September 13
Work - Task Lists
Monday, 2 September 13
Work - Task Lists
Monday, 2 September 13
Work - Task Lists
Monday, 2 September 13
Work - Task Lists
Monday, 2 September 13
Work - Task Lists
Monday, 2 September 13
BPMN Designer (JS)
Monday, 2 September 13
BRMS 6.0Simplified Utilization
Monday, 2 September 13
BRMS 5.0 Programmatic APIKnowledgeBuilder 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();
Monday, 2 September 13
Changes• Conventions:• droolsjbpm -> kie• knowlege -> kie
• Examples• KnowledgeBase -> Kie• StatefulKnowledgeSession -> KieSession• StatelessKnowledgeSession - StatelesKieSession
• Legacy API Adapter JAR• Most API’s should work with legacy adapter• KnowledegAgents have not been ported, PKG’s are not
longer the unit of deployment
Monday, 2 September 13
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
Monday, 2 September 13
Git Hub Examples• https://github.com/droolsjbpm/drools/tree/master/drools-
examples-api
Monday, 2 September 13
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();
Monday, 2 September 13
102
Monday, 2 September 13
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();
Monday, 2 September 13
104
Monday, 2 September 13
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();
Monday, 2 September 13
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");
Monday, 2 September 13
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();
Monday, 2 September 13
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 thisKieContainer 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();
Monday, 2 September 13
Dynamic KieModules
// create a new kjarInternalKieModule kJar2 = createKieJar(ks, releaseId, "rule2", "rule3");
// deploy it on mavenrepository.deployArtifact(releaseId, kJar2, kPom);
// since I am not calling start() on the scanner it means it won't have automatic scheduled scanningKieScanner scanner = ks.newKieScanner(kieContainer);
// scan the maven repo to get the new kjar version and deploy it on the kcontainerscanner.scanNow();
// create a ksesion and check it works as expectedKieSession ksession2 = kieContainer.newKieSession("KSession1");checkKSession(ksession2, "rule2", "rule3");
Monday, 2 September 13
kmodule.xml Editor
Monday, 2 September 13
Programmatic API• Builder API, for tooling integration• Incremental compilation, and problem
reportingKieServices 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();
Monday, 2 September 13
BRMS 6.0 CDI
Monday, 2 September 13
CDI Context and Dependency • CDI injects named entities from the
kmodule.xml
• Injectable types• KieServices• KieContainer• KieBase• KieSession• StatelessKieSession
Monday, 2 September 13
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;
@Injectprivate 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;
Monday, 2 September 13
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;
Monday, 2 September 13
BRMS 6.0 Spring and Camel
Monday, 2 September 13
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>
Monday, 2 September 13
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>
Monday, 2 September 13
BRMS 6.0R.I.P Rete
Monday, 2 September 13
R.I.P RETEinspirations:• 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
Monday, 2 September 13
Backward ChainingReactive Transitive
Closures
Monday, 2 September 13
Reasoning with GraphsHouse
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")
Monday, 2 September 13
123
Backward Chainingquery 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")
Monday, 2 September 13
Backward Chainingksession.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")
Monday, 2 September 13
Backward Chainingrule "go" salience 10when $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")
Monday, 2 September 13
Backward Chainingrule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end
rule "go" salience 10when $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")
Monday, 2 September 13
Backward Chainingrule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end
rule "go" salience 10when $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")
Monday, 2 September 13
Backward Chainingrule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end
rule "go" salience 10when $s : String( )then System.out.println( $s );end
ksession.insert( "go1" );ksession.fireAllRules();---go1office 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")
Monday, 2 September 13
Backward Chainingrule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end
rule "go" salience 10when $s : String( )then System.out.println( $s );end
ksession.insert( "go1" );ksession.fireAllRules();---go1office 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")
Monday, 2 September 13
Backward Chainingrule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end
rule "go" salience 10when $s : String( )then System.out.println( $s );end
ksession.insert( "go1" );ksession.fireAllRules();---go1office 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)
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")
isContainedIn(x==Office, y==House)
Monday, 2 September 13
Backward Chainingrule "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")
Monday, 2 September 13
Backward Chainingrule "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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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();---go2Draw 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")
Monday, 2 September 13
Backward Chainingrule "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")
Monday, 2 September 13
Backward Chainingrule "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")
Monday, 2 September 13
Backward Chainingrule "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")
Monday, 2 September 13
6.0 JTMS(exp)
Monday, 2 September 13
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
Monday, 2 September 13
148
JTMSCouples 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 ) );endrule "Issue Adult Bus Pass"when $p : Person( age >= 16 )then insert(new AdultBusPass( $p ) );end
Monday, 2 September 13
JTMS• Bad• Monolithic• Leaky• Brittle integrity - manual maintenance
Monday, 2 September 13
150
JTMS
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 ) )endrule "IsAdult"when $p : Person( age >= 16 )then logicalInsert( new IsAdult( $p ) )end
Monday, 2 September 13
151
JTMS
The truth maintenance cascades
rule "Issue Child Bus Pass"when $p : Person( ) IsChild( person =$p )then logicalInsert(new ChildBusPass( $p ) );endrule "Issue Adult Bus Pass"when $p : Person() IsAdult( person =$p )then logicalInsert(new AdultBusPass( $p ) );end
Monday, 2 September 13
152
JTMSrule "Issue Child Bus Pass"when $p : Person( ) not( ChildBusPass( person == $p ) )then requestChildBusPass( $p );end The truth maintenance cascades
Monday, 2 September 13
153
JTMS• Good• De-couple knowledge responsibilities• Encapsulate knowledge• Provide semantic abstractions for those encapsulation• Integrity robustness – truth maintenance
Monday, 2 September 13
JTMS
IsChild
ChildBusPas
Rule : isChildRule
Rule : IssueBusPas
+
+
Monday, 2 September 13
JTMSrule "Do not issue to banned people"when $p : Person( ) Banned( person =$p )then logicalInsert(new ChildBusPass( $p ) , “neg” );end
Monday, 2 September 13
JTMS
IsChild
ChildBusPas
Rule : isChildRule
Rule : IssueBusPas
+
+
Rule : Do Not Issue to Banned People
-
Monday, 2 September 13
6.0 Defeasible(exp)
Monday, 2 September 13
Defeasiblerule "All Birds Fly"when $b : Bird( )then logicalInsert(new Fly( $b ) );endrule "Brocken wing"when $b : Bird( ) BrockenWing($b;)then logicalInsert(new Fly( $b ), “neg” );end
Monday, 2 September 13
Defeasiblerule "All Birds Fly" @Defeasible
when
$b : Bird( )then
logicalInsert(new Fly( $b ) );
end
rule "Brocken wing" @Defeasible
@Defeaterwhen
$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
Monday, 2 September 13
160
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?
Monday, 2 September 13