CLIPS规则按降序打印消息



我需要一些剪辑问题的帮助。这就是问题所在:

"假设CLIPS数据库包含以下模板实例化的事实:

(deftemplate recommendation
     (slot name)
     (slot message)
     (slot rating)
)

写入CLIPS规则,按照评级降序打印消息。每条消息都要连同其相关的名称和评级一起打印出来。"

我知道排序规则,当有一个列表,如:

(deffacts testlist
        (list 1 4 2 3 5 8 7 6 9 0)
    ) 
(defrule sort
         ?f <- (list $?head ?a ?b&:(< ?b ?a) $?tail)
=>
    (retract ?f)
    (assert (list $?head ?b ?a $?tail))
)

但我不确定什么时候是deftemplate格式。有人能帮忙吗?

CLIPS do-for-all-facts使做这样的事情变得更容易,但不幸的是,它在默认情况下在许多系统上不可用,需要重新编译CLIPS才能使其可用。

如果您为所有需要打印的项目断言事实,那么您可以使用forall来确定具有最高评级的项目:

(defrule assert-unprinted "Asserts each item that needs to be printed."
  (print-sorted)
  (recommendation (name ?n))
  =>
  (assert (unprinted ?n)))
(defrule retract-print-sorted "Retract print-sorted after all items enumerated."
  (declare (salience -10))
  ?f <- (print-sorted)
  =>
  (retract ?f))
(defrule print-greatest "Prints the unprinted item with the greatest rating."
  (not (print-sorted))
  ?u <- (unprinted ?name)
  (recommendation (name ?name) (rating ?rating))
  (forall (and (unprinted ?n) (recommendation (name ?n) (rating ?r)))
          (test (<= ?r ?rating)))
  =>
  (retract ?u)
  (printout t ?name " has rating " ?rating "." crlf))

下面是一些例子:

(deffacts recommendations
  (recommendation (name chocolate) (rating 10.0))
  (recommendation (name vanilla) (rating 6.8))
  (recommendation (name strawberry) (rating 8.5)))

按降序打印,如下所示:

CLIPS> (reset)
CLIPS> (assert (print-sorted))
<Fact-4>
CLIPS> (run)
chocolate has rating 10.0.
strawberry has rating 8.5.
vanilla has rating 6.8.
CLIPS> 
CLIPS> 
(deftemplate recommendation
   (slot name)
   (slot message)
   (slot rating))
CLIPS>      
(deffacts recommendations
   (recommendation (name chocolate) (rating 10.0))
   (recommendation (name vanilla) (rating 6.8))
   (recommendation (name strawberry) (rating 8.5)))
CLIPS> 
(deffunction rating-sort (?f1 ?f2)
   (< (fact-slot-value ?f1 rating) (fact-slot-value ?f2 rating)))
CLIPS>    
(defrule print
   =>
   (bind ?facts (find-all-facts ((?f recommendation)) TRUE))
   (bind ?facts (sort rating-sort ?facts))
   (progn$ (?f ?facts)
      (printout t (fact-slot-value ?f name) " has rating " (fact-slot-value ?f rating) "." crlf)))
CLIPS> (reset)
CLIPS> (run)
chocolate has rating 10.0.
strawberry has rating 8.5.
vanilla has rating 6.8.
CLIPS> 

最新更新