我一直在学习Lisp以扩展我的视野,因为我听说它用于AI编程.在做了一些探索之后,我还没有找到人工智能的例子或语言中任何会使其更倾向于它的东西.
过去是否使用过Lisp因为它可用,或者是否有一些我只是缺少的东西?
Lisp WAS在AI中使用直到20世纪80年代末.然而,在80年代,Common Lisp作为"AI语言"被商业世界超卖; 这种强烈反对迫使大多数AI程序员使用C++几年.目前,原型通常用较年轻的动态语言(Perl,Python,Ruby等)编写,成功研究的实现通常是C或C++(有时是Java).
如果你对70年代很好奇......好吧,我不在那里.但我认为Lisp在人工智能研究方面取得了成功,原因有三个(按重要性排序):
Lisp是一款出色的原型制作工具.这是很长一段时间以来最好的.Lisp仍然很擅长处理你不知道如何解决的问题.该描述完美地表征了AI.
Lisp很好地支持符号编程.旧的AI也是象征性的.在很长一段时间内,它在这方面也是独一无二的.
Lisp非常强大.代码/数据的区别是较弱的,因此感觉因为你的函数和宏看起来像内置的东西比其他语言更具扩展性.
我没有Peter Norvig的旧AI书,但它应该是学习在Lisp中编写AI算法的好方法.
免责声明:我是计算语言学的研究生.我知道自然语言处理的子领域比其他领域好很多.也许Lisp在其他子域中使用得更多.
Lisp用于AI,因为它支持非常好地计算符号的软件的实现.符号,符号表达和计算与这些是Lisp的核心.
用符号计算的典型AI区域是:计算机代数,定理证明,计划系统,诊断,重写系统,知识表示和推理,逻辑语言,机器翻译,专家系统等.
因此,使用Lisp编写这些域中的许多着名AI应用程序并不奇怪:
Macsyma作为第一个大型计算机代数系统.
ACL2作为广泛使用的定理证明器,例如由AMD使用.
DART是美国军方在第一次海湾战争期间使用的物流规划者.据说这个Lisp应用程序已经回报了当时美国在AI研究方面的所有投资.
SPIKE,哈勃太空望远镜的规划和调度应用程序.也用于其他几个大型望远镜.
CYC,最大的软件系统之一.人类常识知识领域的表征与推理.
METAL,首批商业上使用的自然语言翻译系统之一.
美国运通'授权人助理,负责检查信用卡交易.
这些领域有成千上万的应用程序是用Lisp编写的.对于那些人来说很常见的是他们需要在符号处理领域具有特殊能力.一个在Lisp之上实现在这些域中具有特殊解释器/编译器的特殊语言.Lisp允许人们为符号数据和程序创建表示,并且可以实现各种机制来操纵这些表达式(数学公式,逻辑公式,计划......).
(请注意,许多其他通用编程语言也在AI中使用.我试图回答为什么特别是在AI中使用Lisp.)
一个原因是它允许您使用特定于您的域的构造扩展语言,使其有效地成为特定于域的语言.这种技术是因为它允许你来思考的非常强大的问题你要解决,而不是约洗牌位.
我的猜测一直是,作为一种功能语言,它不区分代码和数据.包括函数定义和函数调用在内的所有内容都可以视为列表,并像任何其他数据一样进行修改.
因此,可以轻松编写自检,自修改代码.
一个可能的答案是AI是一个非常难的问题的集合,而Lisp是解决难题的好语言,而不仅仅是人工智能.
至于为什么:宏,泛型函数和丰富的内省允许简洁的代码和简单的域抽象引入 - 它是一种你可以使功能更强大的语言.对于许多不必要的问题,它带来了自己的成本,但对于其他问题,需要力量才能取得任何进展.
我认为仅从AI的角度思考这个问题是错误的.如果你问为什么它被用于人工智能,而不是为什么它现在不经常被使用,那么人工智能冬季和普通口齿不清的商业影响等事情会分散注意力......
无论如何,我认为这是因为大多数AI代码基本上都是研究代码.Lisp是一种用于探索性编程,实现困难算法,自修改和经常修改的代码的优秀语言.换句话说,对于研究代码.
我今天使用lisp作为我的一些研究代码(数学,信号处理),因为它比大多数语言更灵活,更强大,同时仍然比大多数语言生成更高效的代码.我通常可以在c ++速度+/- 2的范围内获得性能,但是我可以更快地实现事物,并且处理复杂性,如果我使用c ++,java,c#,这将花费我更多的时间.
尽管如此,这是偏离主题.我认为AI代码主要是用普通的lisp编写的,因为它是一种研究代码的强大方法.它仍然是; 但随着"AI"算法变得更好理解和探索,它们中的一部分更易于教学和使用,因此它们在本科课程中出现了年度语言.从那里开始,它成为人们已经知道的问题,可用的库,以及适用于大型团体的库.
我猜测,一个重要原因是列表作为基本数据结构的灵活性.
当时,能够将它们变成所有类型的复合对象,并将新事物作为信息传递和民族主义,使其成为首选语言; 不是专门针对AI,而是针对大而复杂的任务.特别是当他们在尝试概念时.