0

次の構造に従って定義された一連の「個人」事実が与えられていると仮定します。

(deftemplate person (slot name) (slot sex) (allowed-values male female) (multislot children))

次のことを行うルールを記述します。

  • person ファクトの children マルチスロットに表示されるが、person ファクトの name スロットには表示されない名前ごとに、フォーム (unknown-person ) のファクトを作成します (2 人が同じ名前を持っていないと想定されます)。
  • フォーム ( unknown-person ) の各ファクトについて、ユーザーにその人の性別を尋ね、ファクトを撤回し、フォーム ( unknown-person ) の新しいファクトをアサートします。
  • フォーム ( unknown-person ) の各ファクトについて、ファクトを撤回し、その人物の新しい人物ファクトを作成します (人物には子供がいないと想定されます)。

ルールでデータ検証を行って、許可された値のみがユーザーによって提供されるようにする必要があります。

4

1 に答える 1

0

CLIPS でテンプレートを定義します。

(deftemplate person 
    (slot name) 
    (slot sex) 
    (slot gender (allowed-values male female)) 
    (multislot children))

未知の人物の作成から始めます (注意: 存在するかどうかを確認せずに人物を作成するため、これは完全に正しいとは限りません)。

(defrule childrencataloguer "First layer of unknown person resolution"
    (person (children $?ch))
    =>
    (progn$ (?term ?ch)
        (assert (unknown-person ?term))
    ))

上記の警告に対処する

(defrule removeunknownswithpersonsalready
    (person (name ?n))
    ?up <-(unknown-person ?n)
    =>
    (retract ?up))

次に、性別を取得します。

(defrule getgender 
    ?up-nogen <-(unknown-person ?n)
    =>
    (retract ?up-nogen)
    (printout t crlf "Please enter male or female to indicate " ?n "'s gender" crlf )
    (assert (unknown-person ?n (read)))
)

性別の確認を行う方法は他にもあります。許可された値が検証に入力されるように、deftemplate 自体を使用したいと思います。しかし、方法はまだわかりません。

(assert (gender male))
(assert (gender female))

次に、検証を行います。

(defrule checkgender
    ?p <- (unknown-person ?n ?s)
    (not (gender ?s))
    =>
    (retract ?p)
    (assert (unknown-person ?n))
)

ついにアンノウン卒業

(defrule graduatefromunknown
    (declare (salience -10))
    ?up <- (unknown-person ?n ?s)
    =>
    (retract ?up)
    (assert (person (name ?n) (sex ?s)))
)
于 2013-05-15T14:34:18.020 に答える