Haskell与Prolog的比较

dan*_*tel 51 haskell prolog

在Prolog中比在Haskell中更好地解决了哪些问题?这两种语言之间的主要区别是什么?


编辑

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

gkn*_*uth 37

关于逻辑库问题:如果它不存在,应该可以通过各种方式构建一个.在合理的策士建立逻辑推理能力到方案.PLAI的第33-34章讨论Prolog并实施Prolog.这些作者正在构建Scheme和Prolog之间的桥梁.在Haskell的惰性评估功能之后,PLT Scheme的创建者将其作为一种语言构建为一种懒惰方案.Oleg Kiselyov的LogicT论文像往常一样辉煌 - 他推动了许多语言的可能性.Haskell Wiki上还有一个逻辑编程示例.


Kor*_*icz 32

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

Prolog是声明性(逻辑)语言,它更容易在其中陈述逻辑问题.Haskell是一种函数式语言,因此更适合于计算问题.

关于声明性编程的维基百科:

在计算机科学中,声明性编程是一种编程范式,它在不描述其控制流的情况下表达计算的逻辑.它试图通过描述程序应该完成的内容来最小化或消除副作用,而不是描述如何完成它.这与命令式编程形成对比,命令式编程需要运行算法的详细描述.

声明性编程将程序视为形式逻辑的理论,并将计算视为逻辑空间中的推论.声明性编程最近变得特别令人感兴趣,因为它可以极大地简化编写并行程序.

维基百科的函数式编程:

在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据.它强调功能的应用,与强调状态变化的命令式编程风格形成对比.函数式编程的根源在于lambda演算,这是一个在20世纪30年代开发的用于研究函数定义,函数应用和递归的正式系统.许多函数式编程语言可以被视为lambda演算的装饰.

简而言之,声明性语言声明了一组关于哪些输出应该来自哪些输入并使用这些规则来推导输入的输出的规则,而功能语言则声明一组数学或逻辑函数,这些函数定义输入如何转换为输出.


至于ADDED问题:我不知道但你可以 Haskell 翻译成Prolog,或者在Haskell中实现 Prolog :)

  • 这个答案有点误导.逻辑编程(Prolog)和函数编程(Haskell)都是*声明性编程语言,但它们代表了声明性范例的不同方法. (62认同)
  • 如果Prolog系统支持暂停目标,Haskell最有可能被翻译成Prolog.通过暂停目标,我们可以模拟懒惰评估.但翻译将是一种类型删除程序,因为Prolog没有类型. (4认同)
  • 对于那些刚接触Prolog的人来说,上面的答案确实是一个很好的答案.但请注意,Prolog目标中的条款顺序确实很重要.因此,维基百科引用"声明性编程是一种编程范式,表达计算的逻辑而不描述其控制流"可能被误解为意味着目标中的子句的顺序无关紧要,这是错误的.Prolog程序的控制流程受到目标中子句顺序的影响很大,包括"红色"剪辑在子句中出现的顺序. (3认同)
  • @RobertOschler所说的是100%真实.Prolog按先例进行处理,其中最高的是: - 和 - >因为它们定义了程序如何处理查询并为可用事实构建搜索树的规则.Prolog从上到下读取谓词,从左到右读取子句.Prolog实际上是一种基于列表的语言,其中子句被分成从左到右满足的目标.目标列表定义了一个规则,其中必须满足所有目标才能应用规则.Prolog从列表中获取第一个目标,对其进行评估,如果为true,则在列表为空之前采用下一个目标 (2认同)

Jes*_*erE 31

Prolog是一种逻辑编程语言,而Haskell是一种函数式语言.函数式语言基于函数的概念,该函数接受大量参数并计算值.

另一方面,Prolog没有功能.相反,谓词用于证明"定理".Prolog谓词不计算值,它们可以回答"是"或"否",并可选择将输入变量绑定到值:

功能和逻辑编程的有用性经常重叠.函数式编程最近获得了相当大的吸引力,而Prolog仍然是一种小众语言,很大程度上是因为它与主流OOP的函数和方法的常见概念比函数式编程更加不同,而且经常被认为是(非常)难学.

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

您可以在Wikipedia上阅读有关逻辑编程的更多信息.


Ian*_*oss 11

您可能会发现" 逃离Zurg:逻辑编程中练习 "这篇论文是一本有趣的读物.它显示了Prolog和Haskell中简单搜索问题的实现的并排比较,以及用于更一般地表示搜索问题的小型类型框架.作者得出的结论是,在Haskell中至少表达一些类型的问题比在Prolog中更容易,主要是因为Haskell类型系统使得更容易提出搜索状态的良好表示并从一个状态转移到另一个状态.

  • 提到的论文包含Prolog程序,这些程序清楚地由不习惯Prolog语言的程序员编写.示例:使用图1,`trans/4`:`append/3`.Prolog程序员会将列表放入头部,使其成为一个常量操作,而不是每个答案的线性操作. (6认同)
  • 我想我们可以通过多种方式反驳论文:高阶编程不需要类型(我没有看到调用/ n中的任何类型),与Prolog相比,Haskell模式匹配和结构构建可能比较慢(没有检查它还没有),问题可以使用CLP(<= 60)(我没有看到Haskell在这里提供任何东西),等等. (2认同)