我需要一些剪辑问题的帮助。这就是问题所在:
"假设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>