CLIPS не распознает имя deftemplate

#clips

#клипы

Вопрос:

Я пытаюсь отменить факт deftemplate, но когда я делаю это, CLIPS продолжает говорить, что я должен сначала объявить дефункцию, но это соответствующий deftemplate.В чем, по-видимому, проблема?

Я прикрепил соответствующий код:

Я получаю эту ошибку:

[EXPRNPSR3] Отсутствует объявление функции для сельского хозяйства.

В чем, по-видимому, проблема?

 (deftemplate Agriculture
  (slot weed
        (type SYMBOL)
        (allowed-symbols B G))

  (slot crop
        (type SYMBOL)
        (allowed-symbols C S))

  (slot organic-matter
        (type INTEGER)
        (allowed-values 1 2 3)))

(defrule Sencor-1
  (and (Agriculture(weed B))
       (Agriculture(crop C|S))
       (Agriculture(organic-matter 1)))
 =>
  (printout t "Do not use Sencor!!"crlf))

(defrule Sencor-2
  (and (Agriculture(weed B))
       (Agriculture(crop C|S))
       (Agriculture(organic-matter 2|3)))
 =>
  (printout t " " crlf "Use 3/4  pt/ac of Sencor" crlf ))

(defrule Lasso-1
  (and (Agriculture(weed B|G))
       (Agriculture(crop C|S))
       (Agriculture(organic-matter 1)))
 =>
  (printout t crlf"Use 2 pt/ac of Lasso" crlf))

(defrule Lasso-2
  (and (Agriculture(weed B|G))
       (Agriculture(crop C|S))
       (Agriculture(organic-matter 2)))
 =>
  (printout t crlf "Use 1 pt/ac of Lasso" crlf))

(defrule Lasso-3
  (and (Agriculture(weed B|G))
       (Agriculture(crop C|S))
       (Agriculture(organic-matter 3)))
 =>
  (printout t crlf "Use 0.5 pt/ac of Lasso" crlf))

(defrule Bicep-1
  (and (Agriculture(weed B|G))
       (Agriculture(crop C))
       (Agriculture(organic-matter 1)))
 =>
  (printout t crlf "Use 1.5 pt/ac of Bicep" crlf))

(defrule Bicep-2
  (and (Agriculture(weed B|G))
       (Agriculture(crop C))
       (Agriculture(organic-matter 2)))
 =>
  (printout t crlf"Use 2.5 pt/ac of Bicep" crlf))

(defrule Bicep-3
  (and (Agriculture(weed B|G))
       (Agriculture(crop C))
       (Agriculture(organic-matter 3)))
 =>
  (printout t crlf "Use 3 pt/ac of Bicep" crlf))

(defrule input
  (initial-fact)
 =>
  (printout t crlf "What is the crop? (C:corn,S:soybean)")
  (bind ?a (read))
  (assert(Agriculture(crop ?a))) ;gets input from user
  (printout t crlf "What is the weed problem? (B:broadleaf, G:grass)")
  (bind ?b (read))
  (assert(Agriculture(weed  ?b)))
  (printout t crlf "What is the % of organic matter content? (1:<2%,2:2-4%,3:>4%)")
  (bind ?c (read))
  (assert(Agriculture(organic-matter ?c)))
  ?d <- (Agriculture(crop ?a) (weed ?b)  (organic-matter ?c))
  (printout t  ""crlf crlf "RECOMMENDATIONS:"crlf)
  (retract ?d))
  

Ответ №1:

В RHS input правила, которое вы указываете:

 ?d <- (Agriculture(crop ?a) (weed ?b)  (organic-matter ?c))
  

Это интерпретируется как «Запустить функцию Agriculture и связать ее результаты с ?d».

То, что вы, вероятно, пытаетесь сделать, это:

 (bind ?d (assert (Agriculture (crop ?a) (weed ?b)  (organic-matter ?c))))
  

Комментарии:

1. Также нет смысла утверждать, а затем удалять тот же факт из RHS.

2. Удалено после ввода правила, но теперь правила срабатывают несколько раз, как мне это исправить