2017-05-24 8 views
0

CLIPエキスパートシステムエンジンを使用するC#でWPFアプリケーションを開発しています.Garyが開発したCLIPSCRLWrapper.dllを使用しました。 はここに私のC#のコードです:しかし、ときCLIPS Eval関数がIDEの場合と同じようにCLIPSCRLWrapper.dllで動作しない理由

if(rc==0) 
{ 
std::string excStr="Eval: Invalid expression"; 
excStr.appennd(evalString); 
throw std::logic_error(excStr); 
} 

:、私は見つける

clips.Load("ATC.clp"); 
clips.Eval("(Clear)"); 
clips.Reset(); 
clips.Run(); 
sring evalStr="(find-all-facts ((?f ATCOutPut)) TRUE)"; 
FactAddressValue fv =(FactAddressValue)((MultifieldValue)clips.Eval(evalStr))[0]; 

しかし、デバッグの後、最後の行code.andに押しつぶさプロジェクトプログラムは、このコードスニペットに実行されます私はそれを返す、「(見つけ-すべての事実を((?ATCOutPut F))TRUE)」を入力し、IDEで "ATC.clpを" ロード

ファクト-1

また、Garyが投稿した "clips_dotnet_010"コードも読んでいますが、上記のC#コードはGaryのものとほとんど同じですが、ちょうど潰れました。理由はわかりません。

したがって、同じ評価文字列は、DLLとIDEの異なる結果を取得します。 どうすればIDEとしてCLIPSCRLWrapper.dllで同じ結果が得られますか?

そして、以下のような「ATC.clp」のコード:

(deftemplate ATCOutPut 
(slot name (type SYMBOL)(default nil)) 
(slot end (type STRING)(default "")) 
(slot planetype(type STRING)(default "")) 
(slot landingtype(type STRING)(default "")) 
(slot value (type NUMBER)(default 5000)) 
(slot ID(type INTEGER)(default 0)) 
) 

(deffacts InitATC 
(ATCOutPut (name NONE)) 
) 

答えて

0

コードからこの行を削除します。

clips.Eval("(Clear)"); 

資本Cでクリアという名前のクリップには、コマンドがありませんCLIPSでEvalメソッドを使ってclearコマンドを呼び出すのであれば、構造体を読み込んだ後でこれを行うのは意味がありません。また、 "clips.Clear();" Evalメソッドを呼び出す代わりにメソッド呼び出しを呼び出します。

+0

しかし、最後の行ではちょうど潰れました: "FactAddressValue fv =(FactAddressValue)((MultifieldValue)clips.Eval(evalStr))[0];"、私は数日間この作業をしましたまだそれを作ることはできません。だから、あなたは私の唯一の希望です。 –

+0

最も可能性の高い説明は、プログラムの作業ディレクトリがrulesファイルがあるディレクトリと異なるため、ルールがロードされなかったことです。 –

+0

私は問題を最終的に見つけました。つまり、Windowsを使用しています10.Win7にプロジェクトをコピーすると、正常にコンパイルされました。 –

関連する問題