Как сравнить объект ArrayList (класс Java) в JESS?

Это мой основной метод.

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)");

}

Я хотел бы проверить пиццу, которая содержит название топпинга "T2" в списке pizzaToppingList или нет. Правило показано ниже

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

Но это не работает, потому что в JESS значением слота pizzaToppingList является ArrayList(объект java). Это означает, что слот pizzaToppingList не является значением Lists в JESS.

Как я решаю эту проблему? поблагодарить!

1 ответ

Решение

Ну, вам придется вызывать метод собственного класса Java ArrayList. Простой способ заключается в использовании test CE:

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

То, что вы пробовали, не может работать, так как вы используете одну и ту же переменную привязки ?t2 для списка и для того, что может быть одним из его элементов.

Другие вопросы по тегам