author | paulson |
Thu, 22 Jun 2000 11:36:08 +0200 | |
changeset 9106 | 0fe9200f64bd |
parent 9091 | 8ae7a2e5119b |
child 9110 | 40d759b9725f |
permissions | -rw-r--r-- |
9027 | 1 |
(* Title: HOL/UNITY/AllocImpl |
2 |
ID: $Id$ |
|
3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
|
4 |
Copyright 2000 University of Cambridge |
|
5 |
||
6 |
Implementation of a multiple-client allocator from a single-client allocator |
|
7 |
||
8 |
add_path "../Induct"; |
|
9 |
time_use_thy "AllocImpl"; |
|
10 |
*) |
|
11 |
||
12 |
AddIs [impOfSubs subset_preserves_o]; |
|
13 |
Addsimps [funPair_o_distrib]; |
|
14 |
Addsimps [Always_INT_distrib]; |
|
15 |
Delsimps [o_apply]; |
|
16 |
||
17 |
Goalw [merge_spec_def,merge_eqOut_def] |
|
18 |
"[| M: merge_spec; G: preserves merge.Out; G: preserves merge.iOut |] \ |
|
19 |
\ ==> M Join G : Always {s. length (merge.Out s) = length (merge.iOut s)}"; |
|
20 |
by (force_tac (claset() addDs [guaranteesD], simpset()) 1); |
|
21 |
qed "Merge_Always_Out_eq_iOut"; |
|
22 |
||
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
23 |
Goalw [merge_spec_def,merge_bounded_def] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
24 |
"[| M: merge_spec; G: preserves merge.iOut |] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
25 |
\ ==> M Join G : Always {s. ALL elt : set (merge.iOut s). elt < Nclients}"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
26 |
by (force_tac (claset() addDs [guaranteesD], simpset()) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
27 |
qed "Merge_Bounded"; |
9091 | 28 |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
29 |
Goal "[| M : merge_spec; G : preserves (funPair merge.Out iOut) |] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
30 |
\ ==> M Join G : Always \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
31 |
\ {s. setsum (%i. bag_of (sublist (merge.Out s) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
32 |
\ {k. k < length (iOut s) & iOut s ! k = i})) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
33 |
\ (lessThan Nclients) = \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
34 |
\ (bag_of o merge.Out) s}"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
35 |
by (rtac ([[Merge_Always_Out_eq_iOut, Merge_Bounded] MRS Always_Int_I, |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
36 |
UNIV_AlwaysI] MRS (Always_Compl_Un_eq RS iffD1)) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
37 |
by Auto_tac; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
38 |
by (stac (bag_of_sublist_UN_disjoint RS sym) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
39 |
by (Simp_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
40 |
by (Blast_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
41 |
by (asm_full_simp_tac (simpset() addsimps [set_conv_nth]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
42 |
by (subgoal_tac |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
43 |
"(UN i:lessThan Nclients. {k. k < length (iOut x) & iOut x ! k = i}) = \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
44 |
\ lessThan (length (iOut x))" 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
45 |
by (Blast_tac 2); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
46 |
by (asm_simp_tac (simpset() addsimps [o_def]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
47 |
qed "Merge_Bag_Follows_lemma"; |
9027 | 48 |
|
49 |
Goal "M : merge_spec \ |
|
50 |
\ ==> M : (INT i: lessThan Nclients. Increasing (sub i o merge.In)) \ |
|
51 |
\ guarantees[funPair merge.Out merge.iOut] \ |
|
52 |
\ (bag_of o merge.Out) Fols \ |
|
53 |
\ (%s. setsum (%i. (bag_of o sub i o merge.In) s) \ |
|
54 |
\ (lessThan Nclients))"; |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
55 |
by (rtac (Merge_Bag_Follows_lemma RS Always_Follows1 RS guaranteesI) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
56 |
by Auto_tac; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
57 |
by (rtac Follows_setsum 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
58 |
by (auto_tac (claset(), |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
59 |
simpset() addsimps [merge_spec_def,merge_follows_def, o_def])); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
60 |
by (best_tac (claset() addIs [impOfSubs (mono_bag_of RS mono_Follows_apply)] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
61 |
addDs [guaranteesD]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
62 |
qed "Merge_Bag_Follows"; |
9091 | 63 |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
64 |
(*Declare a locale for M : merge_spec and |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
65 |
G : preserves (funPair merge.Out iOut)? *) |
9091 | 66 |
|
67 |
||
68 |
||
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
69 |
(** Distributor **) |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
70 |
|
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
71 |
Goalw [distr_follows_def] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
72 |
"D : distr_follows \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
73 |
\ ==> D : Increasing distr.In Int Increasing distr.iIn Int \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
74 |
\ Always {s. ALL elt : set (distr.iIn s). elt < Nclients} \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
75 |
\ guarantees[distr.Out] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
76 |
\ (INT i : lessThan Nclients. Increasing (sub i o distr.Out))"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
77 |
by (blast_tac (claset() addIs [guaranteesI, Follows_Increasing1] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
78 |
addDs [guaranteesD]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
79 |
qed "Distr_Increasing_Out"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
80 |
|
9027 | 81 |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
82 |
Goal "[| G : preserves distr.Out; \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
83 |
\ D Join G : Always {s. ALL elt: set (distr.iIn s). elt < Nclients} |] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
84 |
\ ==> D Join G : Always \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
85 |
\ {s. setsum (%i. bag_of (sublist (distr.In s) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
86 |
\ {k. k < length (iIn s) & iIn s ! k = i})) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
87 |
\ (lessThan Nclients) = \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
88 |
\ bag_of (sublist (distr.In s) (lessThan (length (iIn s))))}"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
89 |
by (etac ([asm_rl, UNIV_AlwaysI] MRS (Always_Compl_Un_eq RS iffD1)) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
90 |
by Auto_tac; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
91 |
by (stac (bag_of_sublist_UN_disjoint RS sym) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
92 |
by (Simp_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
93 |
by (Blast_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
94 |
by (asm_full_simp_tac (simpset() addsimps [set_conv_nth]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
95 |
by (subgoal_tac |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
96 |
"(UN i:lessThan Nclients. {k. k < length (iIn x) & iIn x ! k = i}) = \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
97 |
\ lessThan (length (iIn x))" 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
98 |
by (Blast_tac 2); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
99 |
by (Asm_simp_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
100 |
qed "Distr_Bag_Follows_lemma"; |
9027 | 101 |
|
102 |
||
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
103 |
Goal "D : distr_follows \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
104 |
\ ==> D : Increasing distr.In Int Increasing distr.iIn Int \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
105 |
\ Always {s. ALL elt : set (distr.iIn s). elt < Nclients} \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
106 |
\ guarantees[distr.Out] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
107 |
\ (INT i : lessThan Nclients. \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
108 |
\ (%s. setsum (%i. (bag_of o sub i o distr.Out) s) (lessThan Nclients)) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
109 |
\ Fols \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
110 |
\ (%s. bag_of (sublist (distr.In s) (lessThan (length(distr.iIn s))))))"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
111 |
by (rtac guaranteesI 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
112 |
by (Clarify_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
113 |
by (rtac (Distr_Bag_Follows_lemma RS Always_Follows2) 1); |
9027 | 114 |
by Auto_tac; |
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
115 |
by (rtac Follows_setsum 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
116 |
by (auto_tac (claset(), |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
117 |
simpset() addsimps [distr_follows_def, o_def])); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
118 |
by (best_tac (claset() addIs [impOfSubs (mono_bag_of RS mono_Follows_apply)] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
119 |
addDs [guaranteesD]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
120 |
qed "Distr_Bag_Follows"; |
9027 | 121 |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
122 |
(* |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
123 |
(INT i : lessThan Nclients. Increasing (sub i o allocAsk) Int |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
124 |
Increasing (sub i o allocRel)) |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
125 |
Int |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
126 |
Always {s. ALL i. i<Nclients --> |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
127 |
(ALL elt : set ((sub i o allocAsk) s). elt <= NbT)} |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
128 |
Int |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
129 |
(INT i : lessThan Nclients. |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
130 |
INT h. {s. h <= (sub i o allocGiv)s & h pfixGe (sub i o allocAsk)s} |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
131 |
LeadsTo |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
132 |
{s. tokens h <= (tokens o sub i o allocRel)s}) |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
133 |
<= |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
134 |
(INT i : lessThan Nclients. Increasing (sub i o allocAsk) Int |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
135 |
Increasing (sub i o allocRel)) |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
136 |
Int |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
137 |
Always {s. ALL i. i<Nclients --> |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
138 |
(ALL elt : set ((sub i o allocAsk) s). elt <= NbT)} |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
139 |
Int |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
140 |
(INT h. {s. h <= (sub i o allocGiv)s & h pfixGe (sub i o allocAsk)s} |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
141 |
LeadsTo |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
142 |
{s. tokens h <= (tokens o sub i o allocRel)s}) |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
143 |
*) |