0

这是我的主要方法。

public static void main(String[] args) throws JessException {
    Rete engine = new Rete();
    engine.batch("template.clp");

    PizzaBase pizzaBase = new PizzaBase();
    pizzaBase.setSize(9);

    PizzaTopping pizzaTopping = new PizzaTopping();
    pizzaTopping.setName("T1");

    PizzaTopping pizzaTopping2 = new PizzaTopping();
    pizzaTopping2.setName("T2");

    PizzaTopping pizzaTopping3 = new PizzaTopping();
    pizzaTopping3.setName("T3");

    List<PizzaTopping> pizzaToppingList = new ArrayList<PizzaTopping>();
    pizzaToppingList.add(pizzaTopping);
    pizzaToppingList.add(pizzaTopping2);
    pizzaToppingList.add(pizzaTopping3);

    Pizza pizza = new Pizza();
    pizza.setBase(pizzaBase);
    pizza.setPizzaToppingList(pizzaToppingList);

    engine.add(pizzaBase);
    engine.addAll(pizzaToppingList);
    engine.add(pizza);
    engine.eval("(facts)");
    engine.batch("rules.clp");
    engine.reset();
    engine.run();
    engine.eval("(facts)");

}

我想检查pizzaToppingList中包含topping name是否为“T2”的pizza。规则如下所示

(defrule rule1
    (Pizza (pizzaToppingList ?t2) (OBJECT ?a))
    (PizzaTopping (name "T2") (OBJECT ?t2))
     =>
    (printout t "fired")
)

但它不起作用,因为在 JESS 中,pizzaToppingList 的槽值是 ArrayList(java object)。这意味着 PizzaToppingList 槽不是 JESS 中的 Lists 值。

我如何解决这个问题?感谢!

4

1 回答 1

1

好吧,您必须调用 Java 自己的 ArrayList 类的方法。一个简单的方法是使用testCE:

(defrule rule1
  (Pizza (pizzaToppingList ?ptList) (OBJECT ?a))
  (PizzaTopping (name "T2") (OBJECT ?t2))
  (test  (?ptList contains ?t2) )
=>
  (printout t "fired")
)

您尝试过的方法行不通,因为您?t2对列表和可能是它的元素之一使用了相同的绑定变量。

于 2014-11-07T16:41:11.620 回答