人工智能中使用Lisp和Prolog?

34

现在,三年前我上了一门人工智能课程,显然我足够熟练可以问这个问题......只是开玩笑的,哈哈 ;)

但说真的,这些编程语言有什么特别之处,使它们在人工智能研究中如此受欢迎。尽管人工智能研究已经“老”了......但在过去的5-10年里似乎已经取得了最长的进展......是因为这些语言在某种程度上是围绕人工智能概念而“设计”的,还是因为我们现在没有更好的选择?

我之所以提出这个问题,是因为我一直觉得这很有趣,而且我很好奇。如果我完全错了,他们使用不同的语言,我很想知道他们都用了什么。我的意思是,我可以理解Prolog,特别是具有感性/命题逻辑和模糊逻辑的Prolog。但我不理解为什么我们要使用Lisp...甚至不理解其他人工智能研究人员用来进行机器学习等方面的东西。

关于这个主题的任何文章/书籍也是有帮助的 :)


为什么Lisp被用于人工智能? - Rainer Joswig
另一个副本:https://dev59.com/B3A75IYBdhLWcg3wAUF9 - Rainer Joswig
这是一个太主观的问题。至少应该是 CW(社区维护)的。 - Cerin
最好在程序员论坛上问,但这不是重复的问题,因为它涉及LISP和Prolog的比较,对吧? - 2rs2ts
6个回答

34
问题已经在Lisp中得到了回答,因此我将对Prolog进行评论。
Prolog的设计目的是自然语言处理和逻辑推理。在Prolog发明的早期1970年代的GOFAI范式中,这意味着:
1. 构建自然语言的符号语法,用于构建句子/话语的逻辑表示; 2. 使用这些表示和逻辑公理(不一定是古典逻辑的)来推导新的事实; 3. 使用类似的语法将逻辑表示翻译回语言。
Prolog在这方面非常擅长,并且在ISS中用于正好这样的任务。然而,这种方法被贬低了,因为
1. “所有语法都有漏洞”:没有语法可以捕捉语言中的所有规则和异常; 2. 语法越详细,解析的复杂度(无论是大O还是实际)就越高; 3. 逻辑推理对许多实际任务来说既不足够也不必要; 4. NLP的统计方法,即“单词计数”,已被证明更加强大。随着互联网的兴起,可获得足够的数据集以获取NLP开发人员所需的统计信息。同时,存储器和磁盘成本已经降低,而处理能力仍然相对昂贵。
只有最近,自然语言处理研究人员才开发出了一些实用的符号-统计结合方法,有时使用Prolog。而其他国家都使用Java、C++或Python,因为您可以更容易地找到库、工具和非博士程序员。Prolog中的I/O和算术不易操作,这并没有帮助其被广泛接受。
现在,Prolog主要局限于涉及NLP和约束推理的特定领域应用中,在这些领域中,它似乎表现得相当不错。尽管如此,很少有软件公司会宣传“基于Prolog技术构建”,因为该语言因未能实现“使AI易于使用”的承诺而声名狼藉。
(我想补充说,我是Prolog的忠实粉丝,但即便是我也只用它进行原型设计。)

谢谢你的回答 - 我正在为我的班级演示研究 Prolog 和 LISP 在 AI 编程方面的应用,这对我非常有帮助!在我的研究中,我甚至还没有接触到“所有语法泄漏”的概念。 - 2rs2ts
1
@user691859:我觉得这非常令人惊讶,因为这个引用实际上比语法更广泛。 认知科学中的许多内容很难用规则表达,因此基于规则的AI方法在很大程度上已经被统计和机器学习所取代。 - Fred Foo
这个概念在计算机科学理论和编程语言概念课上向我解释过,用来解释为什么英语没有CNF/BNF定义,但我从未听说过这个确切的短语,也没有在我的研究中看到过。事实上,我还没有读到基于规则的方法已经被统计和机器学习所取代的规则!我的演示将会是基于弱依据的,呵呵。 - 2rs2ts

32

我对Prolog不太了解,但这就是为什么选择Lisp的原因:

  • Lisp是一种同构语言,这意味着代码以与语言中的数据结构(s表达式)相同的形式表示。即“代码就是数据”。如果您正在编写修改/操作其他代码的代码(例如遗传算法或符号操作),则这具有巨大优势。

  • Lisp的宏系统使其非常适合定义特定于问题的DSL。大多数Lisp开发人员有效地“扩展语言”以执行所需操作。同构的事实在这里极大地帮助。

  • 有些历史联系,Lisp在早期AI研究大量流行起来。一些有趣的事实在这个线程中

  • Lisp作为函数式编程语言运行得相当好。这对于AI来说是相当好的领域匹配(在其中,您通常只是尝试让机器学习如何为给定的输入生成正确的输出)。

  • 主观看法:Lisp似乎吸引那些具有数学思维方式的人,而这恰好是现代AI所需要的......这是可能的,因为Lisp与未类型化的λ演算密切相关

我目前在做一些人工智能/机器学习的工作,选择了Clojure(JVM上的现代Lisp)基本上是出于以上原因。


14
我在大学里只有一次Lisp的经历,主要是((((((((((((((((((((这个)))))))))))))))))))))))))))))))))))). 有点让人不舒服。:( - user475353
5
啊,可怕的括号。这也曾让我迟疑了一段时间……但是,一旦我弄清楚了为什么它们在那里(基本上——它们是语言同构设计所需的非常优雅、一致和最小的函数应用语法),一切都变得合理了,我后悔没早学会Lisp。 - mikera
19
索伦:闭合括号太多了吗?说真的,在Lisp中编写一个函数,然后在另一种语言中编写相同的函数,并计算组合字符数。我发现对于Java而言,如果你将所有 []{}() 相加,你得到的数量比Lisp中的圆括号要多好几倍,所以这个经典的抱怨实际上是“它太简洁和一致了”。我认为Lisp课程的教授们应该让每个人都在Lisp和Java/C/其他语言中完成一个练习,以证明它有其原因。(你曾经尝试过用Java做SICP吗?咋啦。) - Ken
4
@Ken:你关于 Java 中 []{}() 的看法可能是正确的。这也是 Python 吸引许多人的原因之一 :) - ypercubeᵀᴹ
2
采用标准的代码格式,无论是哪种编程语言,都有助于提高代码的可读性。在LISP中,括号可以像C/Java中的花括号一样处理,一旦你开始使用它们缩进表达式,你会发现LISP同样易读! - 2rs2ts
显示剩余5条评论

16
当我们认为人工智能是符号操作和本体论等时,Lisp具有优势。当我们将人工智能视为逻辑,统一是棘手的操作时,Prolog具有优势。但是,这两种方法都没有任何优势可用于当前"人工智能"的任何竞争者:统计学人工智能是关于稀疏数组的。所有类型的神经网络(包括深度学习)都涉及连接了大量节点的网络。模型无关方法(许多种机器学习、进化方法等)也非常简单。复杂性是 emergent 的,因此您不必担心它。编写一个可以学会所需知识的简单基础即可。在任何这种情况下,任何通用语言都可以使用。甚至可以提出论据,认为大多数神经网络方法非常简单,C++ 会过于冗长。所以,使用最便于聘请最佳程序员完成任务的语言。

1
一个杰出的答案。 - Fattie

12

这里有一些好的、有信息量的回答,但Lisp和Prolog的重点要么被忽略了,要么被边缘化了,要么没有得到足够的强调。

Lisp,后来是Prolog,在主要的人工智能研究围绕符号处理的时代出现。符号处理的一个简单例子是我们人类如何手动进行代数、微积分或积分。我们通过符号操作变量和常量来推导等效关系。Lisp和Prolog就是为此而设计的。

在C++或Java中实现符号操作并不是轻松的事情,因为它们并不是为此目的而设计的。然而,C++、Java或类似语言可能是当今人工智能中的流行语言,因为现在存在几种不涉及符号处理的人工智能研究变体。

一种人工智能形式涉及使用统计方法作为知识基础,这需要使用更精简的语言来减少计算时间。此外,许多所谓的人工智能系统只是为了服务于特定的利基目的而设计的专业系统。当然,这些系统可能最好用非Lisp/Prolog语言编程,并且更少依赖“推理”或常识知识获取,而更多地依赖于从输入中处理数据。

即使是用Java、C++和一点Prolog编程的沃森,也可以说是一个高度专业化的系统。它似乎是为了获取大量事实而设计的,然后使用复杂的搜索算法对这些事实进行排序(虽然我不确定,IBM可能会因此而不满)。未来的AI实现可能会结合AI范例,并为每个专业部分实现各种语言。甚至Lisp和Prolog也有可能再次流行起来。


点赞以强调符号操作。 - Fibo Kowalsky

6

回顾Prolog的动机可能是个好主意:它是用于问题解决和理解推理(无论是人类还是机器)。这是一个持续进行的项目,即使Prolog是其中最好的结果之一,但并不是最终目标。我们一直在寻找更好的语言来表示知识。请查看Bob Kowalski的最新书籍:如何成为人工智能。


1
我不明白为什么我们要使用Lisp,甚至不知道其他人工智能研究者会用什么来进行机器学习等方面的工作。
Yann LeCun开发了Lush,也成为一家社交媒体网络的AI研究总监。
任何关于这个主题的文章/书籍都有帮助 :)
我想你已经知道Artificial Intelligence: A Modern Approach这本书,它是大学里最受欢迎的人工智能介绍书。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接