Drools规则引擎初体验

[转载声明] 转载时必须标注:本文来源于铁木箱子的博客http:// www.mzone.cc
[本文地址] 本文永久地址是: 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代码,如下:


     
     
  1. package test.cc.mzone.drools ;
  2.  
  3. import java.util.Iterator ;
  4.  
  5. import org.drools.KnowledgeBase ;
  6. import org.drools.KnowledgeBaseFactory ;
  7. import org.drools.builder.KnowledgeBuilder ;
  8. import org.drools.builder.KnowledgeBuilderError ;
  9. import org.drools.builder.KnowledgeBuilderFactory ;
  10. import org.drools.builder.ResourceType ;
  11. import org.drools.io.ResourceFactory ;
  12. import org.drools.runtime.StatefulKnowledgeSession ;
  13.  
  14. /**
  15.  * Drools规则引擎测试。
  16.  *
  17.  * @author Eric
  18.  *
  19.  */
  20. public class DroolsTester {
  21.  
  22. public static class User {
  23. private int money ; // 手中的钱
  24. private int kp ; // 空瓶数
  25. private int totals ; // 喝掉的瓶数
  26.  
  27. public int getMoney ( ) {
  28. return money ;
  29. }
  30.  
  31. public User setMoney ( int money ) {
  32. this. money = money ;
  33. return this ;
  34. }
  35.  
  36. public int getKp ( ) {
  37. return kp ;
  38. }
  39.  
  40. public void setKp ( int kp ) {
  41. this. kp = kp ;
  42. }
  43.  
  44. public int getTotals ( ) {
  45. return totals ;
  46. }
  47.  
  48. public void setTotals ( int totals ) {
  49. this. totals = totals ;
  50. }
  51.  
  52. }
  53.  
  54. public static void main ( String [ ] args ) throws Exception {
  55. KnowledgeBuilder kbuilder = KnowledgeBuilderFactory. newKnowledgeBuilder ( ) ;
  56. kbuilder. add (ResourceFactory. newClassPathResource ( "drools/a.drl" ), ResourceType. DRL ) ;
  57. if (kbuilder. hasErrors ( ) ) {
  58. System. out. println ( "规则错误:" ) ;
  59. Iterator <KnowledgeBuilderError > it = kbuilder. getErrors ( ). iterator ( ) ;
  60. while (it. hasNext ( ) ) System. out. println (it. next ( ) ) ;
  61. return ;
  62. }
  63. KnowledgeBase kb = KnowledgeBaseFactory. newKnowledgeBase ( ) ;
  64. kb. addKnowledgePackages (kbuilder. getKnowledgePackages ( ) ) ;
  65. StatefulKnowledgeSession s = kb. newStatefulKnowledgeSession ( ) ;
  66. s. insert ( new User ( ). setMoney ( 50 ) ) ;
  67. s. fireAllRules ( ) ;
  68. s. dispose ( ) ;
  69. }
  70.  
  71. }

      上述这段代码是标准的应用Drools引擎的步骤,不细说,核心的一行代码是:


     
     
  1. s. insert ( new User ( ). setMoney ( 50 ) ) ;
  2. s. fireAllRules ( ) ;

      通过insert方法设置初始数据,并通过后续的代码进行规制调用进行计算,对应的a.drl规制文件内容如下:

二、规则文件编写

      通过Drools的Eclipse插件可以很方便的编写规则文件,针对上述的解题的规则如下:


     
     
  1. //created on: 2012-7-5
  2. package cc.mzone
  3.  
  4. //list any import classes here.
  5. import test.cc.mzone.drools.DroolsTester.User ;
  6.  
  7.  
  8. //declare any global variables here
  9.  
  10.  
  11.  
  12. // 规则1,如果有钱就买一瓶喝掉
  13. rule "r001"
  14. salience 3
  15. when
  16. $u :User (money > 0 ) ;
  17. then
  18. System. out. println ( "余钱:" + $u. getMoney ( ) + ",花1元购买1瓶并喝掉" ) ;
  19. $u. setKp ($u. getKp ( ) + 1 ) ;
  20. $u. setMoney ($u. getMoney ( ) - 1 ) ;
  21. $u. setTotals ($u. getTotals ( ) + 1 ) ;
  22. update ($u ) ;
  23. end
  24.  
  25. // 规则2,如果空瓶数大于2则换购1瓶(兑换成1元钱)
  26. rule "r002"
  27. salience 2
  28. when
  29. $u :User (kp >= 2 ) ;
  30. then
  31. System. out. println ( "空瓶数:" + $u. getKp ( ) + ",兑换2个空瓶为1元钱" ) ;
  32. $u. setKp ($u. getKp ( ) - 2 ) ;
  33. $u. setMoney ($u. getMoney ( ) + 1 ) ;
  34. update ($u ) ;
  35. end
  36.  
  37. // 规则3,打印已经喝掉的数量
  38. rule "r003"
  39. salience 1
  40. when
  41. $u :User ( ) ;
  42. then
  43. System. out. println ( "总喝掉瓶数:" + $u. getTotals ( ) ) ;
  44. end

      我们在规则文件中定义了3个规则,分别是:r001、r002、r003,每个规则对应一条路径。每个规则中指定了salience属性,该属性的值越大表示执行的优先级就越高,越先被执行。我们这个文件中定义的规则就是:只要有钱就先购买饮料,没钱了再用空瓶兑换1元钱,执行第一部分的Java代码后输出信息如下:


     
     
  1. 余钱: 50,花 1元购买 1瓶并喝掉
  2. 余钱: 49,花 1元购买 1瓶并喝掉
  3. 余钱: 48,花 1元购买 1瓶并喝掉
  4. 余钱: 47,花 1元购买 1瓶并喝掉
  5. 余钱: 46,花 1元购买 1瓶并喝掉
  6. 余钱: 45,花 1元购买 1瓶并喝掉
  7. 余钱: 44,花 1元购买 1瓶并喝掉
  8. 余钱: 43,花 1元购买 1瓶并喝掉
  9. 余钱: 42,花 1元购买 1瓶并喝掉
  10. 余钱: 41,花 1元购买 1瓶并喝掉
  11. 余钱: 40,花 1元购买 1瓶并喝掉
  12. 余钱: 39,花 1元购买 1瓶并喝掉
  13. 余钱: 38,花 1元购买 1瓶并喝掉
  14. 余钱: 37,花 1元购买 1瓶并喝掉
  15. 余钱: 36,花 1元购买 1瓶并喝掉
  16. 余钱: 35,花 1元购买 1瓶并喝掉
  17. 余钱: 34,花 1元购买 1瓶并喝掉
  18. 余钱: 33,花 1元购买 1瓶并喝掉
  19. 余钱: 32,花 1元购买 1瓶并喝掉
  20. 余钱: 31,花 1元购买 1瓶并喝掉
  21. 余钱: 30,花 1元购买 1瓶并喝掉
  22. 余钱: 29,花 1元购买 1瓶并喝掉
  23. 余钱: 28,花 1元购买 1瓶并喝掉
  24. 余钱: 27,花 1元购买 1瓶并喝掉
  25. 余钱: 26,花 1元购买 1瓶并喝掉
  26. 余钱: 25,花 1元购买 1瓶并喝掉
  27. 余钱: 24,花 1元购买 1瓶并喝掉
  28. 余钱: 23,花 1元购买 1瓶并喝掉
  29. 余钱: 22,花 1元购买 1瓶并喝掉
  30. 余钱: 21,花 1元购买 1瓶并喝掉
  31. 余钱: 20,花 1元购买 1瓶并喝掉
  32. 余钱: 19,花 1元购买 1瓶并喝掉
  33. 余钱: 18,花 1元购买 1瓶并喝掉
  34. 余钱: 17,花 1元购买 1瓶并喝掉
  35. 余钱: 16,花 1元购买 1瓶并喝掉
  36. 余钱: 15,花 1元购买 1瓶并喝掉
  37. 余钱: 14,花 1元购买 1瓶并喝掉
  38. 余钱: 13,花 1元购买 1瓶并喝掉
  39. 余钱: 12,花 1元购买 1瓶并喝掉
  40. 余钱: 11,花 1元购买 1瓶并喝掉
  41. 余钱: 10,花 1元购买 1瓶并喝掉
  42. 余钱: 9,花 1元购买 1瓶并喝掉
  43. 余钱: 8,花 1元购买 1瓶并喝掉
  44. 余钱: 7,花 1元购买 1瓶并喝掉
  45. 余钱: 6,花 1元购买 1瓶并喝掉
  46. 余钱: 5,花 1元购买 1瓶并喝掉
  47. 余钱: 4,花 1元购买 1瓶并喝掉
  48. 余钱: 3,花 1元购买 1瓶并喝掉
  49. 余钱: 2,花 1元购买 1瓶并喝掉
  50. 余钱: 1,花 1元购买 1瓶并喝掉
  51. 空瓶数: 50,兑换 2个空瓶为 1元钱
  52. 余钱: 1,花 1元购买 1瓶并喝掉
  53. 空瓶数: 49,兑换 2个空瓶为 1元钱
  54. 余钱: 1,花 1元购买 1瓶并喝掉
  55. 空瓶数: 48,兑换 2个空瓶为 1元钱
  56. 余钱: 1,花 1元购买 1瓶并喝掉
  57. 空瓶数: 47,兑换 2个空瓶为 1元钱
  58. 余钱: 1,花 1元购买 1瓶并喝掉
  59. 空瓶数: 46,兑换 2个空瓶为 1元钱
  60. 余钱: 1,花 1元购买 1瓶并喝掉
  61. 空瓶数: 45,兑换 2个空瓶为 1元钱
  62. 余钱: 1,花 1元购买 1瓶并喝掉
  63. 空瓶数: 44,兑换 2个空瓶为 1元钱
  64. 余钱: 1,花 1元购买 1瓶并喝掉
  65. 空瓶数: 43,兑换 2个空瓶为 1元钱
  66. 余钱: 1,花 1元购买 1瓶并喝掉
  67. 空瓶数: 42,兑换 2个空瓶为 1元钱
  68. 余钱: 1,花 1元购买 1瓶并喝掉
  69. 空瓶数: 41,兑换 2个空瓶为 1元钱
  70. 余钱: 1,花 1元购买 1瓶并喝掉
  71. 空瓶数: 40,兑换 2个空瓶为 1元钱
  72. 余钱: 1,花 1元购买 1瓶并喝掉
  73. 空瓶数: 39,兑换 2个空瓶为 1元钱
  74. 余钱: 1,花 1元购买 1瓶并喝掉
  75. 空瓶数: 38,兑换 2个空瓶为 1元钱
  76. 余钱: 1,花 1元购买 1瓶并喝掉
  77. 空瓶数: 37,兑换 2个空瓶为 1元钱
  78. 余钱: 1,花 1元购买 1瓶并喝掉
  79. 空瓶数: 36,兑换 2个空瓶为 1元钱
  80. 余钱: 1,花 1元购买 1瓶并喝掉
  81. 空瓶数: 35,兑换 2个空瓶为 1元钱
  82. 余钱: 1,花 1元购买 1瓶并喝掉
  83. 空瓶数: 34,兑换 2个空瓶为 1元钱
  84. 余钱: 1,花 1元购买 1瓶并喝掉
  85. 空瓶数: 33,兑换 2个空瓶为 1元钱
  86. 余钱: 1,花 1元购买 1瓶并喝掉
  87. 空瓶数: 32,兑换 2个空瓶为 1元钱
  88. 余钱: 1,花 1元购买 1瓶并喝掉
  89. 空瓶数: 31,兑换 2个空瓶为 1元钱
  90. 余钱: 1,花 1元购买 1瓶并喝掉
  91. 空瓶数: 30,兑换 2个空瓶为 1元钱
  92. 余钱: 1,花 1元购买 1瓶并喝掉
  93. 空瓶数: 29,兑换 2个空瓶为 1元钱
  94. 余钱: 1,花 1元购买 1瓶并喝掉
  95. 空瓶数: 28,兑换 2个空瓶为 1元钱
  96. 余钱: 1,花 1元购买 1瓶并喝掉
  97. 空瓶数: 27,兑换 2个空瓶为 1元钱
  98. 余钱: 1,花 1元购买 1瓶并喝掉
  99. 空瓶数: 26,兑换 2个空瓶为 1元钱
  100. 余钱: 1,花 1元购买 1瓶并喝掉
  101. 空瓶数: 25,兑换 2个空瓶为 1元钱
  102. 余钱: 1,花 1元购买 1瓶并喝掉
  103. 空瓶数: 24,兑换 2个空瓶为 1元钱
  104. 余钱: 1,花 1元购买 1瓶并喝掉
  105. 空瓶数: 23,兑换 2个空瓶为 1元钱
  106. 余钱: 1,花 1元购买 1瓶并喝掉
  107. 空瓶数: 22,兑换 2个空瓶为 1元钱
  108. 余钱: 1,花 1元购买 1瓶并喝掉
  109. 空瓶数: 21,兑换 2个空瓶为 1元钱
  110. 余钱: 1,花 1元购买 1瓶并喝掉
  111. 空瓶数: 20,兑换 2个空瓶为 1元钱
  112. 余钱: 1,花 1元购买 1瓶并喝掉
  113. 空瓶数: 19,兑换 2个空瓶为 1元钱
  114. 余钱: 1,花 1元购买 1瓶并喝掉
  115. 空瓶数: 18,兑换 2个空瓶为 1元钱
  116. 余钱: 1,花 1元购买 1瓶并喝掉
  117. 空瓶数: 17,兑换 2个空瓶为 1元钱
  118. 余钱: 1,花 1元购买 1瓶并喝掉
  119. 空瓶数: 16,兑换 2个空瓶为 1元钱
  120. 余钱: 1,花 1元购买 1瓶并喝掉
  121. 空瓶数: 15,兑换 2个空瓶为 1元钱
  122. 余钱: 1,花 1元购买 1瓶并喝掉
  123. 空瓶数: 14,兑换 2个空瓶为 1元钱
  124. 余钱: 1,花 1元购买 1瓶并喝掉
  125. 空瓶数: 13,兑换 2个空瓶为 1元钱
  126. 余钱: 1,花 1元购买 1瓶并喝掉
  127. 空瓶数: 12,兑换 2个空瓶为 1元钱
  128. 余钱: 1,花 1元购买 1瓶并喝掉
  129. 空瓶数: 11,兑换 2个空瓶为 1元钱
  130. 余钱: 1,花 1元购买 1瓶并喝掉
  131. 空瓶数: 10,兑换 2个空瓶为 1元钱
  132. 余钱: 1,花 1元购买 1瓶并喝掉
  133. 空瓶数: 9,兑换 2个空瓶为 1元钱
  134. 余钱: 1,花 1元购买 1瓶并喝掉
  135. 空瓶数: 8,兑换 2个空瓶为 1元钱
  136. 余钱: 1,花 1元购买 1瓶并喝掉
  137. 空瓶数: 7,兑换 2个空瓶为 1元钱
  138. 余钱: 1,花 1元购买 1瓶并喝掉
  139. 空瓶数: 6,兑换 2个空瓶为 1元钱
  140. 余钱: 1,花 1元购买 1瓶并喝掉
  141. 空瓶数: 5,兑换 2个空瓶为 1元钱
  142. 余钱: 1,花 1元购买 1瓶并喝掉
  143. 空瓶数: 4,兑换 2个空瓶为 1元钱
  144. 余钱: 1,花 1元购买 1瓶并喝掉
  145. 空瓶数: 3,兑换 2个空瓶为 1元钱
  146. 余钱: 1,花 1元购买 1瓶并喝掉
  147. 空瓶数: 2,兑换 2个空瓶为 1元钱
  148. 余钱: 1,花 1元购买 1瓶并喝掉
  149. 总喝掉瓶数: 99

      根据输出信息,符合我们的预期,确实是只要有钱就购买。如果换一种策略,只要有2个空瓶了就兑换先,那么可以将规则1和规则2的salience属性值对调,这样规则2就会优先执行,执行效果如下:


     
     
  1. 余钱: 50,花 1元购买 1瓶并喝掉
  2. 余钱: 49,花 1元购买 1瓶并喝掉
  3. 空瓶数: 2,兑换 2个空瓶为 1元钱
  4. 余钱: 49,花 1元购买 1瓶并喝掉
  5. 余钱: 48,花 1元购买 1瓶并喝掉
  6. 空瓶数: 2,兑换 2个空瓶为 1元钱
  7. 余钱: 48,花 1元购买 1瓶并喝掉
  8. 余钱: 47,花 1元购买 1瓶并喝掉
  9. 空瓶数: 2,兑换 2个空瓶为 1元钱
  10. 余钱: 47,花 1元购买 1瓶并喝掉
  11. 余钱: 46,花 1元购买 1瓶并喝掉
  12. 空瓶数: 2,兑换 2个空瓶为 1元钱
  13. 余钱: 46,花 1元购买 1瓶并喝掉
  14. 余钱: 45,花 1元购买 1瓶并喝掉
  15. 空瓶数: 2,兑换 2个空瓶为 1元钱
  16. 余钱: 45,花 1元购买 1瓶并喝掉
  17. 余钱: 44,花 1元购买 1瓶并喝掉
  18. 空瓶数: 2,兑换 2个空瓶为 1元钱
  19. 余钱: 44,花 1元购买 1瓶并喝掉
  20. 余钱: 43,花 1元购买 1瓶并喝掉
  21. 空瓶数: 2,兑换 2个空瓶为 1元钱
  22. 余钱: 43,花 1元购买 1瓶并喝掉
  23. 余钱: 42,花 1元购买 1瓶并喝掉
  24. 空瓶数: 2,兑换 2个空瓶为 1元钱
  25. 余钱: 42,花 1元购买 1瓶并喝掉
  26. 余钱: 41,花 1元购买 1瓶并喝掉
  27. 空瓶数: 2,兑换 2个空瓶为 1元钱
  28. 余钱: 41,花 1元购买 1瓶并喝掉
  29. 余钱: 40,花 1元购买 1瓶并喝掉
  30. 空瓶数: 2,兑换 2个空瓶为 1元钱
  31. 余钱: 40,花 1元购买 1瓶并喝掉
  32. 余钱: 39,花 1元购买 1瓶并喝掉
  33. 空瓶数: 2,兑换 2个空瓶为 1元钱
  34. 余钱: 39,花 1元购买 1瓶并喝掉
  35. 余钱: 38,花 1元购买 1瓶并喝掉
  36. 空瓶数: 2,兑换 2个空瓶为 1元钱
  37. 余钱: 38,花 1元购买 1瓶并喝掉
  38. 余钱: 37,花 1元购买 1瓶并喝掉
  39. 空瓶数: 2,兑换 2个空瓶为 1元钱
  40. 余钱: 37,花 1元购买 1瓶并喝掉
  41. 余钱: 36,花 1元购买 1瓶并喝掉
  42. 空瓶数: 2,兑换 2个空瓶为 1元钱
  43. 余钱: 36,花 1元购买 1瓶并喝掉
  44. 余钱: 35,花 1元购买 1瓶并喝掉
  45. 空瓶数: 2,兑换 2个空瓶为 1元钱
  46. 余钱: 35,花 1元购买 1瓶并喝掉
  47. 余钱: 34,花 1元购买 1瓶并喝掉
  48. 空瓶数: 2,兑换 2个空瓶为 1元钱
  49. 余钱: 34,花 1元购买 1瓶并喝掉
  50. 余钱: 33,花 1元购买 1瓶并喝掉
  51. 空瓶数: 2,兑换 2个空瓶为 1元钱
  52. 余钱: 33,花 1元购买 1瓶并喝掉
  53. 余钱: 32,花 1元购买 1瓶并喝掉
  54. 空瓶数: 2,兑换 2个空瓶为 1元钱
  55. 余钱: 32,花 1元购买 1瓶并喝掉
  56. 余钱: 31,花 1元购买 1瓶并喝掉
  57. 空瓶数: 2,兑换 2个空瓶为 1元钱
  58. 余钱: 31,花 1元购买 1瓶并喝掉
  59. 余钱: 30,花 1元购买 1瓶并喝掉
  60. 空瓶数: 2,兑换 2个空瓶为 1元钱
  61. 余钱: 30,花 1元购买 1瓶并喝掉
  62. 余钱: 29,花 1元购买 1瓶并喝掉
  63. 空瓶数: 2,兑换 2个空瓶为 1元钱
  64. 余钱: 29,花 1元购买 1瓶并喝掉
  65. 余钱: 28,花 1元购买 1瓶并喝掉
  66. 空瓶数: 2,兑换 2个空瓶为 1元钱
  67. 余钱: 28,花 1元购买 1瓶并喝掉
  68. 余钱: 27,花 1元购买 1瓶并喝掉
  69. 空瓶数: 2,兑换 2个空瓶为 1元钱
  70. 余钱: 27,花 1元购买 1瓶并喝掉
  71. 余钱: 26,花 1元购买 1瓶并喝掉
  72. 空瓶数: 2,兑换 2个空瓶为 1元钱
  73. 余钱: 26,花 1元购买 1瓶并喝掉
  74. 余钱: 25,花 1元购买 1瓶并喝掉
  75. 空瓶数: 2,兑换 2个空瓶为 1元钱
  76. 余钱: 25,花 1元购买 1瓶并喝掉
  77. 余钱: 24,花 1元购买 1瓶并喝掉
  78. 空瓶数: 2,兑换 2个空瓶为 1元钱
  79. 余钱: 24,花 1元购买 1瓶并喝掉
  80. 余钱: 23,花 1元购买 1瓶并喝掉
  81. 空瓶数: 2,兑换 2个空瓶为 1元钱
  82. 余钱: 23,花 1元购买 1瓶并喝掉
  83. 余钱: 22,花 1元购买 1瓶并喝掉
  84. 空瓶数: 2,兑换 2个空瓶为 1元钱
  85. 余钱: 22,花 1元购买 1瓶并喝掉
  86. 余钱: 21,花 1元购买 1瓶并喝掉
  87. 空瓶数: 2,兑换 2个空瓶为 1元钱
  88. 余钱: 21,花 1元购买 1瓶并喝掉
  89. 余钱: 20,花 1元购买 1瓶并喝掉
  90. 空瓶数: 2,兑换 2个空瓶为 1元钱
  91. 余钱: 20,花 1元购买 1瓶并喝掉
  92. 余钱: 19,花 1元购买 1瓶并喝掉
  93. 空瓶数: 2,兑换 2个空瓶为 1元钱
  94. 余钱: 19,花 1元购买 1瓶并喝掉
  95. 余钱: 18,花 1元购买 1瓶并喝掉
  96. 空瓶数: 2,兑换 2个空瓶为 1元钱
  97. 余钱: 18,花 1元购买 1瓶并喝掉
  98. 余钱: 17,花 1元购买 1瓶并喝掉
  99. 空瓶数: 2,兑换 2个空瓶为 1元钱
  100. 余钱: 17,花 1元购买 1瓶并喝掉
  101. 余钱: 16,花 1元购买 1瓶并喝掉
  102. 空瓶数: 2,兑换 2个空瓶为 1元钱
  103. 余钱: 16,花 1元购买 1瓶并喝掉
  104. 余钱: 15,花 1元购买 1瓶并喝掉
  105. 空瓶数: 2,兑换 2个空瓶为 1元钱
  106. 余钱: 15,花 1元购买 1瓶并喝掉
  107. 余钱: 14,花 1元购买 1瓶并喝掉
  108. 空瓶数: 2,兑换 2个空瓶为 1元钱
  109. 余钱: 14,花 1元购买 1瓶并喝掉
  110. 余钱: 13,花 1元购买 1瓶并喝掉
  111. 空瓶数: 2,兑换 2个空瓶为 1元钱
  112. 余钱: 13,花 1元购买 1瓶并喝掉
  113. 余钱: 12,花 1元购买 1瓶并喝掉
  114. 空瓶数: 2,兑换 2个空瓶为 1元钱
  115. 余钱: 12,花 1元购买 1瓶并喝掉
  116. 余钱: 11,花 1元购买 1瓶并喝掉
  117. 空瓶数: 2,兑换 2个空瓶为 1元钱
  118. 余钱: 11,花 1元购买 1瓶并喝掉
  119. 余钱: 10,花 1元购买 1瓶并喝掉
  120. 空瓶数: 2,兑换 2个空瓶为 1元钱
  121. 余钱: 10,花 1元购买 1瓶并喝掉
  122. 余钱: 9,花 1元购买 1瓶并喝掉
  123. 空瓶数: 2,兑换 2个空瓶为 1元钱
  124. 余钱: 9,花 1元购买 1瓶并喝掉
  125. 余钱: 8,花 1元购买 1瓶并喝掉
  126. 空瓶数: 2,兑换 2个空瓶为 1元钱
  127. 余钱: 8,花 1元购买 1瓶并喝掉
  128. 余钱: 7,花 1元购买 1瓶并喝掉
  129. 空瓶数: 2,兑换 2个空瓶为 1元钱
  130. 余钱: 7,花 1元购买 1瓶并喝掉
  131. 余钱: 6,花 1元购买 1瓶并喝掉
  132. 空瓶数: 2,兑换 2个空瓶为 1元钱
  133. 余钱: 6,花 1元购买 1瓶并喝掉
  134. 余钱: 5,花 1元购买 1瓶并喝掉
  135. 空瓶数: 2,兑换 2个空瓶为 1元钱
  136. 余钱: 5,花 1元购买 1瓶并喝掉
  137. 余钱: 4,花 1元购买 1瓶并喝掉
  138. 空瓶数: 2,兑换 2个空瓶为 1元钱
  139. 余钱: 4,花 1元购买 1瓶并喝掉
  140. 余钱: 3,花 1元购买 1瓶并喝掉
  141. 空瓶数: 2,兑换 2个空瓶为 1元钱
  142. 余钱: 3,花 1元购买 1瓶并喝掉
  143. 余钱: 2,花 1元购买 1瓶并喝掉
  144. 空瓶数: 2,兑换 2个空瓶为 1元钱
  145. 余钱: 2,花 1元购买 1瓶并喝掉
  146. 余钱: 1,花 1元购买 1瓶并喝掉
  147. 空瓶数: 2,兑换 2个空瓶为 1元钱
  148. 余钱: 1,花 1元购买 1瓶并喝掉
  149. 总喝掉瓶数: 99

      可见输出信息不一样了,也非常符合我们的预期。由此可见,不同的规则分析可以导致不同的执行路径,但最终效果都一样,很好的推理出了我们想要的结果。通过Drools规则推理引擎还可以解决很多类似的问题。

      后续将继续研究并和大家分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值