编写一个编写程序的程序

时间:2011-11-25 03:08:59

标签: algorithm logic computation-theory

在理论计算机科学中众所周知,“Hello world tester”程序是一个不可判定的问题。(这是hello world tester所指的链接。 我的问题是,由于给出了一个程序作为输入,我们不能说该程序将做什么,我们能解决相反的问题:
给定一组输入和输出,是否有编写程序的算法,该程序编写程序以实现给定输入和输出之间的一对一映射。
我知道metaprogramming,但我的问题更多是理论上的兴趣。可以申请一般情况的东西。

6 个答案:

答案 0 :(得分:2)

你的问题含糊不清。

您如何指定“程序应该做什么”? 任何精确,完整和机器可读的程序功能规范都已经是一个程序。

因此,您的问题的答案是编译器



现在,您正在询问如何根据其输入和输出样本查找函数 这是一个关于统计分析的问题,我无法回答。

答案 1 :(得分:2)

通过这些思考,人们必须非常小心。由于没有明确区分命题x拥有的 a 计划P(x)任何计划x而导致很多混淆命题P(x)成立。只要P(x)所持有的程序集是有限的,就会有一个证据证明它们的正确性(虽然这个证据可能不为人所知)。

此时,您还必须区分已知和可以知道的程序以及只能通过完整枚举所有可能性来显示的程序。让我们举个例子:

采取10个程序,不接受任何输入,可能会也可能不会终止并生成“hello World”。然后有一个程序可以确定哪些程序是正确的,哪些不正确。让我们称这些程序为(x_1,...,x_10)。然后,如果设置了i的二进制表示中的第j位,则将程序(X_0,...,X_{2^10})中的X_i输出true用于程序x_j。其中一个程序必须是正确决定所有十个x_i的程序,可能没有办法弄清楚这100个X_j中哪一个是正确的(一个元) - 此时的问题)。

这表明,考虑到有限的程序集和输入/输出对,人们总能解析为完全枚举,并且所有停止问题类型的矛盾立即消失。在您的情况下,每个输入的生成程序集合大小为1,输入/输出对集合的大小有限(因为您必须将它提供给元程序)。因此,完整的枚举可以非常简单地解决您的问题,您还可以轻松地证明更正的程序的正确性以及元程序的正确性。

注意:由于生成的程序集是无限的,这是少数几种可以证明P(x)无限程序集的情况之一(实际上你可以证明P(x,input,output)这个集合) 。这表明集合是无限的只是必要的,而不是这种类型的悖论出现的充分条件。

答案 2 :(得分:1)

听起来你想要生成一个状态机,通过给定输入序列来学习,然后更新自己以产生适当的输出序列。假设您的输出序列对于相同的输入序列始终相同,则应该足够简单地编写。如果输出不确定,例如根据一天中的时间更改输出,则无法自动生成状态机。

答案 3 :(得分:1)

取决于“一对一映射”的含义。 (而且,我想,“输入”和“输出”。)

我的猜测是,你问的是,给定一个给定任意程序的输入和输出的例子,是否可以设计一个算法来编写一个等效的程序?如果是这样,答案是否定的。例如,你可以有一个输入/输出为1 / 1,2 / 2,3 / 3,4 / 4的程序,然而,如果下一个输入值是5,输出将是3782.没有办法从一组给定的结果中知道下一个结果可能是什么。

答案 4 :(得分:1)

由于您未说明如何显示输入和输出,因此问题未明确。对于有限列表,答案是“是”,就像在这个Python代码中一样:

def f(input,output):
    print "def g():"
    print "    x = {" + ",".join(repr(x) + ":" + repr(y) for x,y in zip(input,output)) + "}"
    print "    print x[raw_input()]"


>>> f(['2','3','4'],['a','b','x'])
def g():
    x = {'2':'a','3':'b','4':'x'}
    print x[raw_input()]
>>> def g():
...     x = {'2':'a','3':'b','4':'x'}
...     print x[raw_input()]
... 
>>> g()
3
b

无限集如何呈现它们?如果只显示一小部分输入,则不会指定整个算法。猜测最合适的is是不可判定的。如果你有一个“魔法黑盒子”,那么连续多个映射但只有相当数量的程序,所以这是不可能的。

答案 5 :(得分:0)

我认为我同意SLaks,但从不同的角度来看,编译器做了什么?

(编辑:我看到SLaks编辑了他的原始答案,基本上是'你正在描述身份功能'。)

它采用一种源语言的程序来描述程序的预期行为,并用目​​标语言“编写”另一个程序来展示该行为。

我们也可以根据流程优化等方面来考虑这个问题 - 给定一个抽象的规范,我们可以构建一个精简映射到一些“更具体”(读取:通常不那么确定)的实现。

但根据你的问题,如果有的话,很难说出你的意思。