我需要一个函数来搜索仅满足条件的事实的最大值。查找剪辑中最大的事实满足条件
(deftemplate tax
(field det (type SYMBOL))
(field oper (type INTEGER))
(field machine (type INTEGER))
(field time (type INTEGER))
)
(deffacts tax
(tax (det A) (oper 1) (machine 1) (time 10))
(tax (det A) (oper 2) (machine 2) (time 5))
(tax (det B) (oper 1) (machine 1) (time 8))
(tax (det B) (oper 2) (machine 5) (time 4))
(tax (det C) (oper 1) (machine 4) (time 10))
(tax (det C) (oper 2) (machine 2) (time 5))
(tax (det D) (oper 1) (machine 3) (time 6))
(tax (det D) (oper 2) (machine 2) (time 5))
(tax (det E) (oper 1) (machine 1) (time 7))
)
(deffunction my-predicate (?fact1 ?fact2)
(< (fact-slot-value ?fact1 time) (fact-slot-value ?fact2 time)))
(deffunction find-max (?template ?predicate)
(bind ?max FALSE)
(do-for-all-facts ((?f ?template)) TRUE
(test (eq oper 2)) ; It's my conditions. This may be something else.
(if (or (not ?max) (funcall ?predicate ?f ?max))
then
(bind ?max ?f)))
(return ?max))
(defrule find-max
=>
(bind ?tax (find-max tax my-predicate))
(if ?tax
then
(printout t "Fact " (fact-slot-value ?tax machine) " is the maximum" crlf)))
但我在函数find-max和rule find-max中出错。
非常感谢你。 – aleator 2014-12-10 13:18:36