I am trying to order a collection of facts in CLIPS according to a comparator based on two fields ... Unfortunately I cannot understand why the comparator (apparently right) prints 2 if two facts are passed in which the first field is the same.
MY COMPARATOR:
(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)))))
THE FACTS IN 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))
MY COMPARATOR OUTPUT:
<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
I don't understand how 13.997 can be greater than 13.997. Thank you all in advance.
You need to be using (return TRUE) and (return FALSE) in your deffunction rather than return TRUE and return FALSE, but the code works the same even with this change. The comparator never prints 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>
来源:https://stackoverflow.com/questions/58026686/sort-a-set-of-facts-clips