Вывести конкретные факты, увеличив порядок определенного значения в CLIPS - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующий список фактов:

f-0    (initial-fact)
f-1    (fact 1 [input_1] 21)
f-2    (fact 1 [input_2] 28)
f-3    (fact 1 [input_3] 10)
f-4    (fact 1 [input_4] 25)
f-5    (fact 1 Normal Operation!)
f-6    (fact 2 [input_1] 7)
f-7    (fact 2 [input_2] 25)
f-8    (fact 2 [input_3] 13)
f-9    (fact 2 [input_4] 15)
f-10   (fact 2 adder a1 error!)
f-11   (fact 3 [input_1] 11)
f-12   (fact 3 [input_2] 17)
f-13   (fact 3 [input_3] 24)
f-14   (fact 3 [input_4] 31)
f-15   (fact 3 multiplier p1 error!)

Есть ли способ как-то выбрать и напечатать из всех этих фактов те, которые содержат только номер и тип ошибки? Например, я хочу печатать в порядке возрастания:

1 Normal Operation!
2 adder a1 error!
3 multiplier p1 error!

Обратите внимание, что у меня на самом деле больше фактов, и порядок их в списке фактов не в порядке возрастания, как я показал. Поэтому я должен как-то увеличить его.

1 Ответ

0 голосов
/ 21 января 2019
         CLIPS (6.31 2/3/18)
CLIPS> 
(deffacts initial
   (fact 1 [input_1] 21)
   (fact 1 [input_2] 28)
   (fact 1 [input_3] 10)
   (fact 1 [input_4] 25)
   (fact 1 Normal Operation!)
   (fact 2 [input_1] 7)
   (fact 2 [input_2] 25)
   (fact 2 [input_3] 13)
   (fact 2 [input_4] 15)
   (fact 2 adder a1 error!)
   (fact 3 [input_1] 11)
   (fact 3 [input_2] 17)
   (fact 3 [input_3] 24)
   (fact 3 [input_4] 31)
   (fact 3 multiplier p1 error!))
CLIPS> 
(deffunction compare-1st (?f1 ?f2)
   (> (nth$ 1 (fact-slot-value ?f1 implied))
      (nth$ 1 (fact-slot-value ?f2 implied))))
CLIPS> 
(defrule print
   =>
   (bind ?facts 
      (find-all-facts ((?f fact)) 
                      (not (instance-namep (nth$ 2 ?f:implied)))))
   (bind ?facts (sort compare-1st ?facts))
   (foreach ?f ?facts
      (bind ?data (fact-slot-value ?f implied))
      (printout t (implode$ (first$ ?data)) " " 
                  (implode$ (rest$ ?data)) crlf))) 
CLIPS> (reset)
CLIPS> (run)
1 Normal Operation!
2 adder a1 error!
3 multiplier p1 error!
CLIPS> 
...