2011-04-19 9 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

このプログラムには多くの小さな構文エラーがあります。一般的に、ジェスの通訳はそれを指摘する良い仕事をしています。まず、あなたのコメントブロックのそれぞれで、あなたはコメントの実際のテキストを持っています...コメントされていません。たとえば、 "Fuzzy Variables"のような行の先頭にセミコロンを追加します。

第二には、ライン

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

上のその最後の小数点以下にスペースがないようにべきです。

第3に、規則rule-1rule-2は、最後に十分なクローズカッコがありません。まともなプログラマーのエディタであれば、Lispコードを書式設定できるので、それを修正するのに役立つはずです。見る前の行 - 述語関数の前に:

第四に、ライン

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

に、あなたは「&」を逃しています。

は最後に、私が思うに、ライン

retract(?f) 

が不正な形式れる - (retract ?f)でなければなりません。

関連する問題