【问题标题】:Are there elements of 'logic programming' in Java?Java中有“逻辑编程”的元素吗?
【发布时间】:2021-08-09 10:19:53
【问题描述】:

近年来,“函数式编程”的许多元素已经进入 Java,尤其是 Java 8。我想到了 lambda 表达式、函数式接口、Java 泛型、流接口、可选类等。

我的问题是,是否还有任何新的类/接口/语法已添加到 Java 并源于“逻辑编程”范式?或者是否有计划这样做?

(参见例如here 对这两种方法的比较)

【问题讨论】:

    标签: java logic-programming


    【解决方案1】:

    逻辑编程语言(例如 Prolog)允许将程序编写为真理陈述和它们之间的关系,因此该语言的实现本质上是一种算法,它搜索满足所有程序声明性陈述的解决方案。

    因此,Java 要支持“开箱即用”的逻辑编程,标准库必须包含这样的搜索算法。据我所知,事实并非如此。但是,有第三方库可以这样做; Google 搜索“Java logic programming library”会产生几个(constraint programming libraries 同样。)

    这些库通常将语句和关系表示为 Java 对象,并包含一个算法(或可能有几个可供选择的算法)的实现,以便搜索解决方案。考虑到这些库的可用性、复杂性和多样性,Java 标准库中似乎不太可能添加等价的东西。

    【讨论】:

    • 谢谢@kaya3!在我的搜索中添加“库”确实很有帮助,至少在鸭鸭搜索中……在我看来,SAT-solving(SAT 表示满意)也是搜索有用库的有用关键字。对于 Java 标准库的支持,我希望至少在遵循我所知道的仅支持所谓的 Horn 子句的普通 Prolog 示例时,最终会得到一些非常成熟的基本算法。但我还没有进入这个话题,所以我可能完全错了。
    【解决方案2】:

    Java 支持predicates,函数式接口接受一个参数并根据参数是否使谓词的条件为真或假而返回真或假。这类似于您链接的问题中提到的 Prolog 谓词。

    【讨论】:

    • 当然,谢谢,我应该想到这些,因为我经常使用它们。由于它们是功能接口,我的想法是把它们放在“功能”抽屉中......
    • Java 中的Predicate 函数式接口并不真正类似于Prolog 中的谓词;请参阅 OP 中链接的问答进行讨论。
    • @kaya3 我已将我的答案修改为“类似”而不是“等效”。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多