2015-11-01 49 views
0

我想用規則打印所有事實的數據。以下是事實:在CLIPS中獲取事實和打印參數

(deffacts datas 
(pile name 1 blocks A B C A B) 
(pile name 2 blocks B A) 
(pile name 3 blocks A B) 
(pile name 4 blocks A)) 

,這裏是我想看到的印刷:

pile 1 : A B C A B 
pile 2 : B A 
pile 3 : A B 
pile 4 : A 

是否有人有一個想法,怎麼辦呢?

謝謝你的幫助!

回答

0

如果其中樁打印的順序並不重要,你可以這樣來做:

CLIPS> (clear) 
CLIPS> 
(deffacts datas 
    (pile name 1 blocks A B C A B) 
    (pile name 2 blocks B A) 
    (pile name 3 blocks A B) 
    (pile name 4 blocks A)) 
CLIPS> 
(defrule print 
    (pile name ?name blocks $?blocks) 
    => 
    (printout t pile " " ?name " : " (implode$ ?blocks) crlf)) 
CLIPS> (reset) 
CLIPS> (run) 
pile 4 : A 
pile 3 : A B 
pile 2 : B A 
pile 1 : A B C A B 
CLIPS> (clear) 
CLIPS> 
(deftemplate pile 
    (slot name) 
    (multislot blocks)) 
CLIPS>  
(deffacts datas 
    (pile (name 1) (blocks A B C A B)) 
    (pile (name 2) (blocks B A)) 
    (pile (name 3) (blocks A B)) 
    (pile (name 4) (blocks A))) 
CLIPS> 
(defrule print 
    (pile (name ?name) (blocks $?blocks)) 
    => 
    (printout t pile " " ?name " : " (implode$ ?blocks) crlf)) 
CLIPS> (reset) 
CLIPS> (run) 
pile 4 : A 
pile 3 : A B 
pile 2 : B A 
pile 1 : A B C A B 
CLIPS> 

如果順序很重要,你可以用下面的方式事實是這樣做,但這是在第一種情況下無論是破壞性的,或者需要清理在第二種情況:

CLIPS> (clear) 
CLIPS> 
(deftemplate pile 
    (slot name) 
    (multislot blocks)) 
CLIPS>  
(deffacts datas 
    (pile (name 1) (blocks A B C A B)) 
    (pile (name 2) (blocks B A)) 
    (pile (name 3) (blocks A B)) 
    (pile (name 4) (blocks A))) 
CLIPS> 
(defrule print 
    ?pile <- (pile (name ?name) (blocks $?blocks)) 
    (not (pile (name ?name2&:(< ?name2 ?name)))) 
    => 
    (retract ?pile) 
    (printout t pile " " ?name " : " (implode$ ?blocks) crlf)) 
CLIPS> (reset) 
CLIPS> (run) 
pile 1 : A B C A B 
pile 2 : B A 
pile 3 : A B 
pile 4 : A 
CLIPS> (facts) 
f-0  (initial-fact) 
For a total of 1 fact. 
CLIPS> (clear) 
CLIPS> 
(deftemplate pile 
    (slot name) 
    (multislot blocks)) 
CLIPS>  
(deffacts datas 
    (pile (name 1) (blocks A B C A B)) 
    (pile (name 2) (blocks B A)) 
    (pile (name 3) (blocks A B)) 
    (pile (name 4) (blocks A))) 
CLIPS> 
(defrule print 
    (pile (name ?name) (blocks $?blocks)) 
    (not (and (pile (name ?name2&:(< ?name2 ?name))) 
      (not (pile-printed ?name2)))) 
    => 
    (assert (pile-printed ?name)) 
    (printout t pile " " ?name " : " (implode$ ?blocks) crlf)) 
CLIPS> (reset) 
CLIPS> (run) 
pile 1 : A B C A B 
pile 2 : B A 
pile 3 : A B 
pile 4 : A 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (pile (name 1) (blocks A B C A B)) 
f-2  (pile (name 2) (blocks B A)) 
f-3  (pile (name 3) (blocks A B)) 
f-4  (pile (name 4) (blocks A)) 
f-5  (pile-printed 1) 
f-6  (pile-printed 2) 
f-7  (pile-printed 3) 
f-8  (pile-printed 4) 
For a total of 9 facts. 
CLIPS> 

最後,您可以用事實查詢功能,以獲取所有樁事實,然後對它們進行排序,以獲得所需的順序:

CLIPS> (clear) 
CLIPS> 
(deffunction pile-sort (?f1 ?f2) 
    (> (fact-slot-value ?f1 name) 
     (fact-slot-value ?f2 name))) 
CLIPS> 
(deftemplate pile 
    (slot name) 
    (multislot blocks)) 
CLIPS>  
(deffacts datas 
    (pile (name 1) (blocks A B C A B)) 
    (pile (name 2) (blocks B A)) 
    (pile (name 3) (blocks A B)) 
    (pile (name 4) (blocks A))) 
CLIPS>  
(defrule print 
    => 
    (bind ?facts (find-all-facts ((?f pile)) TRUE)) 
    (bind ?facts (sort pile-sort ?facts)) 
    (progn$ (?f ?facts) 
     (printout t pile " " (fact-slot-value ?f name) " : " 
          (implode$ (fact-slot-value ?f blocks)) crlf))) 
CLIPS> (reset) 
CLIPS> (run) 
pile 1 : A B C A B 
pile 2 : B A 
pile 3 : A B 
pile 4 : A 
CLIPS> 
+0

非常感謝你! – Danvdb