→ 包含一个连续程序p。 在初始状态,p是原始程序,而在最终状态,p只是空程序。小步语义的公理和推理规则定义了如何在每个状态转换期间重写4.2SOS的余代数语义我们通过一个函数来定义编程语言的操作语义,该函数将每个程序连同初始状态一起映射到函子T(X)= 1 +A×X的最终组合的元素,其中A是计算期间达到的状态集。这个余代数的载体集是A∞。这意味着,如果程序执行,则程序的语义由有限状态转换列表描述。68S. Glesner等人理论计算机科学电子笔记176(2007)61终止,并在非终止的情况下通过无限状态转换列表。SOS将编程语言的语义定义为映射元组的函数 到元组 到作为最终状态的aJ因此,每个SOS语义可以被认为是一个函数,它以程序p和初始状态a作为输入,并迭代地定义一个元素为A的有限或无限列表。因此,每个SOS语义都对应于一个具有余代数运算[stop,values,next values]的余代数。停止表示程序终止。否则,当前状态是可观察的,并由函数值表示。其余的可观察的状态转换序列是通过应用下一个当前状态的功能。给定SOS语义,我们定义一个函数[SOS]]:A×P→A∞余归纳为下图中唯一的余代数同态:A× P_[[SOS]]- -- -_A∞[停止,值,下一个值]J[空,头,尾]J1+A×(A×P)________ 1+ A × A ∞id+(id×[[SOS]])[SOS]的定义方程为:⎧constructions(value(a,p),next(a,p))if[stop,constructions,next](a)⎪停止jJ⎪⎨[[SOS]](a,p)=⎪⎪即如果 → 或者如果 →aJif[stop,value,next](a)=stop⎪⎪⎩如果没有继承国,这个定义赋予每个程序和每个初始状态一个最终余代数A∞的元素,A ∞是函子T(X)= 1+A×X的最终余代数。5相似关系正如第2节中的例子所证明的,我们可以认为两个不同程序的行为是等价的,即使它们的状态转换序列不相同。在本节中,我们定义了列表上的两种相似关系。第一种,我们称之为折叠,允许我们将任何有限数量的连续相同状态折叠成给定状态转换序列中的一个状态。折叠对于验证更改某个程序部分中执行步骤数量的编译器优化至关重要 一个非常简单的例子是消除no-ops或skip语句。在机器代码级别上,一个稍微复杂一点的例子是用一个简单的操作替换另一个简单的操作。⎪S. Glesner等人理论计算机科学电子笔记176(2007)6169更复杂的等效操作或简单操作的捆绑,使得它们可以在一个步骤中执行。这在验证现代VLIW(超长指令字)处理器(如Intel Itanium架构)的优化时尤为重要。这些优化可以很容易地证明是正确的概念的干扰。在5.1小节中,我们介绍了两个不同的定义,并总结了Isabelle/HOL中它们等价性的证明第二种相似关系,抽象,允许我们简化状态转换序列,通过应用抽象函数元素的方式包含的状态。抽象的定义见5.2小节。5.1崩溃的关系坍缩是序列上的二元关系,它捕捉了这样一种思想,即我们希望通过将这个有限序列坍缩为一个单一状态,将连续相等状态的任何有限子序列视为等价于该状态的仅一次出现。原则上,有两种方法来定义坍缩关系。在本小节的其余部分,我们给出了Isabelle/HOL中的两个替代的定义及其等价性证明。5.1.1使用合并函数的相似性我们的第一种方法是基于序列的唯一最小形式,称为序列的合并。这是一个序列,其中一个元素的所有有限次如果两个列表的合并包含在互模拟中,则它们被认为是相似的。合并函数的定义需要形式化有限前缀和潜在无限序列的连续性。特别地,我们需要最大有限前缀的概念,它是序列中相等元素的(长度最大)前缀。在Isabelle/HOL中,这可以通过以下谓词表示:is_max_prefix pLp前缀L你好 设p = {x}另一个(其他前缀L x。set other ={x})−→其他尺寸≤尺寸p由于我们的序列是潜在无限的,这样的前缀不一定需要存在。例如如果我们的列表是单个状态1的无限重复,则不存在最大有限前缀在我们的形式化中,我们还定义了函数split_finite_prefix,它分割序列的最大前缀(如果它存在),返回前缀元素和列表的其余部分,或者如果列表为空则返回None分裂有限前缀case Lof无| x ~ L2 ⇒如果前缀是_max_prefix p L,则Some(x,cut_maxn(size(max_prefix L))L)else Some(x,L2)1 对于缩写,这样的列表被称为无聊。70S. Glesner等人理论计算机科学电子笔记176(2007)61如果列表中没有这样的前缀,那么只有第一个元素被拆分为前缀。将此函数以共递归方式应用于惰性列表,将产生所需的合并函数:合并L≡ llist_corec L split_finite_prefix以这种方式定义的合并函数正是我们想要的:它将相等元素的序列折叠成该元素的一个单独出现。如果列表是某个x的无限重复,那么合并函数就像一个简单的复制函数,因为最大前缀永远不存在。请注意,合并函数不可计算,因为split_finite_prefix不可计算。这也是为什么两个列表相似的证明不能自动化的原因对于这样的证明,需要找到一个包含它们的合并对的互模拟在具体情况下,这可能是一项乏味的任务。对于有限列表,我们可以显式地命名所有最大的简单前缀,以便将它们折叠成单个(相等)元素。 对于无限列表,我们必须在我们的列表中展示某种结构,使得每当我们从两个列表中删除一个最大简单前缀时,我们可以再次这样做,等等。 当使用直接定义的关系时,关于无限列表的相似性的推理变得更容易,如下所述。5.1.2直接定义相似关系或者,我们使用以下引入规则共归纳地定义一个关系,其中r=pdenteste a tet e.finite元素x的重复次数:2共归纳“absRel”引导页nil:“无意义的“步骤:“[[ p=q ; LM]]=p@Lq@M”这个定义表达了空列表与空列表相似,如果两个列表相似,那么我们可以在两个简单的x前缀前面加上两个不同长度但元素x相同的前缀。 虽然这个定义简短、简洁,而且--正如我们稍后将看到的--易于在证明中使用,但人们不能立即看出它等价于我们基于合并函数的第一个对双列数的定义。最突出的问题是我们不能“走回头路这意味着当对于某些P和Q成立,我们只知道存在P的某些分裂,Q使得P和Q的各自前缀对于某个x是有限x-前缀,并且后缀也是相似的,但是没有办法构造性地确定这个前缀-后缀-对。对于共归纳集和归纳集的这些性质的证明经常使用事例规则,逻辑上等价于回”的介绍步骤。 将这一规则应用于格式为A-B的陈述只产生这样的分裂存在的弱声明,这对于大多数用途是不足够的。为了使这个定义仍然有用,我们证明了一个加强的案例规则:我们表明,每当我们在第一个变化的位置分裂序列时也就是说,在最后一节定义的最大前缀之后,我们保持相似性:lemmacase_strong:“[[p@L q@M; is_max_prefix p p@L; is_max_prefix q q@M]]=LM“2 符号@表示列表上的追加操作。S. Glesner等人理论计算机科学电子笔记176(2007)6171利用这个引理,我们证明了我们的关系的抽象性质(如传递性),参见。[12]详情此外,这条规则是我们两个相似性定义之间的重要桥梁,我们需要证明它们的等价性。5.1.3证明等价性这两个定义是等价的:merging(L1)=merging(L2)合并L1合并L2证明的一个方向是简单的。我们证明了每个懒惰列表都类似于它自己的合并。这个证明方向的简化版本在这里以ISAR [20]符号给出:引理abs_sim:显示“A合并A”证明-S让?X =“L.{(L,合并L)}”有“X”。x∈?X−→(x =(,)(2000年) x=(p@L,q@M)<$p<$= q<$(L,M)∈?XabsRel))”证明-{fix xassume“x∈?X”然后通过auto获得L,其中x_form:“x =(L,合并L)”因此,“x =(,)(2000年) x=(p@L,q@M)<$p<$= q<$(L,M)∈?XabsRel)”证明案例假设“L=0“显示?作者:lnil_abs_invariant下假设L_not_empty:“L空“然后通过简单相加得到l和M,其中L_form:“L=l~M”:因此?论文证明案例假设“boring L”,因此“x =([l]@M,[l]@M)”通过自动因此?thesis by(unfold sameRel_def,auto intro:sim_refl)下假设“<$boring L”然后获得pmax,其中is_mp:“is_max_prefixpmaxL”. 此外,然后获得后缀,其中lsplit:“L=(pmax@suffix)”. 此外,从is_mp和L_form具有pml:“setpmax={l}”. 最终具有“合并L =1~合并后缀”...因此“x =(pmax@suffix,[l]@(merging suffix))”. 通过简单地添加:sameRel_def最终显示,您是否会看到“pmax_def=[l]”?汽车(Auto)qedqed}因此?blast文章QED而且有“(A,merging A)∈?X自动最终显示?thesis by(rule_tac X="?X”in absRel.coinduct,simp)QED这样证明了L等于merging(L),我们就可以完成一个方向的证明,即merging(L1)=merging(L2)=<$L1<$L 2,因为merging是一个等价关系。另一个方向带来更多的困难。幸运的是,我们有我们的“强化案件规则”。使用它,我们表明,X={(merging(x),merging(y))|x y}72S. Glesner等人理论计算机科学电子笔记176(2007)61⎪是一种互模拟,它要求⎧⎪⎪⎪⎨(,)或(merging(x),merging(y))=(a~merging(xJ),a~merging(yJ))⎪其中xJ<$yJ由于我们现在知道我们可以移除最大有限个α-前缀,并且列表保持相似,我们分别选择相应的子集为xJ和yJ(α为a)。由于合并函数的定义是只删除这个最大前缀,第二个要求也是正确的。这两个定义之间的等价性证明是非常有用的。在我们的实验中,我们发现,虽然使用相似关系的共归纳规则(第二种定义变体)相对简单,但要证明两个不同的惰性列表在核心递归定义的函数(第一种定义变体中的合并函数)下的图像是相等的,则要困难得多5.2从无关细节中抽象重新考虑图3中计算高斯和的两个程序,它们在语义上并不相同,但如果忽略变量i和s并将每个状态仅投影到感兴趣的部分上,则它们是相似的。在本小节中,我们正式介绍了通过抽象函数简化状态的思想定义5.1[序列上的抽象]设f:A→A是一个修改A中状态的函数。然后我们定义一个共归纳函数Tf:A∞→A∞,head(Tf(l))=Tf(head(l))和tail(Tf(l))=Tf(tail(l))。Tf通过将f应用于原始序列中的每个元素来变换给定序列Tf(l)称为l关于f的抽象。⬦定义5.2 [语义等价模抽象]设l和k是状态转移序列,l,k∈A∞。如果Tf(l)和Tg(k)相似,则l在语义上等价于k模抽象函数f和g⬦有了这个定义,我们在6.3小节中证明,如果忘记了辅助变量i和s的值,那么图3中的两个程序的语义在语义上是相等的。6程序转换在这一节中,我们证明了我们的共同代数方法的有用性,程序语言的语义和正确性证明程序转换验证的转换讨论的激励例子在第2节。S. Glesner等人理论计算机科学电子笔记176(2007)6173S为此,我们通过形式化4.1小节中给出的规则,在Is- abelle/HOL中指定了一个简单while语言的语义。一个国家被定义为作为函数State:Var→N,将变量映射到自然数。此外,我们还指定了函数step,它形式化了单个状态的执行,并返回新语句和新状态,其中计算继续进行:step:(Statement,State)~(Statement,State)。如果没有继承国,其结果是无效的这个转换函数允许我们通过为每个配置(每个状态和延续程序)分配一个潜在的无限状态转换序列,来以共递归的方式定义示例语言中程序state_sequence::“配置文件状态项llist”state_sequence_def:“state_sequence C == llist_corec Cstep”在这一节中,我们证明了第2节中介绍的变换可以基于这种共代数语义并通过使用第5节中定义的相似关系来验证。在6.1小节中,我们从一个标准的互模拟证明开始,证明不可达代码可以被消除,参见。图1.我们在6.2小节中继续使用循环验证将循环不变代码移出循环,参见。图2.最后,在6.3小节中,我们演示了当转换涉及消除程序变量时如何使用抽象,参见。图3.6.1涉及经典共归纳情形的正确性证明考虑以下程序模板:PS:=whiletruedoi:=i+1od;S其中S是一个显然从未达到的任意陈述。因此,PS的语义应该独立于S。我们通过验证S的任意实例化S1和S2的两个状态转移序列相等来证明这一点:<$S1,S2,σ∈State. seq(P S1,σ)= seq(P S2,σ)通过证明两个状态转移序列处于互模拟关系来证明这一陈述是简单的。PS的配置只能有两个延续之一:PS本身,当循环体刚刚被求值时,以及PE:=(i:=i+1;whiletruedoi:=i+1od;S),当总是为真的条件已经在前一步中被检查时。在程序执行过程中,这个程序的延续在这两个延续之间无限地交替,由此定义的状态转换序列与S无关。关于Isabelle/HOL中seq(PS1,σ)=seq(PS2,σ)的共归纳证明的细节,参见。[12 ]第10段。6.2涉及折叠的正确在前面的小节中,两个程序的状态序列实际上是相等的。显然,情况并非总是如此。 作为示例,考虑图2中的循环不变代码的提取。为了验证它,我们需要证明(其中P174S. Glesner等人理论计算机科学电子笔记176(2007)61和P2是图2中的两个程序):<$σ ∈状态seq(P1,σ)<$seq(P2,σ)在Isabelle/HOL中的程序转换的正确性证明中,关系式(cf.第5.1节)派上用场。为了证明两个懒惰列表是相似的,它可以证明存在一组包含(x,y)的懒惰列表对,使得关系式的共归纳规则成立:V相关系数:[[(a,b)∈ X;z. z∈X =<$z =(<$,<$)Themostimportanttechnologiesforthedevelopmentofthetechnologiesarethemostimportanttechnologies. z=(p@L,q@M)<$p<$= q<$((L,M)∈X<$L<$M))]]=ab通常很容易找到这样一个集合X。在大多数情况下,由两个程序的迹组成的对被证明是等价的(程序通过的所有状态列表)可以被构造性地指定,并且具有所需的属性,即使它们是无限的。这些证明通常利用一个人可以“永远留在X中”的事实在我们的示例验证中,我们选择:X={(seq(P1,σ),seq(P2,σ)}σ在Isabelle/HOL中,我们已经验证了<$(x,y)∈Xx <$y,这是我们想要的结果。关于证明的细节,我们参考[12]。6.3涉及抽象的通过定义语义等价模抽象,cf。在定义5.2中,我们有一种方法可以将不同的状态转移序列相互联系起来。所使用的抽象函数可以重命名变量,仅投影到感兴趣的它们与非线性函数一起,使我们能够将有限状态的跃迁序列联系起来。例6.1再次考虑图3中的程序。它们的语义由A∞中的有限和无限状态转换序列来描述,其中每个状态都是程序中包含的变量到其当前值的映射(如果还没有定义,则为undef我们定义一个抽象函数f:A→A,f(a)={(x = v)|(x = v)∈ a<$ x/∈ {i,s}}这个函数通过忽略不感兴趣的变量i和s的当前值,将每个状态投影到其相关部分。定义一个包含(Tf(l),Tid(k))的坍缩很简单,其中id:A→A表示A上的恒等函数,l表示第一个程序的语义,k表示图3中第二个程序的语义。⬦S. Glesner等人理论计算机科学电子笔记176(2007)61757相关工作分别证明程序和系统的语义等价,已经在编译器验证领域进行了深入的研究。关于编译器验证的早期研究是在考虑编程语言Piton的翻译的Boyer-Moore定理证明器中进行的[14]。德国Verifix项目研究了在没有性能损失的情况下构建正确的编译器,参见[3]以获得概述。最近的工作集中在编译器前端的转换上。从Java到Java字节码的转换的形式验证和形式字节码验证在[11]中进行了研究。后者的工作是由Java的形式化工作和在定理证明器Isabelle/HOL中证明其类型安全的工作所预示的[16]。最近,共代数方法也被成功地用于编程语言和系统的规范和推理。在[7,9]中,面向对象编程语言的语义已经被共代数地定义VFiasco项目[8]的目标是验证一个具有煤炭地质方法的操作系统。[19]描述了共代数类规范语言CCSL。余代数证明方法不是唯一的形式主义捕捉的字符的语义non-terminating也可以使用标记的转换系统[13]。互模拟可以在两种形式主义中使用。我们的互模拟概念(操作于共代数数据集)和弱互模拟概念[13](操作于标记转移系统)可以用于相同的目的:定义程序等价性直到可观察的步骤。在我们自己的工作[1]中,我们已经证明了一个死代码消除算法,用于编译器正确使用Kripke结构上的互模拟。在[5]中,我们描述了如何在编译器验证中使用余代数和余归纳。最后,我们在形式化和转换数据流相关计算方面的工作[2]也表明,正如本文所提出的工作,形式化的选择对于使用定理证明器时的证明成功至关重要。8结论我们已经提出了一个新的框架,程序等价的共代数验证。通过给每个程序分配一个合适的终结余代数的元素,我们也为非终结程序定义了语义。通过验证编译器中简单但典型的非细化优化,我们已经表明,我们的框架能够形式化在现代优化编译器中发现的转换的正确性证明我们还展示了我们如何将这个框架与定理证明器Isabelle/HOL中的正确性证明一起特别是,我们提出了两个不同的概念的正确性,并证明了它们的等价性在伊莎贝尔/HOL。虽然第一个概念很好地捕捉了数学直觉,但第二个概念更适合于机械化证明。有了这些结果,我们有助于如何在theo-rem证明器的形式化的问题,以简化机械化的证明,并减少76S. Glesner等人理论计算机科学电子笔记176(2007)61核查费用。为了能够也与不完全相同的状态转换行为的程序,我们引入了两种相似性关系(抽象和语义等价模抽象)。我们把状态转移序列对与连续状态的概念联系起来,这些状态转移序列对包含可能具有不同长度的连续相同状态的相应有限连续在一个坍缩中,我们把每一个这样的具有相同状态的有限子序列看作一个单一的状态。此外,语义等价模抽象的概念使我们能够将状态转换序列对,这两者都可以通过在它们上应用抽象函数元素来降低到一个共同的分母。这两个概念,再加上对状态转移序列的抽象,是验证语义等价的有力工具。有了它们,我们对语义对等的定义完全基于语义方面,而不是基于任何句法标准。如果原始程序和变换程序的状态转移序列的抽象包含在一个适当的折叠中,则每个变换都是正确的(相对于某些抽象函数)甚至两个语法上完全无关的程序在给定的抽象上也可以是语义等价的。如何选择抽象函数的问题取决于上下文,也就是说,取决于我们想要考虑什么是语义等价的问题。我们相信,这一框架的验证程序或系统转换,分别,也可以应用于软件工程的其他领域。今后工作的主题是进一步探讨这一点。引用[1] Jan Olaf Blech,Lars Gesellensetter,and Sabine Glesner. Isabelle/HOL中死代码消除的正式验证。第三届IEEE国际软件工程与形式化方法会议论文集IEEE Comp. Soc. Pr
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 4
- 资源: 2万+
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx