当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么逻辑编程没有流行?》经验,为你挑选了6个好方法。

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

在本主题中,似乎达成了一个普遍的共识,即逻辑编程很有用,但必须这样证明.它有没有被认为有用的原因?

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

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



1> Laurent..:

当您使用Prolog学习计算机科学课程中的逻辑编程时,重点不是让您成为一名熟练的Prolog程序员,而是要开放您的思维来替代形式的编程技术(数据结构/算法). d之前没有考虑过.

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

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

当您开发软件时,您会意识到,即使您没有编写一行Prolog代码,您有时会重复使用您在这些"无用的"Prolog或AI课程中学到的技巧. .

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

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



2> Noel Walters..:

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

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

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

逻辑编程语言提供了一种机制,用于将事实和推理规则提供给"推理引擎",然后启动该推理引擎以将规则应用于给定事实以产生新事实.特定的逻辑语言代表或依赖于它的特定推理引擎的强度.

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

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

由于DEC遭到了被惠普吞噬的康柏的吞噬,RuleWorks已经成为开源的,可以从这个网页获得.

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



3> TrayMan..:

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

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

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


就数据库语言理念而言(我之前也有过这种想法),在开发中的分布式数据库中存在语言抽象,其基于逻辑语言Datalog的查询语言.我不太了解它,但鉴于这个答案的主题,值得一提.http://en.wikipedia.org/wiki/Datomic

4> rndmcnlly..:

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

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

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



5> David Thornl..:

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

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

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

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

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



6> jalf..:

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

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

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

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有