Могу ли я связать переменную при некотором условии? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть шаблон:

(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», если найдено, привяжите его к имени? Name.

В настоящее время у меня есть что-то следующее:

(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. Я только хочу проверить эти претензии с именем упоминается в друле. И если какое-либо из этих утверждений имеет поле 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')

Извините, если это очень глупо, я попытался использовать test $ и member $ на field. Но не мог понять это. Я занимаюсь самообучением CLIPS в свободное время.

1 Ответ

0 голосов
/ 05 июля 2019
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> 
...