0

例として、私は持っています:

(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"
)

どうすればいいですか?事前にありがとう

編集:みんなありがとう!私は自分が何をする必要があるかを理解していると思います。

4

2 に答える 2

0

テンプレートが定義された後にスロットをテンプレートに追加することはできません。これは、プログラムの実行中にメンバー変数を Java クラスに追加することに似ています。

ただし、既存のスロットの値を設定できます。テンプレートにkindスロットがある場合、次のように言うことができます

(modify ?a (kind bird))
于 2015-04-23T04:02:40.803 に答える
0

前もってスロットを提供するというアーネストの提案に加えて、ルールがアニマルに対して検出する可能性のあるあらゆる種類のプロパティのコンテナとして機能できるマルチスロットを検討することもできます。

(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)
)

または、非常に一般的な種類の deftemplate を使用して、すべての種類またはプロパティを動的に表現できます。

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

しかし、これは単なる答えではありません。

于 2015-04-23T05:24:08.837 に答える