- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
目前我正在尝试掌握一点 formal verification与 KeY Java 程序的工具。
这是我的带键注释的 Java 代码:
public class Test {
public int[] a;
/*@ public normal_behavior
@ ensures (\forall int x; 0<=x && x<a.length; a[x]==1);
@*/
public void fillArray() {
int i = 0;
while(i < a.length) {
a[i] = 1;
i++;
}
}
}
令我惊讶的是KeY,它无法证明当前程序根据其规范是有效的。 KeY 在目标 54 处失败。当前目标窗口显示:
self.a.<created> = TRUE,
wellFormed(heap),
self.<created> = TRUE,
Test::exactInstance(self) = TRUE,
measuredByEmpty
==>
self.a = null,
self = null,
{exc:=null || i:=0}
\<{
try {
method-frame(source=fillArray()@Test, this=self)
: {
while (i<this.a.length) {
this.a[i] = 1;
i++;
}
}
}
catch (java.lang.Throwable e) {
exc = e;
}
}\> (\forall int x; (x <= -1 | x >= self.a.length | self.a[x] = 1) & self.<inv> & exc = null)
我不太明白:规范证明失败的主要原因是什么?
最佳答案
失败的最基本原因是,如果证明者在方法中发现无界循环 - 那么如果没有loop invariant,它就无法遵循方法规范。规范。
因此,对于每个无界循环,我们必须指定一个循环不变量。循环不变量是对于每个循环迭代都成立的规则。每个循环都可以有自己特定的不变规则。因此,具有规范的 Java 代码必须固定为:
public class Test{
public int[] a;
/*@ public normal_behavior
@ ensures (\forall int x; 0<=x && x<a.length; a[x]==1); // method post-condition
@ diverges true; // not necessary terminates
@*/
public void fillArray() {
int i = 0;
/*@ loop_invariant
@ 0 <= i && i <= a.length && // i ∈ [0, a.length]
@ (\forall int x; 0<=x && x<i; a[x]==1); // x ∈ [0, i) | a[x] = 1
@ assignable a[*]; // Valid array location
@*/
while(i < a.length) {
a[i] = 1;
i++;
}
}
}
考虑如何指定方法时最困难的部分是找出循环不变式。但与此同时 - 这是最有趣的。出于原因,我将重复此循环的不变量:
i ∈ [0, a.length]
x ∈ [0, i) | a[x] = 1
并且这个条件在ANY迭代的循环中永远不会改变。这就是为什么它是一个不变。
顺便说一句,如果正式规范做得正确 - 我们可以扔掉 TDD以及单元测试。如果程序可以根据其规范在数学上证明是正确的,谁会关心运行时结果?
如果规范良好并且代码语义经过验证,那么在程序执行中就不会出现任何问题,这是肯定的。正因为如此 - 形式验证是一个非常有前途的领域。
关于java - Java中 'KeY'的形式化验证未能证明数组重置循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54959098/
我很快就会明白,我不是 Git 甚至 Gitkraken 的高手。因此,我只有一个修补程序、一个主分支和一个功能分支。我在修补程序、提交、推送和 merge 到 master 中进行更改(然后我也推送
我刚开始使用 stub 请求来测试对 iOS 的外部 API 的异步调用。我目前被以下代码困住了,我无法弄清楚什么不起作用。 我想要实现的非常简单的事情是,如果我从网站收到 200 响应,我将 Vie
设置: 一个 JPA ReviewRepository延长 CrudRepository 我的测试使用切片测试注释 @DataJpaTest 我的测试@Autowired ReviewReposito
我尝试通过logstash将csv文件vrom filebeat摄取到hdfs中。 Filebeat 成功将其转移到 logstash,因为我使用 stdout{codec=>rubydebug} 并
我看到很多教程解释了如何在 Tensorflow 的 Bazel WORKSPACE 中构建项目(例如 this one)。但我似乎无法找到一种方法来构建我自己的项目并将 tensorflow 作为依
我正在运行 Ubuntu 10.04 并且最初安装了 ruby 1.9.1(来自源代码)。我刚刚决定试用 ruby 1.9.2 和 rails 3,现在似乎是使用 rvm 处理多个 ruby
我有一个应用程序从后端接收支持的语言环境列表作为以下响应: {locales: [{code: 'enUS'}, {code: 'deDE'}, {code: 'arAR'}]} 我想使用 date-
我是一名优秀的程序员,十分优秀!