这个问题并不适合Jess所写的(Java代码是简短而高效的),但我可以告诉你一个可以适应其他更复杂情况的解决方案。首先,你需要定义一个模板来保存Date
,int
对:
(deftemplate pair (slot date) (slot score))
然后,你可以创建一个使用模板的一些事实。这些都是有点相当于你date1
,date2
等,除非他们每个日期对应的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好运!
当人们回答你的问题时,你需要投票和/或接受答案,否则他们会停止回答你的问题...... –