dafny - 是否存在将不变量更改为确保子句的一种解决方案?
问题描述
function max(a: array<int>,n:int):(int)
requires n>0
requires a.Length>n
reads a
{
if n==1 then a[0] else
if max(a,n-1)<a[n] then a[n] else
max(a,n-1)
}
method max_one_way(a: array<int>, n: int) returns (Result:int)
requires n>0
requires a.Length>n
ensures Result == max(a, n);
{
var i: int;
i := 1;
Result := a[0];
while (i < n)
invariant i <= n;
invariant Result == max(a, i);
{
i := i + 1;
if (Result < a[i])
{
Result := a[i];
}
}
}
method max_one_way_rule1(a: array<int>, n: int, i1: int,Result1 : int) returns (Result:int,i:int)
requires n > 0;
requires a.Length > n;
requires 0< i1 < n;
requires Result1 == max(a,i1);
requires Result1 < a[i1+1];
ensures i <= n;
ensures 0 < i < a.Length;
ensures Result == max(a, i);
{
i := i1+1;
Result := a[i];
}
method max_one_way_rule2(a: array<int>, n: int, i1: int,Result1 : int) returns (Result:int,i:int)
requires n > 0;
requires a.Length > n;
requires 0< i1 < n;
requires Result1 == max(a,i1);
requires Result1 > a[i1+1];
ensures i <= n;
ensures 0 < i < a.Length;
ensures Result == max(a, i);
{
i := i1+1;
Result:=Result1;
}
我尝试对最大数组搜索进行编码,这是通过while循环执行此操作的正常方法,例如方法 max_one_way ,但我的想法是迭代调用满足条件的方法(max_one_way_rule1 和 rule2),对吗?提示,它可以成功编译。
解决方案
推荐阅读
- c++ - 对基于模板的类进行分组?
- javascript - 这如何导致绝对的沉默?
- c++ - 使用 CMake 将调试标志从 -g 更改为 -ggdb3
- python - 有没有办法从线程中更改类变量
- javascript - 如何慢慢改变表格单元格的颜色javascript
- python - 使用 flask_sqlalchemy 创建多对多关系
- swiftui - SwiftUI DatePicker 没有像预期的那样
- javascript - JS:for循环中的当前节点
- excel - 具有列表框值过滤器的列表框标题
- redirect - 从无后缀 URL 到 *.html URL 的永久 301 重定向