你能用Scala做逻辑编程吗?

你能用Scala做逻辑编程吗?,scala,programming-languages,prolog,language-features,logic-programming,curry,Scala,Programming Languages,Prolog,Language Features,Logic Programming,Curry,我在某个地方读到,Scala中match/case特性所支持的模式匹配实际上是从Prolog这样的逻辑语言中借来的 你能用Scala优雅地解决像连通图这样的问题吗? e、 g.不,你不能这样做,除非你真的创建了一个逻辑引擎,这会破坏整个目的 此外,由于许多原因,模式匹配本身完全不适合这样做。例如,考虑基本查询本身:路径(1, 5,p)< /代码>。在Scala的模式匹配中,1、5和P是输出。无法提供可用于生成输出的输入 对于Prolog,这就像,假设1和5是固定的,那么p会有什么可能的值?这就是

我在某个地方读到,Scala中match/case特性所支持的模式匹配实际上是从Prolog这样的逻辑语言中借来的

你能用Scala优雅地解决像连通图这样的问题吗?
e、 g.

不,你不能这样做,除非你真的创建了一个逻辑引擎,这会破坏整个目的

此外,由于许多原因,模式匹配本身完全不适合这样做。例如,考虑基本查询本身:<代码>路径(1, 5,p)< /代码>。在Scala的模式匹配中,1、5和P是输出。无法提供可用于生成输出的输入

对于Prolog,这就像,假设1和5是固定的,那么p会有什么可能的值?这就是模式匹配的工作原理


编辑:使用Scala 2.10,模式匹配现在被编译为一个中间操作,就像理解操作一样,然后进一步优化默认翻译。但是,您可以定义自己的类来处理模式匹配,我已经看到它用于实现prolog登录——尽管我找不到链接,抱歉。

Scala不是逻辑编程语言,但您确实可以在Scala中为逻辑编程定义DSL。请注意,Scala从函数式编程中借用了很多概念——它可以而且应该以函数式风格使用。函数式编程和逻辑编程都是声明式的,但有很大的不同。您可以阅读更多信息。

有关函数式编程和逻辑式编程之间的差距如何缩小的详细信息,请参阅。流结构是理解这两种范式如何结合的关键。通过将标准函数“提升”为流/逻辑格式,它们可以表现出与Prolog非常相似的问题解决行为


您还应该了解解析器组合器。有了正确的组合器,就有可能实现高效的Prolog式求解功能

我知道我迟到了,但在搜索re:kanren时我发现了这个[死链接]还有这个:


我只是在研究这个主题,对它的理解非常模糊,但这些链接可能会引起一些兴趣。

Haskell和函数式编程语言是Scala灵感的直接来源。从这些语言继承下来的应用程序之一是领域特定语言(DSL)的开发。Haskell中有很多用于逻辑编程(Prolog)的DSL。如果还没有实现的话,将这样一个DSL库移植到Scala应该是完全可能的。

刚刚在Scala中找到了一个很好的Prolog实现。不幸的是,我没有时间尝试它,因此我的印象仅基于查看可在此处找到的源代码:

上面提到了几个测试程序。Prolog解释器是用Scala编写的,因此Prolog子句可以作为Scala中编写的Scala对象嵌入。我不完全理解它背后的魔力,下面是一个如何编写tak函数的示例:

tak('X, 'Y, 'Z, 'A) :- (
 'X =< 'Y, CUT, 'Z === 'A)
tak('X, 'Y, 'Z, 'A) :- (
 'X1 is 'X - 1,
 'Y1 is 'Y - 1,
 'Z1 is 'Z - 1,
 tak('X1, 'Y, 'Z, 'A1),
 tak('Y1, 'Z, 'X, 'A2),
 tak('Z1, 'X, 'Y, 'A3),
 tak('A1, 'A2, 'A3, 'A)
)
tak('X,'Y,'Z,'A):-(
“X=<”Y,切,“Z=”A)
tak('X,'Y,'Z,'A):-(
"X1是"X-1",,
“Y1是”Y-1,
'Z1是'Z-1,
tak('X1,'Y,'Z,'A1),
tak('Y1,'Z,'X,'A2),
tak('Z1,'X,'Y,'A3),
tak('A1,'A2,'A3,'A)
)
我猜它是通过延续进行回溯的,并且有自己的特点 一个可变环境的实现和统一

如果您查看代码,例如unifyTerm,您将看到它 大量使用模式匹配,这使Scala成为一种特殊的 实现逻辑引擎的位置


请注意,模式匹配本身并不能直接用于逻辑编程,因为它是用Scala编写的相当完整的Prolog解释器, 源于内核Prolog(参见Fluents:Prolog的重构 中与外部对象的一致反射和互操作 CL'2000)

真正的开源(Apache许可证)代码位于:

它的设计考虑到了简单性和可扩展性 这对于尝试新的Prolog扩展的人来说是很有用的 或其他逻辑编程语言

Styla使用了一些Java中没有的Scala产品:

  • 高阶函数、映射、折叠、事例类等
  • 组合分析器-“穷人的DCG”
  • Scala的优雅隐式转换 列表、数组、序列等
  • Scala的任意长度整数和小数(带 一种自然的语法(与Java不同)
  • Scala的“…”字符串-用于正则表达式和嵌入 直接在Scala类中编写Prolog代码
  • Scala中提供的一些IO抽象 将文件操作视为迭代器- 一个自然的匹配,为原始的音乐 Styla是从中派生出来的基于Java的内核Prolog

(文本摘自:)

您还可以看看scampi(Scala中的约束编程求解器):Jacop CP solver也有一个Scala API。

对您的问题的传统答案是,逻辑变量不能直接用一种假设一切都是值的语言建模

然而,有一种相对较新的方法将逻辑变量映射到函数结构。在具体的例子中,接近Prolog的逻辑语言Curry被翻译成Haskell。这种方法非常不寻常的一点是,逻辑变量是用懒散来建模的。有关更多信息,请参阅。也许可以使用lazy val来达到这个目的。

我发现这是类似Prolog的系统实现方法的源代码,而不是未记录的源代码或神秘的库

但是几天前我才对Scala感兴趣,所以问了同样的关于用户的问题。Scala:

实现统一回溯的语言应该是生成器函数,它可以在函数执行过程中返回并保留计算。同样的效果也可能发生