war*_*hip 2 lisp artificial-intelligence
AI以各种不同的语言实现,例如Python,C/C++,Java,所以有人可以向我解释使用Lisp如何让人们执行#5(Peter Norvig在这里提到):
- [Lisp允许...]一个宏系统,它允许开发人员创建特定于域的抽象级别,从而构建下一级别.......今天,(5)是Lisp与其他语言相比擅长的唯一功能.
资料来源:https://www.quora.com/Is-it-true-that-Lisp-is-highly-used-programming-language-in-AI
我基本上对创建特定于域的抽象级别意味着什么感到困惑.有人可以提供一个具体的例子/应用程序,了解它何时/如何有用,一般来说,这意味着什么?我试过阅读http://lambda-the-ultimate.org/node/4765,但并没有真正"全面了解".但是,我觉得这里有一些魔力,因为Lisp允许你编写其他程序/ OOP /函数语言不会让你的代码.然后我发现了这篇文章:https://www.quora.com/Which-programming-language-is-better-for-artificial-intelligence-C-or-C++,其中最佳答案如下:
对于通用人工智能,我不会选择并在LISP中编程.一个真正的AI会有很多自我修改的代码(你不认为一个真正的AI会采用它的程序员写的最后一个词,你呢?).
这让我更感兴趣,这让我想知道:
对于AI来说,具有"自我检查,自我修改的代码"究竟是什么意思(来源:为什么Lisp用于AI?),以及为什么/如何使用它?这听起来很酷(就好像人工智能对自己的操作有自我意识,可以这么说),听起来好像使用Lisp可以让人完成这些事情,而其他语言甚至都不会想到它(对不起,如果天真地快乐,我绝对没有Lisp的经验,但我很高兴开始).我读了一下:自修改代码的用途是什么?并立即对特定AI应用程序的前景和自修改代码的未来前景感兴趣.
无论如何,我绝对可以看到能够编写自修改代码的能力,以及能够在特定研究问题领域上定制语言的能力(这是我认为Peter Norvig在他的帖子中所暗示的),但我我真的很不确定这些是什么意思,我想了解上面提到的这两个方面("领域特定的抽象层次"和"自我")的细节(甚至只是本质) - 以明确的方式检查,自我修改代码").
[Lisp允许...]一个宏系统,它允许开发人员创建特定于域的抽象级别,从而构建下一级别.......今天,(5)是Lisp与其他语言相比擅长的唯一功能.
对于Stack Overflow来说,这可能过于宽泛,但是域特定抽象的概念是在许多语言中发生的概念,它在Common Lisp中更容易实现.例如,在C中,当你调用open()时,你会得到一个文件描述符.它是一个小整数,但是如果你坚持使用域模型,你不关心它是一个整数,你关心它是一个文件描述符,并且在文件描述符所在的地方使用它是有意义的.这是一个漏水的抽象,但是,因为这些电话往往通过返回信号误差负整数,所以你做真正要关心的事实,文件描述符是一个整数,这样就可以可靠地比较结果,弄清它是否是不是错误.在C中,您可以定义将一些信息捆绑在一起的结构或记录类型.这提供了稍高的抽象量.
抽象的想法是你可以考虑如何使用某些东西,它代表什么,并根据领域而不是表示来思考.从某种意义上说,所有编程语言都支持这一点,但是Common Lisp使构建语言结构变得更加容易,这些结构看起来就像语言的内置结构,并有助于避免冗余(并且容易出错)的样板.
例如,如果您正在编写一个自然演绎风格定理证明器,则需要定义一组推理规则并使其可用作证明系统.其中一些规则将更加简单,并且不需要了解当前的证明范围.例如,要检查使用联合消除(来自A∧B,推断A(或B))是否合法,您只需要检查前提和结论的形式.没有抽象,你可能必须写:
(defun check-conjunction-elimination (premises conclusion context)
(declare (ignore context))
(and (= (length premises) 1)
(typep (first premises) 'conjunction)
(member conclusion (conjunction-conjuncts (first premises))
:test 'proposition=)))
(register-inference-rule "conjunction elimination" 'check-conjunction-elimination)
Run Code Online (Sandbox Code Playgroud)
通过定义抽象的能力,您可以编写一个模式匹配器,可以将其简化为:
(defun check-conjunction-elimination (premises conclusion context)
(declare (ignore context))
(proposition-case (premises conclusion)
(((and A B) A) t)
(((and A B) B) t)))
(register-inference-rule "conjunction elimination" 'check-conjunction-elimination)
Run Code Online (Sandbox Code Playgroud)
(当然,有些语言内置了模式匹配(Haskell,Prolog(在某种意义上)),但关键是模式匹配是一个过程过程,你可以用任何语言实现它.但是,它是一个代码生成过程,在大多数语言中,你必须在编译期间将代码生成作为单独的传递.使用Common Lisp,它是语言的一部分.)
您可以将该模式抽象为:
(define-simple-inference-rule "conjunction elimination" (premises conclusion)
((and A B) A)
((and A B) B)))
Run Code Online (Sandbox Code Playgroud)
而你仍然会生成原始代码.这种抽象节省了大量空间,这意味着当其他人进来时,他们不需要知道所有Common Lisp,他们只需要知道如何使用define-simple-inference-rule.(当然,这确实增加了一些开销,因为它是别的,他们的东西就需要知道如何使用.)但这个想法仍然存在:代码对应于您谈谈域的方式,不是这样的编程语言作品.
至于"自我修改代码",我认为这个术语比你实际上看到的好用途还要多.在上面描述的宏扩展意义上,有一种自修改代码(因为宏扩展代码知道如何"修改"或将代码转换成其他东西,但我不认为这是一个很好的例子).由于您可以访问eval,因此您可以将代码修改为对象并对其进行评估,但我认为很多人并不真正提倡这样做.能够动态地重新定义代码可能很方便,但是我认为你会看到人们在REPL中比在程序中做得更多.
但是,能够返回闭包(越来越多的语言支持的东西)是一个很大的帮助.例如,跟踪是"某种"自我修改.你可以实现这样的事情:
(defmacro trace (name)
(let ((f (symbol-function name)))
(setf (symbol-function name)
(lambda (&rest args)
(print (list* name args))
(apply f args)))))
Run Code Online (Sandbox Code Playgroud)
你需要做更多的事情来支持无人问津,但我认为这一点非常明确; 您可以在运行时以可预测的方式执行更改函数行为等的操作. 跟踪和日志记录工具是一个简单的示例,但如果系统决定分析它知道的一些重要的方法,它可以动态地决定开始缓存一些结果,或做其他有趣的事情.这是一种"自我修改",可能非常有用.
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |