SWI-Prolog在语义Web中的应用

25

我希望能听到有实际编程经验的人使用SWI-Prolog语义库的经验。

编辑:我提出这个问题的原因是,在与许多拥有Prolog经验的人交谈中,他们中的大多数似乎在他们的学术项目中将其用于一些人工智能编程。我想知道是否有人在生产环境中广泛使用它。因为实时可维护性和性能不同于完成项目以获得好成绩。

你如何与像Java这样的编程语言集成?

编辑:正如答案中提到的那样,REST服务或使用SWI-Prolog的Foreign Interface是两个最佳选择。

您在Prolog库的使用方面做了什么(在语义Web的上下文中)?

可能在这里得不到明确的答案。也许,这个问题属于语义溢出。我现在有一个公平的想法,并将在更合适的论坛中继续讨论。

使用了哪种开发环境? Emacs或由SWI-Prolog提供的其变种似乎是压倒性的答案。

我从来不想要像Intellij IDEA for java这样的IDE。毕竟我会做什么,自动完成?我理解基于规则的语言的必要性。但再一次,我讨论开发环境的原因是帮助我跟踪我的规则(调试)并且可能在我的知识集中识别异常。 SWI-Prolog的图形跟踪器满足第一个要求,但至少对我来说,它似乎很糟糕且有限。但我不认为还有别的。

我非常喜欢使用SWI-Prolog的想法,但如果影响生产率,我将避免使用它。

正如答案中提到的那样,Prolog应用于其擅长的事情。我总是知道这一点,因此在其他编程语言的集成问题上提出了问题。似乎最大的生产力障碍是开发人员的质量,位于开发阶段中。系统中的问题可能处于休眠状态且难以修复,但可以使用一组问题来检查系统的有效性。

注意:当我提到答案时,我指的是@littletable提供的答案。还有对于对语义Web感兴趣的人,thea看起来很有意思。


2
Java比Prolog更高级?是的! - salva
有趣。如何定义高级编程。硬件抽象,可移植性...任何依赖于设置规则并直接与逻辑交互的语言都不是高级编程。当你教授某人一门语言的介绍时,他问你如何迭代,你告诉他为什么要使用迭代,为什么不能定义一个传递规则,这不是高级编程。 - uncaught_exceptions
我担心这个问题可能对SO来说有点太具体了。你可以尝试在SWI-Prolog邮件列表上提问,https://lists.iai.uni-bonn.de/mailman/listinfo.cgi/swi-prolog - Fred Foo
你可能是正确的。我确实发送了一些电子邮件,也可能会在一些更具体的论坛上发布。 - uncaught_exceptions
1
我在SWI-Prolog编程方面有丰富的经验,但并非在语义网络的背景下。这对您有帮助吗? - Little Bobby Tables
@littlebobbytables,那应该完全没问题。我只想听听那些在生产/商业环境中使用过SWI Prolog的人的意见。 - uncaught_exceptions
3个回答

15
免责声明:本人未在商业/生产环境中使用SWI-Prolog,也未尝试过SWI / Java接口(虽然在SWI-Prolog邮件列表上报告其运行良好),且对语义网络没有兴趣。
话虽如此,我确实使用SWI-Prolog编写了一个庞大而复杂的项目,并且这不是一个玩具应用程序-我需要它工作才能完成我的研究。因此,即使不具备所有所需的资格,我也有一些凭证来回答这个问题。
在大型项目的背景下,最好将Prolog视为编写搜索例程的特定领域语言-类似于SQL和存储。Prolog擅长解决搜索问题中非常重要,如果您的问题可以缩小到在给定事实和规则集中查找变量的有效分配,则Prolog是您的首选武器:您不必担心编码中除了调整查询和规则之外的任何其他问题。它也会运行得相当快,特别是如果您编译谓词的话。Prolog通常很慢,不是因为它本质上慢,而是因为它在大型搜索空间上运行搜索例程。
记住这点,您可以以与集成SQL类似的方式将其与Java集成:Prolog负责解决搜索。它存储永久数据和规则,并运行查询。Java应用程序负责其他所有事项。
开发环境对于Prolog来说有点薄弱。您不会得到花哨的IDE-仅因为很少有东西值得精致。 Prolog程序很少具有完全的编译时信息,因此您不会获得完美的自动完成。我只是使用了Emacs,并始终打开了Prolog shell。对于大多数事情,Prolog文本跟踪器/调试器就可以胜任。 SWI附带了它自己的图形调试器,但我没有尝试过。

Prolog拥有几个鲜为人知的优点:内置解析框架(DCG规则)、出色的宏系统(术语扩展)和元谓词(调用、查找等)。如果你知道如何使用它们,这些就是你牌库中真正的王牌。

总之:Prolog是否提高或损害了生产力?这取决于当前阻碍你生产力的内容。如果你在Java中浪费太多时间想着如何实现知识表示和搜索例程 - 只需使用Prolog;这不像你要自己实现红黑树而不使用SQL一样。如果你正在寻找软实时性能和一个豪华IDE - 尝试其他东西。


1
太好了,这就是我想要的答案。我的问题与以模型形式表示的知识有关(语义猫头鹰模型,但不必过于关注细节),以及现有的用Prolog编写的库,可以表示此知识并公开搜索和推理功能。(我将打破评论以保持连贯性) - uncaught_exceptions
1
续:你可以进一步解释的部分是这个语句:“记住这一点,你可以以类似于集成SQL的方式将其与Java集成”。我如何将数据传递到Prolog并将结果返回到Java中? - uncaught_exceptions
@doc_180:你至少有三个简单的选择。 (a) 运行 SWI-Prolog HTTP 服务器,并将其用作 REST Web 服务。 (b) 打开一个管道到 Prolog 进程,并将查询作为文本发送并接收结果作为文本。 (c) 使用 JPL http://www.swi-prolog.org/packages/jpl/(我自己没有尝试过,但据报告是可以工作的)。 - Little Bobby Tables
1
将查询管道传输到Prolog可能不适合我。REST WS会有所帮助,但可能会变得冗长。我大约3天前开始评估jpl,看起来还不错。谢谢。 - uncaught_exceptions
标记你的答案。我尝试在标记时总结问题的状态。如果您有要补充的内容,请告诉我。 - uncaught_exceptions
+1 是为了给一个高度专业的问题提供详细的答案。 - jprete

6

我并没有在生产环境中使用过它,但我将其集成到基于Java/Eclipse的Bioclipse工作台中,作为我的论文工作的一部分,以在真实场景下使用。此外,该论文的重点是测试Prolog集成在Bioclipse中的性能和可用性。

对于您提出的问题,我会简短回答,但任何有兴趣的人可以在我的论文报告中找到更多信息,该报告名为“SWI-Prolog作为语义Web工具用于Bioclipse中的语义查询:集成和性能基准测试”,以及相关标记的博客帖子。源代码可以在GitHub代码库中找到。

你是如何与像Java这样的编程语言集成的?

我使用了JPL Java Prolog接口

您在语义Web的上下文中使用Prolog库来做什么?

我使用它来对一些包含不同高度峰值的60000个NMR谱的RDF数据库进行模式匹配。我使用这个测试了SWI-Prolog在此操作中的性能,与其他语义Web工具如Pellet和Jena(基于Java)进行了比较。(顺便说一下,SWI-Prolog远远胜过这两个工具)。

使用了什么开发环境?

Eclipse RCP

我非常喜欢使用SWI-Prolog,但如果其影响生产力,我将远离它。

我的经验是,除了增加某些问题的生产力外,某些操作的性能也比使用传统编程语言编写的工具要好得多。


0
  1. 使用Java的Prolog:Sicstus Prolog
  2. 您也可以使用CORBA

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