文字の入力配列を取り、入力配列からなる別の配列を逆順に出力するメソッドを実装したいと思います。 1つのインデックス範囲6の外Dafnyメソッドは、逆の文字配列を返します
predicate reversed (arr : array<char>, outarr: array<char>)
requires arr != null && outarr != null
//requires 0<=k<=arr.Length-1
reads arr, outarr
{
forall k :: 0<=k<=arr.Length-1 ==> outarr[k] == arr[(arr.Length-1-k)]
}
method yarra(arr : array<char>) returns (outarr : array<char>)
requires arr != null && arr.Length > 0
ensures outarr != null && reversed(arr,outarr)
{
var i:= 0;
var j:= arr.Length-1;
outarr := new char[arr.Length];
outarr[0] := arr[j];
i := i+1;
j := j-1;
while i<arr.Length && 0<=j<arr.Length
invariant 0<=i<=arr.Length
decreases arr.Length-i, j
{
outarr[i] := arr[j];
i:=i+1;
j:=j-1;
}
//return outarr;
}
method Main()
{
var s := ['a','b','a','b','a','b','a','b','a','b','a','b'];
var a,b,c,d := new char[5], new char[5], new char[5], new char[5];
a[0], a[1], a[2], a[3], a[4] := 'y', 'a', 'r', 'r', 'a';
d[0], d[1], d[2], d[3], d[4] := 'y', 'a', 'r', 'r', 'a';
b := yarra(a);
c := yarra(b);
assert c[..] == a[..];
//assert c.Length > -2;
//assert d[0] == a[0];
//print c; print a;
}
- エラー:私のコードしかし、私はエラー「私たちの範囲のインデックス」と私はここで
が起こる何見当がつかない を「事後条件が成り立たない可能性があります」だです43
- エラー2この戻りパスで事後条件が成立しないことがあります。 21 2
これは保持できない事後条件です。 13 26
stdin.dfy(6,43):エラー:インデックスが範囲外
stdin.dfy(21,2):エラーBP5003:事後条件が、このリターンパスに保持していないかもしれません。
stdin.dfy(13,26):関連する場所:これは保持できない可能性のある事後条件です。
stdin.dfy(6,2):関連場所
stdin.dfy(6,47):関連場所