summaryrefslogtreecommitdiff
path: root/Test/hofs/ReadsReads.dfy
blob: 47f7f575802d9e2c83e1f497efebcaea475b70f3 (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// RUN: %dafny /print:"%t.print" "%s" > "%t"
// RUN: %diff "%s.expect" "%t"

module ReadsRequiresReads {
  function MyReadsOk(f : A -> B, a : A) : set<object>
    reads f.reads(a);
  {
    f.reads(a)
  }

  function MyReadsOk2(f : A -> B, a : A) : set<object>
    reads f.reads(a);
  {
    (f.reads)(a)
  }

  function MyReadsOk3(f : A -> B, a : A) : set<object>
    reads (f.reads)(a);
  {
    f.reads(a)
  }

  function MyReadsOk4(f : A -> B, a : A) : set<object>
    reads (f.reads)(a);
  {
    (f.reads)(a)
  }

  function MyReadsBad(f : A -> B, a : A) : set<object>
  {
    f.reads(a)
  }

  function MyReadsBad2(f : A -> B, a : A) : set<object>
  {
    (f.reads)(a)
  }

  function MyReadsOk'(f : A -> B, a : A, o : object) : bool
    reads f.reads(a);
  {
    o in f.reads(a)
  }

  function MyReadsBad'(f : A -> B, a : A, o : object) : bool
  {
    o in f.reads(a)
  }

  function MyRequiresOk(f : A -> B, a : A) : bool
    reads f.reads(a);
  {
    f.requires(a)
  }

  function MyRequiresBad(f : A -> B, a : A) : bool
  {
    f.requires(a)
  }
}

module WhatWeKnowAboutReads {
  function ReadsNothing():(){()}

  lemma IndeedNothing() {
    assert ReadsNothing.reads() == {};
  }

  method NothingHere() {
    assert (() => ()).reads() == {};
  }

  class S {
    var s : S;
  }

  function ReadsSomething(s : S):()
    reads s;
  {()}

  method MaybeSomething() {
    var s  := new S;
    var s' := new S;
           if * { assert s in ReadsSomething.reads(s) || ReadsSomething.reads(s) == {};
    } else if * { assert s in ReadsSomething.reads(s);
    } else if * { assert ReadsSomething.reads(s) == {};
    } else if * { assert s' !in ReadsSomething.reads(s);
    } else if * { assert s' in ReadsSomething.reads(s);
    }
  }

  method SomethingHere() {
    var s  := new S;
    var s' := new S;
    var f := (u) reads u => ();
           if * { assert s in f.reads(s) || f.reads(s) == {};
    } else if * { assert s in f.reads(s);
    } else if * { assert f.reads(s) == {};
    } else if * { assert s' !in f.reads(s);
    } else if * { assert s' in f.reads(s);
    }
  }
}