как фаззифицировать в fuzzyclips?

Я хочу написать проект, чтобы получить точное значение калорий, чтобы рассчитать точное значение тогдашней части (насколько увеличился вес?). Это мое правило:

if calorie is high then increase weight

для этого у меня есть этот набор калорий:

(highCalorie (20 0)(40 .2) (60 .5) (100 .8) (180 1))

а с другой стороны, для значения увеличения веса у меня есть этот набор:

 (increase(50 0) (100 .4) (120 .8) (150 1))

другими словами, я хочу сопоставить значение калорий для увеличения веса. для этого я пишу этот код:

(deftemplate calories
   20 180 
   (high(20 0)(40 .2) (60 .5) (100 .8) (180 1))
)
(deftemplate fat
   50 150 
   (increase(50 0) (100 .4) (120 .8) (150 1))
)

; We first get a precise value for calorie and fuzzify it.

(defrule getCalorie
   (declare (salience 100))
   =>
   (printout t "Enter calorie: ")
   (bind ?t (read))
   (assert (calorie ?t))
)

(defrule fuzzifyCalorie
   (calorie ?t)
   =>
   (assert (calories (?t 0) (?t .2) (?t .5)(?t .8)(?t 1))))

; Here we add rules to prescribe amounts of increased weight

(defrule result
    (declare (salience -1))
   (calories high)
   =>
   (assert (fat increase)))

(defrule ShowPenicillin
   (declare (salience -100))
   ?f <- (fat ?p)
   =>
   (printout t "for this colrie" (moment-defuzzify ?f) " grams of fat increased to weight" crlf))

в чем моя ошибка?

большое спасибо.


person zara-T    schedule 13.06.2015    source источник


Ответы (1)


В ваших deftemplates отсутствуют скобки. Исправленный код

(deftemplate calories
   20 180 
   ((high (20 0)
          (40 .2) 
          (60 .5) 
          (100 .8) 
          (180 1))))

(deftemplate fat
   50 150 
   ((increase (50 0) 
              (100 .4) 
              (120 .8) 
              (150 1))))
person Gary Riley    schedule 14.06.2015
comment
tnx, например, в вашем коде (20 0) означает, что проверка 20 в наборе калорий равна 0? Это правда? - person zara-T; 14.06.2015
comment
Я думаю, это то, что называется уровнем членства. Таким образом, значение 20 не считается высоким. Я нашел кое-какую документацию здесь: alumni.cs.ucr.edu/~vladimir /cs171/quickfuzzy.pdf. - person Gary Riley; 14.06.2015
comment
я попробовал то, что вы сказали, но это не сработало, я изменил свой код. и это работает, но я не понимаю смысла этих строк? (defrule fuzzifyCalorie (калория ?t) =› (assert (калории (?t 0) (?t 1) (?t 0)))) спасибо за вашу помощь - person zara-T; 14.06.2015
comment
Насколько я могу судить, это описание нечеткого множества фактов. Итак, если бы ?t было 50, у вас было бы (калорий (50 0) (50 1) (50 0)), что означает, что значение определенно равно 50. Если вы укажете его как (калории (40 0) (50 1) ( 60 0)) это означало бы, что оно было между 40 и 60 с наибольшей вероятностью 50. - person Gary Riley; 15.06.2015