﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-花落成泥-随笔分类-规则引擎</title><link>http://www.blogjava.net/hlcn/category/49512.html</link><description>学习是进步的源泉</description><language>zh-cn</language><lastBuildDate>Fri, 02 Sep 2011 07:21:51 GMT</lastBuildDate><pubDate>Fri, 02 Sep 2011 07:21:51 GMT</pubDate><ttl>60</ttl><item><title>一个小学题目的解: 采用规则引擎Drools实现</title><link>http://www.blogjava.net/hlcn/archive/2011/09/02/357821.html</link><dc:creator>WYH-THINK</dc:creator><author>WYH-THINK</author><pubDate>Fri, 02 Sep 2011 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/hlcn/archive/2011/09/02/357821.html</guid><wfw:comment>http://www.blogjava.net/hlcn/comments/357821.html</wfw:comment><comments>http://www.blogjava.net/hlcn/archive/2011/09/02/357821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hlcn/comments/commentRss/357821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hlcn/services/trackbacks/357821.html</trackback:ping><description><![CDATA[
转自<a href="http://www.iteye.com/topic/257039">http://www.iteye.com/topic/257039</a><br /><br /><p>同学帮他侄儿问我一个问题：<br />资源：<br />1、小明的钱可以购买50瓶汽水。<br />2、老板搞促销，两个空汽水瓶子可以换一瓶汽水。<br /><br />问：小明最多能喝多少瓶汽水？<br /><br />开始还楞了一下， 现在的小学题目还真不简单。不过马上给出答案：<br />先是50瓶，然后用50个空瓶换来25瓶，喝完后用25个空瓶换12瓶再多个空瓶，<br />喝完后用13个空瓶换6瓶，然后是7个空瓶换3瓶，然后是4个空瓶换2瓶，<br />然后是2个空瓶换1瓶，最后问老板借1个空瓶，再用2个空瓶换1瓶，<br />剩下来那个空瓶还给老板。所以喝到50+25+12+6+3+2+1+1=100<br /><br />不过最近在学习规则引擎， 于是就想到了怎么用规则引擎来实现。<br />我的想法是：<br />1: 假设汽水一元一瓶， 则小明最初有50元。<br />2: 如果兜里有超过一元钱， 则买一瓶汽水喝， 此时： <br />钱减少一元，同时拥有的空瓶增加一个。<br />3: 如果拥有至少两个空瓶， 则两个空瓶卖给老板， 兜里的钱加一。<br />根据如上想法， 有了如下规则引擎的实现的实现(Drool)：<br /><br />java文件SodaWater.java：</p><div class="dp-highlighter"><div class="bar"><div class="tools">Java代码 <a title="复制代码" href="http://www.iteye.com/topic/257039#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img style="display: none;" class="spinner" alt="" src="http://www.iteye.com/images/spinner.gif" /></a></div></div><ol class="dp-j"><li><span class="keyword">package</span><span> org.drools.examples;&nbsp; </span></li><li><span>&nbsp; </span></li><li><span class="keyword">import</span><span> java.io.InputStreamReader;&nbsp; </span></li><li><span class="keyword">import</span><span> java.io.Reader;&nbsp; </span></li><li><span>&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.FactHandle;&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.RuleBase;&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.RuleBaseFactory;&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.StatefulSession;&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.WorkingMemory;&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.compiler.PackageBuilder;&nbsp; </span></li><li><span class="keyword">import</span><span> org.drools.rule.Package;&nbsp; </span></li><li><span>&nbsp; </span></li><li><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> SodaWater&nbsp; </span></li><li><span>{&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">void</span><span> main(String[] args) </span><span class="keyword">throws</span><span> Exception {&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">final</span><span> PackageBuilder builder = </span><span class="keyword">new</span><span> PackageBuilder();&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.addPackageFromDrl( <span class="keyword">new</span><span> InputStreamReader( SodaWater.</span><span class="keyword">class</span><span>.getResourceAsStream( </span><span class="string">"SodaWater.drl"</span><span> ) ) );&nbsp; </span></span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">final</span><span> RuleBase ruleBase = RuleBaseFactory.newRuleBase();&nbsp; </span></span></li><li><span>        ruleBase.addPackage( builder.getPackage() );  </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">final</span><span> StatefulSession session = ruleBase.newStatefulSession();&nbsp; </span></span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer customer = <span class="keyword">new</span><span> Customer( </span><span class="string">"XiaoMing"</span><span>, </span><span class="number">50</span><span>);&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.insert(customer);&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.fireAllRules();&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">class</span><span> Customer&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">private</span><span> String name;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> money;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> drinkSum;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> blankCup;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> Customer(String name, </span><span class="keyword">int</span><span> money)&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.name = name;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.money = money;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.drinkSum = </span><span class="number">0</span><span>;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.blankCup = </span><span class="number">0</span><span>;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getMoney()&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">return</span><span> money;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setMoney(</span><span class="keyword">int</span><span> money)&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.money = money;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getBlankCup()&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">return</span><span> blankCup;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setBlankCup(</span><span class="keyword">int</span><span> blankCup)&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.blankCup = blankCup;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getDrinkSum()&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">return</span><span> drinkSum;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setDrinkSum(</span><span class="keyword">int</span><span> drinkSum)&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.drinkSum = drinkSum;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> String getName()&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">return</span><span> name;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name)&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">this</span><span>.name = name;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; }&nbsp; </span></li><li><span>}&nbsp; </span></li></ol></div><pre style="display: none;" class="java" title="一个小学题目的解: 采用规则引擎Drools实现" name="code" codeable_type="Post" codeable_id="708001" source_url="http://www.iteye.com/topic/257039#708001" pre_index="0">package org.drools.examples;

import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.FactHandle;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.WorkingMemory;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;

public class SodaWater
{
    public static final void main(String[] args) throws Exception {
        final PackageBuilder builder = new PackageBuilder();
        builder.addPackageFromDrl( new InputStreamReader( SodaWater.class.getResourceAsStream( "SodaWater.drl" ) ) );

        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage( builder.getPackage() );

        final StatefulSession session = ruleBase.newStatefulSession();

        Customer customer = new Customer( "XiaoMing", 50);
        session.insert(customer);
        session.fireAllRules();
    }
   
    public static class Customer
    {
        private String name;
       
        private int money;
       
        private int drinkSum;
       
        private int blankCup;
       
        public Customer(String name, int money)
        {
            this.name = name;
            this.money = money;
            this.drinkSum = 0;
            this.blankCup = 0;
        }       

        public int getMoney()
        {
            return money;
        }
       
        public void setMoney(int money)
        {
            this.money = money;
        }
       
        public int getBlankCup()
        {
            return blankCup;
        }

        public void setBlankCup(int blankCup)
        {
            this.blankCup = blankCup;
        }

        public int getDrinkSum()
        {
            return drinkSum;
        }

        public void setDrinkSum(int drinkSum)
        {
            this.drinkSum = drinkSum;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }      
       
    }
}</pre> <p><br /><br />rule文件：</p><div class="dp-highlighter"><div class="bar"><div class="tools">Sql代码 <a title="复制代码" href="http://www.iteye.com/topic/257039#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img style="display: none;" class="spinner" alt="" src="http://www.iteye.com/images/spinner.gif" /></a></div></div><ol class="dp-sql"><li><span>package org.drools.examples&nbsp; </span></li><li><span>&nbsp; </span></li><li><span>dialect <span class="string">"mvel"</span><span>&nbsp; </span></span></li><li><span>&nbsp; </span></li><li><span>import org.drools.examples.SodaWater.Customer&nbsp; </span></li><li><span>&nbsp;&nbsp; </span></li><li><span>&nbsp; </span></li><li><span class="keyword">rule</span><span> </span><span class="string">"buy a soda water and drink"</span><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">when</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c : Customer(money &gt; 0, $m:money, $b:blankCup, $d:drinkSum)&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">then</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c.money = $m - 1;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c.blankCup = $b + 1;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c.drinkSum = $d + 1;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<span class="keyword">out</span><span>.println( </span><span class="string">"Customer "</span><span> + $c.</span><span class="keyword">name</span><span> + </span><span class="string">" now buy a soda water and drink: money="</span><span> + $c.money + </span><span class="string">" and blankCup="</span><span> + $c.blankCup);&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">update</span><span>($c);&nbsp; </span></span></li><li><span class="keyword">end</span><span>&nbsp; </span></li><li><span>&nbsp; </span></li><li><span class="keyword">rule</span><span> </span><span class="string">"sale blank cup and get money"</span><span>&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">when</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c : Customer(blankCup &gt; 1, $b:blankCup, $m:money )&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">then</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c.blankCup = $b - 2;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c.money = $m + 1;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<span class="keyword">out</span><span>.println(</span><span class="string">"Customer "</span><span> + $c.</span><span class="keyword">name</span><span> + </span><span class="string">" now sale 2 cups and get money: money="</span><span> + $c.money + </span><span class="string">", blankCup="</span><span> + $c.blankCup);&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">update</span><span>($c);&nbsp; </span></span></li><li><span class="keyword">end</span><span>&nbsp; </span></li><li><span>&nbsp; </span></li><li><span class="keyword">rule</span><span> </span><span class="string">"finish drink"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">no</span><span>-loop </span><span class="keyword">true</span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp; dialect <span class="string">"java"</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">when</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c : Customer(blankCup &lt; 2, money == 0)&nbsp; </span></li><li><span>&nbsp;&nbsp;&nbsp; <span class="keyword">then</span><span>&nbsp; </span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<span class="keyword">out</span><span>.println( </span><span class="string">"Customer "</span><span> + $c.getName() + </span><span class="string">" finished drink, and drink number is "</span><span> + $c.getDrinkSum() + </span><span class="string">" blankCup="</span><span> + $c.getBlankCup());&nbsp; </span></span></li><li><span class="keyword">end</span><span>&nbsp; </span></li></ol></div><pre style="display: none;" class="sql" title="一个小学题目的解: 采用规则引擎Drools实现" name="code" codeable_type="Post" codeable_id="708001" source_url="http://www.iteye.com/topic/257039#708001" pre_index="1">package org.drools.examples

dialect "mvel"

import org.drools.examples.SodaWater.Customer
 

rule "buy a soda water and drink"
    when
        $c : Customer(money &gt; 0, $m:money, $b:blankCup, $d:drinkSum)
    then
        $c.money = $m - 1;
        $c.blankCup = $b + 1;
        $c.drinkSum = $d + 1;
        System.out.println( "Customer " + $c.name + " now buy a soda water and drink: money=" + $c.money + " and blankCup=" + $c.blankCup);
        update($c);
end

rule "sale blank cup and get money"
    when
        $c : Customer(blankCup &gt; 1, $b:blankCup, $m:money )
    then
        $c.blankCup = $b - 2;
        $c.money = $m + 1;
        System.out.println("Customer " + $c.name + " now sale 2 cups and get money: money=" + $c.money + ", blankCup=" + $c.blankCup);
        update($c);
end

rule "finish drink"           
    no-loop true   
    dialect "java"
    when
        $c : Customer(blankCup &lt; 2, money == 0)
    then
        System.out.println( "Customer " + $c.getName() + " finished drink, and drink number is " + $c.getDrinkSum() + " blankCup=" + $c.getBlankCup());
end</pre> <p><br /><br />运行结果如下：<br />Customer XiaoMing now buy a soda water and drink: money=49 and blankCup=1<br />Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=2<br />Customer XiaoMing now sale 2 cups and get money: money=49, blankCup=0<br />Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=1<br />Customer XiaoMing now buy a soda water and drink: money=47 and blankCup=2<br /><br />...<br /><br />Customer XiaoMing now buy a soda water and drink: money=1 and blankCup=1<br />Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=2<br />Customer XiaoMing now sale 2 cups and get money: money=1, blankCup=0<br />Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=1<br />Customer XiaoMing finished drink, and drink number is 99 blankCup=1<br /><br />不过小明最后手上还有最后一个瓶子， 计算机只能到此了。<br />向老板借一个瓶子换一瓶汽水，喝完在还一个空瓶子，估计就是人类智慧来。</p><p> </p><p>此程序需要drools的jar包，具体可见：</p><p>http://lcllcl987.iteye.com/blog/254381</p><p><br />看看大家还有什么好的算法。</p><br /> 
<img src ="http://www.blogjava.net/hlcn/aggbug/357821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hlcn/" target="_blank">WYH-THINK</a> 2011-09-02 14:39 <a href="http://www.blogjava.net/hlcn/archive/2011/09/02/357821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>