大约一年以来,我一直在考虑编写一个能够编写程序的程序。这主要是一个有趣的练习,可能会让我学到一些新的概念。我的灵感来源于负熵以及秩序从混乱中涌现、新的混乱从秩序中产生的无限循环的能力。
更具体地说,程序将从编写一个短的随机字符串开始。如果字符串能够编译,程序会记录下来以便后续比较。如果字符串无法编译,程序会尝试重写直到它能够编译。随着更多字符串(迷你“无用”程序)被记录下来,它们可以被解析以寻找相似性,并用于生成语法。然后可以利用这个语法来编写更多比纯粹随机字符串更有可能编译的字符串。
这显然有点傻,但我想尝试以这种方式“培养”一个程序会很有趣。作为副产品,我可以得到一堆独特的程序,我可以将它们可视化并称之为艺术。
我可能会用Ruby来编写这个程序,因为它的语法简单且支持动态编译,然后我将使用ruby-processing在processing中进行可视化。
我想知道的是:
- 这种编程类型有名称吗?
- 在这个领域目前存在什么?
- 主要贡献者是谁?
- 额外奖励! – 除了编译(是/否)之外,我可以通过哪些方式程序化地为输出程序赋值?
我可能希望扩展这个程序的功能,根据参数生成程序,但我希望程序通过运行编译的程序并为程序的输出赋予意义来定义这些参数。这个问题可能比一个奖励问题更复杂,但如果你能想到一种简单的方法在不到23行或一个超链接内完成,请在你的回答中加入它。
我知道这不完全是元编程,从我对AI和生成算法的有限了解来看,它们通常比我所想的更有目标性。最理想的情况是一个程序能够不断重写和改进自己,这样我就不必动手了^_^
回答:
查找“遗传编程”。
编辑以回应评论:
@[隐藏人名], @[隐藏人名]: 确实。原帖中描述的是通过强行尝试使某些具体语法编译来推断语法,然后从语法中反向生成新的具体语法的系统。如果你必须要有非常接近这个描述的东西…我最好的建议是研究从某种语法非常简单的语言中的具体语法构建隐马尔可夫模型。我会考虑使用一种最小的组合逻辑(类似于Unlambda语言的精神)。
另一方面,遗传编程是一种有发展实践和文献的技术,它不是“确定性”的,而是一个随机过程。它也是一个相当广泛的术语——可以说,原帖中的系统是GP的一个极限情况,具有0%的交叉和100%的变异。