Haskell与Prolog比较

59

在哪些问题上,Prolog比Haskell更擅长解决?这两种语言的主要区别是什么?


编辑

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


2
那个新增的问题本身很好。如果有办法将gknauth的答案转移到一个新的问题中,你应该再次提问,这样两个问题都会有自己的高质量答案。 - Nathan Shively-Sanders
2
请查看Curry语言的KiCS2实现——一种支持从底层开始的逻辑编程的Haskell方言。http://www-ps.informatik.uni-kiel.de/kics2/和https://jeltsch.wordpress.com/2013/04/27/a-taste-of-curry/ - Erik Kaplun
高级语言比低级语言具有更少的确定性,并且更加声明式。在命令式-声明式谱系中:汇编语言 > C语言 > Java/C# > Lisp/ML > Haskell > Prolog > 自然语言。 - aoeu256
1
就记录而言,Prolog像Haskell一样是纯的,但在不同的意义上:https://www.metalevel.at/prolog/purity - Erik Kaplun
5个回答

41
关于逻辑库的问题:如果不存在,就应该有多种方法可以构建。《Reasoned Schemer》将逻辑推理功能集成到Scheme中。《PLAI》的第33-34章讨论了Prolog和实现Prolog。这些作者正在建立Scheme和Prolog之间的桥梁。PLT Scheme的创建者之一建立了Lazy Scheme作为其语言之一,以Haskell的惰性评估特性命名。Oleg Kiselyov的LogicT论文像往常一样非常出色——他在许多语言中推动了可能性的边界。Haskell Wiki上还有一个logic programming example

1
感谢您宝贵的回答。可惜只能选择一个最佳答案。 - danatel
1
“LogicT”似乎是一个不错的选择,我很愿意深入研究这篇论文。 - Profpatsch

37

Prolog主要是面向AI和语言领域的逻辑问题的语言。Haskell更多地是通用编程语言。

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

维基百科关于声明式编程的定义:

在计算机科学中,声明式编程是一种编程范式,它表达了计算的逻辑而不描述其控制流。它试图通过描述程序应该完成什么来最小化或消除副作用,而不是描述如何执行。这与命令式编程相反,后者需要详细描述要运行的算法。

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

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

在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据。它强调应用函数,而不是强调状态的变化,这与命令式编程风格相反。函数式编程的根源在于λ演算,这是在20世纪30年代开发的一种形式系统,用于研究函数定义、函数应用和递归。许多函数式编程语言可以看作是对λ演算的修饰。

简而言之,声明式语言声明一组关于哪些输入应该产生哪些输出的规则,并使用这些规则从输入中推导出输出,而函数式语言声明一组数学或逻辑函数,这些函数定义了输入如何转换为输出。

关于ADDED问题:我不知道有什么,但您可以将Haskell翻译成Prolog,或者在Haskell中实现Prolog :)


76
这个回答有点误导。逻辑编程语言(Prolog)和函数式编程语言(Haskell)都是“声明式编程语言”,但它们代表了不同的声明式范式方法。 - nedned
4
如果Prolog系统支持悬挂目标,那么Haskell很可能被翻译成Prolog。使用悬挂目标可以模拟惰性求值。但是这种翻译将是一个类型擦除程序,因为Prolog没有类型。 - user502187
4
对于那些刚接触Prolog的人来说,以上答案确实是一个好答案。但是要注意,Prolog目标中子句的顺序确实非常重要。因此维基百科引用的“声明式编程是一种表达计算逻辑而不描述其控制流的编程范例”可能会被误解为意味着目标中子句的顺序不重要,这是错误的。Prolog程序的控制流非常受到目标中子句的顺序影响,包括“剪红线”出现在子句中的顺序。 - Robert Oschler
2
@RobertOschler说的完全正确。 Prolog通过先例处理,其中最高的是:-和-->,因为它们定义了程序如何处理查询并为可用事实建立搜索树的规则。 Prolog从上到下读取谓词,并从左到右读取子句。 Prolog有效地是一种基于列表的语言,其中子句被分成要从左到右满足的目标。一系列目标定义了一个规则,所有目标必须满足才能应用该规则。 Prolog从列表中获取第一个目标,对其进行评估,如果为真,则继续下一个,直到列表为空。 - G_V

34

Prolog是一种逻辑编程语言,而Haskell则是一种函数式语言。函数式语言基于一个函数的概念,它接受若干参数并计算出一个值。

相比之下,Prolog没有函数的概念。相反,谓词用于证明一个“定理”。Prolog谓词不会计算一个值,它们可以回答“是”或“否”,并且可以可选地将输入变量绑定到值:

函数式和逻辑编程的实用性通常重叠。最近函数式编程已经得到了相当大的关注,而Prolog仍然是一种小众语言,这很大程度上是由于它与主流面向对象编程中常见的函数和方法的概念非常不同,往往被认为学习(非常)困难。

在Prolog中,某些问题变得几乎可以轻松实现,特别是与约束求解器结合使用。

您可以在Wikipedia上了解更多关于逻辑编程的知识。


1
感谢你宝贵的回答。只能选择一个最佳答案,有点遗憾。 - danatel
一定要同意Prolog很难学习这一点。我在两门课程中使用了它:人工智能课程中用于创建专家系统,以及解决水壶问题。在编程语言概念课程中,我们使用Prolog来处理数字问题、数据结构,所以可以看到该语言的两个方面。在编程语言中,我们使用了名为FP的Prolog方言,由讲师用Prolog编写。它将函数元素引入prolog,允许car、cdr、cons、tail/rest等操作。我们还学习了如何在命令式语言中实现自己的回溯搜索引擎。 - Tanner
@Tanner,学习编程大多数时候都很困难,因为在我看来,大多数人不会自然地思考逻辑树,而是更倾向于系统性思维,这与面向对象编程更加契合。例如,将椅子视为一个概念是很自然的,你不需要定义每个单独的椅子才能认识它。在Prolog中,解决基于树的逻辑问题非常容易实现,但使用面向对象的语言构建具有输入和输出的系统,并改变状态或返回一个可预测的结果,在我看来更容易些。 - G_V
另一方面,Prolog 没有函数。相反,谓词用于证明一个“定理”。更公正地说,谓词用于测试断言或更简单地回答关于输入的事实和可绘制的结论的问题。尽管 Prolog 给人以复杂印象,但它不需要先前的计算经验,并且对新学习者相当直观。它曾经在一些大学里被教给大一新生。现在我认为只有剑桥这样做。 - Trunk

15

你可能会发现这篇论文《Escape from Zurg: 逻辑编程练习》很有趣。它展示了在Prolog和Haskell中实现简单搜索问题的对比,并提供了一个用于更普遍地表示搜索问题的类型类框架。作者得出的结论是,在Haskell中表达这些类型的问题比在Prolog中容易,主要是因为Haskell类型系统使得更容易从状态到状态推导出良好的搜索状态和移动的表示方式。


2
我想我们可以以许多方式反驳这篇论文:类型并非高阶编程所必需(在调用/ n中我看不到任何类型),相对于Prolog,Haskell的模式匹配和结构构建可能会较慢(尚未检查),该问题可以利用CLP(<=60)(我没看到Haskell在这方面提供任何东西),等等。 - user502187
7
提到的论文中包含了由不习惯使用Prolog语言的程序员清晰编写的Prolog程序。例如:图1中的trans/4:使用了append/3。一个熟悉Prolog的程序员会把列表放在头部,使其成为常量操作,而不是每个答案都线性操作。 - false
1
一个本地Prolog - false

-10

实际上只有两种语言:

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

中间的所有其他语言都只是翻译工具,仅此而已。当我们使用机器语言时,我们必须像机器一样思考,而使用人类语言时则要像人类一样思考。

程序员的真正工作是双向思考。一些编程工具(如汇编器)迫使程序员花费更多时间像机器一样思考。而其他工具(如Prolog)则允许我们花费更多时间像人类一样思考。

在每个极端都需要付出代价,无论是性能还是成本。

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


10
如果你经常使用Prolog,你会知道你需要像一个回溯的约束解析机器一样思考,而不是像人类一样。 :) 人类根本不像Prolog那样思考,尽管可能比图灵机器更接近。 - Nathan Shively-Sanders
4
鉴于本贴的限制,或许我应该回到之前的话题 :) 你说得完全正确,关于图灵机。我曾经使用过 Prolog,并且现在仍在使用。事实上,我仍然保留着我的 Turbo Prolog 副本,保存在5.1/4英寸双面双密度软盘上,保存完好。也许我应该把它带给漫画书店老板看看。 - Square Rig Master
我对此得到-9的结果并不感到惊讶。 - PascalVKooten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接