배열로 백업 된 일반 FIFO 큐를 확인하는 중 혼란스러운 오류가 발생했습니다. 대기열은 Dafny의 작성자가 작성한 this 종이에서 발견되었습니다.Dafny 제네릭 형식 배열 오류
해당 오류 : 이니셜 라이저가 배열 요소를 구비
않으면, '데이터'의 새로운 어레이가 할당 양쪽 라인에 관한 빈 크기
있어야 배열을 new Data[whatever]
을 통해 생성자와 큐 삽입 메서드에 추가합니다.
Dafny 버전 : Dafny 2.0.0.00922 기술 미리보기 참조 0
전체 코드입니다.
class {:autocontracts} SimpleQueue<Data>
{
ghost var Contents: seq<Data>;
var a: array<Data>;
var m: int, n: int;
predicate Valid() {
a != null && a.Length != 0 && 0 <= m <= n <= a.Length && Contents == a[m..n]
}
constructor()
ensures Contents == [];
{
a := new Data[10];
m := 0;
n := 0;
Contents := [];
}
method Enqueue(d: Data)
ensures Contents == old(Contents) + [d];
{
if n == a.Length {
var b := a;
if m == 0 {
b := new Data[2 * a.Length];
}
forall (i | 0 <= i < n - m) {
b[i] := a[m + i];
}
a, m, n := b, 0, n - m;
}
a[n], n, Contents := d, n + 1, Contents + [d];
}
method Dequeue() returns (d: Data)
requires Contents != [];
ensures d == old(Contents)[0] && Contents == old(Contents)[1..];
{
assert a[m] == a[m..n][0];
d, m, Contents := a[m], m + 1, Contents[1..];
}
}
method Main()
{
var q := new SimpleQueue();
q.Enqueue(5); q.Enqueue(12);
var x := q.Dequeue();
assert x == 5;
}