dafny - dafny assert 可以处理“!false”吗
问题描述
最终注释掉的断言将不会验证,但是当运行上面的 if 语句时会打印出来。输出
ohb= true
ohx= false
palin(xe) == false
ohx ==false
function method palin(a:seq<int>) :bool {
forall i:int :: (0<=i && i<(|a|/2)) ==> a[i]==a[|a|-i -1]
}
method Main() {
var xe:seq<int> := [0,1,2,3,0];
var se:seq<int> := [0,1,2,1,0];
var ohb := palin(se);
var ohx :bool := palin(xe);
print "ohb= ",ohb,"\n";
print "ohx= ",ohx,"\n";
assert palin(se);
if (palin(xe) == false) {print "palin(xe) == false\n";}
if (!ohx) {print "ohx ==false\n";}
//assert !ohx;
}
解决方案
失败的断言意味着验证者无法自动找到证明。如果您认为该属性成立,则需要编写证明(或部分证明)。
对于您的程序,证明某事不是回文归结为显示违反回文属性的位置。在逻辑方面,您试图证明 a 的否定,forall
即a exists
,并且要证明 aexists
您需要为绑定变量提供见证i
。
在您的示例中,以下内容就足够了:
predicate method palin(a: seq<int>) {
forall i :: 0 <= i < |a| / 2 ==> a[i] == a[|a| - i - 1]
}
method Main() {
var xe := [0,1,2,3,0];
var se := [0,1,2,1,0];
var ohb := palin(se);
var ohx := palin(xe);
print "ohb= ", ohb, "\n";
print "ohx= ", ohx, "\n";
assert palin(se);
if palin(xe) == false { print "palin(xe) == false\n"; }
if !ohx { print "ohx == false\n"; }
assert !ohx by {
assert xe[1] != xe[3];
}
}
推荐阅读
- java - 在服务器端验证文件
- python - 熊猫数据框适用于日期时间列:不起作用
- r - 按固定日期范围聚合 R
- arrays - 如何在减去 2 行的同时计算行之间的差异 | 谷歌电子表格
- python - 根据日期 Python 组合 Pandas DataFrames
- html - 我应该在 json 和 html 解析器上阅读什么来自己构建一个?
- angular - 更新到 Angular 9 后构建项目导致错误“无法读取未定义的属性‘长度’
- javascript - 我们可以在 react native expo 项目中使用 react native (npm) 包吗
- java - 为什么Handler没有延迟?
- google-cloud-platform - Big Query 作业未找到问题