我正在用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))
)
答案 0 :(得分:0)
从代码中删除此行:
clips.Eval("(Clear)");
在名为Clear的剪辑中没有带有大写字母C的命令。如果您的意图是通过Eval方法在CLIPS中调用clear命令,那么在加载构造之后执行此操作是没有意义的,并且您可以使用“clips.Clear();”执行此操作方法调用而不是调用Eval方法。