在 Jess 中,如何通过规则向模板添加插槽?

In Jess, how would I add a slot to a template through a rule?

举个例子,我有:

(deftemplate Animal
(slot has-feathers (default FALSE))
(slot name (default "George"))
)

我的规则是:

(defrule bird-test
?a <-(Animal (has-feathers ?))
=>
(printout t ?a.name " is a bird" crlf)
"Add slot 'bird' to ?a or Animal"
)

我该怎么做?提前谢谢你

编辑:谢谢大家!我想我明白我需要做什么。

模板定义后不能再添加槽;这类似于在程序运行时向 Java class 添加成员变量。

但您可以设置现有插槽的值;如果您的模板有一个 kind 插槽,您可以说

(modify ?a (kind bird))

除了 Ernest 提出的预先提供插槽的建议之外,您还可以考虑一个多插槽,它可以充当您的规则可能检测到的动物的各种属性的容器。

(deftemplate Animal
    (slot name)
    (slot has-feathers)
    (multislot props)...)

你可以写

(defrule bird-test
  (declare (no-loop TRUE))
  ?a <-(Animal (has-feathers TRUE)(props $?ex ))
=>
  (modify ?a (props $?ex isBird))
  (printout t ?a.name "'s props: " ?a.props crlf)
)

或者,一种非常通用的 detemplate 可用于动态表达所有类型或属性:

(deftemplate is-a
    (slot thing)
    (slot property))

但这不仅仅是一个答案。