2017-03-07 13 views
1

にアジェンダを取得します。私は<a href="https://clips.codeplex.com/" rel="nofollow noreferrer">CLIPS.NET</a>と協力し、私はクリップで議題にアクセスできるか疑問クリップ

私はいくつかの入力値を持っており、それは、入力値に基づいてソリューションを生成することができるようにクリップを実行できるようにしたいです。しかし、私はまた、どのルールが厳密に解雇されるのか見たいと思っています。私は今、この

(deftemplate MAIN::action 
    (slot name (default ?NONE))) 

(deftemplate MAIN::input 
    (slot name) 
    (slot value (default ?NONE))) 

(defrule MAIN::rule0 
    (input (name test-input) (value 1)) 
=> 
    (assert (action (name do-something))) 
) 

のようなものを持っている問題は、その唯一プリントコンソールに何かとは、私がまたはそのような何か仕事ができる一切の文字列を与えないので、私は(議題)を使用カントです。だから 私はアジェンダを手に入れることができますか?あるいは、ルールが実行された場所(少し不便そうです)を確認するために、すべてのルールに新しい事実を作成する必要がありますか?

void AllNextActivationFunction(
    void *theEnv, 
    DATA_OBJECT_PTR returnValue) 
    { 
    unsigned long count; 
    struct multifield *theList; 
    void *act; 


    if (EnvArgCountCheck(theEnv, "all-next-activation", EXACTLY, 0) == -1) 
     { 
     EnvSetMultifieldErrorValue(theEnv, returnValue); 
     return; 
     } 

    // Count activations 
    for (act = EnvGetNextActivation(theEnv, NULL), count = 0; 
     act != NULL; 
     act = EnvGetNextActivation(theEnv, act), count++) 
     { /* Do Nothing */ } 

    // Create the multifield 
    SetpType(returnValue, MULTIFIELD); 
    SetpDOBegin(returnValue, 1); 
    SetpDOEnd(returnValue, (long)count); 
    theList = (struct multifield *) EnvCreateMultifield(theEnv, count); 
    SetpValue(returnValue, (void *)theList); 

    // Store values in multifield 
    for (act = EnvGetNextActivation(theEnv, NULL), count = 1; 
     act != NULL; 
     act = EnvGetNextActivation(theEnv, act), count++) 
     { 
     SetMFType(theList, count, SYMBOL); 
     SetMFValue(theList, count, EnvAddSymbol(theEnv, EnvGetActivationName(theEnv, act))); 
     } 
    } 


void EnvUserFunctions(
    void *environment) 
    { 
    EnvDefineFunction2(environment, "next-activation", 'w', PTIEF NextActivationFunction, "NextActivationFunction", "00"); 
    EnvDefineFunction2(environment, "all-next-activation", 'm', PTIEF AllNextActivationFunction, "AllNextActivationFunction", "00"); 
    } 

答えて

2

あなたはどちらかと思います:

"すべて-次の活性化"(現在作業)機能上の私の挑戦

UPDATE(今の私は、ルールの名前を必要とします)アクティベーションを反復して情報を取得したり、CLIPSでユーザー定義関数を追加したり、.NETからEvalメソッドを使用してそのCLIPS関数を呼び出せるようにするために、.NET APIを拡張する必要があります。

CLIPS> (next-activation) 
FALSE 
CLIPS> (defrule foo =>) 
CLIPS> (defrule bar =>) 
CLIPS> (next-activation) 
bar 
CLIPS> (run 1) 
CLIPS> (next-activation) 
foo 
CLIPS> 

:そのコードにクリップを再コンパイル

void *NextActivationFunction(
    void *theEnv) 
    { 
    void *act; 

    if (EnvArgCountCheck(theEnv,"next-activation",EXACTLY,0) == -1) 
    { return EnvFalseSymbol(theEnv); } 

    act = EnvGetNextActivation(theEnv,NULL); 

    if (act == NULL) 
    { return EnvFalseSymbol(theEnv); } 
    else 
    { return EnvAddSymbol(theEnv,EnvGetActivationName(theEnv,act)); } 
    } 

void EnvUserFunctions(
    void *environment) 
    { 
    EnvDefineFunction2(environment,"next-activation", 'w', PTIEF NextActivationFunction, "NextActivationFunction", "00"); 
    } 

は、あなたがクリップ内でこの機能を使用することができます:たとえば、ここにあなたが次の起動の名前を返しますuserfunctions.cに追加できるコードですまたは.NETからevalメソッド使用:

clips.Eval("(next-activation)"); 
+0

をお願いします。一度にすべての次のアクティベーションを取得する方法はありますか?私は何かを試しましたが(私は質問をupdatet)、それは動作していません – MrWoffle

+1

1)SaveCurrentModuleを呼び出す必要はありませんが、あなたはRestoreCurrentModuleへの後続の呼び出しが必要な場合。 setMFTypeとSetMFValueのインデックスは1から始まります。3)SetMFValue呼び出しをSetMFValue(theList、count、EnvAddSymbol(theEnv、EnvGetActivationName(theEnv、act)))で置き換えます。 –

+0

ありがとう! (私は問題のコードを更新しているので、今働いている) – MrWoffle

関連する問題

 関連する問題