Есть ли способ логически связать значения из двух разных мультислотов? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть количество пар ключ: значение, таких как Company: ABC, Role: Admin и т. Д. Я хочу написать общее правило, чтобы я мог искать факты с этими значениями пары. На данный момент мое правило ниже просто ищет значения в факте, но не может быть привязано таким образом, чтобы сравнивать компанию: ABC в фактическом правиле с компанией: 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 и компании Боба срабатывает. Я хочу, чтобы это было таким правилом для компании: ABC следует сопоставлять только с компанией: фактически ABC Employee. А также, я хочу Правило должно быть общим и не ограничиваться Сотрудником, мероприятием и т. д.

1 Ответ

0 голосов
/ 04 июня 2019

Используйте функцию 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> 
...