首页 > 解决方案 > 检查 CLIPS 中的多个事实

问题描述

假设我有一些像这样的事实(我不知道有多少):灯 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

解决方案


您可以为此使用事实集查询函数(基本编程指南12.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))     

推荐阅读