2

not関数がパターン マッチングとどのように相互作用するかを理解するのに少し苦労しています。「そんな事実はない」というパターンマッチを書きたいと思います。

つまり、私が欲しいのは:

(defrule init-count
    (not (highest-debt ?))
    (catherines ?debt)
    =>
    (assert (highest-debt ?debt))
)

その後:

(defrule continue-count
    ?debt-fact <- (highest-debt ?h-debt)
    (? ?a-debt)
    (test (> ?a-debt ?h-debt))
    =>
    (retract ?debt-fact)
    (assert (highest-debt ?a-debt))
)

しかし、何らかの理由で、ここではうまくいきnotません。に置き換えnot(not (exists /*pattern*/))もうまくいかないようです。私が欠けているものや、そのようなルールで最大数を見つけることを実装する良い方法はありますか?

アップデート

私が発見した答えはこれです:notパターンは最初のものであってはなりません ((declare (salience 0))どちらも数えません)。したがって、次のコードは正しく機能します。

(defrule init-count
    (catherines ?debt)
    (not (highest-debt ?))
    =>
    (assert (highest-debt ?debt))
)

おじゃまします :(

4

1 に答える 1

3

バージョン 6.24 以前では、not conditional 要素がルールの最初のパターンであった場合、その前にパターン (initial-fact) が追加されていました (これについては、セクション 5.4.9、LHS CE の自動追加と並べ替えで説明されています)。基本的なプログラミング ガイド)。(reset) コマンドが実行されると、(initial-fact) ファクトがアサートされます。これがあなたの問題の原因だと思います。他の事実を主張する前に (リセット) を実行していれば、元のルールが機能していたはずです。

于 2012-03-16T03:26:23.203 に答える