关于自己的源代码的程序推理


15

这个问题的灵感来自以下(模糊的)问题:拥有可以推理并修改其源代码的AI的编程语言/逻辑基础是什么?

这一点都不严格,因此这是我尝试从中提取一个具体的问题。我对两件事感兴趣:

(A)可以将自己的程序表示和操纵为数据类型程序(例如,AST)的编程语言P。(如果需要,可以将类型为Program的对象转换为String,即该语言的有效程序的文本。这与编译器的操作相反。)

(B)一种推理语言P程序的功能的方法。我正在考虑以下两个层次:

  1. 另一种语言Q(具有定理证明功能)可对P程序的功能进行建模。它应该能够表达和证明诸如“运行程序p的结果为foo”之类的语句。
  2. 推理程序p:Program 用语言P本身做什么的一种方式(因此,我们将P = Q视为上述值。)

在何种程度上实施了类似的措施,或者在这个方向上取得了什么进展?实际的障碍是什么?根据问题的初衷,使问题形式化的最佳方法是什么?

*

正如答案所显示的(谢谢!),(A)和(B1)可以分别完成,尽管似乎将它们一起执行更多是研究问题。

这是我对这个问题的一些初步想法(警告:相当模糊)。另请参阅我对Martin Berger答案的评论。

我对编程语言建模相同的编程语言感兴趣,而不是对一种更简单的编程语言(因此上面的P = Q)感兴趣。这将是程序能够“了解其自身源代码”的“概念证明”。相依类型的编程语言可以保证其功能的输出,但这不算是“关心自己的源代码”,而不仅仅是“ Hello world!”。会被视为一种会自动打印出裸露的字符串的语言中的quine-需要某种引用/自引用。这里的类似物具有表示Program的数据类型。

这似乎是一个相当大的项目-语言越简单,表达其中的所有内容就越困难;语言越复杂,就需要进行更多的建模工作。

按照递归定理的精神,程序可以“获取”其自己的源代码并对其进行修改(即,输出其自身的修改版本)。(B2)然后告诉我们该程序应该能够对修改后的程序表示保证(这应该能够递归,即它应该能够对将来的所有修改内容进行表达?)。


1
为什么需要用该语言作为定理证明者来确定“运行程序p的结果是foo”?语言可以简单地运行p!确实,这就是正在发生的事情。
Martin Berger 2015年


3
请注意,原则上所有可以自己实现解释器的语言都可以完成您所需要的事情。以更数学的方式,递归定理适用于任何足够强大的计算模型。某些编程语言通过内置使其变得更容易。推理相同:您可以在这些语言中实现任何推理系统。当然,不能指望所有理由,例如程序的停顿问题。
卡夫

2
我认为这个问题不是很清楚。您应该看看Python,Java等编程语言以及Martin在回答中提到的那些语言,并澄清问题,以便可以很清楚地看出它们满足您的需求,否则就不能。
卡夫

1
@HoldenLee至于“P = Q”,建立的术语是“均质元编程”,这是相对于“异质元编程”,其中P Q.
马丁伯杰

Answers:


14

我认为您是在问两个不同的问题。

  • 编程语言将其所有程序表示为数据的能力。
  • 关于程序作为数据的推理。

出于分析目的,将它们分开是很有用的。我将专注于前者。

编程语言在数据受元编程同声性等术语约束时表示,操纵(和运行)其程序的能力。

以一种(笨拙的)方式,所有众所周知的编程语言都可以进行元编程,即通过使用字符串数据类型以及对字符串调用外部程序(编译器,链接器等)的能力(例如,将它们写入文件中)系统优先)。但是,这可能不是您的意思。您可能会想到不错的语法。字符串不是用于程序表示的好语法,因为几乎所有的字符串都不表示程序,即当被视为程序表示机制时,字符串数据类型包含很多“垃圾”。更糟糕的是,字符串运算的代数与程序构造的代数基本上没有关系。

您可能想到的是更好的东西。例如,如果是一个程序,那么 P P,但作为数据,在手操纵和分析。这通常称为报价。实际上,报价是不灵活的,因此我们使用准报价,这是对报价的概括,其中报价可以包含“漏洞”,可以在其中运行提供数据以“填充”漏洞的程序。例如˚FPPP是表示有条件的准报价,其中,而不是我们有一个孔的条件 [ ]。如果程序中号的计算结果为所述数据X > 0 ,则准报价˚F

一世F[]ŤHËñ7ËsË8+9
[]中号X>0计算结果为数据˚F
一世F[中号]ŤHËñ7ËsË8+9
一世FX>0ŤHËñ7ËsË8+9

(请注意,是一个普通程序(不是作为数据的程序),它返回带引号的程序,即作为数据的程序。)为了使其正常工作,您需要一种数据类型来表示程序。通常,该数据类型称为AST(抽象语法树),您可以将(准)引号视为AST的缩写机制。中号

几种编程语言为元编程提供了准引用和其他功能。Lisp的宏化功能开创了将程序视为数据的这种能力。也许不幸的是,长期以来,人们一直认为基于Lisp的宏的功能很大程度上取决于Lisp的简约语法。直到MetaML(1),现代的,语法丰富的语言才被证明能够进行元编程。从那时起,MetaOCaml(2)(MetaML的后代,对于在仍在继续进行的探索中解决如何将程序键入为数据的问题具有重要意义),Template Haskell(3)和Converge(4)(取得所有关键的元编程功能(我认为是对的)表明,各种现代编程语言都可以容纳元编程。重要的是要意识到我们可以采取任何编程语言并将其转换为元编程语言L m p ,即L,并具有将其自己的程序表示为数据并进行评估的能力。大号大号p大号

Ëv一种PPPPËv一种PPP

关于第二维,关于作为数据给出的程序的推理。只要将程序转换为数据,它们就是“正常”数据,可以作为数据进行推理。如Joshua所指出的,您可以使用所有方式的证明者技术,例如从属类型或契约,交互式定理证明者或自动化工具。但是,您将必须在推理过程中表示语言的语义。如果您需要的那种语言具有元编程能力,那么事情可能会变得有些棘手,并且在这个方向上没有做太多的工作,其中(5)是用于此目的的唯一程序逻辑。在基于元编程的推理方面,还有基于Curry-Howard的工作(6、7、8)。请注意,这些基于逻辑的方法 而且基于类型的方法(2)确实可以表达对所有未来元编程阶段都适用的属性。除了(2)以外,这些文件都没有执行。

总结:您所要求的内容已经实现,但是非常微妙,并且仍然存在未解决的问题,特别是与类型和简化的推理有关的问题。


  1. 塔哈(W. Taha)。多阶段编程:其理论与应用

  2. 塔哈(W. Taha)和尼尔森(MF Nielsen)。环境分类器

  3. T. Sheard和S. Peyton Jones。Haskell的模板元编程

  4. L. Tratt。使用动态类型的OO语言进行编译时元编程

  5. M. Berger,L。Tratt,《齐次元编程的程序逻辑》

  6. R. Davies,F。Pfenning,分阶段计算的模态分析

  7. R.Davies,一种绑定时间分析的时间逻辑方法

  8. T. Tsukada,A. Igarashi。环境分类器的逻辑基础


没错-编程语言P可以不同于表达语言的Q的语言Q(例如,可以用Coq表示)。我正在考虑的那种定理是这样的:假设我们有一个经过精心设计的程序A_1。Thm:对于每n个,以下成立:程序A_n将输出(m_n,A_ {n + 1}),其中m_n是整数,A_ {n + 1}是另一个程序(例如,通过以某种方式修改A_n而获得) ,对于所有n,我们都有m_n> 0。
Holden Lee

(这是科幻小说的版本,我们有一个“证明”,即一个不断修改自身的程序永远不会按下发射核导弹的按钮,或者说该程序将始终优化一定数量。)
霍顿李

这就是为什么我想区分运行程序和推理程序输出内容的原因-我们想在运行之前知道其性能,而不运行它。注意,如果我们希望A_n能够“修改其源代码”以产生A_ {n + 1},则P将必然具有元编程能力(这使我们处于(5)的位置)。
Holden Lee

在我看来,P = Q仍然很有趣。假设,A是一个AI程序,修改自身的方式是通过推理自己的代码-例如,写下有关代码位的定理,证明它们,然后才修改其代码。然后,它似乎P包含需要有Q的功能
霍顿李

@HoldenLee可以编写类似A_n的程序。如果使用字符串作为程序的代表,则可以用任何语言简单地完成此操作,如果需要准引号或类似的语言,则可以在例如Converge中进行。我不了解m_n在构造中的作用。
Martin Berger 2015年

6

没有当前的系统可以执行系统中的所有四个步骤。如果要设计系统,首要要求之一就是谐音语言。至少您希望您的核心编程语言尽可能地小,以便当您进入系统并开始对其进行解释时,它将起作用。因此,您需要一个在Lisp中首创的元圆解释器。其他语言也可以做到这一点,但是关于lisp的现有研究很多。

如果要执行此操作,第一步是使用类似Lisp的谐音语言或某种框架,您可以在其中推断正在运行的程序。使用Lisp的唯一原因是,您可以使用该语言定义元循环解释器,也可以仅将代码视为数据。将代码视为数据是最重要的事情。关于c2 Wiki上的谐音含义的讨论一直在进行。

例如,在Lisp中,您的“程序”数据类型是有效的Lisp程序。您将lisp程序传递给解释器,它会计算出一些东西。如果您没有编写有效的“程序”,解释器将拒绝它。

因此,谐音语言可以满足您的三个要求。您甚至可以轻而易举地定义正式程序的概念。

您可以在Lisp内部建模Lisp吗?是的,这通常主要是在Lisp编程书的末尾进行练习以测试您的能力。ICP

目前,第四个问题是一个研究问题,下面是我发现的试图回答这个问题的内容。

我会说有很多类型的程序试图这样做。以下是我所知道的所有程序。

  • JSLint是静态分析器的一个示例,该分析器采用机器代码或某种其他语言并显式查找错误。然后,它要求程序员进行更正。

  • Coq是允许您使用编程语言指定证明的环境。它还具有一些策略,可以为您提供解决问题的方法。仍然希望有人来做这项工作。Coq使用依赖类型来工作,因此非常注重类型。它在计算机科学家和从事同伦类型理论研究的人们中非常受欢迎。

  • 另一方面,ACL2是自动定理证明器。该系统将根据您编程的内容来证明语句。

  • ACL2和Coq有一个软件插件,可将其系统与机器学习系统连接。用于训练这些系统的是先前编写的程序。根据我的理解,这些系统增加了另一个功能,您不仅拥有自己的战术,而且还提供有助于证明开发的建议定理。

以下是您的问题含义的基础。

  • gcc是优化编译器的一个示例,该编译器可以将自身作为输入,然后输出自身的优化版本。编译器可以将程序从一种表示形式转换为另一种表示形式,并由于某些优化标志而提高了速度,这一思想已广为人知。一旦引导了编译器并生成了有效的机器代码,便可以添加优化并重新编译该编译器,从而使编译器自身更高效。

1
无需使语言尽可能少。您可以将相关的元编程功能添加到任何语言。Taha的MetaML工作证明了这一点。实际上,元编程功能的添加是机械的。
Martin Berger 2015年

1
我也不同意“没有当前的系统可以完成所有四个步骤”。问题4仅讨论以代码形式运行的程序。这是完全有可能的,实际上甚至Javascript的eval都可以做到。
Martin Berger 2015年

@MartinBerger我的意思是使核心内核尽可能地小。同样,如果您甚至开始希望您的系统能够执行#4,那么您将需要一个不仅可以训练人类而且可以训练计算机的系统,以便使用它,从而使您拥有一个最小的系统并使它们具有在其中进行编码的库,这对您有利。该系统就像元编程模板一样
Joshua Herman 2015年

这取决于我们在说什么(4)。原始问题包含两个方面。首先是微不足道的,您只需运行该程序。第二个问题可以通过我在键入系统(2)的答案中引用为(5)的逻辑来处理。后者在MetaOCaml中实现。但是还有更多的研究空间:(2)和(5)都不能处理任意形式的元编程,并且(2)所保证的属性有点弱(毕竟,这是具有类型推断的类型系统) 。
Martin Berger 2015年

1
至于“您使核心内核尽可能地小”:这不是必需的。您可以将完整的元编程添加到任何语言。
Martin Berger 2015年

5

正如@ user217281728的答案所提到的,有一类与推理和AI相关的机器,称为Gödel机器

Gödel机器是JürgenSchmidhuber发明的一种自我完善的计算机程序,可以以最佳方式解决问题。它使用递归自我改进协议,其中当可以证明新代码提供了更好的策略时,它将重写自己的代码。该机器是由JürgenSchmidhuber发明的,但以启发数学理论的KurtGödel的名字命名。

于尔根·施密德胡伯(JürgenSchmidhuber)的参考出版物“ Goedel机器:自参考通用问题求解器可实现最佳自我改进”,(2006)arXiv:cs / 0309048v5

机器实现元学习的工作方式分为两个阶段:

  1. 从数据中学习(级别1,学习)
  2. 使用学习到的数据来修改/优化其源代码/算法(级别2,学习学习)

由于机器修改了自己的源,因此它是自引用的,即具有自修改属性(另请参见此处)。

从这个意义上讲,它可以严格地修改学习算法本身(证明最佳的自我修改)。存在自我参考和不确定性的问题,在这种情况下,其形式为:

..一台拥有无限计算资源的Gödel机器必须忽略那些无法证明其有效性的自我改进

具有自我修改属性的其他语言(及其关联的解释器)例如是LISP

在LISP中,代码和数据可以互换,或者在LISP程序中可以将源代码AST用作数据,并且可以将其修改为数据。另一方面,对于某些源代码,数据可以看作是AST。

更新

还有其他机器,例如自编程机器(以及其他),它们结合了自参考自复制自编程

上面的一个有趣的方面是,自我参照根本没有问题,而是自我复制 /自我编程自动机中必要元素

有关更多详细信息(以及更多出版物),请参阅JP Moulin,CR Biologies 329(2006)。

抽象

生命系统能够对不可预测的环境做出适当的响应。这种自我组织似乎是作为自我编程机器来运行的,即能够自我修改的组织。到目前为止,提出的生物的自组织模型是微分系统的函数解或自动机的转移函数。这些功能是固定的,因此这些模型无法修改其组织。另一方面,计算机科学提出了许多具有生物适应系统特性的模型,但是所有这些模型都取决于目标与结果之间的比较以及程序员的巧妙选择参数,而程序员没有意图。在生命系统中也没有选择。sp中号sp


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.