在 CLIPS 中获取议程

Get Agenda in CLIPS

我和 CLIPS.NET 一起工作,想知道如何访问剪辑中的议程。

我想要一些输入值并让剪辑 运行 以便它可以根据输入值生成解决方案。但我也想看看到底触发了什么规则。我现在有这样的东西

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

问题是我不能使用 (agenda),因为它只会向控制台打印一些内容,并且没有给我可以使用的字符串或类似的东西。所以 我怎样才能得到议程?或者我是否需要在每条规则中创建一个新事实以查看执行了哪些规则(似乎有点不方便)? (现在我只需要规则的名称)

更新

我的试用功能 "all-next-activation"(现在可用):

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");
  }

您要么必须扩展 .NET API 以包含一些允许您迭代激活并从中获取信息的 C 函数,要么在 CLIPS 中添加用户定义的函数,并且使用 .NET 中的 Eval 方法调用该 CLIPS 函数。例如,这里的代码你可以添加到 userfunctions.c 即 returns 下一个激活的名称:

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");
  }

用该代码重新编译 CLIPS 允许您在 CLIPS 中使用此功能:

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

或从 .NET 使用 Eval 方法:

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