为什么CLIPS Eval函数在CLIPSCRLWrapper.dll中与在IDE中不同

时间:2017-05-24 02:19:32

标签: c# clips

我正在用C#开发一个WPF应用程序,它在某些部分使用了CLIPS专家系统引擎。我使用了Gary开发的CLIPSCRLWrapper.dll。 这是我的C#代码:

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];

但是,该项目在最后一行代码中被粉碎。在调试之后,我发现该程序会运行到此代码段中:

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

然而,当我加载" ATC.clp"在IDE中,键入“(find-all-facts((?f ATCOutPut))TRUE)”,然后返回

  

事实-1

我还阅读了" clips_dotnet_010"加里发布的代码,上面的C#代码与加里的代码几乎相同。但是我的粉碎了。我不知道为什么。

因此,相同的eval字符串得到不同的结果int 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))
)

1 个答案:

答案 0 :(得分:0)

从代码中删除此行:

clips.Eval("(Clear)");

在名为Clear的剪辑中没有带有大写字母C的命令。如果您的意图是通过Eval方法在CLIPS中调用clear命令,那么在加载构造之后执行此操作是没有意义的,并且您可以使用“clips.Clear();”执行此操作方法调用而不是调用Eval方法。