2017-06-05 64 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)))