你能用Scala进行逻辑编程吗?

Ale*_*x R 15 language-features programming-languages scala prolog logic-programming

我在某处看到,Scala中匹配/案例功能支持的模式匹配实际上是从Prolog这样的逻辑语言中借用的.

您能否使用Scala优雅地解决连接图问题等问题?例如https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html

Dan*_*ral 12

不,你不能这样做,除非你真的创建了一个逻辑引擎,这种方式违背了整个目的.

此外,由于许多原因,模式匹配本身完全不适用于此.例如,考虑基本查询本身:path(1, 5, P).在Scala的模式匹配中,1,5和P是输出.您无法提供可用于生成输出的输入.

对于Prolog,这就像假设1和5是固定的,P可能具有哪些可能值?这就是现在模式匹配的工作原理.

编辑: 使用Scala 2.10,模式匹配现在被编译为像for-comprehensions一样的中间操作,然后进一步优化默认转换.但是,可以定义自己的类来处理模式匹配,我已经看到它用于实现prolog登录 - 虽然我找不到链接,抱歉.

  • @Alex不,它不能. (5认同)
  • @DaveGriffith对我来说完全没有辱骂.解析器组合器完成所有这些:对回溯的理解. (3认同)

Ros*_*son 6

请参阅http://kanren.sourceforge.net/,了解功能和逻辑编程如何相距甚远.流结构是理解两种范式如何结合在一起的关键.通过将标准函数"提升"为流/逻辑格式,它们可以表现出与Prolog非常相似的解决问题的行为.

您还应该查看解析器组合器.有了正确的组合器,就可以实现高效的Prolog类解决方案.


fed*_*lva 6

我知道我迟到但是正在搜索:kanren我发现了这个[死链接]还有这个:http://code.google.com/p/scalalogic/

我只是在研究这个主题,只是对它有一个非常暗淡的理解,但这些链接无论如何都可能有一些兴趣.

  • 仅供参考,第一个链接现在将您带到 AdultFriendFinder。耶链接腐烂。 (2认同)

小智 6

Haskell和函数式编程语言一直是Scala灵感的直接来源.从这些语言继承的应用程序之一是域特定语言(DSL)的开发.在Haskell中有很多用于逻辑编程(Prolog)的DSL.将这样的DSL库移植到Scala应该是非常可能的,如果尚未发生的话.


fal*_*lse 5

对您问题的传统回答会概述逻辑变量不能直接用假设一切都是值的语言来建模。

然而,有一种相对较新的方法可以将逻辑变量映射到函数结构。在具体情况下,接近 Prolog 的逻辑语言 Curry 被翻译为 Haskell。这种方法的不同寻常之处在于,逻辑变量是通过惰性建模的。有关更多信息,请参阅KiCS2:从 Curry 到 Haskell 的新编译器。也许lazy val可以用于此目的。