Сортировать набор фактов КЛИПС - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь упорядочить набор фактов в 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.Спасибо всем заранее.

1 Ответ

0 голосов
/ 20 сентября 2019

Вы должны использовать (возвращать TRUE) и (возвращать FALSE) в вашей функции вместо возвращать TRUE и возвращать FALSE , но код работает одинаково даже с этим изменением.Компаратор никогда не печатает 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>
...