Java的嵌入式Prolog解释器/编译器
Posted
技术标签:
【中文标题】Java的嵌入式Prolog解释器/编译器【英文标题】:Embedded Prolog Interpreter/Compiler for Java 【发布时间】:2010-12-21 11:32:39 【问题描述】:我正在开发一个 Java 应用程序,它需要执行一些复杂的逻辑规则推导作为其功能的一部分。我想用 Prolog 或其他一些逻辑/约束编程语言而不是 Java 来编写我的逻辑推导,因为我相信生成的代码会更简单且更易于维护。
我用谷歌搜索了 Prolog 上的嵌入式 Java 实现,发现其中有很多,每个都有很少的文档。我的(适度的)选择标准是:
应该可以嵌入到 Java 中(例如,可以与我的 java 包捆绑在一起,而不需要在外部程序上进行任何本机安装) 从 Java 中使用的简单接口(用于启动推理、检查结果和添加规则) 至少提供几个使用示例 不一定是 Prolog,但其他符合上述标准的逻辑/约束编程语言也可以满足我的需求。我有哪些选择,它们的优缺点是什么?
【问题讨论】:
我从未使用过 Prolog-in-Java,但另一种选择是自己编写。我知道至少有 2 本 Lisp 书籍在不多的页面(关于 Lisp 和 PAIP)中做到了这一点,所以即使在 Java 中也不会那么那么难。 当然,您可以在几页代码中制作一种玩具逻辑编程语言,但我正在寻找更强大的东西。现在,你也可以在几页代码中做一个玩具 lisp,所以我想我只需要四页就可以了:-) 那些是你乱扔的一些加载词!我不确定是什么让小型 Prolog 实现成为“玩具”,或者它们以何种方式不够“强大”。 Norvig 的一课是“Prolog 在要点上与 Lisp 相似”;那么,一个小小的 Prolog-on-Lisp 就不是一个“玩具”,而是一个不同的编译器 UI。在 Java 中它不会那么有趣,但我不认为他在使用宏时做的那么。 1.没有图书馆。 2.没有语法。在使用 Lisp 时,您可以重用 Lisp 语法和 Lisp 库(“Prolog 在要点上类似于 Lisp”),而 Java 则不然。相反,您最终还必须实现解析器和库。此外,即使使用 Lisp 实现,由于不使用 Prolog 语法和库,您也无法使用任何外部可用的 Prolog 库。 当然,您可以声称您可以像使用匿名对象而不是闭包一样重用 Java 语法和库。但是任何有函数式编程经验的人都知道,语法的复杂性和冗长只会让这几乎只是一个痛苦的练习。 【参考方案1】:根据Wikipedia,以下版本的Prolog都有Java接口。我已经链接到他们的主页:
BProlog Ciao Prolog SICStus Prolog SWI Prolog TuProlog(用 Java 实现) LPA Prolog祝您搜索顺利!
【讨论】:
TuProlog 似乎是其中唯一一个不需要先安装任何外部应用程序的。我会调查的。谢谢。 我非常喜欢 TuProlog。文档可能不是那么热门,但实现非常好,而且正如您所说,它不需要混淆。 ***列出了更多具有 Java 接口的 Prolog 系统:JIProlog、Jekejeke Prolog、JLog、jTrolog、XSB Prolog、YAP Prolog。 TuProlog 很棒,可以嵌入,而且非常灵活。我已将其移植到 android。【参考方案2】:SWI prolog 一个非常流行的实现似乎有一个Java interface as does SiCStus,它比使用JNI 在Java 进程中实例化一个实例更容易。我很久以前就使用过 C 语言并推荐它们。我的偏好是 SWI,因为它是开源的,并且根据我的经验 de facto 实现。
SWI 的 Java 接口的文档似乎足够了,嵌入过程也相当简单。
【讨论】:
SWI Prolog 和 SiCStus 需要本地安装才能从 Java 中使用。 我确信您可以打包可执行文件或 DLL 以包含在您的 JAR 文件中。 SWI 最初是一个 unix 应用程序,所以我认为它不会执行实际安装程序所需的操作——即更改注册表或安装 com 对象。【参考方案3】:两年前我也需要这样做。我用SWI interface which is called JPL。它允许您加载 Prolog 文件,对其进行断言和查询。它确实需要安装 SWI Prolog,但这根本不是问题。 SWI Prolog 是available for many platforms。
我还尝试了 100% 用 Java 实现且不需要外部程序的替代方案。所有这些都是越野车或难以使用。不要浪费你的时间。
【讨论】:
【参考方案4】:Clojure 是一种基于 JVM 的类 Lisp 语言,其库 (core.logic) 支持基于逻辑和约束的编程。 Clojure 还有大量用于生成 java 类和working with java code 的工具,因此两种语言之间的互操作是微不足道的。
【讨论】:
【参考方案5】:Amzi prolog 已经存在了一段时间。我已经简单地使用了它,但没有使用嵌入式版本。但是他们确实有很好的文档,并且可以购买支持。他们有 Java 端口,所以可能值得一看。
【讨论】:
【参考方案6】:LPA 确实提供 LPA 智能服务器,作为将其 Prolog 引擎嵌入各种主流语言(包括 Java、.Net 等)的一种方式
克莱夫
http://www.lpa.co.uk/int.htm
【讨论】:
【参考方案7】:两个用 Java 编写的商业 Prolog:IF Computer Japan 的 Minerva 和 Jekejeke。两者都非常接近 ISO。
【讨论】:
【参考方案8】:您还可以查看我创建的the Prol engine。它允许您将 Prolog 嵌入到您的 Java 程序中(但速度不是很快)
【讨论】:
【参考方案9】:教授。 Paul Tarau 从his page 提供了几个实现
Jinni Prolog
Kernel Prolog
【讨论】:
【参考方案10】:Prova 3.0 http://www.prova.ws 即将完成。然而,它不仅仅是另一个 Prolog,而是编程风格的混合体,特别适用于简单的双向 Java 集成、反应式代理编程、与 ESB 的集成、工作流逻辑和事件处理。此版本是从零开始完全重写的,因此缺少一些较旧的功能,例如 OWL 集成,但一定会在下一个版本中返回。
【讨论】:
【参考方案11】:有 Mini-Kanren for Scala,它为您提供了一种精简、可破解、基于现代 Horn 子句的逻辑编程语言的本机 JVM 实现。
【讨论】:
【参考方案12】:我最近遇到的另一个有价值的选择是 JSetL。这不是Prolog,而是 Java的约束编程库,支持逻辑变量, 统一、约束解决和非确定性。
http://prmat.math.unipr.it/~gianfr/JSetL/index.html
【讨论】:
【参考方案13】:Java 中有许多 Prolog 实现。它们不是非常快,但在 Java 中使用起来很方便。 例子是: TuProlog 或 PrologCafe 您还可以查看以下有关以下主题的学士论文 Execution and Analysis of Prolog Programs in Java.
【讨论】:
以上是关于Java的嵌入式Prolog解释器/编译器的主要内容,如果未能解决你的问题,请参考以下文章