2015-12-26 45 views
0

在C#應用程序中,我想使用Aleph來構建理論。在C#中使用Aleph與SWI Prolog?

在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 

我該如何解決這個錯誤?

+0

沒有特別的理由,謝謝您的修改。 –

回答

1

爲什麼你用C#的錯誤,但不能直接使用的Prolog時的原因,是這樣的:

You are doing two different things!

讓我們交錯上述兩個片段:

 
?-      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'

簡歷通過琢磨該差值的調查。如果您的代碼的舊版本顯示不同的行爲,請檢查它們(以及當前代碼的增量)!

+1

謝謝,但我不知道我該如何解決這個問題? –

+0

@ K.Ros。如何嘗試'PlQuery.PlCall(「read_all(datainput)」); PlQuery.PlCall(「誘導」);'?或者爲什麼在從C#調用時需要「斷言(...)',而不是在SWI-Prolog外殼中? – repeat

+1

應用程序在與」PlQuery.PlCall(「read_all(datainput)」)一起運行時停止; PlQuery.PlCall (「誘導」)' –