CLIPS在RHS中使用OR条件声明事实

问题描述 投票:0回答:1

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),但没有断言第二个事实。

语法可能是错误的,但是我想您对我要实现的目标有了想法。

conditional-statements clips
1个回答
0
投票

首先定义两个定义模板:一个代表已知的属性值,另一个代表可推论的属性值。可推导属性值的分组将使用链接插槽分组在一起。

         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>
© www.soinside.com 2019 - 2024. All rights reserved.