【问题标题】:Check multiple facts in CLIPS检查 CLIPS 中的多个事实
【发布时间】:2019-01-19 12:07:48
【问题描述】:

假设我有一些像这样的事实(我不知道有多少):灯 x 已关闭。通过 derule,我逐步打开所有灯,因此每个事实都将是:灯 x 已打开。如何检查每个亮着的灯。我知道如果有三盏灯我可以写:

(defrule checkAllLamps
    (lamp 1 is on)
    (lamp 2 is on)
    (lamp 3 is on)
    =>
    (printout t "All lamps are on now")
)

但是对于 x 灯呢? 谢谢!

【问题讨论】:

    标签: clips


    【解决方案1】:

    您可以为此使用事实集查询函数(Basic Programming Guide12.9.12 章)。

    (deftemplate lamp 
      (slot id (type INTEGER)) 
      (slot state (type SYMBOL)))
    
    (defrule all-lamps-are-on 
      (lamp (state on)) 
      (test (>= (length$ (find-all-facts ((?l lamp)) (eq ?l:state on))) 3)) 
      => 
      (printout t "All lamps are on" crlf))     
    

    【讨论】:

    • 谢谢!是否可以在没有 deftemplate 的情况下做到这一点?使用 deffacts
    • AFAIK 事实集查询函数仅适用于 deftemplates。您仍然可以将deffacts 构造与deftemplate 事实一起使用,您只需要确保在调用deffacts 函数之前构造了deftemplates。隐含/有序事实在特征方面非常有限。我建议你尽可能多地使用deftemplatefacts。
    • 其实这条规则检查的是是否至少有三个灯亮着。只要至少有三盏灯亮着,就可以有任意数量的灯熄灭。对于每盏灯超过两个时,它也会执行一次,因此如果有五个灯亮,您将看到“所有灯都亮”消息 3 次。
    • 确实如此。我专注于回答标题中的问题,而不是验证 OP 的真正目的。假设是 OP 提供了一个例子来更好地阐明他所追求的。
    • 一般来说,在规则的条件下使用查询函数是个坏主意,因为当规则触发时,系统的当前状态可能与查询函数启动时的系统状态不同。评估。例如,如果您断言三个已打开的灯事实,然后撤回已断言的前两个,即使只有一个灯打开,仍然会激活 all-lamps-are-on 规则。
    【解决方案2】:

    您可以通过以下方法检查所有灯是否都亮着。 checkAllLamps 规则将根本没有灯的情况视为所有灯都亮着,而 checkAllLampsAtLeastOne 规则要求至少有一个灯亮。

             CLIPS (6.31 2/3/18)
    CLIPS> 
    (defrule checkAllLamps
       (not (lamp ? is off))
       =>
       (printout t "All lamps are on now" crlf))
    CLIPS> 
    (defrule checkAllLampsAtLeastOne
       (exists (lamp ? is on))
       (not (lamp ? is off))
       =>
       (printout t "All lamps are on now" crlf))
    CLIPS> (agenda)
    0      checkAllLamps: *
    For a total of 1 activation.
    CLIPS> (assert (lamp 1 is on))
    <Fact-1>
    CLIPS> (agenda)
    0      checkAllLampsAtLeastOne: *,*
    0      checkAllLamps: *
    For a total of 2 activations.
    CLIPS> (assert (lamp 2 is off))
    <Fact-2>
    CLIPS> (agenda)
    CLIPS> (retract 2)
    CLIPS> (assert (lamp 2 is on))
    <Fact-3>
    CLIPS> (agenda)
    0      checkAllLampsAtLeastOne: *,*
    0      checkAllLamps: *
    For a total of 2 activations.
    CLIPS> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多