首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AI开发的语言需求

AI开发的语言需求
EN

Stack Overflow用户
提问于 2010-08-19 21:07:32
回答 8查看 1.8K关注 0票数 19

可能重复:

Why is Lisp used for AI?

是什么使语言适合于人工智能的开发?

我听说LISP和Prolog在这个领域被广泛使用。哪些特性使它们适合于AI?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-08-21 00:02:32

总体而言,我认为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...so中出现的,它确实领先于它的时代。

有一些用于Java的AI库。在Java中,你可以使用类上的方法将函数作为第一类对象进行排序,这比LISP更难/更不方便,但也是可能的。在C和C++中,你有函数指针,尽管它们比LISP更麻烦。

一旦你有了作为第一类对象的函数,你就可以进行比其他方式更通用的编程。如果没有函数作为第一类对象,您可能必须构造sum(array)product(array)来执行不同的操作。但是使用函数作为第一类对象,您可以计算accumulate(array, +)accumulate(array, *)。你甚至可以做accumulate(array, getDataElement, operation)。由于人工智能的定义如此模糊,因此灵活性类型是一个很大的帮助。现在,您可以构建更通用的代码,这些代码可以更容易地以甚至不是最初设想的方式进行扩展。

Lambda (现在到处都是)成为一种省去输入的方法,这样你就不必定义每个函数了。在前面的示例中,您可以直接使用accumulate(array, lambda element: return element.GPA, +),而不是在某个地方创建getDataElement(arrayelement) { return arrayelement.GPA }。因此,您不必使用大量的函数来污染您的命名空间,只需调用一两次。

如果你回到1958年,基本上你的选择是LISP、Fortran或汇编。与Fortran相比,LISP更加灵活(不幸的是效率也较低),并且提供了更好的抽象方法。除了作为第一类对象的功能外,它还具有动态类型、垃圾回收等功能(目前任何脚本语言都有)。现在有了更多的选择来作为一种语言来使用,尽管LISP受益于成为第一个并成为每个人碰巧都在使用的AI语言。现在看看Ruby/Python/Perl/JavaScript/Java/C#/,甚至是最新提出的C语言标准,你都会开始看到LISP中潜入的特性(map/reduce、lambdas、垃圾回收等)。在20世纪50年代,LISP远远领先于它的时代。

即使是现在,LISP仍然在大多数竞争中保持着一些王牌。LISP中的宏系统非常先进。在C中,您可以使用库调用或简单的宏(基本上是文本替换)来扩展该语言。在LISP中,您可以定义新的语言元素(考虑您自己的if语句,现在考虑您自己的自定义语言来定义GUI)。总体而言,LISP语言仍然提供主流语言仍未赶上的抽象方法。当然,您可以为C定义自己的自定义编译器,并添加您想要的所有语言构造,但没有人真正做到这一点。在LISP中,程序员可以通过宏很容易地做到这一点。此外,LISP是经过编译的,根据编程语言的不同,它通常比Perl、Python和Ruby更高效。

Prolog基本上是一种用于表示事实和规则的逻辑语言。什么是专家系统,而是规则和事实的集合。由于用Prolog表示一组规则非常方便,因此与专家系统有明显的协同作用。

现在我认为使用LISP/Prolog来解决每一个AI问题并不是一个既定的选择。事实上,只要看看Java可用的机器学习/数据挖掘库就知道了。然而,当你正在制作一个新系统的原型或者因为你不知道自己在做什么而进行实验时,使用脚本语言比静态类型的语言更容易做到这一点。LISP是最早拥有所有这些我们认为理所当然的特性的语言。基本上,一开始根本没有竞争。

而且,总的来说,学术界似乎非常喜欢函数式语言。这样就不会影响到LISP的功能。尽管现在你在这方面也有ML、Haskell、OCaml等语言(其中一些语言支持多种范式……)。

票数 10
EN

Stack Overflow用户

发布于 2010-08-19 21:45:17

Lisp和Prolog在这个特定领域的主要名片是它们支持像lambdas这样的元编程概念。这很重要的原因是,当您想要在一种编程语言中使用自己的编程语言时,它很有用,就像您通常想要编写专家系统规则一样。

为了在像C这样的低级命令式语言中很好地做到这一点,通常最好只为你的新(专家系统规则)语言创建一个单独的编译器或语言库,这样你就可以用新语言编写你的规则,用C编写你的操作。这就是像CLIPS这样的东西背后的原则。

票数 3
EN

Stack Overflow用户

发布于 2010-08-20 01:54:24

您需要的两个主要功能是进行实验性编程的能力和进行非常规编程的能力。

当你在做人工智能时,根据定义,你并不真正知道你在做什么。(如果你这样做了,它不会是人工智能,不是吗?)这意味着你想要一种可以快速尝试和改变的语言。就我个人而言,我还没有找到比Common Lisp更好的语言。

类似地,您正在做一些不太传统的事情。Prolog已经是一种非传统的语言,Lisp的宏可以极大地改变这种语言。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3522064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档