Как сравнить объект 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.

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


person newnok6    schedule 07.11.2014    source источник


Ответы (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 для списка и для того, что может быть одним из его элементов.

person laune    schedule 07.11.2014
comment
Я привязался к вашему ответу, но программа показывает ошибку, подобную этому неправильному имени слота в токене?ptList - person newnok6; 09.11.2014
comment
Спасибо ! Я работаю прямо сейчас, я меняю с (eval (?ptList содержит ?t2)) на (test (?ptList содержит ?t2)) - person newnok6; 09.11.2014
comment
Извините - это должен быть тест (eval из другой системы). Я отредактировал свой ответ. - person laune; 09.11.2014