有没有办法从逻辑上绑定来自两个不同多槽的值?

Is there a way to logically bind values from two different multislots?

我有 key:value 对,例如 Company:ABC、Role:Admin 等。我想编写一个通用规则,以便我可以使用这些对值搜索事实。现在,我下面的规则只是搜索事实中的值,但不能以将规则事实中的 company:ABC 与提供的事实中的 company:ABC 进行比较的方式进行绑定。

我有一些关于员工的(动态)事实如下:

Format: Employee
FormatData:
        [ Name: Bob,
    Role: Admin,
    Company: ABC]

还有一个事实(规则):(这里的规则是动态变化的。所以规则应该是非常通用的。)

Format: Rule
FormatData: 
    [ Format: Employee,
    Field: Company
    Value: ABC
    ]

我现在的代码:

(deftemplate rule
    (multislot fact1)
    (multislot fact2))

(deftemplate fact
    (slot name)
    (multislot field)
    (multislot value))

(defrule reasoning
    (rule (fact1 ?name1 ?field1 ?value1)
        (fact2 ?name2 ?field2 ?value2))
    (fact (name ?name1) (field $? ?field1 $?) (value $? ?value1 $?))
    (fact (name ?name2) (field $? ?field2 $?) (value $? ?value2 $?))
=>
    (assert (worked))

提供的事实:

(rule (fact1 'Employee' 'company' 'ABC')
    (fact2 'Event' 'Place' 'USA'))
(fact (name 'Employee') (field 'Name' 'Company' 'Role') (value 'Bob' 'ABC' 'Admin'))
(fact (name 'Event') (field 'Place') (value 'USA'))

预期输出:

(worked)

但是使用此规则和模板,即使员工姓名为 ABC 且公司为 bob 的事实也会被规则触发。 我希望 company:ABC 的规则实际上只与 company:ABC Employee 匹配。而且,我想要 规则是通用的,不限于员工、事件等。

使用 length$ 函数确保从多字段槽中检索的字段和值来自同一位置。

         CLIPS (6.31 4/1/19)
CLIPS> 
(deftemplate rule
   (multislot fact1)
   (multislot fact2))
CLIPS> 
(deftemplate fact
    (slot name)
    (multislot field)
    (multislot value))
CLIPS> 
(defrule reasoning
   (rule (fact1 ?name1 ?field1 ?value1)
         (fact2 ?name2 ?field2 ?value2))
   (fact (name ?name1) 
         (field $?f1 ?field1 $?) 
         (value $?v1&:(= (length$ ?f1) (length$ ?v1)) ?value1 $?))
   (fact (name ?name2) 
         (field $?f2 ?field2 $?) 
         (value $?v2&:(= (length$ ?f2) (length$ ?v2)) ?value2 $?))
   =>
   (assert (worked)))
CLIPS>     
(deffacts initial
   (rule (fact1 'Employee' 'Company' 'ABC')
         (fact2 'Event' 'Place' 'USA'))
   (fact (name 'Employee') (field 'Name' 'Company' 'Role') (value 'Bob' 'ABC' 'Admin'))
   (fact (name 'Event') (field 'Place') (value 'USA'))
   (fact (name 'Employee') (field 'Name' 'Company' 'Role') (value 'ABC' 'Bob' 'Admin')))
CLIPS> (reset)
CLIPS> (agenda)
0      reasoning: f-1,f-2,f-3
For a total of 1 activation.
CLIPS>