使用Prolog与C# (Unity)

3
我想知道是否有一种“简单”的方法可以从C#代码(在Unity环境中)调用Prolog(最好是SWI-Prolog)代码。
我已经尝试使用SWI-Prolog-C#接口(源代码在此),但它没有得到很好的维护,并且我无法使其与最新版本的SWI-Prolog 64位(截至今天为止为8.2.4)配合使用。
我还看到可以使用SWI-Prolog套接字和C#套接字(或Unity套接字)发送信息,但我无法使其工作,并且我不确定使用套接字是否对性能最佳。
我唯一有效的解决方案是使用另一个“自定义”的Prolog引擎:CSharpProlog。这使我可以将Prolog代码集成到CSharp文件中。但如果可能的话,我仍然想使用SWI-Prolog,请问有人知道我该如何做吗?

这是一个非常好的问题,我还没有进展。除非有人实现快速基于消息的IPC(使用AMQP,暗示),否则可以使用基于HTTP的协议连接到远程Prolog引擎:[Pengines](https://www.swi-prolog.org/pldoc/doc_for?object=section(%27packages/pengines.html%27))。我还没有尝试过它。 - David Tonhofer
1
Swi-prolog允许从C中发起调用。https://www.swi-prolog.org/pldoc/man?section=foreign-create-query 从那里,接口C和C#是可能的,但需要一些低级功夫,如机器语言、字节顺序、C#名称混淆等。我还没有尝试过在SWI中使用它。 - peter.cyc
@peter.cyc:听起来很有趣,很想看到实际应用......但是如果(好的)C#接口无法解决(请参阅我的回答,它确实可以解决...),我会首先尝试查看SWI-Prolog提供的C++接口,并在托管C++中编译它。这些都是我15年前必须做的事情... - CapelliC
1个回答

1
从您提供的链接中,并没有明确说明源代码可在这里获取。尝试编译以适应目标机器结构。
我正在尝试使用MonoDevelop在Linux上生成接口,但这不是一件轻松的事情,稍后会重试。同时,您可以在Windows上尝试。可能会更简单...
编辑
我现在有时间尝试在Windows 10 64位上从源代码编译,到目前为止似乎运行得非常好。我正在使用VisualStudio Community 2017,在打开解决方案(contrib-swiplcs\SwiPlCs_git.sln)之后,在SwiPLcs属性-编译中定义了_PL_X64。
希望对您有帮助。
编辑
我已经上传了这个仓库,其中展示了SWIPlCs的简化用法。请注意,有一个目录(swipl_cs),其中我只是复制了SwiPlCs中不可或缺的源文件(未更改)。有一个单独的Prolog文件,计算N皇后问题的解决方案(仅显示第一个,以尽可能简单)。并且通过CLP(FD)执行的步骤进行显示-感谢Markus Triska提供原始实现。

是的,你说得对,我已经相应地添加了链接。 我已经尝试在Windows上编译该项目并成功获得了DLL。然而,当我尝试在另一个程序中使用该DLL时,它无法正常工作,我遇到了以下错误: 未处理的异常。System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。 - Sis
1
@Sis:请看我的编辑,在Windows上按照预期工作。 - CapelliC
1
嗯,看起来比 System.AccessViolationException 好多了 :) 如果堆栈跟踪没有帮助(您在调试器中看到它了吗?),为了简化问题,我建议将(部分)源代码添加到分发解决方案中找到的 C# 测试项目中。也许通过逐步逼近我们可以达到目标。 - CapelliC
抱歉,我遇到了问题,稍后会重试... - CapelliC
你好,很抱歉回复晚了。非常感谢您的编辑。我已经成功让它工作了。我还需要适应界面,但我认为从那个点开始我将能够做我想做的事情。再次感激不尽。 - Sis
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接