- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的程序中,循环的最后一个不变量验证失败。但是如果我把它作为断言放在 while 循环之前,条件就会验证。如果我添加字段 ia
没有改变,它也会验证。为什么需要这个?读取权限不应该暗示这一点吗?我可以想象 old
以一种奇怪的方式与循环预状态/状态破坏进行交互,但这并不能向我解释它失败的原因。会不会是一个错误?
domain VCTArray[CT] {
function loc(a: VCTArray[CT], i: Int): CT
function alen(a: VCTArray[CT]): Int
}
// a field
field ia: VCTArray[Ref]
// a field
field item: Int
method negatefirst(diz: Ref)
requires diz != null
requires acc(diz.ia, 1/2)
requires alen(diz.ia) > 0 ==> acc(loc(diz.ia, 0).item, write)
{
// Verifies just fine
assert alen(diz.ia) > 0 ==> (old(loc(diz.ia, 0).item) == old(loc(diz.ia, 0).item))
while (false)
invariant acc(diz.ia, 1/4)
// invariant diz.ia == old(diz.ia) // Adding this invariant allows the program to verify
invariant alen(diz.ia) > 0 ==> acc(loc(diz.ia, 0).item, write)
// Error: insufficient permission to acces loc(diz.ia, 0).item
invariant alen(diz.ia) > 0 ==> (old(loc(diz.ia, 0).item) == old(loc(diz.ia, 0).item))
{
}
}
我的芯片版本:
$ ./silicon.sh --help
Silicon 1.1-SNAPSHOT (d45da1d7+)
最佳答案
您观察到的行为是 known difference硅和碳之间,这确实令人困惑。
这就是硅中正在发生的事情:循环体基本上是隔离验证的,即模块化:不变量在空状态下被吸入,然后是循环守卫;然后验证 body 。吸入最后一个不变量时,假定其左侧 alen(diz.ia) > 0
(在一条路径上)及其右侧 old(loc(diz.ia, 0).item) == old(loc(diz.ia, 0).item)
被(试图)吸入。现在,回想一下,正在进行的验证是在一个新的状态下孤立地发生的:因此,当前状态下的 diz.ia
可能不会引用与当前状态下的 diz.ia
相同的对象旧
状态。如果是这样,则 alen(diz.ia) > 0
(当前状态)并不意味着 old(alen(diz.ia) > 0)
,并且字段 old(loc(diz.ia, 0).item)
因此可能无法访问。因此,假设引用在这两个状态之间没有变化——即 invariant diz.ia == old(diz.ia)
——使程序验证。
这是纯粹主义者验证循环体的方式;实际上,隔离并不那么严格:两个验证器都将关于局部变量的知识构建到循环中,用于(语法上)未在循环体中分配的变量。这是一个例子:
method test() {
var i: Int := 0
var j: Int := 0
while (true)
{
assert i == 0 // Verified
assert j == 0 // Rejected
j := j
}
}
Carbon 更进一步,还将有关字段的知识构建到循环体中,对于周围验证范围(例如包含循环的方法体)保留一些权限的字段:
field f: Int
method test(r: Ref, p: Perm) {
inhale none < p
inhale acc(r.f, p) && r.f == 0
while (true)
invariant acc(r.f, p/2) // Verified in Carbon, rejected by Silicon
{
assert r.f == 0
}
}
以上内容按原样在 Carbon 中验证,但如果您将不变量的权限更改为 p
(或通过 exhale acc(r.f, p); inhale 破坏字段的值,则不再验证acc(r.f, p)
就在循环之前。
底线:Viper 团队应该决定“正确”的语义,并确保两个验证者都遵守它。
关于formal-verification - 不变量失败但在循环验证之前断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63559863/
我正在阅读一篇非常愚蠢的论文,它一直在谈论乔托如何定义“形式语义”。 Giotto has a formal semantics that specifies the meaning of mode
在下面的程序中,循环的最后一个不变量验证失败。但是如果我把它作为断言放在 while 循环之前,条件就会验证。如果我添加字段 ia 没有改变,它也会验证。为什么需要这个?读取权限不应该暗示这一点吗?我
任何人都可以清楚地解释什么是完全温和的上下文敏感语法吗? 这些语法是否可用于对自然语言建模? 此外,索引语法、头语法和树语法等语法是否属于轻度上下文敏感语法? 最佳答案 Joshi (1985) 引入
程序可以从 START 分支到 LEFT 或 RIGHT 分支。如何检查 LEFT 分支的执行路径和 RIGHT 分支的另一个执行路径? ------------------------------
你知道任何可以指定上下文相关语法的吗?例如 * 符号指针/乘法歧义解析。我正在寻找能够解决这种歧义的正式语言。我正在寻找的语言应该被很好地指定。 编辑:我正在寻找类似 BNF 的东西,但应该是上下文相
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
给定一个循环不变式,维基百科列出了一种为循环生成最弱前提条件的好方法(来自 http://en.wikipedia.org/wiki/Predicate_transformer_semantics )
在乔姆斯基的层次结构中,没有定义递归语言集。我知道递归语言是递归可枚举语言的一个子集,并且所有递归语言都是可判定的。 我很好奇递归语言与上下文敏感语言的比较。我可以假设上下文相关语言是递归语言的严格子
我有一项家庭作业,除一个问题外,我已经完成(参见标题) 对于我的一生,我无法弄清楚……所以我开始认为这是一个棘手的问题。 我将提交的当前答案是: L1 = {a^n b^n: n>=1} is det
我正在尝试在 Isabelle 中输入和证明 Z 规范。 假设我有一个用 LaTeX 格式编写的自动售货机规范: \begin{zed} price:\nat \end{zed} \b
我在达夫尼(Dafny)得到警告,说我的量词有 No terms found to trigger on. 我要为代码执行的操作是找到平方值小于或等于给定自然数'n'的最大数字。这是到目前为止我想出的
实际上,我想从 1..N 构建一个 {"1", "2", "3", ..., "N"} 集> 设置。如何将数字转换为字符串? 最佳答案 TLC 模块提供了一个ToString 运算符。 关于forma
考虑解决 100 prisoners and a lightbulb 的标准策略问题。这是我在 Dafny 中对其进行建模的尝试: method strategy(P: set, Special: T
一段时间以来,我一直对形式方法感兴趣。我已经使用正式的方法来推理我一直在从事的一些项目的一些非常具体的子领域。我永远无法说服其他团队成员尝试相同的方法,更不用说用正式的方法指定整个域了。 我发现特别有
感谢 this question 的精彩回复我了解如何使用可变参数调用 javascript 函数。 现在我希望使用与构造函数一起应用 我发现了一些有趣的信息on this post . 但是我的代码
我真的找遍了所有地方,但没有找到我的问题的答案: 一般化问题: 如何在不启动 R 函数的情况下评估 R 函数的参数 (formals())? 尽管 R 的“懒惰评估”,您如何评估 R 中的整个环境?
我想知道我需要在以下内容中添加什么才能让它通过 dafny? function mapper (input: seq) : seq ensures |mapper(input)| == |input|
我正在和 KeY ( https://www.key-project.org ) 一起玩一个教学项目。 一方面,我很高兴 KeY 轻松证明了以下带 jml 注释的 Java 代码的正确性 /*@ en
我真的找遍了所有地方,但没有找到我的问题的答案: 一般化问题: 如何在不启动 R 函数的情况下评估 R 函数的参数 (formals())? 尽管 R 的“懒惰评估”,您如何评估 R 中的整个环境?
这是我要证明的代码: function rec_even(a: nat) : bool requires a >= 0; { if a == 0 then true else if a
我是一名优秀的程序员,十分优秀!