Проверьте несколько фактов в клипах - PullRequest
0 голосов
/ 19 января 2019

Допустим, у меня есть некоторые факты (я не знаю, сколько их), например: лампа x выключена.С помощью дефлектора я постепенно включаю все лампы, поэтому каждый факт будет таким: лампа x включена.Как я проверяю каждую лампочку, которая включена.Я знаю, что если бы было три лампы, я мог бы написать:

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

Но для х ламп?Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вот как вы можете проверить, все ли лампы включены.Правило 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> 
0 голосов
/ 19 января 2019

Вы можете использовать для этого функции запроса фактов (глава 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))     
...