2013-07-24 33 views
1

我是jess规则中的一个begginer所以我不明白我可以如何使用它。我读了很多教程,但我很困惑。我怎么能在java中制定一个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; 
       } 

我怎么能与杰西规则做呢? 我想做一个杰西规则谁接受日期,比较它们,并让我回到在Java变量VAR。你能让我成为一个简单的例子来理解它吗?

+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."); 
    } 

正如我所说的,这ISN非常适合,因为结果代码比原来的代码更大更复杂。在使用规则引擎的情况下,如果你有多个交互规则,这样的Jess程序没有比这更多的开销,所以相当快地开始看起来像是等同于Java代码的简化。祝Jess好运!

+0

Jess看起来很难理解。您能否让我知道我们如何执行添加程序(如(+ 2 3))? – 2015-04-07 05:56:43

+0

不知道我明白了; (+ 2 3)已经是一个完整且有效的程序,它会添加2和3并返回5。 –