Ожидаемый аргумент # 1 должен иметь тип integer или float в коде CLIPS

#clips

#клипы

Вопрос:

У меня проблема с моим кодом, которая заключается в том, чтобы рекомендовать гербицид и норму его внесения в зависимости от конкретной полевой ситуации.

 (deftemplate plant
  (multislot weed)
  (multislot crop))

(deftemplate Herbicide
  (slot orgmatter)
  (slot sencor)
  (slot lasso)
  (slot bicep))

(deffacts p
  (plant  (weed B) (crop C S))
  (plant  (weed B G) (crop C S))
  (plant  (weed B G) (crop C)))

(deffacts H
  (Herbicide  (orgmatter 1) (sencor 0.0) (lasso 2.0) (bicep 1.5))
  (Herbicide  (orgmatter 2) (sencor 0.75) (lasso 1.0) (bicep 2.5))
  (Herbicide  (orgmatter 3) (sencor 0.75) (lasso 0.5) (bicep 3.0)))

(defrule read-input
  =>
  (printout t "what is type of crop? (C:Corn , S:Soyabeans): ")
  (assert (crop(read)))
  (printout t "what is type of weed? (B:broadleaf , G:gress): ")
  (assert (weed(read)))
  (printout t "what is the organic matter? (1:<2% ,2: 2-4%, 3: >4%: ")
  (assert (orgmatter(read))))

(defrule check-input
  (crop ?crop)
  (weed ?weed)
  (orgmatter ? orgmatter)
  (plant (weed $?weed1) (crop $?crop1))
  (Herbicide  (orgmatter ?orgmatter1) (sencor ?sencor1) (lasso ?lasso1)(bicep ?bicep1))
  (test (member$ ?crop ?crop1))
  (test (member$ ?weed ?weed1))
  (test (= orgmatter ?orgmatter1))
  =>
  (printout t "you can use" ?sencor1 " pt/ac of sencor" crlf)
  (printout t "you can use" ?lasso1 " pt/ac of lasso" crlf)
  (printout t "you can use" ?bicep1 " pt/ac of bicep" crlf)))

 

Ошибка заключается в следующем: Function = expected argument#1 to be of type integer or float

Ответ №1:

В конце вашего кода есть дополнительный ) .

В defrule check-input у вас есть тест:

 (test (= orgmatter ?orgmatter1))
 

Который сравнивает СИМВОЛ orgmatter с переменной ?orgmatter1 . = Тест работает только с цифрами. Если вы хотите сравнить символы или строки, вам нужно использовать eq функцию.

 (test (eq orgmatter ?orgmatter1))
 

Тем не менее, если вы ?orgmatter1 больше нигде не используете, более эффективно выполнять буквальное совпадение, а не тест.

 (Herbicide (orgmatter orgmatter) 
           (sencor ?sencor1) 
           (lasso ?lasso1) 
           (bicep ?bicep1))