我现在试图更好地理解编程语言中的“抽象解释”是什么。我找到了一本很好的书,该章解释了用最小固定元素扩展域的思想,为连续函数产生固定点的四个公理等等。我了解了这些技术细节(尽管我不确定整个方案中到底指的是“抽象解释”)。
我不确定是什么促使使用抽象解释?它只是确定可计算功能的固定点吗?主要动机是否来自大多数编程语言中的递归?
也将很高兴获得一些高层次的概述,该概述对具有计算机科学学位的人的技术确实足够深入。我发现Wikipedia页面令人不安。
我现在试图更好地理解编程语言中的“抽象解释”是什么。我找到了一本很好的书,该章解释了用最小固定元素扩展域的思想,为连续函数产生固定点的四个公理等等。我了解了这些技术细节(尽管我不确定整个方案中到底指的是“抽象解释”)。
我不确定是什么促使使用抽象解释?它只是确定可计算功能的固定点吗?主要动机是否来自大多数编程语言中的递归?
也将很高兴获得一些高层次的概述,该概述对具有计算机科学学位的人的技术确实足够深入。我发现Wikipedia页面令人不安。
Answers:
抽象解释是一个非常笼统的概念,并且根据您要求的对象,您会收到不同的解释,因为通用概念允许多种观点。这个答案的观点是我的,我不认为这是一般性的。
计算硬度作为动力
让我们从决策问题开始,其决策解决方案具有以下结构:
程序上通常有一个NP-hard下限。检查程序的语义属性甚至是不确定的。我们能做什么?
让我们做两个观察。首先,即使我们不能解决一般问题,有时我们也可以解决特定的问题实例。其次,诸如编译器优化之类的应用程序可以容忍近似值,因为消除了部分而非全部无效源的编译器很有用。为了使这种直觉更加精确,我们必须回答:
抽象解释思想1:更改问题陈述
对我来说,抽象解释的主要见解是改变问题的表述,以使我们不再要求是/否答案,而是要求是/否/也许答案。
结果,每个问题都有一个简单的,固定时间的解决方案(输出可能是)。现在,我们可以将注意力转移到并非总是产生Maybe的过程上。回到上面的问题,一种适用于某些问题实例的解决方案是将Maybe返回可能无法解决的问题的解决方案。而且,也许是肯定和否的近似值, 因为我们不确定答案是什么。
这个想法并不局限于决策问题。考虑有关程序的这些问题。
在所有这些情况下,我们可以通过考虑具有不确定性的解决方案,从精确的解决方案过渡到近似的解决方案。
生产的布景不一定是最大的。这个想法非常笼统,适用于与程序分析无关的问题。
请注意,我们不仅更改了问题,而且还严格地对其进行了概括,因为对原始问题的解决方案仍然是对已修改问题的解决方案。现在最大的未解决问题是:我们如何找到一个近似的解决方案?
抽象解释思想2:原始解的不动点表征
第二个主要想法是观察到,许多问题的解决方案集具有表征为候选解决方案格中的固定点的特征。例如,假设您有一个图形,并且想知道一个顶点 可从顶点到达 。我们可以将其分解为找到集合 可以到达的所有顶点中 然后检查 在这个集合中。我们可以进一步观察到 是该方程式的最小解:
定点表征的价值在于,可以将精确解视为一系列近似值的极限。在此示例中,系列的第th个元素是可到达的图顶点集合 距 逼近是这些顶点的子集。
定点表征是设计决策。一组解决方案有许多不同的特征。他们每个人可能都有不同的优势。就编程语言而言,我们拥有的结构不仅仅是处理图形。我们关心的定点方程可以通过对输入程序的结构进行归纳来定义。这个想法并不特定于程序。当对结构化语言的元素(如语法,逻辑公式,程序,算术表达式等)进行抽象解释时,我们可以通过归纳某些句法对象的结构来定义不动点。
通过给出定点特性,我们致力于一种特定的计算解决方案。实际上,我们不会计算此固定点,因为它至少与解决原始问题一样困难,这将使我们进入下一步。
抽象解释思想3:不动点近似
而不是计算函数的固定点 格子状 ,我们可以计算另一个函数的不动点 格子状 。只要满足相关的某些条件 至 ,是在 保证是在 。这是抽象解释的基础结果之一,通常称为定点传递定理。健全性条件由Galois连接给出,或者由涉及抽象或具体化函数的较弱设置或健全性关系给出。
定点传递定理可确保您不必在每次设计近似分析时都证明您正在计算声音近似值。您只需要证明格子 (包含原始解决方案)和 (包含近似值)和函数 和 满足某些约束。如果您是分析的设计师并且在意稳健性,那么这将是一个巨大的胜利。
您可能会发现定点转移背后的直觉很有见地。我们可以将固定点视为元素(可能是超限)链的极限。计算近似解等于近似此极限,我们可以通过近似链中的元素来实现。
近似的概念取决于应用。如果您使用图表可达性来计划行程,则可以接受一个近似值,该近似值告诉您之间没有路径 和 即使有路径,但是如果算法说存在从 至 没有路的地方。
抽象解释思想4:不动点逼近算法
到目前为止,所看到的一切都是数学存在的结果。最后一步是计算近似值。当逼近点的格是有限的(或者满足上升/下降链条件)时,我们可以使用一个简单的迭代过程。如果晶格是无限的,则迭代过程可能无法满足要求,尽管计算固定点仍然可以确定。在这种情况下,许多技术被用来进一步逼近解,或者比幼稚的迭代算法更快地跳到精确的解。在计算解决方案的上下文中,您会听到诸如扩大,缩小,策略迭代,加速等术语。
摘要
在我看来,抽象解释为抽象概念提供了数学基础,就像数学逻辑为推理提供了数学基础一样。我们关心的许多问题的解决方案都具有固定的特征。这种观察不仅限于编程语言问题,甚至不限于计算机科学。近似解可以表征为不动点的近似值,并可以通过专用算法进行计算。这些特征和算法将利用问题实例的结构。对于程序,此结构由语言的语法给出。
计算不具有自然度量的问题的近似值是从业者不断发展和完善的艺术。对于这种艺术背后的科学来说,抽象解释是一种数学理论。
参考 您可以阅读一些不错的有关抽象解释的教程。
我同意,通常很难从所有这些细节中提取要点。(实际上,我所见过的每一种对抽象解释的处理都存在的一个大问题是,它们在没有动机的情况下提供了太多的机制。)
我是这样想的:
抽象解释大约一次在大量输入上运行程序。
这并不能涵盖所有内容,但总体来说还不错。
典型示例是评估算术表达式以确定结果的符号。您可以想象一个假设的,无限快的机器,该机器可以在每个正输入上求值一个表达式并返回结果集。如果您拥有其中之一,则原则上可以确定诸如“该程序在给定正数时返回正数”之类的内容。
但是当然您实际上没有那台机器。您被困在现实生活中,因此您必须象征性地做同样的事情,有时可以给出准确的答案,但经常失败,或者近似地以总是返回答案但不一定准确的方式给出答案。后者是抽象解释的作用。
您甚至无法直接表示所有正数的集合。相反,您需要该集合的抽象。您还需要抽象负数和零。您最终得到了一组有限的抽象集,代表具体集合。
现在,您可以提出规则,例如“将两个正数相加得到一个正数”,或者 。为每种语言原语提出规则,您可以假装同时评估大量输入上的算术表达式。
当然,“加一个正数和一个负数”规则会给您带来麻烦,因为类似的加法会返回任何结果。抽象解释框架在这里可以为您提供帮助:它表示您应该返回尽可能紧密的声音近似值。如果您的规则合理,并且说加法在抽象集中返回了某些内容,则任何具体评估都应在相应的具体集中返回一个数字。例如, 规则是合理的,如果 对每个积极的人都是积极的 和 。也, 听起来不错,“是您的抽象集的联合操作。
我相信,即使是最年轻的PL研究人员也可以在下午编写这样的抽象解释。它实际上并不难,您应该在阅读更多内容之前先尝试一下,以了解基本知识。执行此操作时,您会发现抽象集需要一些交集的概念(表示为“”和子集(表示为““)。它们应与具体的相交点和子集相对应。
当您想证明您的抽象解释尽可能严格时,您需要一个Galois连接来形式化这种对应关系。仅拥有一个就可以确保对于任何给定的具体集合,都存在最严格的抽象集合。
当您想使用带有循环或递归的语言时,您的程序可能不会终止,因此您需要 表示非终止的值。您需要“计算”(从数学意义上)具体函数作为固定点,并类似地计算抽象函数。如果您具有高阶函数,则会发现典型的拓扑机制根本无法处理它们(高阶应用程序通常不是连续的),并且需要Scott域。
IOW,您确定为抽象解释的动机实际上是对在图灵等效语言上进行抽象解释所需的机器的动机。实际动机是通过一次在许多输入上运行程序来总结程序的行为。