【发布时间】:2019-11-15 20:37:47
【问题描述】:
我有一个模板:
(deftemplate drule
(slot name1)
(slot id)
(multislot field1)
(multislot value1)
(slot name2)
(multislot field2)
(multislot value2))
(deftemplate claim
(slot name)
(multislot field)
(multislot value))
我能有规则吗
- 检查是否有
name与drule中相同的声明。 - 检查 claim:field 是否具有值“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 时,它才会绑定。我只想检查那些带有名称的声明
在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 上使用 test$ 和 member$。但想不通。我在空闲时间自学 CLIPS。
【问题讨论】:
标签: clips expert-system