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でトッピング名が「T2」であるピザをチェックしたいのですが、以下にルールを示します。

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

しかし、JESS では、pizzaToppingList のスロット値は ArrayList(Java オブジェクト) であるため、機能しません。これは、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リストとその要素の1つに同じバインディング変数を使用しているため、試したことは機能しません。

于 2014-11-07T16:41:11.620 に答える