Date post: | 05-Dec-2014 |
Category: |
Technology |
Upload: | mark-proctor |
View: | 1,444 times |
Download: | 1 times |
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