【问题标题】:Is there a way to logically bind values from two different multislots?有没有办法从两个不同的多槽逻辑绑定值?
【发布时间】:2019-06-05 02:49:27
【问题描述】:

我有许多键:值对,例如 Company:ABC、Role:Admin 等。我想编写一个通用规则,以便可以使用这些对值搜索事实。目前,我下面的规则只是搜索事实中的值,但不能以这样的方式绑定来比较 company:ABC in rule fact 和 company:ABC in provided fact。

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

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 的事实也会触发该规则。 我希望这样的规则与公司:ABC 应该只匹配公司:ABC 实际上是员工。而且,我想要 规则是一般性的,不限于员工、事件等。

【问题讨论】:

    标签: clips


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2022-08-16
      • 2022-01-22
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      相关资源
      最近更新 更多