У меня есть факты, такие как
(claim (name Employee) (field 'EmpName' 'Company') (value 'Bob' 'ABC'))
(claim (name Event) (field 'EventName' 'Company') (value 'Conference' 'ABC'))
(drule (id gen1)(name1 'Employee') (field1 'EmpName' 'Company') (value1 'Bob' 'ABC') (name2 'Event')
(field2 'EventName') (value2 'Conference'))
Я пробовал правило, такое как следующее.Но это не работает так, как задумано.
(defrule drule-rule
(drule
(id ?id))
(forall
(drule
(id ?id)
(name1 ?name1)
(field1 $?f11 ?field1 $?)
(value1 $?v11&:(= (length$ ?f11) (length$ ?v11)) ?value1 $?))
(name2 ?name2)
(field2 $?f22 ?field2 $?)
(value2 $?v22&:(= (length$ ?f22) (length$ ?v22)) ?value2 $?))
(claim
(name ?name1)
(field $?f1 ?field1 $?)
(value $?v1&:(= (length$ ?f1) (length$ ?v1)) ?value1 $?))
(claim (name ?name2)
(field $?f2 ?field2 $?)
(value $?v2&:(= (length$ ?f2) (length$ ?v2)) ?value2 $?)))
(forall
(claim
(field $?f3 ?field3 $?)
(value $?v4&:(= (length$ ?f3) (length$ ?v3)) ?value3 $?))
(claim
(field $?f4 ?field4 $?)
(value $?v4&:(= (length$ ?f4) (length$ ?v4)) ?value3 $?)))
=>
(assert (Action allowed)))
Я хочу, чтобы указанное выше правило проверяло каждое поле в claim
в первом forall
с другими сопоставленными утверждениями.Если то же имя поля найдено , то проверьте значение этого поля в других утверждениях.
Для приведенных выше фактов утверждение должно работать.В то время как для приведенного ниже утверждения должно произойти сбой, потому что поле Company
не совпадает с другим утверждением.
(claim (name Employee) (field 'EmpName' 'Company') (value 'Bob' 'xyz'))
(claim (name Event) (field 'EventName' 'Company') (value 'Conference' 'ABC'))
(drule (id gen1)(name1 'Employee') (field1 'EmpName' 'Company') (value1 'Bob' 'ABC') (name2 'Event')
(field2 'EventName') (value2 'Conference'))
Возможно ли это с одним правилом?Или любые другие альтернативы?
Спасибо.