jess multislot值匹配忽略顺序

时间:2016-12-03 04:45:27

标签: jess

我正在尝试检查是否已存在相同的实例。

(defemplate justificand (slot consq) (multislot antes))
(assert (justificand (consq s) (antes p q r))) ;;; order p q r

(defrule test
   (exists (justificand (consq s) (antes q p r))) ;;; order q p r
    =>
   (printout t "matching success " crlf))

在我的情况下,我用(antes p q r)断言一个对齐,但p,q和r的顺序 并不重要。因此,即使用(antes q p r)进行测试,测试规则也需要成功。

但是,jess似乎考虑了用于匹配的多时隙值的顺序。

任何忽略多时隙值匹配顺序的方法?

由于

1 个答案:

答案 0 :(得分:0)

使用你的deftemplate和这个功能

(deffunction unleq (?l1 $?l2)
  (and (eq (length$ ?l1)(length$ $?l2))
       (eq (length$ ?l1)(length$ (intersection$ ?l1 $?l2)))))

并插入事实:

(deffacts f1
  (justificand (consq s1) (antes p q r))
  (justificand (consq s2) (antes r p q))
  (justificand (consq s3) (antes p q x))
  (justificand (consq s4) (antes p q))
  (justificand (consq s4) (antes r q q p p)))

此规则触发:

(defrule match
  (justificand (consq ?s) (antes $?pqr&:(unleq $?pqr p q r)))
=>
  (printout t "match for " ?s crlf))

match for s2
match for s1