summaryrefslogtreecommitdiff
path: root/Test/codeexpr/CodeExpr2.bpl
blob: 9d8beed760500303997f62fc0c7b29e4ba2c336d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// RUN: %boogie "%s" > "%t"
// RUN: %diff "%s.expect" "%t"
type T;
const zero: T;

function IsProperIndex(i: int, size: int): bool;

procedure P(a: [int]T, n: int)
  requires (forall i : int :: IsProperIndex(i, n) ==> a[i] == zero);
{
  call Q(a, n);
}

procedure Q(a: [int]T, n: int)
  requires (forall i : int :: IsProperIndex(i, n) ==> |{ B: return a[i] == zero; }|);
{
  call P(a, n);
}

procedure A(a: [int]T, n: int)
{
  assert
    (forall i : int :: IsProperIndex(i, n) ==> a[i] == zero)
    ==>
    (forall i : int :: IsProperIndex(i, n) ==> |{ B: return a[i] == zero; }|);
}

procedure B(a: [int]T, n: int)
{
  assert
    (forall i : int :: IsProperIndex(i, n) ==> |{ B: return a[i] == zero; }|)
    ==>
    (forall i : int :: IsProperIndex(i, n) ==> a[i] == zero);
}

procedure C(a: [int]T, n: int)
{
  Start:
    assume (forall i : int :: IsProperIndex(i, n) ==> a[i] == zero);
    goto Next;
  Next:
    assert (forall i : int :: IsProperIndex(i, n) ==> |{ B: return a[i] == zero; }|);
}

procedure D(a: [int]T, n: int)
{
  Start:
    assume (forall i : int :: IsProperIndex(i, n) ==> |{ B: return a[i] == zero; }|);
    goto Next;
  Next:
    assert (forall i : int :: IsProperIndex(i, n) ==> a[i] == zero);
}