1 (* experiments related to ARM program verification *)
11 predicate inv (a : array int) =
12 a[0] = 0 /\ length a = 11 /\ forall k:int. 1 <= k <= 10 -> 0 < a[k]
14 val ghost loop1 : ref int
15 val ghost loop2 : ref int
18 requires { inv a /\ !loop1 = 0 /\ !loop2 = 0 }
19 ensures { !loop1 = 9 /\ !loop2 <= 45 }
22 invariant { 2 <= !i <= 11 /\ inv a /\
23 !loop1 = !i - 2 /\ 2 * !loop2 <= (!i-2) * (!i-1) }
27 while a[!j] < a[!j - 1] do
28 invariant { 1 <= !j <= !i /\ inv a /\
29 2 * !loop2 <= (!i-2) * (!i-1) + 2*(!i - !j) }
49 val mem : ref (map int int)
50 val mem_ldr (a:int) : int ensures { result = !mem[a] }
51 val mem_str (a:int) (v:int) : (_r: int) writes { mem }
52 ensures { !mem = (old !mem)[a <- v] }
56 val data : ref (t int int)
57 val data_ldr (a:int) : int ensures { result = data[a] }
58 val data_str (a:int) (v:int) : int writes { data }
59 ensures { data = (old data)[a <- v] }
69 val pc : ref int (* pc *)
71 val ldr (r : ref int) (a : int) : unit writes {r}
72 ensures { !r = !mem[a] }
74 val str (r : ref int) (a : int) : unit writes {mem}
75 ensures { !mem = (old !mem)[a <- !r] }
80 val cmp (r : ref int) (v : int) : unit writes {le}
81 ensures { !le=True <-> !r <= v }
86 @@ logic separation (fp : int) = a+10 < fp-24
89 @@ assume separation fp
99 module InsertionSortExample
112 (* stack and data segment do not overlap *)
113 predicate separation (fp : int) = a+10 < fp-24
115 predicate inv (mem: map int int) =
116 mem[a] = 0 /\ forall k:int. 1 <= k <= 10 -> 0 < mem[a + k]
118 predicate inv_l2 (mem: map int int) (fp : int) (l4 : int) =
119 2 <= mem[fp - 16] <= 11 /\ l4 = mem[fp-16] - 2 /\ inv mem
122 requires { separation !fp /\ inv !mem }
123 ensures { inv_l2 !mem !fp !l4 }
129 requires { separation !fp /\ inv_l2 !mem !fp !l4 }
133 assume { !le = False }