通常,正在使用的每种语言都因其优势而被使用。
Prolog的优点是什么?
可以比任何其他语言更有效地使用 Prolog 的一般情况/问题类别是什么?
究竟比什么呢?Prolog 实际上只是逻辑编程的卓越实现,所以如果您的问题真的是关于编程范式的比较,那确实非常广泛,您应该看这里。
如果您的问题更具体地是关于 prolog 与更常见的 OO 语言,我会争辩说您确实是在比较苹果和橘子 - “优势”(例如)只是思考世界的一种不同方式,并且有时改变提问的方式可以更好地解决问题。
基本上,如果您的程序可以很容易地表述为声明性形式逻辑语句,Prolog(或该家族中的另一种语言)将提供最快的开发时间。如果你使用一个好的 Prolog 编译器,它也会提供最好的性能和可靠性,因为引擎将有大量的设计和开发工作。
试图用另一种语言实现这种东西往往是一团糟。最干净和最通用的解决方案可能涉及实现您自己的统一引擎。即使是简单的实现也不是微不足道的,Warren Abstract Machine 已经写了一两本书,而且做得更好至少需要进行相当多的研究,阅读一些令人头疼的论文。
当然,在现实世界中,程序的关键部分可能会从 Prolog 中受益,但是使用另一种语言可以更好地处理许多其他内容。这就是为什么许多 Prolog 编译器可以与例如 C 接口的原因。
使用 Prolog 的最佳时机之一是当您遇到适合使用回溯解决的问题时。那就是当您对问题有很多可能的解决方案时,也许您希望根据某些上下文命令它们包含/排除。这暗示了很多歧义......就像在自然语言处理中一样。
将所有可能的答案写成 Prolog 子句肯定会更整洁。使用命令式语言,我认为您真正可以做的就是编写一个巨大的(真正巨大的)CASE 语句,这不太有趣。
Prolog 中固有的东西:
Paul Graham 是一个 Lisp 人,但他认为 Prolog 对 2% 的问题确实有好处,我自己喜欢将这 2% 分解并弄清楚他是如何得出这样的数字的。
他对“更好”语言的论点是“更少的代码,更多的力量”。Prolog 绝对是“更少的代码”,如果你选择它的后一种风格(类型化的),你也会获得更多的力量。使用 Prolog 时唯一困扰我的是我在列表中没有随机访问权限(没有数组)。
Prolog 是一种非常高级的编程语言。可以将 (Prolog : C) 类比为 (C : Assembler)
那为什么不用那么多呢?我认为这与我们使用的机器有关。它们基于图灵机。C 可以自动编译成字节码,但 Prolog 被编译为在抽象沃伦机器的仿真上运行,因此效率不高。
此外,prolog 基于一阶逻辑,无法以声明性方式解决每个可解决的问题,因此,在某些时候,您需要依赖类似命令式的代码。
我会说 prolog 对于知识库构成解决方案重要组成部分的问题非常有效。特别是当知识结构适合被编码为逻辑规则时。
例如,为特定问题领域编写自然语言解释器将需要该领域的大量知识。专家系统也属于这种知识驱动的范畴。
它也是探索逻辑谜题解决方案的好语言;-)
一年多以来,我一直在使用 Swi-Prolog 进行编程(为了好玩)。我认为 Prolog 的优点之一是 Prolog 没有副作用:Prolog 是一种对(本地或类成员)变量没有用的语言,它迫使程序员不使用变量。Prolog 对象没有状态。我认为。我一直在编写命令行 Prolog(没有 GUI,除了少数 XPCE 测试):它就像轨道上的火车。