2013-04-21 3 views
2

CLIPS 질문에 대한 도움이 필요합니다.메시지를 내림차순으로 인쇄하는 CLIPS 규칙

"는 클립 데이터베이스는 다음과 같은 템플릿의 인스턴스화있는 사실이 포함되어 있다고 가정 :이 문제입니다.

(deftemplate recommendation 
    (slot name) 
    (slot message) 
    (slot rating) 
) 

쓰기 클립은 등급에 따라 내림차순으로 메시지를 인쇄 할 규칙을 각 메시지가 될 것입니다 관련 이름과 등급과 함께 인쇄됩니다. " 같은 목록이있을 때

나는 정렬 규칙을 알고

(deffacts testlist 
     (list 1 4 2 3 5 8 7 6 9 0) 
    ) 

(defrule sort 

     ?f <- (list $?head ?a ?b&:(< ?b ?a) $?tail) 
=> 
    (retract ?f) 

    (assert (list $?head ?b ?a $?tail)) 
) 

을하지만 deftemplate 형식을 때 나는 확실하지 않다. 누군가 제발 도와 드릴까요?

답변

1

CLIPS do-for-all-facts을 사용하면 이러한 작업을 더 쉽게 수행 할 수 있지만 불행하게도 많은 시스템에서 기본적으로 사용할 수 없으며 CLIPS를 다시 컴파일해야 사용할 수 있습니다.

(deffacts recommendations 
    (recommendation (name chocolate) (rating 10.0)) 
    (recommendation (name vanilla) (rating 6.8)) 
    (recommendation (name strawberry) (rating 8.5))) 
: 여기

(defrule assert-unprinted "Asserts each item that needs to be printed." 
    (print-sorted) 
    (recommendation (name ?n)) 
    => 
    (assert (unprinted ?n))) 

(defrule retract-print-sorted "Retract print-sorted after all items enumerated." 
    (declare (salience -10)) 
    ?f <- (print-sorted) 
    => 
    (retract ?f)) 

(defrule print-greatest "Prints the unprinted item with the greatest rating." 
    (not (print-sorted)) 
    ?u <- (unprinted ?name) 
    (recommendation (name ?name) (rating ?rating)) 
    (forall (and (unprinted ?n) (recommendation (name ?n) (rating ?r))) 
      (test (<= ?r ?rating))) 
    => 
    (retract ?u) 
    (printout t ?name " has rating " ?rating "." crlf)) 

몇 가지 예를 사실 수 있습니다 : 당신이 인쇄하는 데 필요한 모든 항목에 대한 사실을 주장하는 경우

, 당신은 최대 정격 항목을 결정하는 forall을 사용할 수 있습니다

다음과 같이 내림차순으로 인쇄됩니다.

CLIPS> (reset) 
CLIPS> (assert (print-sorted)) 
<Fact-4> 
CLIPS> (run) 
chocolate has rating 10.0. 
strawberry has rating 8.5. 
vanilla has rating 6.8. 
CLIPS> 
+0

예 모든 항목에 대해 사실을 주장하는 것에 대해 생각했지만 정렬 후에 사용하는 방법을 잘 모릅니다. 위대한 작품! 고맙습니다! – user2303699

+0

do-for-all-facts를 포함한 사실 집합 쿼리 함수는 CLIPS 버전 6.23 (2005 년 릴리스) 이상에 기본적으로 제공됩니다. 지난 9 년 동안 업데이트되지 않은 타사 확장 프로그램에는 이러한 기능이 포함되지 않지만 현재 버전의 CLIPS를 사용하는 경우이 기능을 사용할 수 있습니다. –

0
CLIPS> 
(deftemplate recommendation 
    (slot name) 
    (slot message) 
    (slot rating)) 
CLIPS>  
(deffacts recommendations 
    (recommendation (name chocolate) (rating 10.0)) 
    (recommendation (name vanilla) (rating 6.8)) 
    (recommendation (name strawberry) (rating 8.5))) 
CLIPS> 
(deffunction rating-sort (?f1 ?f2) 
    (< (fact-slot-value ?f1 rating) (fact-slot-value ?f2 rating))) 
CLIPS>  
(defrule print 
    => 
    (bind ?facts (find-all-facts ((?f recommendation)) TRUE)) 
    (bind ?facts (sort rating-sort ?facts)) 
    (progn$ (?f ?facts) 
     (printout t (fact-slot-value ?f name) " has rating " (fact-slot-value ?f rating) "." crlf))) 
CLIPS> (reset) 
CLIPS> (run) 
chocolate has rating 10.0. 
strawberry has rating 8.5. 
vanilla has rating 6.8. 
CLIPS> 
관련 문제