有没有办法做基于示例的编程?

时间:2016-03-21 15:07:01

标签: functional-programming language-agnostic scheme lisp code-generation

是否可以通过编写显示前后的一定数量的示例来自动生成程序/功能?需要多少个例子来确保正确性和漏洞?这样一个自动过程的名称是什么?

3 个答案:

答案 0 :(得分:2)

它被称为程序综合或者猜测。您的问题让我想起2013 ICFP programming contest您应该猜测的程序,而您所拥有的只是您选择的测试输入的输出,以非常简单的函数语言。

所以想象你想要制作身份功能:

(define-by-example identity
  (0 -> 0)
  (1 -> 1))

有什么遗失?如果我告诉你创建一个只返回0和1的值的函数怎么办?你会如何与上述例子做出不同的决定?如果它是非线性变换怎么办?例如。要使多项式正确,需要多少个例子?

我想我们会回到这样的事情:

(define-by-example fib
  (0 -> 0)
  (1 -> 1)
  (n -> (+ (fib (- n 1)) (fib (- n 2)))))

但是很多语言都有这个。甚至计划脏表兄球拍也有这个:

#!racket
(define (fib n)
  (match n
    [0 0]
    [1 1]
    [n (+ (fib (- n 1)) (fib (- n 2)))]))

这是Haskell的Hello World,所以我们最好写下: - )

-- haskell
fib 0 = 0
fib 1 = 1
fib n = fib(n - 1) + fib(n - 2)

现在有聪明的人试图找到将想法转移到计算机和我们明确的语法的最佳方法。我确信"通过实例"的本质很好,但它也需要一种解释腐蚀的方式,我想不出比数学不适用的数学或代码更好的方法。

答案 1 :(得分:2)

这是机器学习的子域名,称为监督学习。解决这些问题最流行的方法是使用神经网络。另一种方法是遗传编程。

在一般情况下,无论训练集(示例数量)有多大,都无法保证正确性。但在典型应用中,这不是必需的。如果结果是正确的,则培训被认为是成功的。

答案 2 :(得分:1)

  

是否可以通过编写显示前后的一定数量的示例来自动生成程序/功能?

我说是的,但是......

......它并不那么容易,当然也不是普遍适用的。基本上有两种方法"我知道的:

a)尝试生成程序

只需将程序代码(最可能是某些指令集中的指令)打包在一起,直到获得所需的结果。这可以用蛮力来完成,但是几乎不可能合成非平凡的功能,但是单独完成程序,或者可能使用您喜欢的人工智能工具集的技术,如爬山,模拟退火,遗传编程和整个休息。

我所知道的唯一参考是"Superoptimizer" by Henry Massalin,它试图生成一个与给定函数计算相同的函数,只需要较少的指令。

使用某些更高级别的“计算”表示可能更好。比汇编程序指令(可能是Lisp AST?),但这只是我的猜测。

b)写一个以某种方式"以及#34;学会表现得像所需的程序

这实际上现在以神经网络的形式非常普遍,例如用于图像或语音识别。在这里,你不要试图获得一个能够达到你想要的程序(例如,#34;在任意图像中识别鸟类和#34;),而是编写一个能够学习的一般程序,表现得与众不同。 #34;并训练,以便按照你的意愿行事。

请注意,在了解这些元程序在学习其预期功能后实际执行的操作时,需要付出很多努力。从the first relevant result获取a Google search已经是一个有趣的读物。