📄 fibonaccinative.java
字号:
recurseRule.setSalience( 10 ); // <parameter identifier="f"> // <class>org.drools.examples.fibonacci.Fibonacci</class> // </parameter> final Declaration fDeclarationRecurse = recurseRule.addParameterDeclaration( "f", fibonacciType ); // <java:condition>f.getValue() == -1</java:condition> final Condition conditionRecurse = new Condition( ) { public boolean isAllowed(Tuple tuple) { Fibonacci f = ( Fibonacci ) tuple.get( fDeclarationRecurse ); return f.getValue( ) == -1; } public Declaration[] getRequiredTupleMembers() { return new Declaration[]{fDeclarationRecurse}; } public String toString() { return "f.getValue() == -1"; } }; recurseRule.addCondition( conditionRecurse ); // <java:consequence> // System.err.println( "recurse for " + f.getSequence() ); // drools.assertObject( new Fibonacci( f.getSequence() - 1 ) ); // </java:consequence> final Consequence recurseConsequence = new Consequence( ) { public void invoke(Tuple tuple, WorkingMemory workingMemory) throws ConsequenceException { Fibonacci f = ( Fibonacci ) tuple.get( fDeclarationRecurse ); System.err.println( "recurse for " + f.getSequence( ) ); try { workingMemory.assertObject( new Fibonacci( f.getSequence() - 1 ) ); } catch ( FactException e ) { throw new ConsequenceException( e ); } } }; recurseRule.setConsequence( recurseConsequence ); ruleSet.addRule( recurseRule ); // <rule name="Calculate"> final Rule calculateRule = new Rule( "Calculate" ); // <parameter identifier="f1"> // <class>org.drools.examples.fibonacci.Fibonacci</class> // </parameter> final Declaration f1Declaration = calculateRule.addParameterDeclaration( "f1", fibonacciType ); // <parameter identifier="f2"> // <class>org.drools.examples.fibonacci.Fibonacci</class> // </parameter> final Declaration f2Declaration = calculateRule.addParameterDeclaration( "f2", fibonacciType ); // <parameter identifier="f3"> // <class>org.drools.examples.fibonacci.Fibonacci</class> // </parameter> final Declaration f3Declaration = calculateRule.addParameterDeclaration( "f3", fibonacciType ); // <java:condition>f2.getSequence() == // (f1.getSequence()+1)</java:condition> final Condition conditionCalculateA = new Condition( ) { public boolean isAllowed(Tuple tuple) { Fibonacci f1 = ( Fibonacci ) tuple.get( f1Declaration ); Fibonacci f2 = ( Fibonacci ) tuple.get( f2Declaration ); return f2.getSequence( ) == f1.getSequence( ) + 1; } public Declaration[] getRequiredTupleMembers() { return new Declaration[]{f1Declaration, f2Declaration}; } public String toString() { return "f2.getSequence() == (f1.getSequence()+1)"; } }; calculateRule.addCondition( conditionCalculateA ); // <java:condition>f3.getSequence() == // (f2.getSequence()+1)</java:condition> final Condition conditionCalculateB = new Condition( ) { public boolean isAllowed(Tuple tuple) { Fibonacci f2 = ( Fibonacci ) tuple.get( f2Declaration ); Fibonacci f3 = ( Fibonacci ) tuple.get( f3Declaration ); return f3.getSequence( ) == f2.getSequence( ) + 1; } public Declaration[] getRequiredTupleMembers() { return new Declaration[]{f2Declaration, f3Declaration}; } public String toString() { return "f3.getSequence() == (f2.getSequence()+1)"; } }; calculateRule.addCondition( conditionCalculateB ); // <java:condition>f1.getValue() != -1</java:condition> final Condition conditionCalculateC = new Condition( ) { public boolean isAllowed(Tuple tuple) { Fibonacci f1 = ( Fibonacci ) tuple.get( f1Declaration ); return f1.getValue( ) != -1; } public Declaration[] getRequiredTupleMembers() { return new Declaration[]{f1Declaration}; } public String toString() { return "f1.getValue() != -1"; } }; calculateRule.addCondition( conditionCalculateC ); // <java:condition>f2.getValue() != -1</java:condition> final Condition conditionCalculateD = new Condition( ) { public boolean isAllowed(Tuple tuple) { Fibonacci f2 = ( Fibonacci ) tuple.get( f2Declaration ); return f2.getValue( ) != -1; } public Declaration[] getRequiredTupleMembers() { return new Declaration[]{f2Declaration}; } public String toString() { return "f2.getValue() != -1"; } }; calculateRule.addCondition( conditionCalculateD ); // <java:condition>f3.getValue() == -1</java:condition> final Condition conditionCalculateE = new Condition( ) { public boolean isAllowed(Tuple tuple) { Fibonacci f3 = ( Fibonacci ) tuple.get( f3Declaration ); return f3.getValue( ) == -1; } public Declaration[] getRequiredTupleMembers() { return new Declaration[]{f3Declaration}; } public String toString() { return "f3.getValue() == -1"; } }; calculateRule.addCondition( conditionCalculateE ); // <java:consequence> // f3.setValue( f1.getValue() + f2.getValue() ); // System.err.println( f3.getSequence() + " == " + f3.getValue() ); // drools.modifyObject( f3 ); // drools.retractObject( f1 ); // </java:consequence> final Consequence calculateConsequence = new Consequence( ) { public void invoke(Tuple tuple, WorkingMemory workingMemory) throws ConsequenceException { Fibonacci f1 = ( Fibonacci ) tuple.get( f1Declaration ); Fibonacci f2 = ( Fibonacci ) tuple.get( f2Declaration ); Fibonacci f3 = ( Fibonacci ) tuple.get( f3Declaration ); f3.setValue( f1.getValue( ) + f2.getValue( ) ); System.err.println( f3.getSequence( ) + " == " + f3.getValue( ) ); try { workingMemory.modifyObject( tuple.getFactHandleForObject( f3 ), f3 ); workingMemory.retractObject( tuple.getFactHandleForObject( f1 ) ); } catch ( FactException e ) { throw new ConsequenceException( e ); } } }; calculateRule.setConsequence( calculateConsequence ); ruleSet.addRule( calculateRule ); // Build the RuleSet. RuleBaseBuilder builder = new RuleBaseBuilder( ); builder.addRuleSet( ruleSet ); RuleBase ruleBase = builder.build( ); WorkingMemory workingMemory = ruleBase.newWorkingMemory( ); System.out.println( "DUMP RETE" ); System.out.println( "---------" ); Dumper dumper = new Dumper( ruleBase ); dumper.dumpRete( System.err ); System.out.println( "DUMP RETE DOT" ); System.out.println( "---------" ); dumper.dumpReteToDot( System.err ); // Assert the facts, and fire the rules. Fibonacci fibonacci = new Fibonacci( 50 ); long start = System.currentTimeMillis( ); workingMemory.assertObject( fibonacci ); workingMemory.fireAllRules( ); long stop = System.currentTimeMillis( ); System.err.println( "fibonacci(" + fibonacci.getSequence( ) + ") == " + fibonacci.getValue( ) + " took " + ( stop - start ) + "ms" ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -