2011-12-20 8 views
2

not関数がパターンマッチングとどのようにやり取りするかを理解するのが少し難しいです。私は "このような事実は存在しない"というパターンマッチを書いています。使用しているCLIPSは起動しません。

つまり、私が欲しいのです:

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

ない条件付き要素がルールで最初のパターン、パターン(initial-たバージョン6.24およびそれ以前では、:(

+0

次回は、他の人が読むことができるようにコードを書式設定してみてください。 – pad

+0

私が見たすべてのチュートリアルの例は、そのように書式設定されています。すべての深さレベルでLispスタイルの改行を追加したいですか? –

+0

私はあなたのコードを質問に書式化することを意味しました。あなたのコーディングスタイルに関するコメントはありませんでした。 – pad

答えて

3

を悩ませて申し訳ありません事実)が追加されました(これは、「基本プログラミングガイド」の5.4.9項LHS CEの自動追加と再順序付けで説明しています)。(初期値)は、リセットコマンドを実行したときにアサートされます。これがあなたの問題の原因だと思ってくださいあなたの他の事実を主張する前に(リセット)を実行していればあなたの元のルールはうまくいっていたでしょう

関連する問題