【问题标题】:CLIPS does not recognize deftemplate nameCLIPS 无法识别 deftemplate 名称
【发布时间】:2020-10-09 21:34:06
【问题描述】:

我试图撤回一个 deftemplate 事实,但是当我这样做时,CLIPS 一直说我必须先声明 deffunction,但它是适当的 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))

【问题讨论】:

    标签: clips


    【解决方案1】:

    input 规则的 RHS 中,您声明:

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

    这被解释为“运行函数 Agriculture 并将其结果绑定到 ?d”。

    你可能想要做的是:

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

    【讨论】:

    • 从 RHS 断言然后收回同样的事实也是没有意义的。
    • 在规则输入后撤回但现在规则触发多次我该如何解决这个问题
    猜你喜欢
    • 2019-05-24
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多