Haskell与Prolog的比较

在Prolog中比在Haskell中更好的解决什么样的问题? 这两种语言的主要区别是什么?


编辑

是否有一个Haskell库(一种逻辑解算器),可以模仿Prolog的function?

Prolog主要是针对逻辑问题的语言,尤其是AI和语言领域。 Haskell更多是一种通用语言。

Prolog是声明式的(逻辑)语言,它使得逻辑问题变得更容易。 Haskell是一种function性语言,因此更适合计算问题。

维基百科声明式编程:

在计算机科学中,声明式编程是一种expression计算逻辑而不描述控制stream程的编程范式。 它试图通过描述程序应该完成什么来减less或消除副作用,而不是描述如何去完成它。 这与命令式编程相反,这需要对要运行的algorithm进行详细的描述。

声明式编程认为程序是forms逻辑的理论,计算是逻辑空间中的推理。 声明式编程最近变得特别令人感兴趣,因为它大大简化了编写并行程序。

维基百科关于函数式编程:

在计算机科学中,函数式编程是一种将计算看作是math函数的评估并避免状态和可变数据的编程范例。 它强调function的应用,与强调状态变化的命令式编程风格形成鲜明对比。 函数式编程的根源在于lambda演算,这是20世纪30年代为了研究函数定义,函数应用和recursion而开发的一个正式系统。 许多函数式编程语言可以被看作lambda微积分的修饰。

简而言之,声明性语言声明了一组规则,规定哪些输出应该从哪些input中得到,并使用这些规则从input中推导出输出,而函数式语言则声明一组math或逻辑函数,这些函数定义input如何转换为输出。


至于ADDED问题:我所知道的都不是,但是你可以把 Haskell 翻译成Prolog,或者在Haskell中实现 Prolog。

关于逻辑库问题:如果不存在,应该可以用多种方式来构build。 Reasoned Schemer在Scheme中构build逻辑推理能力。 PLAI的第33-34章讨论Prolog和实现Prolog。 这些作者正在构buildScheme和Prolog之间的桥梁。 PLT计划的创build者已经在Haskell的懒惰评估特性之后,将其作为他们的语言之一构build了一个Lazy Scheme 。 Oleg Kiselyov的LogicT论文像往常一样出色 – 他推动了许多语言的可能性。 Haskell Wiki也有一个逻辑编程的例子 。

  • Daniel P. Friedman,William E. Byrd和Oleg Kiselyov的“Reasoned Schemer”
  • 编程语言: Shriram Krishnamurthi的应用和解释
  • LogicT – 回溯monad变压器公平的操作和修剪
  • 在Haskell Wiki上进行逻辑编程

Prolog是一种逻辑编程语言,而Haskell是一种function语言。 函数式语言是基于一个函数的概念,它需要大量的参数和计算一个值。

另一方面,Prolog没有function。 相反, 谓词被用来certificate一个“定理”。 Prolog谓词不计算值,他们可以回答“是”或“否”,并可以将inputvariables绑定到值:

function和逻辑编程的用处往往是重叠的。 函数式编程最近已经获得了相当多的推动力,而Prolog仍然是一个小众语言,这很大程度上是因为它比function编程和主streamOOP的function和方法的通用概念有很大的不同, (非常)难以学习。

在Prolog中实现某些问题几乎是微不足道的,尤其是与约束求解器结合使用。

你可以阅读更多关于维基百科上的逻辑编程。

你可能会发现从Zurg逃离的论文:一个逻辑编程练习一个有趣的阅读。 它展示了Prolog和Haskell中简单search问题实现的并行比较,以及更一般地表示search问题的小types框架。 作者所得出的结论是,在Haskell中至lessexpression这些types的问题要比在Prolog中容易一些,主要是因为Haskelltypes系统更容易提出search状态的良好表示并从状态转移到状态。

实际上只有两种语言:

  1. 机器语言
  2. 人类的语言。

其他所有的语言都只是译者而已。 当我们使用机器语言时,我们必须像机器一样思考,当使用人类语言时,我们像人类一样思考。

程序员的真正工作就是双向思考。 像汇编程序这样的编程工具迫使程序员花更多时间思考机器。 像Prolog这样的其他工具可以让我们花更多时间像人一样思考。

无论是在performance还是在成本上,每一个极端都要付出代价。

如果您的应用程序的业务逻辑可以简化为一组规则,并将其输出到一组目标(例如编写一个国际象棋游戏),那么Prolog是理想的。 另一方面,如果您需要接受input并告诉计算机如何计算输出,那么函数式语言会更合适。