0

ルール エンジン Jess で深刻な問題が発生しています。私が直面している問題は、Conditional Element Accumulate にあります。いくつかの基準に従って、作業記憶から単語のリストを作成するルールを作成しようとしていますが、リストのすべてのフェーズが表示されます-最初に空のリスト、次に1つの要素を持つリストが続きます-これは、同じルールを何度も実行することによって行われます。しかし、このルールが実行されている間、ワーキング メモリが変化しないことはわかっています。

また、不思議なことに、私は数時間前に同じルールを書きましたが、その結果、複数の要素を持つリストが 1 つしか得られませんでした。

私が間違っていることについて何か提案はありますか?

助けてください!コードは次のとおりです。

(defrule show-me
  (declare  (salience -11)
           (no-loop TRUE))
  ?my-list <- (accumulate (bind ?list (new java.util.ArrayList)) ;initializer
                          (?list add ?sWord) ; action 
                          ?list ;result
                          (ourObject (sourceWord ?sWord) ; CE
                                     {complementType == COMPLEMENTO-OGGETTO-PARTITIVO}))
=>
  (printout t "complementType" (?my-list toString) crlf))

そして、これは私が得ている結果です:

complementType[ un  ,  po  ,  di  ,  acqua  ,  tua  ]
complementType[ un  ,  po  ,  acqua  ,  tua  ]
complementType[ un  ,  acqua  ,  tua  ]
complementType[ acqua  ,  tua  ]
complementType[ acqua  ]
complementType[]

そして、私はこれだけが必要です:

complementType[ un  ,  po  ,  di  ,  acqua  ,  tua  ]

ps コードの表示で申し訳ありませんが、そのまま貼り付けることは許可されませんでした。

4

1 に答える 1

0

ほとんどの場合、エンジンの実行中に ourObject ファクトを挿入しています。1 つの方法は、(ブロックする) 1 つのスレッドで run を呼び出してから、別のスレッドにファクトを挿入することです。これにより、アクティベーションがすぐに作成され、競合の解決では古いアクティベーションよりも新しいアクティベーションが優先されるため、逆の順序で実行されます。

これら 2 つの挿入バリアントのいずれかを実行した場合。ルールは期待どおりに 1 回実行されます。

;;(deffacts facts
;;  (ourObject (sourceWord un)(type X))
;;  (ourObject (sourceWord po)(type X))
;;  (ourObject (sourceWord di)(type X))
;;  (ourObject (sourceWord acqua)(type X)))

(reset)

(assert (ourObject (sourceWord un)(type X)))
(assert (ourObject (sourceWord po)(type X)))
(assert (ourObject (sourceWord di)(type X)))
(assert (ourObject (sourceWord acqua)(type X)))

(run)
于 2014-08-27T18:31:49.733 に答える