我可以在某种情况下绑定变量吗?



我有一个模板:

(deftemplate drule
         (slot name1)
         (slot id)
         (multislot field1)
             (multislot value1)
         (slot name2)
         (multislot field2)
         (multislot value2))
(deftemplate claim
         (slot name)
         (multislot field)
         (multislot value))

我可以有规则

  1. 检查name是否与Drule中的索赔相同。
  2. 检查索赔:字段是否具有值'empname',如果找到,则将其绑定到?名称。

目前我有以下内容:

(defrule drule
    (drule (id ?id)
        (name1 ?name1)
        (name2 ?name2))
    (claim  (name ?name1)
        (field $?pf1 'EmpName' $?)
        (value $?pv1&:(= (length$ ?pf1) (length$ ?pv1)) ?name $?))
    (claim  (name ?name2)
        (field $?pf2 'EmpName' $?)
        (value $?pv2&:(= (length$ ?pf2) (length$ ?pv2)) ?name $?))
     ...
=>
    (assert (success ?name))

但是,只有所有选定的索赔都有字段EmpName,它才会绑定。我只想检查那些名称的主张在Drule中提到。如果这些索赔中的任何一个具有" empname"字段,则应被绑定。如果不只是继续。我的如果某些claims根本没有EmpName字段,则规则会失败。假设是某些索赔将具有EmpName字段和价值。

所需的输入和输出:

(assert
   (claim (name 'Employee') 
          (field 'Company')
          (value 'ABC'))
   (claim (name 'Event')
          (field 'EmpName' 'EventName' 'Company')
          (value 'Bob' 'Conference' 'ABC'))
   (drule (id '001')
          (name1 'Employee')
          (field1 'Company')
          (value1 'ABC')
          (name2 'Event')
          (field2 'EventName')
          (value2 'Conference')))

输出:

(success 'Bob')

对不起,如果它非常愚蠢,我尝试在field上使用测试$和成员$。但无法弄清楚。我的空闲时间是自学剪辑。

CLIPS> 
(deftemplate drule
         (slot name1)
         (slot id)
         (multislot field1)
             (multislot value1)
         (slot name2)
         (multislot field2)
         (multislot value2))
CLIPS> 
(deftemplate claim
         (slot name)
         (multislot field)
         (multislot value))
CLIPS>          
(defrule drule
   (drule (id ?id)
          (name1 ?name1)
          (name2 ?name2))
   (claim (name ?name1))
   (claim (name ?name2))
   (claim (name ?name1 | ?name2)
          (field $?pf1 'EmpName' $?)
          (value $?pv1&:(= (length$ ?pf1) (length$ ?pv1)) ?name $?))
   =>
   (assert (success ?name)))
CLIPS>    
(deffacts initial
   (claim (name 'Employee') 
          (field 'Company')
          (value 'ABC'))
   (claim (name 'Event')
          (field 'EmpName' 'EventName' 'Company')
          (value 'Bob' 'Conference' 'ABC'))
   (drule (id '001')
          (name1 'Employee')
          (field1 'Company')
          (value1 'ABC')
          (name2 'Event')
          (field2 'EventName')
          (value2 'Conference')))
CLIPS> (reset)
CLIPS> (agenda)
0      drule: f-3,f-1,f-2,f-2
For a total of 1 activation.
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (claim (name 'Employee') (field 'Company') (value 'ABC'))
f-2     (claim (name 'Event') (field 'EmpName' 'EventName' 'Company') (value 'Bob' 'Conference' 'ABC'))
f-3     (drule (name1 'Employee') (id '001') (field1 'Company') (value1 'ABC') (name2 'Event') (field2 'EventName') (value2 'Conference'))
f-4     (success 'Bob')
For a total of 5 facts.
CLIPS> 

最新更新