整理一组事实CLIPS

时间:2019-09-20 10:35:11

标签: clips

我试图根据两个字段的比较器在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 :(得分: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>