2010-05-27 24 views
0

我想在剪輯中製作一個程序,它會生成一個數字的所有分區。首先,我開始喜歡他的基本分區數量:(1 1 1 1 1)如果是5號等剪輯中的奇怪錯誤

(deftemplate partition (multislot p)) 
(deffacts facts (p 1 1 1 1 1)) 
(defrule adds 
    (p $?a ?b ?c $?d) 
    (not (p $?a (+ ?b ?c) $?d)) 
    (not (p (+ ?b ?c) $?a $?d)) 
    (not (p $?a $?d (+ ?b ?c))) 
=> (assert (p $?a (+ ?b ?c) $?d)) 
) 

的問題是,雖然代碼似乎罰款,但對錯誤帶有「not」的行 - 我指定創建的新分區不應該已經存在於事實中。 我不知道是什麼問題,歡迎任何想法。 感謝

回答

1

在規則的條件部分,則需要使用=運算符計算表達式,並確定它在事實上的值相匹配:

(defrule adds 
    (p $?a ?b ?c $?d) 

    (not (p $?a =(+ ?b ?c) $?d)) 

    (not (p =(+ ?b ?c) $?a $?d)) 

    (not (p $?a $?d =(+ ?b ?c))) 

    => 

    (assert (p $?a (+ ?b ?c) $?d)))