2017-06-05 85 views
0

我是CLIPS的新手,我無法弄清楚爲什麼我的代碼無法運行。其實我沒有犯錯誤,但是當我按下跑步時,事實不會改變,目標也不會發現。該項目是我們有2瓶。 A容量爲3,B爲容量2.目標是A有0,B有1.我們可以用這些規則來做到這一點:fillA,fillB,emptyA,emptyB,moveAB,moveBA。 以下是我的代碼。有人可以幫忙嗎?謝謝!CLIPS代碼沒有結果

(deffacts problem 
    (name A cap 3 water 0) 
    (name B cap 2 water 0) 
) 

(defrule goal 
(declare (salience 100)) 
(name A water 0) 
(name B water 1) 
=> 
(printout t "FOUND" crlf) 
(halt) 
) 

(defrule start 
(initial-fact) 
=> 
(set-strategy random) 
) 

(defrule emptyA 
?x<-(name A water ?w) 
=> 
(retract ?x) 
(assert (name A water 0)) 
) 

(defrule emptyB 
?x<-(name B water ?w) 
=> 
(retract ?x) 
(assert (name B water 0)) 
) 

(defrule fillA 
?x<-(name A water ?w) 
=> 
(retract ?x) 
(assert (name A water 3)) 
) 

(defrule fillB 
?x<-(name B water ?w) 
=> 
(retract ?x) 
(assert (name B water 2)) 
) 

(defrule moveAB 
?x<-(name A water ?w) 
?y<-(name B water ?water) 
(test (not (< ?w 0))) 
(test (not (> ?water 2))) 
=> 
(retract ?x ?y) 
(assert (name B water ?w)) 
(assert (name A water ?water)) 
) 

(defrule moveBA 
?x<-(name A water ?w) 
?y<-(name B water ?water) 
(test (not (> ?w 3))) 
(test (not (< ?water 0))) 
=> 
(retract ?x ?y) 
(assert (name A water ?water)) 
(assert (name B water ?w)) 
) 

回答

1

所有的事實模式都與三個字段的名稱事實相匹配。你的名字事實有五個領域。需要有精確的匹配。例如,而不是下面的模式:

(name B water ?w) 

你應該使用:

(name B cap ? water ?w) 

或:

(name B cap ?c water ?w) 

或者,使用自定義模板事實,這樣就可以只指定的時隙對你的模式感興趣:

(deftemplate bottle 
    (slot name) 
    (slot cap) 
    (slot water (default 0))) 

(deffacts problem 
    (bottle (name A) (cap 3)) 
    (bottle (name B) (cap 2))) 

(defrule fillA 
    ?x <- (bottle (name A) (water ?w)) 
    => 
    (modify ?x (water 3)))