我如何在java中制作一个jess规则

时间:2013-07-24 11:14:44

标签: java jess

我是jess规则的初学者,所以我无法理解如何使用它。我读了很多教程,但我很困惑。

所以我有这段代码:

Date choosendate = "2013-05-05";
Date date1 = "2013-05-10";
Date date2 = "2013-05-25";
Date date3 = "2013-05-05";
int var = 0;

    if (choosendate.compareTo(date1)==0)
                {
                    var = 1;
                }
                else if (choosendate.compareTo(date2)==0)
                {
                    var = 2;
                }
                else if (choosendate.compareTo(date3)==0)
                {
                    var = 3;
                }

我怎么能用jess规则做到这一点? 我想制定一个jess规则谁接受日期,比较它们并在java中给我回变量var。你能用一个简单的例子来理解它吗?

1 个答案:

答案 0 :(得分:1)

这个问题不适合Jess编写(Java代码简短而有效),但我可以向您展示一个可以适应其他更复杂情况的解决方案。首先,您需要定义一个模板来保存Dateint对:

(deftemplate pair (slot date) (slot score))

然后你可以使用模板创建一些事实。这些等同于您的date1date2等,除非它们将每个日期与相应的var值相关联:

(import java.util.Date)
(assert (pair (date (new Date 113 4 10)) (score 1)))
(assert (pair (date (new Date 113 4 25)) (score 2)))
(assert (pair (date (new Date 113 4 5))  (score 3)))

我们可以定义一个全局变量来保存最终的计算分数(使得从Java中获取更容易。)这相当于您的var变量:

(defglobal ?*var* = 0)

假设“选定日期”将在有序事实chosendate中,我们可以编写如下规则。它取代了您的if语句链,并将您选择的日期与工作记忆中的所有日期进行比较,直到找到匹配项,然后停止:

(defrule score-date
    (chosendate ?d)
    (pair (date ?d) (score ?s))
    =>
    (bind ?*var* ?s)
    (halt))

好了,现在,上面的所有代码都在一个名为dates.clp的文件中。以下Java代码将使用它(包含对Rete.watchAll()的调用,因此您可以看到一些有趣的跟踪输出;您将其留在实际程序中):

    import jess.*;
    // ...

    // Get Jess ready
    Rete engine = new Rete();
    engine.batch("dates.clp");
    engine.watchAll();

    // Plug in the "chosen date"
    Date chosenDate = new Date(113, 4, 5);
    Fact fact = new Fact("chosendate", engine);
    fact.setSlotValue("__data", new Value(new ValueVector().add(chosenDate), RU.LIST));
    engine.assertFact(fact);

    // Run the rule and report the result
    int count = engine.run();
    if (count > 0) {
        int score = engine.getGlobalContext().getVariable("*var*").intValue(null);
        System.out.println("Score = " + score);
    } else {
        System.out.println("No matching date found.");
    }

正如我所说,这不太适合,因为生成的代码比原始代码更大,更复杂。使用规则引擎有意义的是,如果您有多个交互规则;这样的Jess程序没有比这更多的开销,因此与同等的Java代码相比,相当快的开始看起来像一个简化。祝Jess好运!