高阶程序的程序反转算法


10

程序反转一词 具有多种含义,但可能始于麦卡锡(J. McCarthy)1956年的著作《图灵机在AI中定义的功能反转》。到目前为止,已经发现了程序反转和其他领域之间的许多联系,例如可逆编程(物理和逻辑),部分评估,验证,双向编程,逻辑编程和机器学习。

什么是程序反转?在第一个近似中,它是这样的:给定程序接受类型参数 并返回类型结果,产生一个程序,它“某种程度上”是的逆。我故意在这里含糊不清,因为可以用多种方式(和已经)阐明这个概念:例如,必须是内射的?是否应 返回所有或部分,使得?P一个B P 1 P P P 1b a P a = b一个P-1个PPP-1个b一个P一个=b

有一些通用的方法可以使程序求逆,例如使用麦卡锡已经指出的对角化或使用部分评估,但它们往往效率不高。同样,我熟悉的大多数程序反转工作似乎都无法处理完整的高阶编程语言(即 -calculi)。λ

参考要求。用于 -calculi的程序求逆的显式算法的最新技术是什么(不限制高阶)?λ

Answers:


5

这个空间中没有大量的工作,但是有什么工作很有趣。

  1. Torben Mogensen致力于解决这个问题。这是他的两篇论文。

    第一篇论文给出了用于一阶功能程序的算法,第二篇论文将其扩展到了高阶。该算法何时成功的精确表征留待以后的工作。

  2. 横山哲夫,霍尔格·博克·阿克塞尔森和罗伯特·格吕克。

    这描述了RFun编程语言,该语言可反转一阶功能程序,但会强制执行内插性和向后确定性约束,从而确保向后评估与向前一样快。(他们还写了许多其他有关此主题的论文,我很难掌握。)

  3. Stefan Bohne和BaltasarTrancónWidemann。

    这是一张非常整齐的纸!它观察到(a)您可以构造一个态,其中态素是它们的逆成对的函数(对于您使用的逆的任何特定概念),以及(b)此类别具有匕首紧凑结构。这意味着您可以编写带有线性样式规则的程序,然后从语义中读取前后解释。

    它们提供了一种具有相当狂野的语法的功能语言:几乎任意的表达式都可以用作模式,而可逆性使其变得明智。

  4. Francesco Tiezzia,吉田信子

    我没有读过这篇文章,只是在谷歌搜索其他论文时才发现它。考虑到作者和主题,我怀疑这就是您的胡同!


谢谢。(2,3,4)不执行程序反转,而是设计程序语言,根据定义,程序是可逆的。这是一个密切相关但又不同的问题。实际上,我对这些问题的关系尚不完全清楚。我可能没有解决过半反转问题,因为反转似乎是半反转的边缘情况?BTW Mogensen的第二篇论文仅排名第二。
Martin Berger

@MartinBerger:我猜这种关系取决于您要使用程序反转的目的!我对这个问题很感兴趣,因为我正在研究类型推断(如果您具有类型级别的函数,则能够将这些函数求反以找出量词的实例化很有用),因此限制语言不是我。你想做什么?
Neel Krishnaswami

现在,我对一般的抽象问题感兴趣。我对程序反转的兴趣来自程序验证。而且我找不到任何仅使用lambda术语(来自PCF称谓或STLC)并将其求逆的地方。是因为我找错地方了吗?
Martin Berger
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.