在 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))
但这不仅仅是一个答案。
举个例子,我有:
(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))
但这不仅仅是一个答案。