【问题标题】:Using Aleph in C# with SWI Prolog?在 C# 中使用 Aleph 和 SWI Prolog?
【发布时间】:2016-04-01 04:04:36
【问题描述】:

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

以下工作在 SWI-Prolog 中:

?- [aleph.pl]。 ?-working_directory(CDW,'C:/Users/admin/Desktop/inputFiles')。 ?- read_all(数据输入)。 ?-诱导。

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

if (!PlEngine.IsInitialized) { 字符串[] 参数 = { "-q" }; PlEngine.Initialize(参数); PlQuery.PlCall("咨询('C:/Users/admin/Desktop/Aleph_pack/Aleph.pl')"); PlQuery.PlCall("working_directory(CDW,'C:/Users/admin/Desktop/inputFiles')); PlQuery.PlCall("assert(read_all(datainput))"); // 错误! PlQuery.PlCall("assert(induce)"); }

PlQuery.PlCall("assert(read_all(datainput))") 出现以下错误:

在 SwiPlCs.dll 中发生“SbsSW.SwiPlCs.Exceptions.PlException”类型的未处理异常
细节:
SbsSW.SwiPlCs.Exceptions.PlException 未处理
 H结果=-2146233088
 Message=assert/1:无权修改静态过程“read_all/1”
 定义在 c:/users/admin/desktop/aleph_pack/aleph.pl:8857

我该如何解决这个错误?

【问题讨论】:

  • 没有特别的原因,感谢您的编辑。

标签: c# prolog ffi swi-prolog aleph-ilp


【解决方案1】:

使用 C# 时出现错误,而直接使用 Prolog 时却没有,原因是:

你在做两件不同的事情!

让我们把上面两个sn-ps交错:

?- read_all(datainput) 。 %% PlQuery.PlCall("assert(read_all(datainput))"); ?-诱导。 %% PlQuery.PlCall("assert(induce)");

因此,您在 C# 代码中使用 ,而不是在交互式 SWI-Prolog 会话中。

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

assert/1:无权修改静态过程`read_all/1'

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

【讨论】:

  • 谢谢,不知道怎么解决这个问题?
  • @K.Ros。试试PlQuery.PlCall("read_all(datainput)"); PlQuery.PlCall("induce"); 怎么样?或者为什么在从 C# 调用时需要“assert(...)”,但在 SWI-Prolog shell 中不需要?
  • 应用程序在使用 'PlQuery.PlCall("read_all(datainput)"); 运行时停止PlQuery.PlCall("induce")'
  • @K.Ros。一件事:我不能重复你所做/所做的尝试,至少现在不能......可能是读取操作正在等待数据输入吗?
  • 谢谢,我用样本测试运行它,它可以工作。我的“数据输入”是我必须查看的所有数据(用于 Aleph 的 3 个数据文件)。
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多