在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
如何解决此错误?
答案 0 :(得分:1)
您使用C#获取错误的原因是,但直接使用Prolog时不会:
你正在做两件事!
让我们交错以上两个片段:
?- read_all(datainput) . %% PlQuery.PlCall("assert(read_all(datainput))"); ?- induce . %% PlQuery.PlCall("assert(induce)");
所以你在C#代码中使用prolog-assert,但在交互式SWI-Prolog会话中却没有。
你得到的多行错误的一部分也指向了这个方向:
assert/1: No permission to modify static procedure `read_all/1'
通过思考这种差异来恢复你的调查。如果您的代码的旧版本表现出不同的行为,请检查它们(以及当前代码的增量)!