25

随着时间的推移,函数式编程似乎对其他编程语言的影响越来越大。我们在我的 AI 课程中开始使用 Prolog,似乎有一些东西可以让非 AI 领域的编程变得更容易。我的问题是:为什么逻辑编程没有以同样的方式流行起来?

在本主题中,似乎达成了普遍共识,即逻辑编程是有用的,但必须证明这一点。它没有被视为有用的原因吗?

更新:也许我应该更清楚一点。我并不是真的在问 Prolog。我明白为什么在大多数实际应用程序中选择 Prolog 不是一个好主意。

举一个我正在谈论的更多示例,请考虑 Python 中的列表推导/映射/过滤器。这些显然受到函数式语言的影响。为什么像 Python 这样的语言还没有像函数式语言那样从逻辑编程语言中吸取这些东西?

4

13 回答 13

30

当您使用 Prolog 在计算机科学课程中学习逻辑编程时,重点不是让您成为精通的 Prolog 程序员,而是让您对其他形式的编程技术(数据结构/算法)敞开心扉。 d 之前没有考虑过。

当我开始学习计算机科学时,为了说明我的观点,我的工程学校曾经要求所有学生用 Pascal 编写他们的软件程序,但自从我毕业后,我什至从未使用过 Pascal。但是我通过选择正确的数据结构和算法学到的技能我仍然每天都在使用。

Pascal 并没有作为我所知道的语言出现在我的简历中,但它对我作为软件工程师的培训很有帮助。它的有用性不能仅通过当前生产的 Pascal 代码行数来衡量。

当您开发软件时,您会意识到,即使您没有编写一行 Prolog 代码,您有时也会重复使用您在参加过的这些“无用”Prolog 或 AI 课程中首次学习的技术.

评估一项技术(特定的编程语言、特定的软件工具/应用程序)的有用性不仅仅是评估其实际使用水平,而是评估其影响力。

如果你看看逻辑编程在专家系统、电脑游戏人工智能、空中交通管制领域以及可能相当多的其他领域(有人建议吗?)我认为它不能说是逻辑——编程还没有流行...

于 2009-03-10T14:16:32.313 回答
10

在我的编程生涯中,我花了大约 4 年的时间研究基于规则的“专家系统”,用于根据客户要求为电话交换机配置和配置硬件。

它非常成功,据我所知,10 多年后仍在日常使用。但是找到能够理解其工作原理的程序员是比开发系统本身更大的任务。

我认为这就是这种方法没有成功的原因,因为与能够理解过程和函数式编程概念的人数相比,很少有人具备基于逻辑编程的必要思维方式。

逻辑编程语言提供了一种机制,用于将事实和推理规则输入“推理引擎”,然后启动该“推理引擎”以将规则应用于给定的事实以产生新的事实。特定逻辑语言的成败取决于其特定推理引擎的实力。

Prolog 的推理引擎的实现非常幼稚,效率非常低。只需在循环中编写大量 if 语句,在大多数过程语言中就可以更有效地解决相同的问题。

我们为“配置器”选择的语言是 DEC 的 RuleWorks,它是对更广为人知的 OPS5 语言的改进。这有一个基于Rete 算法的推理引擎,这使得它比程序方法更有效。

自从 DEC 被 Compaq 吞并被 HP 吞并后,RuleWorks 已经开源,可以从这个网页获得。

遗憾的是,人们对这些技术没有更多的兴趣,因为它们可以非常有效地解决各种原本难以解决的问题。

于 2009-03-14T09:54:04.973 回答
8

我对普通 Prolog 的印象是它是一种玩具语言。这并不是说逻辑编程没有用。例如,在Twelf中,可以很容易地为简单的编程语言声明语义,并让声明充当解释器。我还听说过一些关于λProlog的好消息。

我认为尝试将逻辑编程语言用作通用语言的问题是某些任务不太适合这个概念。我认为逻辑编程特性需要整合到一种同时具有命令式和函数式构造的语言中。至少有一种这样的语言:Oz,但我还没有尝试过。

编辑:有一个想法我想尝试一段时间:将关系数据库作为原子提供给 Prolog,并使用它来执行查询而不是 SQL。我觉得这将是对 SQL 的巨大改进。

于 2009-03-10T13:41:57.670 回答
8

我最近在一个游戏设计 AI 研究项目中使用了一堆逻辑编程(预告视频!),但我的逻辑繁重的项目中至少有一半是实现基本游戏引擎的函数式或命令式 Scala 代码。 编程的重点,如果我可以这么说的话,就是让机器对你想要的东西的理解与你自己的同步——而大多数同步需要在某种程度上给出你想要的东西的命令式细节完毕。那些愚蠢的机器总是那么的字面意思……

逻辑编程,无论是传统的、演绎的、序言风格的东西,还是更具异国情调的归纳逻辑编程或答案集编程风格,都以能够轻松传达命令式知识(这在现实世界的应用程序中总是需要某个地方)。有时,交互式应用程序的顾虑会使您在表达命令式知识时的工作效率受到最轻微的影响,这是不可接受的。以逻辑编程风格编写整个游戏引擎总是一个坏主意(同样使用具有相同计算能力的 perl 兼容正则表达式来尝试它)。在混合语言中(或者可以让你轻松嵌入逻辑解释器的语言)你可以两全其美(我用过jTrolog将 Prolog 嵌入到我的 Scala 引擎中,形成各种多范式 voltron)。

我认为逻辑编程肯定会更受欢迎和更容易理解,但是从某种意义上说,纯逻辑编程在“流行”方面并不能比 SQL 或正则表达式做得更好,因为它的魔力来自于带走你的命令式表达(理想情况下,让您不会迷失在不重要的细节中)。这种解释几乎同样适用于函数式编程。我喜欢逻辑编程,但这只是因为我可以选择何时使用它。最好的前进方式似乎是以一致、精心设计的方式呈现选择的混合语言。

于 2009-04-30T03:58:44.603 回答
7

我对 Prolog 的第一个问题是它不是一种逻辑编程语言。它缺乏“真”、“假”和“不知道”的三值标准逻辑,将后两者混为一谈。也就是说,这两个真值实际上是“可以显示”和“不能显示”。这给 Prolog 的“非”概念带来了真正的问题,这对于逻辑推理来说是非常基本的。

在正常逻辑中,通过否定命题来证明命题是完全合理的,这被称为“reductio ad absurdum”。(是的,有些人试图在不使用它的情况下重建数学,但这有点深奥。)这在 Prolog 中根本不起作用,因为证明错误和未证明任何东西之间没有区别。

因此,当我在 Prolog 中做一个课堂项目时,每当我认为它是编程逻辑时,我就遇到了麻烦。我总是会做一些需要实际否定的事情。也许其他人不这样做,但我最终认为它是一种模式匹配语言,然后完成项目几乎没有困难。

不可能有一个真正的基于逻辑的语言,程序员可以编写东西并真正依赖结果。一阶谓词演算(即,具有变量的逻辑、真或假函数、“和”、“或”、“非”、“对于所有”和“存在”)是肯定不可判定的。(毕竟,我们不断向数学家倒咖啡而不是机械地生成所有可能的定理是有原因的。)即使程序员已经知道,程序员也无法先验地知道给定命题是否会被证明它是真还是假。

编辑:我也忘记了正确排序条款的关键必要性。在逻辑上,你写下东西的顺序并不重要。在 Prolog 中,我不断陷入无限循环,直到我不再将其视为基于逻辑的语言。同样,它作为一种模式匹配语言有一些不错的特性,但它不符合逻辑,在我看来,它就像一门语言中的一匹小马。YMMV,但其他一些人似乎同意我的观点。

于 2009-03-10T13:38:42.870 回答
7

当我们学习 prolog 时(仅在编程语言课上学习了几周,所以我几乎不是专家),教授还指出,根据您的定义,逻辑编程实际上可能根本不是编程。

当我们说编程时,我们通常指的是“向计算机发出一系列任务或指令”之类的东西。这就是命令式或函数式编程语言所做的。这就是每一种“真正的”编程语言所做的。Prolog 或逻辑编程并没有真正做到这一点。它更像是 SQL。您可以向计算机提出很多问题。它会根据您之前提供的数据尽其所能回答,但与其他编程范例不同,您并没有真正告诉计算机该做什么。

它只是非常专业,不适合通用编程。而且它专门用于的东西并不经常需要。

另一方面,函数式编程绝对是通用编程,可以用于任何事情,没有大问题。这就是为什么后者正在流行,而逻辑编程却没有。我认为... :)

于 2009-03-10T14:13:34.240 回答
4

函数式编程变得越来越流行,因为它在应用于多线程编程时具有一些重要的好处,并且随着我们越来越多地转向多核处理器,多头编程将变得越来越重要。

于 2009-03-10T13:02:14.020 回答
3

根据我自己使用 Prolog 的经验,它非常适合特定任务,但作为一种通用编程语言,在我看来它根本不像许多其他语言那样灵活。

于 2009-03-10T12:56:01.883 回答
3

事实上,Prolog 非常适合特定任务,但在我 11 年的工作经验中,我从来没有遇到过 Prolog 是最佳解决方案的问题。只是 Prolog 理想的问题非常罕见。

于 2009-03-10T13:18:20.643 回答
3

当我在大学的 AI 课程中学习 Prolog 时,我发现它绝对令人着迷,但我只能想到今天在 AI 之外使用它的少数几种情况。即使在那些情况下,我也不愿意使用它。我花了很长时间才最终“获得” Prolog,当我这样做时,我认为它很棒,但我立即发现它的用处有限。

尽管如此,我还是强烈建议学习它,如果没有其他原因,只是为了学习以另一种不同的方式进行编程。能够从许多不同的角度看待问题绝对会让你成为一个更好的程序员。

于 2009-03-10T13:36:30.910 回答
2

这是为工作使用正确工具的标准案例。您确实会在某些情况下看到逻辑编程:它们通常被称为基于规则或专家系统之类的东西。

在您的可计算性理论课程中,您将讨论所有这些通用语言实际上是等效的这一事实(从数学的角度来看)。然而,原型设计和长期开发是非常不同的领域。因此,在基于规则的系统中,您完全有可能使用 Prolog 之类的东西来制定规则集(如果这对您很有效),然后在您的交付平台(例如 Java)上实现最终系统。

顺便说一句,我一直很喜欢 Prolog 对几乎所有事情的回答都是“不”的方式。

于 2009-03-10T13:49:48.383 回答
1

您在AI课程中开始使用 Prolog 的事实应该是一个提示。人工智能也没有很好地流行起来。

我记得在 80 年代挑战一位教授展示 AI 的重要用途(好吧,“嘲笑”是一个更准确的术语,但那时我还年轻)。当时他做不到,今天,我怀疑他在教书大约是他当时大肆宣传的人工智能应用程序的 1/10。

也许这同样适用于 Prolog。我不记得上次看到一家公司寻求 Prolog 经验是什么时候了。也许从来没有,或者也许我看到它并忽略了它。

于 2009-03-10T13:31:18.943 回答
1

在这个讨论线程中有调用真正声明性的逻辑编程语言(语句可以按任何顺序进行),并且可以用于查询数据库作为 SQL 的替代品。

Datalog正是您所寻找的。例如,它用于数据集成、安全应用程序和程序分析。

于 2012-10-28T10:19:02.783 回答