答案 0 :(得分:10)
总的来说,我认为人们对AI语言“首选”的主要看法是它们具有高阶编程以及许多抽象工具。
高阶编程(也称为第一类对象)往往是我能看到的大多数AI语言http://en.wikipedia.org/wiki/Higher-order_programming的定义特征。那篇文章是一个存根,它省略了Prolog http://en.wikipedia.org/wiki/Prolog,允许高阶“谓词”。
但基本上高阶编程是你可以像变量一样传递函数的想法。令人惊讶的是,许多脚本语言也具有作为第一类对象的功能。 LISP / Prolog是AI语言。但其他一些可能会令人惊讶。我见过几本关于Python的AI书籍。其中一个是http://www.nltk.org/book。我也见过一些Ruby和Perl。如果您对LISP有更多了解,您会发现它的许多功能与现代脚本语言类似。然而,LISP于1958年问世......所以它确实超前了。
有Java的AI库。在Java中,您可以使用类上的方法将hack函数作为第一类对象进行排序,它比LISP更难/更方便但可能。在C和C ++中,你有函数指针,尽管它们再次比LISP更麻烦。
一旦将函数作为第一类对象,就可以比其他方式更加通用。如果没有作为第一类对象的函数,则可能必须构造sum(array)
,product(array)
来执行不同的操作。但是,如果将函数作为第一类对象,则可以计算accumulate(array, +)
和accumulate(array, *)
。你甚至可以做accumulate(array, getDataElement, operation)
。由于人工智能定义如此严格,以至于灵活性类型是一个很大的帮助。现在,您可以构建更加通用的代码,这些代码更容易以最初未构思的方式进行扩展。
而Lambda(现在遍布整个地方)成为一种节省输入的方法,因此您无需定义每个功能。在上一个示例中,您只需说getDataElement(arrayelement) { return arrayelement.GPA }
,而不必在某个地方accumulate(array, lambda element: return element.GPA, +)
。因此,您不必使用大量函数来污染您的命名空间,只需调用一次或两次。
如果你回到1958年,基本上你的选择是LISP,Fortran或Assembly。与Fortran相比,LISP更灵活(不幸的是效率也更低),并提供了更好的抽象方法。除了作为第一类对象的功能之外,它还具有动态类型,垃圾收集等(今天任何脚本语言都有)。现在有更多的选择可以用作语言,虽然LISP从第一个受益,并成为每个人碰巧用于AI的语言。现在看看Ruby / Python / Perl / JavaScript / Java / C#/甚至最新提出的C标准,你开始看到LISP隐藏的功能(map / reduce,lambdas,垃圾收集等)。 LISP远远超过了1950年代的时间。
即使是现在,LISP在大部分比赛中仍然保持着一些优势。 LISP中的宏系统非常先进。在C中,您可以使用库调用或简单宏(基本上是文本替换)来扩展语言。在LISP中,您可以定义新的语言元素(想想您自己的if语句,现在可以考虑使用自己的自定义语言来定义GUI)。整体LISP语言仍然提供主流语言仍然没有赶上的抽象方式。当然,您可以为C定义自己的自定义编译器并添加所需的所有语言结构,但没有人真正这样做。在LISP中,程序员可以通过宏轻松完成。此外,LISP是根据编程语言编写的,它通常比Perl,Python和Ruby更有效。
Prolog基本上是一种用于表示事实和规则的逻辑语言。什么是专家系统,但规则和事实的集合。由于在Prolog中表示一系列规则非常方便,因此专家系统存在明显的协同作用。
现在我认为使用LISP / Prolog来解决每个人工智能问题并非如此。实际上,只需查看可用于Java的众多机器学习/数据挖掘库。但是,当您正在为新系统进行原型设计或正在进行实验时,因为您不知道自己在做什么,使用脚本语言比使用静态类型语言更容易。 LISP是最早拥有我们认为理所当然的所有功能的语言。基本上一开始根本没有竞争。
一般来说,学术界似乎也很喜欢功能语言。因此,LISP的功能并没有什么坏处。虽然现在你也有ML,Haskell,OCaml等等(其中一些语言支持多种范例......)。
答案 1 :(得分:3)
Lisp和Prolog在这个特定领域的主要调用卡是它们支持像lambdas这样的元编程概念。重要的原因是,当您想要在编程语言中使用自己的编程语言时,它会有所帮助,就像您通常希望编写专家系统规则一样。
为了在像C这样的低级命令式语言中做得好,通常最好只为新的(专家系统规则)语言创建一个单独的编译器或语言库,这样你就可以用新的语言编写规则了。和你在C中的行为。这是CLIPS之类的原则。
答案 2 :(得分:2)
您想要的两件事是能够进行实验性编程和进行非常规编程的能力。
当你做人工智能时,根据定义,你并不真正知道自己在做什么。 (如果你这样做,那就不是人工智能了,不是吗?)这意味着你需要一种语言,你可以快速尝试并改变它们。我个人没有找到任何比Common Lisp更好的语言。
同样地,你做的事情并不常见。 Prolog已经是一种非传统的语言,Lisp的宏可以极大地改变语言。
答案 3 :(得分:1)
由于无状态特性,函数式编程语言更容易并行化。似乎已经有一个主题,在这里有一些好的答案:Advantages of stateless programming?
如上所述,由于语言的简单性,构建在LISP中生成程序的程序通常也更简单,但这只涉及人工智能的某些领域,如进化计算。
编辑:
好的,我会尝试解释一下为什么并行性对于AI使用符号AI作为一个例子很重要,因为它可能是我最了解的AI领域。基本上它是LISP发明当天每个人都在使用的东西,而它所基于的物理符号假设或多或少与你在LISP代码中计算和建模东西的方式相同。这个链接解释了一下: http://www.cs.st-andrews.ac.uk/~mkw/IC_Group/What_is_Symbolic_AI_full.html
所以基本上这个想法是你创建一个环境模型,然后搜索它以找到解决方案。要实现的最简单的算法之一是广度优先搜索,它是对所有可能状态的详尽搜索。在产生最佳结果的同时,通常非常耗时。优化这种方法的一种方法是使用启发式(A *是一个例子),另一种方法是在CPU之间划分工作。
由于无状态,理论上,您在搜索中展开的任何节点都可以在单独的线程中运行,而不会产生锁定共享数据的复杂性或开销。通常,假设硬件可以支持它,那么您可以更快地获得结果,从而可以更快地并行化任务。这方面的一个例子可能是折叠@ home项目,它在许多GPU上分配工作以找到最佳的蛋白质折叠配置(可能与LISP无关,但与并行性有关)。
答案 4 :(得分:1)
“AI”是什么意思?这个领域非常宽泛,使得这个问题无法回答。你在看什么应用程序?
使用LISP是因为它比FORTRAN更好。也使用了Prolog,但没有人记得。这是人们相信基于符号的方法是可行的方式,然后才能理解传感和表达层的难度。
但现代的“AI”(机器视觉,规划师,地狱,谷歌不可思议的知道你的意思的能力)是用更高效的编程语言完成的,这种语言对大型团队来说更具可持续性。这通常意味着C ++这些天 - 但并不像有人认为C ++是人工智能的好语言。
天啊,你可以在70年代的MATLAB中做很多被称为“AI”的事情。没有人以前称MATLAB为“人工智能的好语言”,对吗?
答案 5 :(得分:0)
据我所知LISP,这是一种Functional Programming语言,你可以制作“制作节目的节目。我不知道我的答案是否符合你的需要,请参阅上面的链接以获取更多信息。
答案 6 :(得分:0)
语言本身(没有图书馆)适用于特定的研究/调查和/或学习/学习领域(“如何以最困难的方式做最简单的事情”)。
商业开发的适用性取决于框架,库,开发工具,开发人员社区,公司采用的可用性。例如,在互联网上你会发现支持任何,甚至最奇特的问题/区域(当然包括AI区域),例如,在C#中,因为它是主流。
更新:
哎呀,我真的没想到会引起我的回答和讨论。
在(“如何以最困难的方式做最简单的事情”)中,我的意思是学习和学习,以及学术研发目标/技术/方法/方法与(商业)发展的目标不一致。
在学生(甚至学术)项目中,人们可以编写大量代码,这些代码可能需要商业RAD中的一行代码(使用框架或库的组件/服务/功能)。
由于..!哦! 因为,在没有首先就术语的共同定义达成一致的情况下纠缠/发展任何讨论是没有意义的......这些术语是主观的并且依赖于语境......并且在一般/抽象语境中并不那么容易制定。 这是不同科学的整个领域的跨学科问题
问题是广泛的(哲学的)和躲避式的......没有开始和结束......没有背景和定义就没有明确的答案......
我们是否会在这里制定一些规范提案?
答案 7 :(得分:0)
具有实例化的模式匹配构造(或容易构造模式匹配代码的能力)是一大优点。模式匹配对于A.I.来说并不是完全必要的,但它可以确保简化许多A.I.的代码。任务。我发现这也使F#成为A.I的便捷语言。