[本文地址] 本文永久地址是: http://www.mzone.cc/article/669.html
最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎。兴趣之下,仔细了解了下Drools,Drools作为JBoss出品的一款开源推理和规则引擎,被广泛的应用在各个领域,如JBPM也是基于Drools的。一般我们使用规则引擎的前提和场景是:业务规则频繁变化!如果业务规则稳定则无需应用规则引擎的,实际中诸如移动通信商、银行等领域则广泛的使用了规则引擎,主要是为了适应频繁变更的规则,但又不需要影响业务逻辑代码。
在看了官方的一些文档介绍后,通过一个例子体验了下Drools,例子说明如下:
1、小明手上有50元钱;
2、1元钱可以买一瓶饮料;
3、2个空瓶可以兑换一瓶饮料;
4、问题是:最终小明可以喝多少瓶饮料;
通过Drools的规则推理引擎可以很好的解决这类问题,至于搭建Drools的开发环境就不细说了。直接上代码说明:
一、编写Java代码,如下:
-
package
test.cc.mzone.drools
;
-
-
import
java.util.Iterator
;
-
-
import
org.drools.KnowledgeBase
;
-
import
org.drools.KnowledgeBaseFactory
;
-
import
org.drools.builder.KnowledgeBuilder
;
-
import
org.drools.builder.KnowledgeBuilderError
;
-
import
org.drools.builder.KnowledgeBuilderFactory
;
-
import
org.drools.builder.ResourceType
;
-
import
org.drools.io.ResourceFactory
;
-
import
org.drools.runtime.StatefulKnowledgeSession
;
-
-
/**
-
* Drools规则引擎测试。
-
*
-
* @author Eric
-
*
-
*/
-
public
class DroolsTester
{
-
-
public
static
class User
{
-
private
int money
; // 手中的钱
-
private
int kp
; // 空瓶数
-
private
int totals
; // 喝掉的瓶数
-
-
public
int getMoney
(
)
{
-
return money
;
-
}
-
-
public User setMoney
(
int money
)
{
-
this.
money
= money
;
-
return
this
;
-
}
-
-
public
int getKp
(
)
{
-
return kp
;
-
}
-
-
public
void setKp
(
int kp
)
{
-
this.
kp
= kp
;
-
}
-
-
public
int getTotals
(
)
{
-
return totals
;
-
}
-
-
public
void setTotals
(
int totals
)
{
-
this.
totals
= totals
;
-
}
-
-
}
-
-
public
static
void main
(
String
[
] args
)
throws
Exception
{
-
KnowledgeBuilder kbuilder
= KnowledgeBuilderFactory.
newKnowledgeBuilder
(
)
;
-
kbuilder.
add
(ResourceFactory.
newClassPathResource
(
"drools/a.drl"
), ResourceType.
DRL
)
;
-
if
(kbuilder.
hasErrors
(
)
)
{
-
System.
out.
println
(
"规则错误:"
)
;
-
Iterator
<KnowledgeBuilderError
> it
= kbuilder.
getErrors
(
).
iterator
(
)
;
-
while
(it.
hasNext
(
)
)
System.
out.
println
(it.
next
(
)
)
;
-
return
;
-
}
-
KnowledgeBase kb
= KnowledgeBaseFactory.
newKnowledgeBase
(
)
;
-
kb.
addKnowledgePackages
(kbuilder.
getKnowledgePackages
(
)
)
;
-
StatefulKnowledgeSession s
= kb.
newStatefulKnowledgeSession
(
)
;
-
s.
insert
(
new User
(
).
setMoney
(
50
)
)
;
-
s.
fireAllRules
(
)
;
-
s.
dispose
(
)
;
-
}
-
-
}
上述这段代码是标准的应用Drools引擎的步骤,不细说,核心的一行代码是:
-
s.
insert
(
new User
(
).
setMoney
(
50
)
)
;
-
s.
fireAllRules
(
)
;
通过insert方法设置初始数据,并通过后续的代码进行规制调用进行计算,对应的a.drl规制文件内容如下:
二、规则文件编写
通过Drools的Eclipse插件可以很方便的编写规则文件,针对上述的解题的规则如下:
-
//created on: 2012-7-5
-
package
cc.mzone
-
-
//list any import classes here.
-
import
test.cc.mzone.drools.DroolsTester.User
;
-
-
-
//declare any global variables here
-
-
-
-
// 规则1,如果有钱就买一瓶喝掉
-
rule
"r001"
-
salience
3
-
when
-
$u
:User
(money
>
0
)
;
-
then
-
System.
out.
println
(
"余钱:"
+ $u.
getMoney
(
)
+
",花1元购买1瓶并喝掉"
)
;
-
$u.
setKp
($u.
getKp
(
)
+
1
)
;
-
$u.
setMoney
($u.
getMoney
(
)
-
1
)
;
-
$u.
setTotals
($u.
getTotals
(
)
+
1
)
;
-
update
($u
)
;
-
end
-
-
// 规则2,如果空瓶数大于2则换购1瓶(兑换成1元钱)
-
rule
"r002"
-
salience
2
-
when
-
$u
:User
(kp
>=
2
)
;
-
then
-
System.
out.
println
(
"空瓶数:"
+ $u.
getKp
(
)
+
",兑换2个空瓶为1元钱"
)
;
-
$u.
setKp
($u.
getKp
(
)
-
2
)
;
-
$u.
setMoney
($u.
getMoney
(
)
+
1
)
;
-
update
($u
)
;
-
end
-
-
// 规则3,打印已经喝掉的数量
-
rule
"r003"
-
salience
1
-
when
-
$u
:User
(
)
;
-
then
-
System.
out.
println
(
"总喝掉瓶数:"
+ $u.
getTotals
(
)
)
;
-
end
我们在规则文件中定义了3个规则,分别是:r001、r002、r003,每个规则对应一条路径。每个规则中指定了salience属性,该属性的值越大表示执行的优先级就越高,越先被执行。我们这个文件中定义的规则就是:只要有钱就先购买饮料,没钱了再用空瓶兑换1元钱,执行第一部分的Java代码后输出信息如下:
-
余钱:
50,花
1元购买
1瓶并喝掉
-
余钱:
49,花
1元购买
1瓶并喝掉
-
余钱:
48,花
1元购买
1瓶并喝掉
-
余钱:
47,花
1元购买
1瓶并喝掉
-
余钱:
46,花
1元购买
1瓶并喝掉
-
余钱:
45,花
1元购买
1瓶并喝掉
-
余钱:
44,花
1元购买
1瓶并喝掉
-
余钱:
43,花
1元购买
1瓶并喝掉
-
余钱:
42,花
1元购买
1瓶并喝掉
-
余钱:
41,花
1元购买
1瓶并喝掉
-
余钱:
40,花
1元购买
1瓶并喝掉
-
余钱:
39,花
1元购买
1瓶并喝掉
-
余钱:
38,花
1元购买
1瓶并喝掉
-
余钱:
37,花
1元购买
1瓶并喝掉
-
余钱:
36,花
1元购买
1瓶并喝掉
-
余钱:
35,花
1元购买
1瓶并喝掉
-
余钱:
34,花
1元购买
1瓶并喝掉
-
余钱:
33,花
1元购买
1瓶并喝掉
-
余钱:
32,花
1元购买
1瓶并喝掉
-
余钱:
31,花
1元购买
1瓶并喝掉
-
余钱:
30,花
1元购买
1瓶并喝掉
-
余钱:
29,花
1元购买
1瓶并喝掉
-
余钱:
28,花
1元购买
1瓶并喝掉
-
余钱:
27,花
1元购买
1瓶并喝掉
-
余钱:
26,花
1元购买
1瓶并喝掉
-
余钱:
25,花
1元购买
1瓶并喝掉
-
余钱:
24,花
1元购买
1瓶并喝掉
-
余钱:
23,花
1元购买
1瓶并喝掉
-
余钱:
22,花
1元购买
1瓶并喝掉
-
余钱:
21,花
1元购买
1瓶并喝掉
-
余钱:
20,花
1元购买
1瓶并喝掉
-
余钱:
19,花
1元购买
1瓶并喝掉
-
余钱:
18,花
1元购买
1瓶并喝掉
-
余钱:
17,花
1元购买
1瓶并喝掉
-
余钱:
16,花
1元购买
1瓶并喝掉
-
余钱:
15,花
1元购买
1瓶并喝掉
-
余钱:
14,花
1元购买
1瓶并喝掉
-
余钱:
13,花
1元购买
1瓶并喝掉
-
余钱:
12,花
1元购买
1瓶并喝掉
-
余钱:
11,花
1元购买
1瓶并喝掉
-
余钱:
10,花
1元购买
1瓶并喝掉
-
余钱:
9,花
1元购买
1瓶并喝掉
-
余钱:
8,花
1元购买
1瓶并喝掉
-
余钱:
7,花
1元购买
1瓶并喝掉
-
余钱:
6,花
1元购买
1瓶并喝掉
-
余钱:
5,花
1元购买
1瓶并喝掉
-
余钱:
4,花
1元购买
1瓶并喝掉
-
余钱:
3,花
1元购买
1瓶并喝掉
-
余钱:
2,花
1元购买
1瓶并喝掉
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
50,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
49,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
48,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
47,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
46,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
45,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
44,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
43,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
42,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
41,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
40,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
39,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
38,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
37,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
36,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
35,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
34,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
33,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
32,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
31,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
30,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
29,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
28,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
27,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
26,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
25,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
24,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
23,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
22,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
21,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
20,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
19,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
18,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
17,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
16,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
15,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
14,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
13,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
12,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
11,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
10,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
9,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
8,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
7,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
6,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
5,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
4,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
3,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
总喝掉瓶数:
99
根据输出信息,符合我们的预期,确实是只要有钱就购买。如果换一种策略,只要有2个空瓶了就兑换先,那么可以将规则1和规则2的salience属性值对调,这样规则2就会优先执行,执行效果如下:
-
余钱:
50,花
1元购买
1瓶并喝掉
-
余钱:
49,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
49,花
1元购买
1瓶并喝掉
-
余钱:
48,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
48,花
1元购买
1瓶并喝掉
-
余钱:
47,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
47,花
1元购买
1瓶并喝掉
-
余钱:
46,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
46,花
1元购买
1瓶并喝掉
-
余钱:
45,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
45,花
1元购买
1瓶并喝掉
-
余钱:
44,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
44,花
1元购买
1瓶并喝掉
-
余钱:
43,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
43,花
1元购买
1瓶并喝掉
-
余钱:
42,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
42,花
1元购买
1瓶并喝掉
-
余钱:
41,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
41,花
1元购买
1瓶并喝掉
-
余钱:
40,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
40,花
1元购买
1瓶并喝掉
-
余钱:
39,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
39,花
1元购买
1瓶并喝掉
-
余钱:
38,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
38,花
1元购买
1瓶并喝掉
-
余钱:
37,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
37,花
1元购买
1瓶并喝掉
-
余钱:
36,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
36,花
1元购买
1瓶并喝掉
-
余钱:
35,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
35,花
1元购买
1瓶并喝掉
-
余钱:
34,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
34,花
1元购买
1瓶并喝掉
-
余钱:
33,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
33,花
1元购买
1瓶并喝掉
-
余钱:
32,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
32,花
1元购买
1瓶并喝掉
-
余钱:
31,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
31,花
1元购买
1瓶并喝掉
-
余钱:
30,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
30,花
1元购买
1瓶并喝掉
-
余钱:
29,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
29,花
1元购买
1瓶并喝掉
-
余钱:
28,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
28,花
1元购买
1瓶并喝掉
-
余钱:
27,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
27,花
1元购买
1瓶并喝掉
-
余钱:
26,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
26,花
1元购买
1瓶并喝掉
-
余钱:
25,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
25,花
1元购买
1瓶并喝掉
-
余钱:
24,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
24,花
1元购买
1瓶并喝掉
-
余钱:
23,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
23,花
1元购买
1瓶并喝掉
-
余钱:
22,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
22,花
1元购买
1瓶并喝掉
-
余钱:
21,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
21,花
1元购买
1瓶并喝掉
-
余钱:
20,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
20,花
1元购买
1瓶并喝掉
-
余钱:
19,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
19,花
1元购买
1瓶并喝掉
-
余钱:
18,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
18,花
1元购买
1瓶并喝掉
-
余钱:
17,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
17,花
1元购买
1瓶并喝掉
-
余钱:
16,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
16,花
1元购买
1瓶并喝掉
-
余钱:
15,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
15,花
1元购买
1瓶并喝掉
-
余钱:
14,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
14,花
1元购买
1瓶并喝掉
-
余钱:
13,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
13,花
1元购买
1瓶并喝掉
-
余钱:
12,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
12,花
1元购买
1瓶并喝掉
-
余钱:
11,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
11,花
1元购买
1瓶并喝掉
-
余钱:
10,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
10,花
1元购买
1瓶并喝掉
-
余钱:
9,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
9,花
1元购买
1瓶并喝掉
-
余钱:
8,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
8,花
1元购买
1瓶并喝掉
-
余钱:
7,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
7,花
1元购买
1瓶并喝掉
-
余钱:
6,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
6,花
1元购买
1瓶并喝掉
-
余钱:
5,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
5,花
1元购买
1瓶并喝掉
-
余钱:
4,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
4,花
1元购买
1瓶并喝掉
-
余钱:
3,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
3,花
1元购买
1瓶并喝掉
-
余钱:
2,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
2,花
1元购买
1瓶并喝掉
-
余钱:
1,花
1元购买
1瓶并喝掉
-
空瓶数:
2,兑换
2个空瓶为
1元钱
-
余钱:
1,花
1元购买
1瓶并喝掉
-
总喝掉瓶数:
99
可见输出信息不一样了,也非常符合我们的预期。由此可见,不同的规则分析可以导致不同的执行路径,但最终效果都一样,很好的推理出了我们想要的结果。通过Drools规则推理引擎还可以解决很多类似的问题。
后续将继续研究并和大家分享。