0

(まず、私の英語で申し訳ありません:)) 私は自分のプロジェクト(自然植物の単純な分類)の改訂システムを作成しようとしています。すべてのコードを貼り付けるのではなく、重要な部分だけを貼り付けたいのですが、そこで、システムが何をするのか説明しようと思います。システムがユーザーからの回答に対応する必要がある植物を見つけたときに、「はい」と答えた場合に選択できる属性を変更するかどうかをユーザーに尋ねる関数(revise-attributeと呼びます)を作成しました属性を変更したい場合、システムは属性のファクト・アドレスを見つけてそれらを撤回するため、最初から開始してルールを再評価する必要があります。たとえば、次の 2 つのルールがあります。

(defrule month
        (not(attribute (name month)))
        =>
        (bind ?allow (create$ january february march april mamy june july august september october november december))
        (bind ?answer (ask-question "what month is it?" ?allow))
        (assert (attribute (name month) (value ?answer)))
)

(defrule flowering
    (not (attribute (name flowering)))
    (attribute (name month) (value ?month))
=>
    (assert (attribute (name flowering) (value ?month)))
)

最後に、ユーザーが月の属性を変更したい場合、この最後の属性は撤回され、月の属性がないためルールの月を再評価して起動する必要があります。このようにして、ユーザーは次の値を変更できます。ただし、開花属性も変更する必要がありますが、アサートされた開花という名前の属性があり、これは行われません。これを念頭に置いて、 revise-function の後に「フォーカス」するモジュールを作成しました。

(defmodule REVISITING (import MAIN ?ALL) )

(defrule REVISITING::retract-month
    (not (attribute(name month)))
    ?f <- (attribute(name flowering))
=>
    (retract ?f)
)

したがって、月が後退すると、開花も後退します。ただし、次のルールに疑問があるため、より良い方法で同じことを行う可能性があるかどうか疑問に思っています

(defrule petal-apex-toothed 
    (not (attribute (name petal-apex-toothed )))
    (attribute (name petal-color) (valore blue | unknown))
    (attribute (name habitat) (valore sea | montain | edge_of_the_road |camp | unknow))
    (attributo (name flowering) (valore may | june | july | august))
=>
    (bind ?allow (create$ yes no unknow))
    (bind ?answer (ask-question "The petal's apex is toothed?" ?allow))
    (assert (attribute (name petal-apex-toothed) (value ?answer)))
)

たとえば、ユーザーが生息地属性を変更したい場合、Revisiting モジュールで次のルールを作成できます。

(defrule retract-habitat
    (not(attribute(name habitat)))
    ?f <- (attribute (name petal-apex-toothed)))
=>
    (retract ?f)
)

しかし、ユーザーが最初に入力した値が山で、それを edge_of_road で変更した場合、petal-apex-toothed 属性も撤回されて再起動されますが、petal-apex- について質問するのは冗長かもしれないと思います。歯付き。では、どうすればコードを改善できますか??

PS私は私が明確だったことを願っています、そうでなければ私はmysefをよりよく説明しようとすることができます:)

4

1 に答える 1