У меня есть количество пар ключ: значение, таких как 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. А также, я хочу
Правило должно быть общим и не ограничиваться Сотрудником, мероприятием и т. д.