我试图根据两个字段的比较器在CLIPS中订购一组事实... 不幸的是,如果传递了两个第一个字段相同的事实,我不明白为什么比较器(显然是正确的)会打印2。
我的比较器:
(deffunction MAIN::rating-sort (?f1 ?f2)
(printout t ?f1 crlf)
(printout t ?f2 crlf)
(printout t "f1-SC " (fact-slot-value ?f1 sum-certainties) crlf)
(printout t "f2-SC " (fact-slot-value ?f2 sum-certainties) crlf)
(printout t "f1-TP " (fact-slot-value ?f1 total-price) crlf)
(printout t "f2-TP " (fact-slot-value ?f2 total-price) crlf)
(if (< (fact-slot-value ?f1 sum-certainties) (fact-slot-value ?f2 sum-certainties)) then (printout t "1" crlf) return TRUE
else (if (> (fact-slot-value ?f1 sum-certainties) (fact-slot-value ?f2 sum-certainties)) then (printout t "2" crlf) return FALSE
else (if (> (fact-slot-value ?f1 total-price) (fact-slot-value ?f2 total-price)) then (printout t "3" crlf) return TRUE
else (if (< (fact-slot-value ?f1 total-price) (fact-slot-value ?f2 total-price)) then (printout t "4" crlf) return FALSE
else (printout t "5" crlf) return FALSE)))))
WM中的事实:
f-64 (alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 1 0 0 0) (total-price 75.0) (certainty 14.0 -0.001 -0.001 -0.001) (sum-certainties 13.997) (flag TRUE))
f-66 (alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 0 1 0 0) (total-price 100.0) (certainty -0.001 14.0 -0.001 -0.001) (sum-certainties 13.997) (flag TRUE))
f-68 (alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 0 0 1 0) (total-price 75.0) (certainty -0.001 -0.001 14.0 -0.001) (sum-certainties 13.997) (flag TRUE))
f-70 (alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 0 0 0 1) (total-price 100.0) (certainty -0.001 -0.001 -0.001 14.0) (sum-certainties 13.997) (flag TRUE))
我的比较器输出:
<Fact-64>
<Fact-66>
f1-SC 13.997
f2-SC 13.997
f1-TP 75.0
f2-TP 100.0
4
<Fact-68>
<Fact-70>
f1-SC 13.997
f2-SC 13.997
f1-TP 75.0
f2-TP 100.0
4
<Fact-64>
<Fact-68>
f1-SC 13.997
f2-SC 13.997
f1-TP 75.0
f2-TP 75.0
2
<Fact-66>
<Fact-68>
f1-SC 13.997
f2-SC 13.997
f1-TP 100.0
f2-TP 75.0
2
我不知道13.997如何大于13.997。 谢谢大家。
答案 0 :(得分:0)
您需要在反功能中使用(返回TRUE)和(返回FALSE),而不是返回TRUE 和返回否,但是即使进行了此更改,代码也可以正常工作。比较器从不打印2。
CLIPS (6.31 6/12/19)
CLIPS>
(deffunction rating-sort (?f1 ?f2)
(printout t ?f1 crlf)
(printout t ?f2 crlf)
(printout t "f1-SC " (fact-slot-value ?f1 sum-certainties) crlf)
(printout t "f2-SC " (fact-slot-value ?f2 sum-certainties) crlf)
(printout t "f1-TP " (fact-slot-value ?f1 total-price) crlf)
(printout t "f2-TP " (fact-slot-value ?f2 total-price) crlf)
(if (< (fact-slot-value ?f1 sum-certainties) (fact-slot-value ?f2 sum-certainties))
then
(printout t "1" crlf) return TRUE
else
(if (> (fact-slot-value ?f1 sum-certainties) (fact-slot-value ?f2 sum-certainties))
then (printout t "2" crlf) return FALSE
else
(if (> (fact-slot-value ?f1 total-price) (fact-slot-value ?f2 total-price))
then (printout t "3" crlf) return TRUE
else
(if (< (fact-slot-value ?f1 total-price) (fact-slot-value ?f2 total-price))
then (printout t "4" crlf) return FALSE
else (printout t "5" crlf) return FALSE)))))
CLIPS>
(deftemplate alternative
(multislot hotels)
(multislot times)
(slot total-price)
(multislot certainty)
(slot sum-certainties)
(slot flag))
CLIPS>
(deffacts alternatives
(alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 1 0 0 0)
(total-price 75.0) (certainty 14.0 -0.001 -0.001 -0.001)
(sum-certainties 13.997) (flag TRUE))
(alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 0 1 0 0)
(total-price 100.0) (certainty -0.001 14.0 -0.001 -0.001)
(sum-certainties 13.997) (flag TRUE))
(alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 0 0 1 0)
(total-price 75.0) (certainty -0.001 -0.001 14.0 -0.001)
(sum-certainties 13.997) (flag TRUE))
(alternative (hotels hotel4 hotel3 hotel2 hotel1) (times 0 0 0 1)
(total-price 100.0) (certainty -0.001 -0.001 -0.001 14.0)
(sum-certainties 13.997) (flag TRUE)))
CLIPS> (reset)
CLIPS> (sort rating-sort (find-all-facts ((?f alternative)) TRUE))
<Fact-1>
<Fact-2>
f1-SC 13.997
f2-SC 13.997
f1-TP 75.0
f2-TP 100.0
4
<Fact-3>
<Fact-4>
f1-SC 13.997
f2-SC 13.997
f1-TP 75.0
f2-TP 100.0
4
<Fact-1>
<Fact-3>
f1-SC 13.997
f2-SC 13.997
f1-TP 75.0
f2-TP 75.0
5
<Fact-2>
<Fact-3>
f1-SC 13.997
f2-SC 13.997
f1-TP 100.0
f2-TP 75.0
3
<Fact-2>
<Fact-4>
f1-SC 13.997
f2-SC 13.997
f1-TP 100.0
f2-TP 100.0
5
(<Fact-1> <Fact-3> <Fact-2> <Fact-4>)
CLIPS>