在带有SWI Prolog的C#中使用Aleph?

时间:2015-12-26 19:05:40

标签: c# prolog ffi swi-prolog

在C#应用程序中,我想使用Aleph构建理论。

以下适用于SWI-Prolog:

?- [aleph.pl].

?- working_directory(CDW,'C:/Users/admin/Desktop/inputFiles').

?- read_all(datainput).

?- induce.

但在C#中,这些命令不会:

if (!PlEngine.IsInitialized)
{
    String[] param = { "-q" };    
    PlEngine.Initialize(param);

    PlQuery.PlCall("consult('C:/Users/admin/Desktop/Aleph_pack/Aleph.pl')");

    PlQuery.PlCall("working_directory(CDW,'C:/Users/admin/Desktop/inputFiles'));

    PlQuery.PlCall("assert(read_all(datainput))");   // ERROR!

    PlQuery.PlCall("assert(induce)");
}

PlQuery.PlCall("assert(read_all(datainput))")收到以下错误:

An unhandled exception of type 'SbsSW.SwiPlCs.Exceptions.PlException' occurred in SwiPlCs.dll
Details:
SbsSW.SwiPlCs.Exceptions.PlException was unhandled
 HResult=-2146233088
 Message=assert/1: No permission to modify static procedure `read_all/1'
 Defined at c:/users/admin/desktop/aleph_pack/aleph.pl:8857

如何解决此错误?

1 个答案:

答案 0 :(得分:1)

您使用C#获取错误的原因是,但直接使用Prolog时不会:

  

你正在做两件事!

让我们交错以上两个片段:

?-                        read_all(datainput)   .
%% PlQuery.PlCall("assert(read_all(datainput))");

?-                        induce   .
%% PlQuery.PlCall("assert(induce)");

所以你在C#代码中使用,但在交互式SWI-Prolog会话中却没有。

你得到的多行错误的一部分也指向了这个方向:

assert/1: No permission to modify static procedure `read_all/1'

通过思考这种差异来恢复你的调查。如果您的代码的旧版本表现出不同的行为,请检查它们(以及当前代码的增量)!