总的来说,我会说我看到人们对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等等(其中一些语言支持多种范例......).
总的来说,我会说我看到人们对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等等(其中一些语言支持多种范例......).