8. Rete
• Dr. Charles L. Forgy , 1974
• Data struture
– List of elements
– Tree-Strutured Sorting Network
• Algorithm
– Rule Compilation
– Runtime Execution
14. JESS
• A Rule Engine
• A scripting environment in Java
JESS Java
• Rete algorithm
• LISP-like syntax
• Can be licensed for commercial use, no
cost for academic use
18. Define Advices
(defadvice before + (bind $?argv ( create$
$?argv 1 )))
(printout t (+ 2 3) crlf)
(undefadvice +)
(printout t (+2 3) crlf)
19. Define Template
(deftemplate automobile
"A specific car."
(slot make)
(slot model)
(slot year (type INTEGER))
(slot color (default white)))
(assert (automobile (model CAMERY) (make TOYOTA) (year 2008)))
(assert (automobile (model 520i) (make BMW) (year 2013)))
(facts)
20. Define class
(import domain.Account)
(deftemplate Account (declare (from-class Account)))
(bind ?a (new Account))
(add ?a)
(facts)
(modify 0 (id 1) (name jini))
(facts)
(bind ?a (new Account))
(add ?a)
(?a setId 2) (?a setName steven)
(printout t (?a getId) "-" (?a getName) "." crlf)
(facts)
(update ?a)
(facts)
21. Define rule
(deftemplate person (slot name) (slot age))
(defrule vote "Can you vote"
(person {age < 18})
=>
(printout t "No, you can't vote" crlf)
)
(assert (person (age 17)))
(run)
22. Use Java
(bind ?map (new java.util.HashMap))
(call ?map put "A" "Apple")
(call ?map put "B" "Banana")
(call ?map put "C" "Cherry")
(printout t (call ?map get "B"))
31. Chinese ?!
cnature.dsl
[condition][]姓名是 {name}=$person : Person(name=='{name}')
[consequence][]打招呼=System.out.println("Hello
"+$person.getName());
cnature.dslr
expander cnature.dsl
rule "Nature language"
when
姓名是 gary
then
打招呼
end
32. JSR 94
public class DroolsRule {
private static final String RULE_SERVICE_PROVIDER
=“http://drools.org/”;
public void run(){
Class.forName(“org.drools.jsr94.rules.RuleServiceProviderImpl
”);
RuleServiceProvider serviceProvider =
RuleServiceProviderManager
.getRuleRuleServiceProvider(RULE_SERVICE_PROVIDER );
}
}
34. JSR-223 support
• JSR-223
– javax.script
• The scripting API consists of interfaces and
classes that define Java Scripting Engines and
provides a framework for their use in Java
applications.
– since Java 1.6
• Before JSR-223
– Use BeanShell or etc..
– API not standard
37. Eval Script
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a Javascript engine
ScriptEngine engine = factory.getEngineByName(“JavaScript”);
// evaluate Javascript code from String
engine.eval(“print(‘Hello world’)”);
38. Eval File
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a Javascript engine
ScriptEngine engine = factory.getEngineByName(“JavaScript”);
// evaluate Javascript code from given file – specified by first argument
engine.eval( new java.io.FileReader(args[0]));
39. Eval Variable
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName(“JavaScript”);
File f = new File(“test.txt”);
// expose File object as variable to script
engine.put(“file”,f);
// evaluate a script string. The script accesses “file” variable and calls
method on it
engine.eval(“print(file.getAbsolutePath())”);
40. Eval Script Function
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName(“JavaScript”);
// Javascript code in a String
String script = “function hello(name) { print(‘Hello’+name); }”;
engine.eval(script);
// javax.script.Invocable is an optional interface. Check whether your
script engine implements or not! Note that the Javascript engine
implements Invocable interface.
Invocable inv = (Invocable) engine;
inv.invokeFunction(“hello”, “Scripting!!”);