文献阅读:通过溯因推理生成不变式 Inductive Invariant Generation via Abductive Inference

图神经网络论文阅读(三) Inductive Representation Learning on Large Graphs,NIPS2017 本文的三位作者均来自斯坦福大学计算机系,他们提出一个通用的归纳框架GraphSAGE(空域卷积)。该框架通过从节点的本地邻居中采样和聚集特征来生成嵌入,并且提出了三种不同的聚合邻居特征的方式,这使得卷积的操作更贴近于直观上的CNN。本模型也可以应用于半监督甚至是无监督的任务。 Model 至于Relative work中涉及到的图embedding方法(随机游走、因子分解机等)就不过多介绍了,直... 阅读详情

摘要

文章提出了一个产生归纳循环不变式的方法。其中的循环不变式是由线性整数约束的布尔组合组成。

文章的主要想法是,通过回溯(backtracking)将霍尔逻辑形式的验证条件和逻辑推因(logical abduction)方法结合起来,基于量词消去(quantifier elimination)来推测候选不变变量。或者说,不断加入新的条件进行试错,直到找到真正的循环不变式或者所有候选都不满足。

技术的亮点是:

  • 只关注对证明程序正确性来说必要的变量
  • 可以推测随机的线性约束的布尔组合(包括析取disjunctions)

介绍

自动取推断循环不变式是程序分析领域非常基本的问题,在软件验证、编译优化和程序理解方面都有非常重要的应用。
在自动生成循环不变式的方法中比较突出的有抽象解释、一些基于约束的技术、反例引导的抽象细化(counterexample guided abstraction refinement),和基于插值的方法。

inductive:归纳的。如果某个变量可以由前提推出(implied),并且在循环每次迭代的前后都保持不变,那么我们就说这个循环不变量是inductive的

文章展示了一个自动生成 可以表示为线性整数约束程序变量的布尔组合的 归纳循环不变量的方法。由于给定循环的前置条件(precondition)后,归纳循环不变量的争取性可以被局部(locally)的检查,所以归纳循环不变量在许多程序验证系统里都起到了至关重要的作用。

Q:如何理解局部(locally)?

文章中的方法主要是为了做程序验证,所以,文章只关心对证明程序正确性来说是必要的不变量。此外,文章之关心数值循环的不变量,因为这样的不变量在许多基础的程序验证任务中非常的重要,比如证明数组越界或者缓冲区溢出。

文章技术的一个显着特点是它可以自然地推断出线性整数约束的任意布尔组合的不变量。在这里,线性整数约束是指整数上的线性不等式以及整除性谓词。此外,还包括了disjunction ∧\wedge∧,和implication ⇒\Rightarrow⇒。比如可以推断出下面的循环不变量
(x%2=0⇒x+2y<n)∧(x%2=1⇒x+2y=n) (x \% 2=0 \Rightarrow x+2 y<n) \wedge(x \% 2=1 \Rightarrow x+2 y=n) (x%2=0⇒x+2y<n)∧(x%2=1⇒x+2y=n)
另一个优点是文章中的技术不需要提前给出循环不变量的句法模板,比如ax+by≤cax+by\leq cax+by≤c。其他的工具可能是求解a,b,c但是文章中不需要给出模板求解未知数,而是自动给出不变量的形式。

方法概览

logical abduction: 逻辑溯因,给定结论,推断出确实的前提或者说是假设

文章的主要想法是利用回溯进行搜索,将霍尔逻辑式的程序推理和逻辑溯因(logical abduction)结合起来。

verification condition: 将所需要的性质抽象而成的条件,如果最后发现该条件成立,那么程序的性质成立

开始时,从最弱但是总是正确的循环不变量true开始,然后不断产生验证条件(verification condition, VC),他的正确性保证了程序的正确行。

如果一个VC是无效的,那么我们技术会使用溯因推断的方法来找到其所需要的前提,以此来使当前的VC正确;这个前提就代表了对新循环不变量的推测,这个推测用于加强现有的不变量,并加入到原来的VC中,之后产生新的VC来检查推测的正确性。这个过程不断的进行,除非所有的VC都成立或者推断出了矛盾。前面的情况代表了我们找到了一个足够强的推断循环不变量来证明程序的正确行,然后算法寻找终止;后一种情况表示进行了错误的推断,所以搜索程序会进行回溯并且尝试不同的推断。

文章中产生的验证条件是χ⇒γ\chi\Rightarrow\gammaχ⇒γ形式的语句的conjunction,断言循环不变量的归纳性和程序中断言的正确性。具体来说,右边的γ\gammaγ是我们想要产生的目标,例如循环的前置;而左边的χ\chiχ表示程序中已知的事实,例如已经推断出来的循环不变量。

给定一个无效的VC:χ⇒γ\chi\Rightarrow\gammaχ⇒γ,该技术会尝试加入一些条件来增强χ\chiχ,进而使得当前的VC正确。也就是说,找到这样一个ψ\psiψ,让当前的循环不变量χ\chiχ满足:

  1. ⊨(χ∧ψ)⇒γ\models(\chi \wedge \psi) \Rightarrow \gamma⊨(χ∧ψ)⇒γ
  2. SAT⁡(χ∧ψ)\operatorname{SAT}(\chi \wedge \psi)SAT(χ∧ψ)

其中(1)表示,添加上ψ\psiψ不需要其他条件就可以推出γ\gammaγ。同时(2)表示添加上ψ\psiψ之后,必须与左边的χ\chiχ一致(所谓的一致可以简单理解为二者不会推到出冲突),因为χ\chiχ代表了已知(或推断)出来的不变量。

推断ψ\psiψ的方法被叫做logic abduction,由Peirce给出。因此,文章背后的一个主要观点是,逻辑溯因对于找到足以使程序的验证条件有效的循环不变量的适当强化很有用。

现在,虽然推断的强化 ψ\psiψ 修正了不正确的VC,但它仍然是一种推测,并且可能并不正确。所以,为了保证方法的soundness,文章在每步产生新的VC时都会检测所有不变量的正确性。如果ψ\psiψ是不正确的推测,那么新的VC会包含无效的、需要被修正的命题。如果算法没办法再去修正当前的VC,那么意味着当前的推断是错误的,必须要进行回溯。在另一方面,如果所有VC都成立了,那么意味着所有的推测都是争取的。然后程序终止,并且找到了足够强的循环不便量来证明程序的正确性。但是,文中的技术没有终止性或完整性保证;算法确实有可能在无限的推测链中走不出来。

由于文章执行溯因的算法是基于量词消除的,因此本文只关注可在 Presburger 算法中表达的循环不变量的推理。

执行示例

下面是一个例子,程序如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtaeViLz-1622890473333)(abd eliminate.assets/image-20210603172731266.png)]

第四行的注解[ϕ\phiϕ]表示ϕ\phiϕ是一个占位符,用来表示这个循环的循环不变式。目标就是推测一个具体的公式φ\varphiφ,使得它足够强,能够在证明第8行assertion。

首先,初始化占位符ϕ\phiϕ为true,使用霍尔逻辑式的推断,然后产生VC,在这个例子中为:
ture⇒(flag⇒a=b) ture\Rightarrow(flag\Rightarrow a=b) ture⇒(flag⇒a=b)
该 VC 表示当前循环不变量 true 足够强以暗示post-condition条件,即标志 ⇒ a = b。显然,这个VC式不正确的,所以我们尝试找到一个ϕ\phiϕ以使得:
(true∧ϕ)⇒(flag⇒a=b) (true \wedge \phi)\Rightarrow(flag \Rightarrow a= b) (true∧ϕ)⇒(flag⇒a=b)
有很多ϕ\phiϕ都可以使得该表达式成立,比如¬flag,a=b,flag⇒a=b,⋯\neg flag,a=b,flag\Rightarrow a=b,\cdots¬flag,a=b,flag⇒a=b,⋯,这里假设选择了ϕ=flag⇒a=b\phi=flag\Rightarrow a=bϕ=flag⇒a=b,也就是说flag⇒a=bflag\Rightarrow a=bflag⇒a=b是推测出来的循环不变量。

我们继续生成新的 VC,以断言的候选不变量的正确性。假设程序继续运行,a++,b+=j-1。那么我们会更新VC为:
(flag⇒a=b)⇒(flag⇒(a+1=b+j−1)) (flag\Rightarrow a = b) \Rightarrow (flag \Rightarrow (a + 1 = b + j - 1)) (flag⇒a=b)⇒(flag⇒(a+1=b+j−1))
每次更新,只会更新和VC中存在的相关的变量,比如这里的a和b。

这个 VC 简单地规定我们的候选不变量是归纳的,因为蕴涵的右侧是候选不变量的最弱先决条件。然而这个VC还不是有效的,所以要继续寻找一个ϕ\phiϕ,使得:
(flag⇒a=b∧ϕ)⇒(flag⇒(a+1=b+j−1)) (∗) (flag\Rightarrow a = b \wedge\phi) \Rightarrow (flag \Rightarrow (a + 1 = b + j - 1)) \ (*) (flag⇒a=b∧ϕ)⇒(flag⇒(a+1=b+j−1)) (∗)
继续搜索可能使其成立的ϕ\phiϕ,可以得到候选:¬flag,j=i+1,flag⇒j=i+1\neg flag, j=i+1,flag\Rightarrow j=i+1¬flag,j=i+1,flag⇒j=i+1。

假设我们选择了不正确的候选,比如j=i+1j=i+1j=i+1,这意味着新的候选循环不变式变成了j=i+1∧(flag⇒a=b∧ϕ)j=i+1 \wedge(flag\Rightarrow a = b \wedge\phi)j=i+1∧(flag⇒a=b∧ϕ)。因为j+1j+1j+1在最开始时并不成立(也就是说当前条件j=i+1∧(flag⇒a=b∧ϕ)j=i+1 \wedge(flag\Rightarrow a = b \wedge\phi)j=i+1∧(flag⇒a=b∧ϕ)在第1-3行并不成立),所以我们拒绝j=i+1j=i+1j=i+1称为候选,进行回溯,回到(flag⇒a=b)(flag\Rightarrow a = b)(flag⇒a=b)的状态,并尝试选择一个新的候选来使得(*)成立,比如:
ϕ=(flag⇒j=i+1) \phi=(flag\Rightarrow j = i + 1) ϕ=(flag⇒j=i+1)
现在,循环不变量边成了:
I=( flag ⇒(a=b∧j=i+1)) \mathcal{I}=(\text { flag } \Rightarrow(a=b \wedge j=i+1)) I=( flag ⇒(a=b∧j=i+1))
这表明新的推测I\mathcal{I}I现在正确了,但是I\mathcal{I}I仍然不是归纳的(inductive),因为此时的VC依然时不成立的:
( flag ⇒(a=b∧j=i+1))⇒(flag⇒(a+1=b+j−1∧(i%2=0⇒j=i+1)∧(i%2≠0⇒i=j)) (\text { flag } \Rightarrow(a=b \wedge j=i+1)) \Rightarrow (flag \Rightarrow (a + 1 = b + j - 1\wedge (i \%2=0\Rightarrow j=i+1) \wedge (i\%2\neq0 \Rightarrow i = j)) ( flag ⇒(a=b∧j=i+1))⇒(flag⇒(a+1=b+j−1∧(i%2=0⇒j=i+1)∧(i%2​=0⇒i=j))
这里最外边的蕴含右侧的部分是I\mathcal{I}I的最弱前提条件。为了让这个VC有效,要继续执行溯因。其中一个解是flag⇒i%2=0flag\Rightarrow i \%2=0flag⇒i%2=0,所以,我们最后得到了新的循环不变量,通过将这个解和I\mathcal{I}I及逆行合取。
I′=( flag ⇒(a=b∧j=i+1∧i%2=0)) \mathcal{I}^{\prime}=(\text { flag } \Rightarrow(a=b \wedge j=i+1 \wedge i \% 2=0)) I′=( flag ⇒(a=b∧j=i+1∧i%2=0))
这是,VC变得有效。换句话说I′\mathcal{I}^{\prime}I′是一个推断不变量,并且可以证明第八行的assertion。

语言

Program π:=sProgram \ \pi \quad:=sProgram π:=s

 Statement s:= skip ∣v:=e∣s1;s2∣ choose s1s2∣ while C[ϕ] do {s}∣assert p ∣ assume p\begin{aligned} \text { Statement } s \quad:=& \text { skip } \mid v:=e \\ &\left|s_{1} ; s_{2}\right| \text { choose } s_{1} s_{2} \\ & |\text { while } C[\phi] \text { do }\{s\} \\ &|\text{assert p} \ | \ \text{assume p} \end{aligned} Statement s:=​ skip ∣v:=e∣s1​;s2​∣ choose s1​s2​∣ while C[ϕ] do {s}∣assert p ∣ assume p​
Expression e:=v∣int∣e1+e2Expression \ e \quad:=v \mid int \mid e_{1}+e_{2}Expression e:=v∣int∣e1​+e2​
∣e∗ int ∣e% int  Conditional C:=e1⊙e2(⊙∈{<,>,=})∣C1∧C2∣C1∨C2∣¬C\begin{aligned} & \mid e * \text { int } \mid e \% \text { int } \\ \text { Conditional } C:=& e_{1} \odot e_{2}(\odot \in\{<,>,=\}) \\ &\left|C_{1} \wedge C_{2}\right| C_{1} \vee C_{2} \mid \neg C \end{aligned} Conditional C:=​∣e∗ int ∣e% int e1​⊙e2​(⊙∈{<,>,=})∣C1​∧C2​∣C1​∨C2​∣¬C​

:=表示定义,program由一个多条statement组成;statement可以是跳过、变量赋值(变量=表达式)、语句序列、choose语句(没有决定执行s1或者s2中的哪一个)等等。

这种语言的循环中未知的循环不变式用ϕ\phiϕ表示,但并不影响程序的语义。对每个占位符ϕ\phiϕ,文章中的技术的目标就是推断出一个具体的逻辑法则ψ\psiψ,使得ψ\psiψ既是推断的,又足够蕴含出循环的后置条件。

使用invs(π)invs(\pi)invs(π)来表示程序π\piπ中的所有占位符。

产生归纳循环不变量的算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxHXpoEP-1622890473335)(abd eliminate.assets/image-20210603200144716.png)]

INVGEN用来产生归纳循环不变量。输入是一个程序π\piπ输出是Δ\DeltaΔ,是一个map,保存着每个占位符ϕ\phiϕ到循环不变量ψ\psiψ的映射。如果不能证明程序是争取的,那么算法返回一个的map∅\empty∅。

算法最开始将每个占位符都初始化为true,然后调用VERIFY对每个占位符代表的循环不变量进行加强。

在VERIFY程序中,输入Δ\DeltaΔ代表现在推断得到的循环不变量。先用Δ\DeltaΔ调用VCGEN(将在后面说明)来生成最弱前置条件χ\chiχ和相应的VC φ\varphiφ 。生成的 VC φ\varphiφ断言 ∆ 中的每个候选不变量 φ\varphiφ 是归纳的,并且它蕴含循环后置条件。具体来说,生成的VC是(β∧ϕ)⇒γ(\beta \wedge\phi) \Rightarrow \gamma(β∧ϕ)⇒γ语句的合取。这里,ϕ\phiϕ是潜在加强当前循环不变量的占位符。β,γ\beta,\gammaβ,γ中不含任何占位符,并且由Δ\DeltaΔ中的候选循环不变量生成。如果VC φ\varphiφ中的所有占位符替换成true之后,公式是有效的,这意味着不再需要加强了,当前的Δ\DeltaΔ就是一个可以验证当前程序的解。

另一方面,如果elim(φ\varphiφ)不是有效的,这意味着当前的循环不变量不够强,我们需要继续进行加强。为了达成这个目的,程序会选择VC中仅包含一个占位符的无效φi\varphi_iφi​,然后利用ABDUCE来找到一个可以使得其有效的候选公式集合S。然后递归的进行调用,直到找到一组有效的解,或者无法继续搜索下去。

VC的生成

VCGEN可以由一系列的推导规则表示。推导规则的形式如下:
Δ,χ⊢s:χ′,φ \Delta,\chi \vdash s : \chi^{\prime},\varphi Δ,χ⊢s:χ′,φ
这里Δ\DeltaΔ是候选循环不变量map,将占位符ϕ\phiϕ映射到公式ψ\psiψ。

VC φ\varphiφ是(β∧ϕ)⇒γ(\beta \wedge\phi) \Rightarrow \gamma(β∧ϕ)⇒γ语句的合取。ϕ\phiϕ是对当前循环不变量一个可能的加强,β,γ\beta,\gammaβ,γ中不含任何占位符。

语句的含义是,如果 elim(φ\varphiφ)(也就是将VC中所有的占位符都替换成true)是有效的,那么{χ′}s{χ}\{\chi'\}s \{\chi \}{χ′}s{χ}是一个有效的霍尔三元组。

P[e/x]:该记号的意思是将谓词公式P中出现的x全都换成表达式e。例如2中,意思就是不需要任何条件,{χ[e/v]}v:=e{χ}\chi [e/v]\}v:=e\{\chi\}χ[e/v]}v:=e{χ}表示将表达式中的v全都替换成e,结果无条件成立。比如{y+5>5}x=y+5{x>5}无条件成立,因为y+5相当于把x>5中的x替换成了y+5

具体的规则如下:

  1. Δ,χ⊢skip:χ, true ‾\overline{\Delta, \chi \vdash skip:\chi, \text { true }}Δ,χ⊢skip:χ, true ​
  2. Δ,χ⊢v:=e:χ[e/v], true ‾\overline{\Delta, \chi \vdash v:=e: \chi[e / v], \text { true }}Δ,χ⊢v:=e:χ[e/v], true ​
  3. Δ,χ⊢ assume C:C⇒χ, true ‾\overline{\Delta, \chi \vdash \text { assume } C: C \Rightarrow \chi, \text { true }}Δ,χ⊢ assume C:C⇒χ, true ​
  4. Δ,χ⊢assert C:χ∧C,true‾\overline{\Delta, \chi \vdash assert\ C: \chi \wedge C, true}Δ,χ⊢assert C:χ∧C,true​
  5. Δ,χ⊢s2:χ2,φ2Δ,χ2⊢s1:χ1,φ1Δ,χ⊢s1;s2:χ1,φ1∧φ2\begin{gathered} \Delta, \chi \vdash s_{2}: \chi_{2}, \varphi_{2} \\ \Delta, \chi_{2} \vdash s_{1}: \chi_{1}, \varphi_{1} \\ \hline \Delta, \chi \vdash s_{1} ; s_{2}: \chi_{1}, \varphi_{1} \wedge \varphi_{2} \end{gathered}Δ,χ⊢s2​:χ2​,φ2​Δ,χ2​⊢s1​:χ1​,φ1​Δ,χ⊢s1​;s2​:χ1​,φ1​∧φ2​​​
  6. Δ,χ⊢s1:χ1,φ1Δ,χ⊢s2:χ2,φ2Δ,χ⊢ choose s1s2:χ1∧χ2,φ1∧φ2\begin{gathered} \Delta, \chi \vdash s_{1}: \chi_{1}, \varphi_{1} \\ \Delta, \chi \vdash s_{2}: \chi_{2}, \varphi_{2} \\ \hline \Delta, \chi \vdash \text { choose } s_{1} s_{2}: \chi_{1} \wedge \chi_{2}, \varphi_{1} \wedge \varphi_{2} \end{gathered}Δ,χ⊢s1​:χ1​,φ1​Δ,χ⊢s2​:χ2​,φ2​Δ,χ⊢ choose s1​s2​:χ1​∧χ2​,φ1​∧φ2​​​
  7. Δ,Δ(ϕ)⊢s:χ′,φ′φ1=(¬C∧Δ(ϕ)∧ϕ)⇒χφ2=(C∧Δ(ϕ)∧ϕ)⇒χ′Δ,χ⊢ while C[ϕ] do {s}:Δ(ϕ),φ1∧φ2∧φ′\begin{gathered} \Delta, \Delta(\phi) \vdash s: \chi^{\prime}, \varphi^{\prime} \\ \varphi_{1}=(\neg C \wedge \Delta(\phi) \wedge \phi) \Rightarrow \chi \\ \varphi_{2}=(C \wedge \Delta(\phi) \wedge \phi) \Rightarrow \chi^{\prime} \\ \hline \Delta, \chi \vdash \text { while } C[\phi] \text { do }\{s\}: \Delta(\phi), \varphi_{1} \wedge \varphi_{2} \wedge \varphi^{\prime} \end{gathered}Δ,Δ(ϕ)⊢s:χ′,φ′φ1​=(¬C∧Δ(ϕ)∧ϕ)⇒χφ2​=(C∧Δ(ϕ)∧ϕ)⇒χ′Δ,χ⊢ while C[ϕ] do {s}:Δ(ϕ),φ1​∧φ2​∧φ′​​

1-6式是很常规的最弱前置条件计算。7中利用了当前Δ\DeltaΔ给出的不变量。更具体的,循环的最弱前置条件是Δ(ϕ)\Delta(\phi)Δ(ϕ),代表了当前推测的循环不变量。在这个规则中,χ′\chi'χ′是循环体s用来产生候选循环不变量Δ(ϕ)\Delta(\phi)Δ(ϕ)的最弱前置条件。VC中的φ1\varphi_1φ1​是说在循环退出的时候,加强φ\varphiφ得到的候选不变量Δ(ϕ)\Delta(\phi)Δ(ϕ)可以蕴含循环的前置条件χ\chiχ;φ2\varphi_2φ2​是说,当ϕ\phiϕ成立时,执行循环会重建不变量Δ(ϕ)\Delta(\phi)Δ(ϕ)。特别来说,如果ϕ\phiϕ是true,那么这些是while循环的标准VC。(Q:这里没有理解)。额外的占位符ϕ\phiϕ允许我们通过abduction产生的假设弱化VC。

定理(Soundness):如果Δ,χ⊢s:χ′,φ\Delta,\chi \vdash s : \chi^{\prime},\varphiΔ,χ⊢s:χ′,φ ,φ\varphiφ是可推倒的,并且elim(φ\varphiφ)是有效的,那么{χ}s{χ′}\{\chi\}s\{\chi'\}{χ}s{χ′}是有效的。

证明:假设φ1∧φ2∧φ′\varphi_{1} \wedge \varphi_{2} \wedge \varphi^{\prime}φ1​∧φ2​∧φ′是有效的,我们需要证明
{Δ(ϕ)} while C[ϕ]do{s}{χ}(1) \{\Delta(\phi)\}\ while\ C[\phi] d o\{s\}\{\chi\} \tag{1} {Δ(ϕ)} while C[ϕ]do{s}{χ}(1)
通过归纳假设(最上面的条件),我们有{χ′}s{Δ(ϕ)}\{\chi'\}s\{\Delta(\phi)\}{χ′}s{Δ(ϕ)}。因为elim(φ2\varphi_2φ2​)蕴含C∧Δ(ϕ)⇒χ′C \wedge \Delta(\phi) \Rightarrow \chi'C∧Δ(ϕ)⇒χ′,通过加强前提(联立前两个式子)我们有{C∧Δ(ϕ)}s{Δ(ϕ)}\{C \wedge \Delta(\phi)\} s\{\Delta(\phi)\}{C∧Δ(ϕ)}s{Δ(ϕ)}。通过标准的关于loop的霍尔逻辑规则,有:
{Δ(ϕ)} while C do {s}{Δ(ϕ)∧¬C}(2) \{\Delta(\phi)\} \text { while } C \text { do }\{s\}\{\Delta(\phi) \wedge \neg C\} \tag{2} {Δ(ϕ)} while C do {s}{Δ(ϕ)∧¬C}(2)
因为elim(φ1\varphi_1φ1​)`是有效的,我们有¬C∧Δ(ϕ)⇒χ\neg C \wedge \Delta(\phi) \Rightarrow \chi¬C∧Δ(ϕ)⇒χ。最后,通过对(2)使用前置条件弱化规则,我们得到(1)。

通过Abduction产生候选

给定一个形式为(χ∧ϕ)⇒γ(\chi \wedge \phi)\Rightarrow\gamma(χ∧ϕ)⇒γ的无效的VC,abduce程序会尝试加入一些条件ψ\psiψ代替ϕ\phiϕ来增强条件,进而使得当前的VC正确。也就是说,找到这样一个ψ\psiψ,让当前的循环不变量χ\chiχ满足:

  1. ⊨(χ∧ψ)⇒γ\models(\chi \wedge \psi) \Rightarrow \gamma⊨(χ∧ψ)⇒γ
  2. SAT⁡(χ∧ψ)\operatorname{SAT}(\chi \wedge \psi)SAT(χ∧ψ)

一个显然但是并不有用的解是ϕ=γ\phi=\gammaϕ=γ。至于为什么没有用,考虑对某个循环体s,断言某些候选不变量$ I$ 的归纳性的 VC :I∧C=wp(s,I)I\wedge C=wp(s,I)I∧C=wp(s,I)。

那么,推断出的结果γ\gammaγ与其最弱前提条件wp(s,I)wp(s,I)wp(s,I)来加强当前的循环不变量III。然而,wp(s,I)wp(s,I)wp(s,I)太弱,通常会导致divergence。事实上,从循环后置条件 I 开始,并反复将其与 wp(s, I) 连接,相当于展开循环体。

所以,需要找到在逻辑上比最弱前提条件更强的一些约束。这里主要的强化机制是量词消除(quantifier elimination)。

那么如何使用量词消除技术来解决abduction问题呢,首先,下面的蕴含式:
⊨(χ∧ψ)⇒γ \models (\chi \wedge \psi) \Rightarrow \gamma ⊨(χ∧ψ)⇒γ
可以被写成:
ψ⊨χ⇒γ \psi \models \chi \Rightarrow \gamma ψ⊨χ⇒γ
考虑公式χ⇒γ\chi \Rightarrow \gammaχ⇒γ中自由变量集合V的子集,我们有:
∀V.χ⇒γ⊨χ⇒γ \forall V. \chi \Rightarrow \gamma \models \chi \Rightarrow \gamma ∀V.χ⇒γ⊨χ⇒γ
所以任何公式φ\varphiφ在逻辑上与∀V.χ⇒γ\forall V. \chi \Rightarrow \gamma∀V.χ⇒γ而且不与χ\chiχ冲突的解都是答案。

定义:(Universal subset)我们把变量集合V叫做ϕ\phiϕ关于ψ\psiψ的Universal subset(US),如果公式∀(V.ϕ)∧ψ\forall (V.\phi) \wedge \psi∀(V.ϕ)∧ψ可满足。

所以,如果V是χ⇒ϕ\chi \Rightarrow \phiχ⇒ϕ关于ψ\psiψ的US,我们可以通过从公式χ⇒ϕ\chi \Rightarrow \phiχ⇒ϕ中通过Perburge算数中的量词消除技术投影(projection)变量V。根据经验,这种方式产生的候选循环不变量非常有用。直觉上,量词消除是有用的,因为它允许我们投射出不相关的变量并防止不变量被归纳。

考虑下面的程序:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ESrJy0u-1622890473337)(abd eliminate.assets/image-20210604105625890.png)]

最开始的循环不变量是true,产生的VC是x≥n⇒y≥nx\geq n \Rightarrow y \geq nx≥n⇒y≥n,并不包含归纳不变量。这是,如果将通过universally quantifying将n投影出来,并使用量词消除技术,我们可以得到y≥xy\geq xy≥x,这就是一个循环不变量。直观地说,在这里,量词消除允许我们将循环的最后一次迭代推广到归纳断言。

图4展示了产生所有χ⇒γ\chi \Rightarrow \gammaχ⇒γ关于χ\chiχ的US,通过将US中的变量投影出来从而推断出来一个候选的加强条件集合。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqQQJkZJ-1622890473339)(abd eliminate.assets/image-20210603211532667.png)]

一个重要的需要考虑的点是先考虑哪一个US,如果找到的加强条件天若,那么算法可以持续时间很长,或者找到了一个无穷的推测链。如果找到的太强,往往算法会很快找到冲突,并且回退。所以算法会先从最强的条件开始依次进行考虑。

在每次遍历while循环后,首先计算出最大χ⇒γ\chi \Rightarrow \gammaχ⇒γ的US,与集合θ\thetaθ中的所有约束一致,最开始只包括χ\chiχ。如果没有MUS(在其他文章中定义),算法返回集合S作为候选的强化变量。然而,如果存在MUS V,那么会通过量词消去技术投影V中的所有变量,维护一个新的候选变量ψ\psiψ。这个策略确保了在下一次遍历维护的MUS和之前的不同,因为V不可能成为和¬ψ≡¬(∀V.(χ⇒γ))\neg \psi \equiv \neg(\forall V .(\chi \Rightarrow \gamma))¬ψ≡¬(∀V.(χ⇒γ))一致的MUS。所以该方法返回的是约束力递减的一个集合。

注意到这个算法并不完全,不能找到所有的候选,而只能找出来使用量词消除技术可以产生的。

基于MATLAB的太阳能光伏电力仿真,模拟每日太阳能发电,可视化功率曲线,并通过数值积分计算总能量输出。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

相关推荐

人脸识别签到考勤系统实战源码

这是一套可直接运行的人脸识别智能签到考勤系统,基于OpenCV YuNet人脸检测与SFace特征识别实现,全程本机运行,数据保存在本地SQLite,不上传任何服务器。配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、逐步骤操作截图和答辩PPT讲解。 系统围绕五个功能模块展开:人脸注册支持照片批量导入并提取特征入库;识别签到支持照片或摄像头两种方式,实时框出人脸并标注姓名、相似度与考勤状态;考勤规则引擎按config.py里配置的上下班时间与宽限分钟,自动判定迟到、早退、缺勤;Tkinter管理面板完成人员管理、流水查询与月度汇总;最后通过openpyxl一键导出整月考勤矩阵,正常绿、迟到黄、缺勤红,Excel打开即用。 选型上特意选了YuNet+SFace路线:纯pip安装免编译,CPU单帧识别不到100ms,两个ONNX模型共约37MB,出自OpenCV官方模型仓库,毕设报告引用有据可查。教程第7章整理了16条Windows下真实踩过的报错及排查方法,第8章给出换模型、换人脸、加功能的二次开发路径。 适合做计算机视觉方向毕设或课程设计的学生,也适合想给班级、实验室、小团队搭一套本地签到工具的Python学习者。运行环境为Python 3.9以上、Windows 10/11,不需要GPU。 使用时先pip install -r requirements.txt装齐依赖,再运行download_data.py下载模型,最后启动main.py即可进入图形界面;命令行register、recognize、report子命令也可脱离界面单独调用。

【模型检测学习笔记】10:有限状态迁移系统上的IC3算法

IC3算法全称是Incremental Construction of Inductive Clauses for Indubitable Correctness,可以用来检测迁移系统上的不变性性质。 1 术语约定 1.1 clause和literal 这里逻辑公式(logic formula)一律用合取范式(conjunctive normal form,CNF) 来表示,CNF中的每一项是一个clause,每个clause是若干literal的析取,每个literal是一个逻辑变量或者逻辑变量的非,例如

大桔骑士的学习笔记 2509

【无人机航测】MATLAB重叠率与地面分辨率协同设计:航线间距及飞行方向优化系统 MATLAB 无人机航测重叠率设计|地面分辨率与航线间距计算

内容概要:本文档介绍了基于MATLAB R2025b开发的无人机航测重叠率与航线间距计算系统,旨在通过建立统一的航测几何计算体系,实现重叠率、地面分辨率与航线间距的动态协同设计。系统结合相机参数、飞行参数、地形数据与风场信息,通过自动化候选航向搜索与多目标优化,选择兼顾覆盖质量、飞行效率与安全性的最优航线方向。项目涵盖从参数输入、摄影测量计算、地形与安全修正,到候选路线生成、综合评价与结果可视化的全流程,并构建了五万组模拟数据用于算法验证与模型训练,支持桌面交互、批量处理与服务化部署,适用于多种复杂场景下的无人机航测任务规划。 适合人群:具备一定MATLAB编程基础和摄影测量知识的科研人员、工程技术人员及高校师生,尤其适合从事无人机航测、地理信息系统(GIS)、遥感与测绘等相关领域的从业者。 使用场景及目标:① 实现无人机航测任务中地面分辨率与航线间距的精确计算与动态优化;② 解决复杂地形与风场环境下航线方向选择困难、覆盖质量难以保障的问题;③ 通过自动化设计减少人为经验依赖,提升航测任务的可靠性与效率;④ 为后续的三维建模、正射影像生成与灾害应急评估等应用提供高质量的数据基础。 阅读建议:建议读者结合文中提供的完整代码示例与GUI界面设计,逐步实践参数配置、模型计算与结果分析流程。重点关注摄影测量公式推导、地形修正策略与多目标优化算法的实现细节,并利用模拟数据进行敏感性分析与模型验证,以深入理解系统的设计理念与工程应用价值。

【形式化方法】基础知识和应用介绍

形式化方法 (formal method) 是一种在计算机科学和软件工程领域中广泛使用的精确建模和分析技术. 它利用数学和逻辑的原理, 以形式化的方式描述和验证计算系统的行为和性质. 形式化方法通过使用形式化规约语言(formal specification language) 和形式化验证 (formal verification) 来对系统进行建模和分析. 它提供了一种严格、精确的描述方式, 可以清晰地定义系统的和。

网络空间安全|人工智能|计算机科学 4107

【电力负荷预测】项目介绍 MATLAB实现基于BO-Transformer-LSTM贝叶斯优化算法(BO)优化Transformer-LSTM组合模型进行居民用户多步电力负荷预测(含模型描述及部分示例

内容概要:本文介绍了一个基于BO-Transformer-LSTM的组合模型,用于实现居民用户多步电力负荷预测的完整项目实例。该模型融合Transformer的全局注意力机制与LSTM的局部时序记忆能力,构建能够捕捉长时依赖与周期性特征的深度学习架构,并引入贝叶斯优化(BO)自动搜索最优超参数组合,提升预测精度与训练效率。项目涵盖从原始数据清洗、特征工程、滑动窗口样本构建、模型设计到超参数优化、反归一化及多步误差评估的全流程,强调时间顺序划分以防止信息泄露,并通过周期编码、外生变量融合等方式增强数据表达能力。文中提供了详细的MATLAB代码示例,包括数据预处理、网络搭建、贝叶斯优化配置和预测结果评估等关键步骤。 适合人群:具备一定机器学习和时间序列分析基础,熟悉MATLAB编程环境,从事电力系统预测、智能电网、负荷管理等相关领域的研究人员、工程师及研究生。 使用场景及目标:①应用于居民级或多用户聚合负荷的短期至中期多步预测(如未来24小时);②服务于配电系统运行调度、需求响应基线设定、家庭能源管理系统优化、分布式能源协调控制等实际工程场景;③为科研提供可复现的深度学习+贝叶斯优化的技术路线参考。 阅读建议:此资源以实际项目为导向,建议读者结合提供的代码逐步实现并调试模型,重点关注数据质量控制、时间特征编码、组合网络结构设计与贝叶斯优化稳定性之间的协同关系,在实践中深入理解多步预测中的误差累积机制与超参数敏感性问题。

测试用的衣橱app小软件,自己玩撒打算

测试用的衣橱app小软件,自己玩撒打算

关系推理论文中总提到的inductive bias该如何理解

周志华《机器学习》对inductive bias定义如下: 机器学习算法在学习过程中对某种假设(hypothesis)的偏好,称为“归纳偏好”(inductive bias),或简称为“偏好” 书中举了例子,例如对一组数据进行拟合的曲线有无数种,其中有的比较“简单”(假设我们认为曲线更平滑意味着“更简单”),有的更复杂。例如一组可以用二次曲线来拟合的数据点,用更复杂的更高阶的曲线也可以拟合,那...

pyxiea 8133

【智能制造排程】基于双层编码遗传算法的柔性作业车间调度模型:工序排序与机器选择联合优化 项目介绍 MATLAB 柔性作业车间排程|遗传算法与机器选择双层编码

内容概要:本文介绍了一个基于MATLAB的柔性作业车间排程项目,采用遗传算法与双层染色体编码技术实现工序排序与机器选择的联合优化。项目构建了统一的排程模型,涵盖工件工序、候选机器、加工时间、设备能力、能耗及交付时间等要素,通过双层编码结构(工序序列层与机器选择层)分别处理加工顺序和设备分配问题,并设计了相应的解码机制、遗传操作与综合适应度函数,以最小化最大完工时间、降低设备空闲损失、提升负载均衡与能源效率为目标。系统支持模拟数据生成,融合多种概率分布反映实际生产不确定性,并输出甘特图、收敛曲线和设备利用率等结果,具备良好的可扩展性,可用于智能制造排程算法研究与实际系统开发。; 适合人群:具备一定编程基础,熟悉MATLAB环境,从事生产调度、智能制造、运筹优化等相关领域的研究人员、工程技术人员及高校研究生;有志于学习遗传算法在工业排程中应用的1-3年经验研发人员。; 使用场景及目标:①解决柔性作业车间中工序排序与机器选择耦合的复杂调度问题;②优化制造系统的最大完工时间、设备利用率、能耗与订单交付表现;③为MES、数字孪生、智能车间等系统提供核心排程算法模块;④作为教学案例或科研平台,用于算法对比、参数调优与动态重排程研究。; 阅读建议:此资源以MATLAB实现为核心,包含完整代码结构与数据生成逻辑,建议结合文中提供的代码示例进行实践运行与调试,深入理解双层编码机制、解码流程与遗传操作的设计思想,并可根据实际需求调整适应度权重或引入新约束条件进行二次开发。

【Coq学习】Formal Reasoning About Programs 阅读笔记第六章

变迁系统和不变量 Transition Systems and Invariants

qq_53287459的博客 601

产业园区如何通过数智工具精准识别企业技术需求,提高服务匹配效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

市级区域_打包.zip

这组资源是基于阿里云 DataV 平台提取的**全国省、市、县三级行政区划矢量数据**,文件格式为通用性极强的 **GeoJSON**。它轻量且结构清晰,不仅易于人类阅读,还能直接拖入 QGIS、ArcGIS 进行制图,或通过 Python (Geopandas)、JavaScript 等代码直接读取调用。 在内容涵盖上,数据从“全国 (100000)”向下细分至省级、地级市,以及县级/市辖区。每个要素(Feature)都完整包含了多边形的经纬度边界坐标,以及极其关键的 `adcode`(国家行政区划代码)、名称(name)、中心点(center)等属性。这允许你在制图时直接按代码或名称精准定位,进行数据聚合或空间裁剪。 在结构设计上,资源巧妙地兼顾了“宏观嵌套”与“微观独立”。例如,带 `_full` 后缀的市级文件,内部直接包含了该市下辖所有区县的边界,适合做全省/全市的整体可视化;而单独无后缀的区县级文件,则适合精细化拆分。此外,直辖市辖区(如北京东城区)已被正确归入县级资源,避免了层级混淆,是一套非常适合做 Web 地图可视化或本地空间分析的底图资产。

交错并联图腾柱PFC变换器仿真设计(Simulink仿真实现)

内容概要:本文档系统性地介绍了基于Simulink平台的“交错并联图腾柱PFC变换器”仿真设计,聚焦于高效率功率因数校正技术的建模与实现。内容涵盖双闭环控制策略(电压外环与电流内环)、PI控制器设计、交错并联结构优化以及图腾柱拓扑的工作原理,旨在提升系统动态响应性能、降低输入电流谐波含量并改善功率因数。文档不仅提供详细的仿真模型构建流程,还配套Mathcad计算书用于参数设计与功率等级扩展,并列举了多种相关电力电子变换器的仿真案例,如三相维也纳整流器、LLC谐振变换器、双向Buck-Boost电路等,形成了一套完整的电力电子系统仿真资源体系,适用于从理论分析到工程实践的全流程学习与研究。; 适合人群:电气工程、自动化、电力电子及相关专业的高校本科生、研究生,以及从事新能源发电、电源设计、电能质量治理、工业自动化等领域的研发工程师;具备基本电路理论知识和Simulink/Matlab使用经验者更佳。; 使用场景及目标:①支持高校课程设计、毕业设计或科研项目中对先进PFC拓扑的仿真验证与性能优化;②帮助工程技术人员快速掌握图腾柱PFC的核心控制逻辑与建模方法,缩短产品开发周期;③作为电力电子系统教学与技术培训的标准化参考案例,强化理论与实践结合能力。; 其他说明:文档由“荔枝科研社”整理发布,所有资源可通过指定公众号或百度网盘链接获取,建议按照目录顺序系统学习,并结合提供的Mathcad计算书、参考文献及仿真文件进行参数验证与二次开发,以深化理解与应用能力。

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

超全Mathcad全桥LLC谐振变换器开关电源设计mathcad计算书

内容概要:本文介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,该模型基于Plecs仿真平台构建,完整实现了全桥LLC谐振变换器的电路拓扑与控制系统,用于深入研究其在变频与移相混合控制策略下的动态行为。模型涵盖了软开关实现机制、谐振腔参数设计、功率传输特性、效率优化以及闭环控制策略等核心内容,支持对启动过程、负载突变、频率调节等工况的仿真分析,有助于全面掌握LLC变换器在高效率、高功率密度电源系统中的工作原理与设计方法。; 适合人群:具备电力电子技术基础、熟悉开关电源设计原理的研究生、硬件工程师及从事高频电源产品研发的技术人员。; 使用场景及目标:①用于高校教学与科研中对LLC谐振变换器运行机理的深入理解与验证;②辅助工程师在实际产品开发中进行关键参数设计、性能预测与优化;③支持对变频控制、软启动过程、零电压开关(ZVS)实现条件、负载调整率及系统稳定性等关键指标的仿真分析与验证。; 阅读建议:建议使用者具备Plecs或类似电力电子仿真软件的操作经验,结合经典电力电子教材与LLC设计指南进行学习,通过调整谐振元件参数、开关频率与负载条件,观察系统响应变化,以深化对谐振变换器非线性动态特性的理解,并建议将仿真结果与理论计算对照分析,提升工程设计能力。

PotPlayer自用皮肤

自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。

2-shell及常用命令-续.pdf

2-shell及常用命令-续.pdf

game.c.docx

game.c.docx

【顶级EI复现】基于KKT条件与分段解析优化的双有源桥DC-DC变换器软开关协同最小应力闭环控制方法(Simulink仿真实现)

内容概要:本文详细介绍了一种基于KKT(Karush-Kuhn-Tucker)最优性条件与分段解析优化技术的双有源桥(DAB)DC-DC变换器闭环控制方法,旨在实现软开关条件下器件电压和电流应力的协同最小化,从而提升变换器的转换效率与系统可靠性。该方法通过建立精确的数学模型,结合KKT条件进行优化求解,并采用分段解析策略提高实时控制性能,在Simulink环境中完成了完整的闭环控制系统建模与仿真验证。作为“顶级EI复现”级别的研究成果,内容涵盖控制算法设计、优化机制分析、仿真架构搭建及结果对比,具有较强的理论深度与工程应用价值,适用于电力电子高频化、高效化发展的前沿研究方向。; 适合人群:面向具备电力电子、自动控制或电气工程等相关专业背景,熟悉Simulink仿真平台,且从事科研工作1年以上的研究生、博士生及科研人员;特别适合致力于DC-DC变换器拓扑优化、软开关技术、最小化开关应力控制、能量高效传输等领域研究的专业人士。; 使用场景及目标:① 复现高水平EI期刊论文中的先进优化控制算法;② 掌握KKT条件在非线性约束优化问题中的具体应用;③ 深入理解DAB变换器在不同工况下的软开关实现机制与应力抑制策略;④ 构建高精度仿真模型以支撑学术论文撰写、科研项目申报或实际工程系统的控制方案设计。; 阅读建议:建议结合提供的Simulink仿真模型同步学习,重点关注KKT条件推导过程与分段解析优化模块的实现逻辑。由于内容涉及较强的数学建模与优化理论,推荐具备扎实的电路理论、现代控制理论及数值优化基础后再行研读,并可参考同系列“顶级EI复现”资源以构建系统性知识体系。

上一篇: Linux下自动生成c++ UML图
下一篇: 逻辑学引言
Cross_Entropy
博客等级 码龄7年 69粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值