CLIPS中是否可以处理类似规则的方法:
(defrule temperature
(IT-IS-COLD-INSIDE TRUE)
=>
(assert
(IT-IS-COLD-OUTSIDE TRUE)
)
(or
(assert (WINDOW-IS-OPEN TRUE))
(assert (DOOR-IS-OPEN TRUE))
)
)
[我很好奇,例如,另一个规则被触发,并且说该规则的结果是DOOR-IS-OPEN
被声明为FALSE,然后CLIPS可以得出结论,这意味着WINDOW-IS-OPEN
必须为TRUE (如果IT-IS-COLD-INSIDE
当然已经为TRUE)?
或者我应该以其他方式编写它,例如:
(defrule temperature
(or
(WINDOW-IS-OPEN TRUE)
(DOOR-IS-OPEN TRUE)
)
(IT-IS-COLD-OUTSIDE TRUE)
=>
(assert (IT-IS-COLD-INSIDE TRUE))
)
这个问题是,在我的用例中,它并不总是正确的(尽管第一个示例始终涵盖了事实)。假设内部可能有非常强烈的热量。我也可以将其添加到图片中,但这并不总是可能的。我正在尝试开发一个可以处理部分定义的数据的系统。
[当我运行原始示例时,它断言了第一个事实(WINDOW-IS-OPEN TRUE)
,但没有断言第二个事实。
语法可能是错误的,但是我想您对我要实现的目标有了想法。
首先定义两个定义模板:一个代表已知的属性值,另一个代表可推论的属性值。可推导属性值的分组将使用链接插槽分组在一起。
CLIPS (6.31 6/12/19)
CLIPS>
(deftemplate av
(slot attribute)
(slot value))
CLIPS>
(deftemplate dav
(slot attribute)
(slot value)
(slot link))
CLIPS>
(deffacts initial
(av (attribute it-is-cold-inside)
(value TRUE)))
CLIPS>
您的温度规则然后可以通过以下代码实现。
CLIPS>
(defrule temperature
(av (attribute it-is-cold-inside)
(value TRUE))
=>
(assert (av (attribute it-is-cold-outside)
(value TRUE))
(dav (attribute window-is-open)
(value TRUE)
(link temperature))
(dav (attribute door-is-open)
(value TRUE)
(link temperature))))
CLIPS>
接下来创建用于管理可推断属性值的规则。当存在与之冲突的已知AV事实时,remove-dav规则将删除所有dav事实。当它是特定链接的最后一个保留的dav事实时,one-remaining-dav规则会将dav事实转换为av事实。
CLIPS>
(defrule remove-dav
(declare (salience 10))
?dav <- (dav (attribute ?a)
(value ?v))
(av (attribute ?a)
(value ~?v))
=>
(retract ?dav))
CLIPS>
(defrule one-remaining-dav
?dav <- (dav (attribute ?a)
(value ?v)
(link ?l))
(not (and (dav (attribute ?a2)
(value ?v2)
(link ?l))
(test (or (neq ?a ?a2)
(neq ?v ?v2)))))
=>
(retract ?dav)
(assert (av (attribute ?a)
(value ?v))))
CLIPS>
因此,当温度规则最初创建可扣除的属性值时:
CLIPS> (reset)
CLIPS> (watch rules)
CLIPS> (watch facts)
CLIPS> (run)
FIRE 1 temperature: f-1
==> f-2 (av (attribute it-is-cold-outside) (value TRUE))
==> f-3 (dav (attribute window-is-open) (value TRUE) (link temperature))
==> f-4 (dav (attribute door-is-open) (value TRUE) (link temperature))
CLIPS>
以后可以添加新信息时可以做出适当的推论:
CLIPS> (assert (av (attribute door-is-open) (value FALSE)))
==> f-5 (av (attribute door-is-open) (value FALSE))
<Fact-5>
CLIPS> (run)
FIRE 1 remove-dav: f-4,f-5
<== f-4 (dav (attribute door-is-open) (value TRUE) (link temperature))
FIRE 2 one-remaining-dav: f-3,*
<== f-3 (dav (attribute window-is-open) (value TRUE) (link temperature))
==> f-6 (av (attribute window-is-open) (value TRUE))
CLIPS>