190

我一直在学习 Lisp 来扩展我的视野,因为我听说它被用于 AI 编程。在进行了一些探索之后,我还没有找到 AI 示例或任何可以使它更倾向于它的语言。

过去使用 Lisp 是因为它可用,还是我只是缺少一些东西?

4

10 回答 10

128

Lisp 一直用于人工智能,直到 1980 年代末。然而,在 80 年代,Common Lisp 被商业界过度吹捧为“人工智能语言”。这种强烈反对迫使大多数 AI 程序员使用 C++ 几年。如今,原型通常是用更年轻的动态语言(Perl、Python、Ruby 等)编写的,成功研究的实现通常是用 C 或 C++(有时是 Java)。

如果你对 70 年代感兴趣……好吧,我当时不在。但我认为 Lisp 在 AI 研究中的成功有以下三个原因(按重要性排序):

  1. Lisp 是一个优秀的原型设计工具。这是很长一段时间以来最好的。Lisp 仍然擅长解决你还不知道如何解决的问题。这种描述完美地描述了人工智能。
  2. Lisp 很好地支持符号编程。旧人工智能也是象征性的。长期以来,这方面也独树一帜。
  3. Lisp 非常强大。代码/数据的区别较弱,因此感觉比其他语言更具可扩展性,因为您的函数和宏看起来像内置的东西。

我没有Peter Norvig 的旧 AI 书籍,但它应该是学习在 Lisp 中编写 AI 算法的好方法。

免责声明:我是计算语言学的研究生。我比其他领域更了解自然语言处理的子领域。也许 Lisp 更多地用于其他子领域。

于 2008-09-25T03:29:10.887 回答
63

Lisp 用于 AI 是因为它非常支持使用符号计算的软件的实现。符号、符号表达式和计算是 Lisp 的核心。

用于符号计算的典型 AI 领域包括:计算机代数、定理证明、规划系统、诊断、重写系统、知识表示和推理、逻辑语言、机器翻译、专家系统等。

因此,这些领域中许多著名的 AI 应用程序都是用 Lisp 编写的也就不足为奇了:

  • Macsyma 作为第一个大型计算机代数系统。
  • ACL2 作为广泛使用的定理证明器,例如被 AMD 使用。
  • DART 作为美军在第一次海湾战争期间使用的后勤规划器。据说仅这个 Lisp 应用程序就收回了当时美国在人工智能研究方面的所有投资。
  • SPIKE,哈勃太空望远镜的计划和调度应用程序。也被其他几个大型望远镜使用。
  • CYC,最大的软件系统之一。人类常识知识领域的表示与推理。
  • METAL,最早商业使用的自然语言翻译系统之一。
  • 美国运通的授权人助理,负责检查信用卡交易。

在这些领域有成千上万的应用程序是用 Lisp 编写的。对那些来说非常普遍的是,他们需要符号处理领域的特殊能力。一种是在 Lisp 之上实现在这些域中具有特殊解释器/编译器的特殊语言。Lisp 允许人们为符号数据和程序创建表示,并且可以实现各种机制来操纵这些表达式(数学公式、逻辑公式、计划……)。

(请注意,AI 中也使用了许多其他通用编程语言。我试图回答为什么在 AI 中特别使用 Lisp。)

于 2009-03-25T03:16:12.147 回答
22

一个原因是它允许您使用特定于您的领域的结构来扩展语言,使其有效地成为一种领域特定的语言。这种技术非常强大,因为它可以让你推理你正在解决的问题,而不是洗牌。

于 2008-09-25T06:19:07.700 回答
11

我的猜测一直是,作为一种函数式语言,它不区分代码和数据。包括函数定义和函数调用在内的所有内容都可以被视为列表并像任何其他数据一样进行修改。

因此,可以轻松编写自检、自修改代码。

于 2008-09-24T23:15:39.217 回答
9

一个可能的答案是 AI 是非常困难的问题的集合,而 Lisp 是解决难题的好语言,而不仅仅是 AI。

至于为什么会这样:宏、通用函数和丰富的自省允许简洁的代码和轻松引入域抽象——它是一种可以让你变得更强大的语言。对于许多不必要的问题,它会带来自己的成本,但对于其他问题,需要电力才能取得进展。

于 2008-09-25T05:38:53.663 回答
7

我认为仅从人工智能的角度来考虑这一点是错误的。如果你问的是为什么它被用于人工智能,而不是为什么它现在不经常使用,那么像人工智能冬天和对普通 lisp 的商业影响之类的事情会让人分心……

无论如何,我认为这是因为大多数 AI 代码本质上是研究代码。Lisp 是一种伟大的语言,用于探索性编程、实现困难的算法、自我修改和经常修改的代码。换句话说,用于研究代码。

我今天将 lisp 用于我的一些研究代码(数学、信号处理),因为它比大多数语言更灵活、更强大,同时仍然比大多数语言生成更高效的代码。我通常可以在 c++ 速度的 +/- 2 倍内获得性能,但我可以更快地实现事情,并且处理复杂性,这将比我使用 c++、java、c# 花费更多的时间。

不过那是跑题了。我认为 AI 代码有一段时间主要是用 common lisp 编写的,因为它是研究代码的强大方法。它仍然是;但随着“人工智能”算法得到更好的理解和探索,其中一部分更容易教授和使用,因此它们出现在本科课程中的年度语言中。从那里开始,问题就变成了人们已经知道什么、有哪些图书馆可用以及哪些对大型团体有效。

于 2008-09-25T15:53:07.133 回答
6

我猜一个重要的原因是列表作为基本数据结构的灵活性。

当时,能够将它们变成各种复合对象,以及消息传递和多态等新事物,使其成为首选语言;不是专门针对人工智能,而是针对大型、复杂的任务。尤其是在他们尝试概念时。

于 2008-09-24T23:05:40.893 回答
4

我认为你是对的:Lisp 是一个方便的破解工具。这是因为它在程序和数据之间没有太多区别。这使黑客可以非常轻松地操纵功能,就像数据一样。

但是 lisp 对人类来说是相当难以阅读的,它的大括号和数据和程序之间没有区别。今天,我不会将 lisp 用于任何生产 AI 代码(甚至可能是原型设计),但更喜欢 python 来编写脚本。

要考虑的另一件事是该语言中/与该语言相关的现有库/工具。我无法将 lisp 库与 python 库进行比较,但我想库和开源现在比以前更重要。

这个答案的灵感来自 lisp 和 python 之间的以下比较:http: //amitp.blogspot.com/2007/04/lisp-vs-python-syntax.html

于 2008-09-25T02:54:20.640 回答
4

我记得听说过,作为一种函数式语言,Lisp 是实现递归算法的一个非常好的选择。在考虑决策过程(遍历)和最终结果(叶节点)时,能够追踪一棵树并按照自己的方式工作是必不可少的。

这是在我们学习 Lisp 的大学 AI 课程中告诉我的。

于 2008-09-25T06:23:44.007 回答
3

一个更愤世嫉俗的答案可能是“因为它在 1980 年代输掉了日本和美国之间的政治人工智能战争”。有一篇有趣的博客文章推测了第五代计算机系统消亡对 Prolog 的影响

于 2011-07-10T08:01:39.507 回答