Есть ли в CLIPS оператор равенства для тестовой функции?Кроме того, как вложенные или работает? - PullRequest
0 голосов

Доброе утро всем!

В рамках своей диссертации для магистров я пытаюсь написать код на CLIPS для прогнозирования вкуса 37 испытуемых и сравнить его с фактическими известными ароматами, которые мы им дали в эксперименте.Мы использовали массив из 122 отведений ЭМГ и регистрировали активность мозга, пока они испытывали каждый вкус.

Я использовал WEKA для создания иерархического дерева отведений, так что я оставлю только самые важные, которые связаны с областями мозга для восприятия вкуса, приведя к 20.

На основена дереве от WEKA Я ​​пытаюсь создать эту умную систему для прогнозирования того, какой вкус может испытать новый субъект, только с нами, «смотрящими» на их деятельность EMG.

Итак ...

Я использую следующее правило, чтобы найти среди своих фактов те, которые удовлетворяют следующему:

(test (or    (or(eq ?L7 -5);Meaning that: test if L7 is either -5, -4, -4, -2, 2
                (eq ?L7 -4)
                (eq ?L7 -3)
                (eq ?L7 -2)
                (eq ?L7 2))
         ;OR
             (  (eq ?L7 -1);or test weather 
                (or(eq ?L120 -5)     ;L7 is -1 AND L120 is -5 or
                   (eq ?L120 -4)     ;L7 is -1 AND L120 is -4 or
                   (eq ?L120 -3)     ;L7 is -1 AND L120 is -3 or
                   (eq ?L120 -1)     ;L7 is -1 AND L120 is -1 or
                   (eq ?L120 1)      ;L7 is -1 AND L120 is 1 or
                   (eq ?L120 2)      ;L7 is -1 AND L120 is 2 or
                   (eq ?L120 3)      ;L7 is -1 AND L120 is 3 or
                   (eq ?L120 4)      ;L7 is -1 AND L120 is 4 or
                   (eq ?L120 5))     ;L7 is -1 AND L120 is 5 
             )
           ;OR
            (   (eq ?L7 0)       ;OR weather 
                (eq ?L60 -4)     ;L7 is 0 and L60 is -4
            )

... и т.д ...

Что я получаю из этого при запускеэто сообщение, гласящее:

[EXPRNPSR1] A function name must be a symbol

ERROR:
(defrule MAIN::rule1
    (declare (salience 60))
    (?f <- (facts (id ?id) (L7 ?L7) (L20 ?L20) (L23 ?L23) (L26 ?L26) ;other parameters follow ...
    (test (or (or (eq ?L7 -5) (eq ?L7 -4) (eq ?L7 -3) (eq ?L7 -2) (eq ?L7 2)) ((     

И на этом оно останавливается, очевидно, подразумевая, что мой синтаксис для вложенных или в тестовой функции используется неправильно.

Также меня интересует "функция теста на равенство погоды".Я использовал в прошлом

(test (<= ?L7 2))

, и я знаю, что это работает, но это не сработало для "==" (он же равен).Следующей лучшей вещью, которую я нашел, была функция «eq».

Все еще не повезло.

Прошу прощения за мои глупые вопросы, но я новичок в CLIPS (и вообще я врач, а не программист (пока!)), Так что любойМы будем благодарны за помощь.

Так что же я делаю не так?Каким должен быть синтаксис для того, что я заявляю в комментариях к моему коду?

Заранее спасибо!

Не могли бы вы помочь?

1 Ответ

0 голосов
/ 05 мая 2019

Сообщение об ошибке показывает точку, в которой произошла ошибка:

         CLIPS (6.30 3/17/15)
CLIPS> 
(deftemplate facts
  (slot id)
  (slot L7)
  (slot L20)
  (slot L23)
  (slot L26))
CLIPS> 
(defrule MAIN::rule1
    (declare (salience 60))
    ?f <- (facts (id ?id) (L7 ?L7) (L20 ?L20) (L23 ?L23) (L26 ?L26))
    (test (or (or (eq ?L7 -5) 
                  (eq ?L7 -4) 
                  (eq ?L7 -3) 
                  (eq ?L7 -2) 
                  (eq ?L7 2)) 
               (()))) 
    =>)     

[EXPRNPSR1] A function name must be a symbol

ERROR:
(defrule MAIN::rule1
   (declare (salience 60))
   ?f <- (facts (id ?id) (L7 ?L7) (L20 ?L20) (L23 ?L23) (L26 ?L26))
   (test (or (or (eq ?L7 -5) (eq ?L7 -4) (eq ?L7 -3) (eq ?L7 -2) (eq ?L7 2)) ((
CLIPS> 

В этом случае ошибка возникает в точке, где встречаются две левые скобки "((". В отличие от языков, которые допускают инфиксоператоры и использовать круглые скобки для указания приоритета, вы не можете использовать дополнительные скобки в CLIPS, поэтому (+ 3 4) является допустимым синтаксисом, но ((+ 3 4)) не является. Так как последний ( является последним проанализированным токеном, сообщение об ошибке указывает, что он ожидал, что токен будет именем функции.

Для сравнений числового равенства используйте = функция.

...