2011-04-19 45 views
2

我想學習Jess和FuzzyJ,但是在運行一個簡單的程序時遇到問題。我已經看了好幾個小時了,我不太確定它爲什麼不運行。如果有人能指引我正確的方向,將非常感激。Jess和FuzzyJ的幫助

;;;;;;;;;;;;;;;;;;;;;;;;; 
Fuzzy Variables 
;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defglobal ?*income* = 
    (new nrc.fuzzy.FuzzyVariable "income" 0.0 230000.00 "dollars")) 
(defglobal ?*stability* = 
    (new nrc.fuzzy.FuzzyVariable "stability" 0.0 1.0 "index")) 
(defglobal ?*liquidity* = 
    (new nrc.fuzzy.FuzzyVariable "liquidity" 0.0 1.0 "index")) 



(defrule initial-terms 
    (declare (salience 100)) 
=> 
(import nrc.fuzzy.*) 
(load-package nrc.fuzzy.jess.FuzzyFunctions) 

;;;;;;;;;;;;;;;;;;;;; 
Primary Terms 
;;;;;;;;;;;;;;;;;;;;;;; 


(?*income* addTerm "low" (new ZFuzzySet 30000.00 80000.00)) 
(?*income* addTerm "medium" (new PIFuzzySet 100000.00 60000.00)) 
(?*income* addTerm "high" (new SFuzzySet 80000.00 190000.00)) 

(?*stability* addTerm "low" (new ZFuzzySet .3 .5)) 
(?*stability* addTerm "medium" (new PIFuzzySet .6 .4)) 
(?*stability* addTerm "high" (new SFuzzySet .7 .9)) 

(?*liquidity* addTerm "low" (new ZFuzzySet .3 .5)) 
(?*liquidity* addTerm "medium" (new PIFuzzySet .6 .4)) 
(?*liquidity* addTerm "high" (new SFuzzySet .7 . 9)) 
) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
Fuzzy Rules 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defrule rule-1 "low income => liquidity very low" 
    (theIncome ?x &: (fuzzy-match ?x "low")) 
=> 

    (assert(theLiquidity (new nrc.fuzzy.FuzzyValue ?*liquidity* "very low"))) 

(defrule rule-2 "high income & high stability => very high liquidity" 
    (theIncome ?x &: (fuzzy-match ?x "high")) 
    (theStability ?y (fuzzy-match ?y "high")) 
=> 
    (assert(theLiquidity (new nrc.fuzzy.FuzzyValue ?*liquidity* "very high")) 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
Defuzzification 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defrule defuzzification-and-display-liquidity 
    (declare (salience -1)) 
    ?f <- (theLiquidity ?z) 
=> 
    (printout t (str-cat "Liquidity: " (?z momentDefuzzify))) 
    retract(?f) 
    (halt)) 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
Start up Rule/Fuzzify 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

(defrule assert-income-and-stability "initialization" 
=> 
    (printout t "Enter the income(ex. 52000): ") 
    (bind ?income-value (float (readline t))) 

    (printout t "Enter the stability index(ex. 0.64): ") 
    (bind ?stability-value (float(readline t))) 


    (assert(theIncome 
     (new nrc.fuzzy.FuzzyValue ?*income* 
     (new nrc.fuzzy.TriangleFuzzySet 
     (- ?income-value 3000.0) 
     ?income-value 
     (+ ?income-value 3000.0))))) 

    (assert(theStability 
     (new nrc.fuzzy.FuzzyValue ?*stability* 
     (new nrc.fuzzy.TriangleFuzzySet 
     (- ?stability-value 3000.0) 
     ?stability-value 
     (+ ?stability-value 3000.0)))))) 

(reset) 
(run) 

回答

1

這個程序有很多小的語法錯誤;總的來說,傑西翻譯很好地指出了他們。首先,在你的每個評論塊中,你已經得到評論的實際文本......沒有評論。因此,比如像「模糊變量」這樣的行的開頭添加分號。

其次,上線

(?*liquidity* addTerm "high" (new SFuzzySet .7 . 9)) 

,就必須有,去年小數點後沒有空間。

第三,規則rule-1rule-2最後沒有足夠的括號。任何能夠格式化Lisp代碼的正規程序員編輯應該能夠幫助你解決這個問題。

四,上線

(theStability ?y (fuzzy-match ?y "high")) 

你錯過了「&:」謂詞函數之前 - 看到前行。

最後,我認爲,行

retract(?f) 

是畸形 - 應(retract ?f)