为什么逻辑编程没有流行?

时间:2009-03-10 12:54:01

标签: programming-languages prolog logic-programming

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

在这个topic中,似乎达成了一个普遍的共识,即逻辑编程是有用的,但必须这样证明。有没有理由认为它没有用?

更新:也许我应该更清楚一点。我不是在问Prolog。我可以理解为什么在大多数实际应用中选择Prolog不是一个好主意。

为了举一个我正在讨论的内容的例子,请考虑Python中的列表推导/ map / filter。这些明显受功能语言的影响。为什么像Python这样的语言还没有从逻辑编程语言中学到这些东西,比如它们有函数式语言?

13 个答案:

答案 0 :(得分:30)

当您使用Prolog学习计算机科学课程中的逻辑编程时,重点不是让您成为一名精通Prolog的程序员,而是要开始思考其他形式的编程技术(数据结构/算法)你以前没有考虑过。

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

Pascal并没有出现在我的简历上作为我所知道的语言,但它在我作为软件工程师的培训中发挥了重要作用。它的用处不仅可以通过当前生产的Pascal代码行来衡量。

当你开发软件时,你会意识到,即使你没有编写一行Prolog代码,你有时会重新使用你可能在这些“无用的”Prolog或AI中学到的技术。你上过的课程。

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

如果你看一下逻辑编程在专家系统,电脑游戏人工智能,空中交通管制等领域的影响,可能还有很多其他领域(建议任何人?)我不认为它可以是说逻辑编程没有流行......

答案 1 :(得分:10)

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

这是非常成功的,据我所知,十多年后仍然在日常使用。但找到能够理解它如何工作的程序员比开发系统本身更重要。

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

逻辑编程语言提供了一种机制,用于将事实和推理规则提供给“推理引擎”,然后将其引入运动以将规则应用于给定的事实以产生新的事实。特定的逻辑语言代表或依赖于它的特定推理引擎。

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

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

由于DEC遭到了被惠普吞噬的康柏的吞噬,RuleWorks已成为开源的并获得from this web page

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

答案 2 :(得分:8)

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

我认为在尝试将逻辑编程语言用作通用语言时遇到的问题是某些任务不能很好地适应这个概念。我认为逻辑编程特性需要被整合到一种语言中,这种语言也具有命令性和功能性的结构。至少有一种这样的语言:Oz,但我还没有尝试过。

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

答案 3 :(得分:8)

我最近在游戏设计AI研究项目中使用了一堆逻辑编程(teaser video!),但至少有一半的逻辑重大项目是实现基本游戏引擎的功能或命令式Scala代码。 编程点,如果我可以声称这样的话,是让机器理解你想要与自己同步的东西 - 并且大多数同步是< em>要求在某种程度上提供命令式详细信息,说明您希望如何完成任务。那些愚蠢的机器总是那么字面......

逻辑编程,无论是传统的,演绎的,序言式的,还是更具异国情调的归纳逻辑编程或答案集编程风格,都能以一定的方式为一些问题提供大量的杠杆作用,代价是能够轻松地传达命令知识(在现实世界的应用程序中总是需要某处)。有时,交互式应用程序的关注点会使您的工作效率受到最轻微的打击,从而表达不可接受的命令性知识。以逻辑编程风格编写整个游戏引擎总是一个坏主意(同样使用具有相同计算能力的perl兼容正则表达式来尝试它)。在混合语言中(或者允许您轻松嵌入逻辑解释器的语言),您可以充分利用这两个世界(我使用jTrolog将Prolog嵌入我的Scala引擎中,形成了多种范式的vol范围)

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

答案 4 :(得分:7)

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

在正常逻辑中,通过反驳其否定来证明命题是完全合理的,这被称为“减少荒谬”。 (是的,有些人试图在不使用数学的情况下重建数学,但这有点深奥。)这在Prolog中根本不起作用,因为在证明虚假和未证明任何事物之间没有区别。

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

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

编辑:我也忘记了正确订购条款的必要性。在逻辑上,你写下来的顺序并不重要。在Prolog中,我不断进入无限循环,直到我停止将其视为基于逻辑的语言。同样,它有一些很好的功能作为模式匹配语言,但它不是逻辑,在我看来它像一个语言的一招小马。 YMMV,但其他一些人似乎同意我的看法。

答案 5 :(得分:7)

当我们学习prolog(在编程语言课上只有几个星期,所以我不是专家)时,教授还指出,根据你的定义,逻辑编程可能根本就不是编程。

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

它非常专业,不适合通用编程。 专门用于的东西通常不需要。

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

答案 6 :(得分:4)

功能编程正变得越来越流行,因为它在应用于多线程编程时具有一些重要的优势,随着我们越来越多地转向多核处理器,多线程编程将变得越来越重要。

答案 7 :(得分:3)

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

答案 8 :(得分:3)

当我在大学的AI课程中学习时,我发现Prolog非常吸引人,但我只能想到今天我在AI之外使用它的一些情况。即使在那些情况下,我也不愿意使用它。我花了很长时间才最终“得到”Prolog,当我这么做时,我觉得它很棒,但我立刻发现它的用处有限。

尽管如此,我还是强烈建议学习它,除非学习以另一种方式学习编程。能够从许多不同的有利位置看问题绝对能让你成为更好的程序员。

答案 9 :(得分:2)

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

答案 10 :(得分:2)

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

computability theory course中,您将讨论所有这些通用语言实际上是等效的(从数学角度来看)。然而,原型设计和长期发展是非常不同的领域。因此,完全有可能的是,在基于规则的系统中,您可以使用类似Prolog的东西(如果适合您)来制定规则集,然后在您的交付平台上实现最终系统(例如,Java)。 / p> 顺便说一句,我一直很喜欢Prolog对几乎所有事情的回答是“不”。

答案 11 :(得分:1)

你在 AI 课程中开始使用Prolog这一事实应该是一个提示。人工智能也没有过得好。

我记得在80年代挑战一位教授展示AI的重要用途(好吧,“嘲笑”将是一个更准确的术语,但我当时还年轻)。他当时不能这样做,今天,我怀疑他正在教他当时大约有十分之一的人工智能申请。

也许同样适用于Prolog。我不记得上次我见过一家寻找Prolog体验的公司了。也许永远不会,或者我看到它并忽略它。

答案 12 :(得分:1)

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

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