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

时间:2019-06-04 09:43:56

标签: clips

我有许多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和公司鲍勃的事实也会被触发。 我想要这样的规则:实际上,company:ABC的规则应该只与company:ABC匹配。而且,我想要 规则是通用的,不限于员工,事件等。

1 个答案:

答案 0 :(得分:0)

使用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>