程序合成
程序合成
经典程序合成定义
输入:
- 一个程序空间
, 通常用文法表示. - 一条规约
, 通常为逻辑表达式.
输出: 一个程序
一个例子: max问题
语法:
规约:
期望答案为:
程序合成方法
1 | graph LR |
如何产生下一个被搜索的程序?
- 枚举法——按照固定格式搜索.
- 约束求解法——转成约束求解问题.
- 空间表示法——一次考虑一组程序而非单个程序.
- 基于概率的方法——基于概率模型查找最有可能的程序.
如何验证程序的正确性? 抽象解释, 符号执行.
- 基于反例的优化: CEGIS. 保存约束求解器的反例, 首先采用测试. 要选择一个好的反例, 就要估算它可以排除的程序的个数.
- LearnSy: 通过近似输出相同的程序对的个数来估计被排除的程序. 输出相同的程序对越多,被一个输入输出对排除的程序期望数量就越少.
- …