author | wenzelm |
Mon, 26 Jun 2000 16:53:55 +0200 | |
changeset 9150 | b7642408aea3 |
parent 9110 | 40d759b9725f |
child 9403 | aad13b59b8d9 |
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 |
||
9110 | 17 |
(*Make a locale for M: merge_spec and G: preserves (funPair merge.Out iOut)?*) |
18 |
||
9027 | 19 |
Goalw [merge_spec_def,merge_eqOut_def] |
20 |
"[| M: merge_spec; G: preserves merge.Out; G: preserves merge.iOut |] \ |
|
21 |
\ ==> M Join G : Always {s. length (merge.Out s) = length (merge.iOut s)}"; |
|
22 |
by (force_tac (claset() addDs [guaranteesD], simpset()) 1); |
|
23 |
qed "Merge_Always_Out_eq_iOut"; |
|
24 |
||
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
25 |
Goalw [merge_spec_def,merge_bounded_def] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
26 |
"[| M: merge_spec; G: preserves merge.iOut |] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
27 |
\ ==> 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
|
28 |
by (force_tac (claset() addDs [guaranteesD], simpset()) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
29 |
qed "Merge_Bounded"; |
9091 | 30 |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
31 |
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
|
32 |
\ ==> M Join G : Always \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
33 |
\ {s. setsum (%i. bag_of (sublist (merge.Out s) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
34 |
\ {k. k < length (iOut s) & iOut s ! k = i})) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
35 |
\ (lessThan Nclients) = \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
36 |
\ (bag_of o merge.Out) s}"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
37 |
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
|
38 |
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
|
39 |
by Auto_tac; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
40 |
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
|
41 |
by (Simp_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
42 |
by (Blast_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
43 |
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
|
44 |
by (subgoal_tac |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
45 |
"(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
|
46 |
\ lessThan (length (iOut x))" 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
47 |
by (Blast_tac 2); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
48 |
by (asm_simp_tac (simpset() addsimps [o_def]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
49 |
qed "Merge_Bag_Follows_lemma"; |
9027 | 50 |
|
51 |
Goal "M : merge_spec \ |
|
52 |
\ ==> M : (INT i: lessThan Nclients. Increasing (sub i o merge.In)) \ |
|
53 |
\ guarantees[funPair merge.Out merge.iOut] \ |
|
54 |
\ (bag_of o merge.Out) Fols \ |
|
55 |
\ (%s. setsum (%i. (bag_of o sub i o merge.In) s) \ |
|
56 |
\ (lessThan Nclients))"; |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
57 |
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
|
58 |
by Auto_tac; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
59 |
by (rtac Follows_setsum 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
60 |
by (auto_tac (claset(), |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
61 |
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
|
62 |
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
|
63 |
addDs [guaranteesD]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
64 |
qed "Merge_Bag_Follows"; |
9091 | 65 |
|
66 |
||
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
67 |
(** Distributor **) |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
68 |
|
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
69 |
Goalw [distr_follows_def] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
70 |
"D : distr_follows \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
71 |
\ ==> D : Increasing distr.In Int Increasing distr.iIn Int \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
72 |
\ 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
|
73 |
\ guarantees[distr.Out] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
74 |
\ (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
|
75 |
by (blast_tac (claset() addIs [guaranteesI, Follows_Increasing1] |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
76 |
addDs [guaranteesD]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
77 |
qed "Distr_Increasing_Out"; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
78 |
|
9027 | 79 |
|
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
80 |
Goal "[| G : preserves distr.Out; \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
81 |
\ 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
|
82 |
\ ==> D Join G : Always \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
83 |
\ {s. setsum (%i. bag_of (sublist (distr.In s) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
84 |
\ {k. k < length (iIn s) & iIn s ! k = i})) \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
85 |
\ (lessThan Nclients) = \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
86 |
\ 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
|
87 |
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
|
88 |
by Auto_tac; |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
89 |
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
|
90 |
by (Simp_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
91 |
by (Blast_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
92 |
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
|
93 |
by (subgoal_tac |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
94 |
"(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
|
95 |
\ lessThan (length (iIn x))" 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
96 |
by (Blast_tac 2); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
97 |
by (Asm_simp_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
98 |
qed "Distr_Bag_Follows_lemma"; |
9027 | 99 |
|
100 |
||
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
101 |
Goal "D : distr_follows \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
102 |
\ ==> D : Increasing distr.In Int Increasing distr.iIn Int \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
103 |
\ 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
|
104 |
\ guarantees[distr.Out] \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
105 |
\ (INT i : lessThan Nclients. \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
106 |
\ (%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
|
107 |
\ Fols \ |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
108 |
\ (%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
|
109 |
by (rtac guaranteesI 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
110 |
by (Clarify_tac 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
111 |
by (rtac (Distr_Bag_Follows_lemma RS Always_Follows2) 1); |
9027 | 112 |
by Auto_tac; |
9106
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
113 |
by (rtac Follows_setsum 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
114 |
by (auto_tac (claset(), |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
115 |
simpset() addsimps [distr_follows_def, o_def])); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
116 |
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
|
117 |
addDs [guaranteesD]) 1); |
0fe9200f64bd
working proofs of the basic merge and distributor properties
paulson
parents:
9091
diff
changeset
|
118 |
qed "Distr_Bag_Follows"; |
9027 | 119 |
|
9110 | 120 |
|
121 |
Goal "!!f::nat=>nat. (INT i:(lessThan n). {s. f i <= g i s}) \ |
|
122 |
\ <= {s. setsum f (lessThan n) <= setsum (%i. g i s) (lessThan n)}"; |
|
123 |
by (induct_tac "n" 1); |
|
124 |
by (auto_tac (claset(), simpset() addsimps [lessThan_Suc])); |
|
125 |
qed "alloc_refinement_lemma"; |
|
126 |
||
127 |
Goal |
|
128 |
"(INT i : lessThan Nclients. Increasing (sub i o allocAsk) Int \ |
|
129 |
\ Increasing (sub i o allocRel)) \ |
|
130 |
\ Int \ |
|
131 |
\ Always {s. ALL i. i<Nclients --> \ |
|
132 |
\ (ALL elt : set ((sub i o allocAsk) s). elt <= NbT)} \ |
|
133 |
\ Int \ |
|
134 |
\ (INT i : lessThan Nclients. \ |
|
135 |
\ INT h. {s. h <= (sub i o allocGiv)s & h pfixGe (sub i o allocAsk)s} \ |
|
136 |
\ LeadsTo {s. tokens h <= (tokens o sub i o allocRel)s}) \ |
|
9150 | 137 |
\ <= \ |
9110 | 138 |
\(INT i : lessThan Nclients. Increasing (sub i o allocAsk) Int \ |
139 |
\ Increasing (sub i o allocRel)) \ |
|
140 |
\ Int \ |
|
141 |
\ Always {s. ALL i. i<Nclients --> \ |
|
142 |
\ (ALL elt : set ((sub i o allocAsk) s). elt <= NbT)} \ |
|
143 |
\ Int \ |
|
144 |
\ (INT hf. (INT i : lessThan Nclients. \ |
|
145 |
\ {s. hf i <= (sub i o allocGiv)s & hf i pfixGe (sub i o allocAsk)s}) \ |
|
146 |
\ LeadsTo {s. setsum (%i. tokens (hf i)) (lessThan Nclients) <= \ |
|
147 |
\ setsum (%i. (tokens o sub i o allocRel)s) (lessThan Nclients) })"; |
|
148 |
by (auto_tac (claset(), simpset() addsimps [ball_conj_distrib])); |
|
149 |
by (rename_tac "F hf" 1); |
|
150 |
by (rtac ([Finite_stable_completion, alloc_refinement_lemma] |
|
151 |
MRS LeadsTo_weaken_R) 1); |
|
152 |
by (Blast_tac 1); |
|
153 |
by (Blast_tac 1); |
|
154 |
by (subgoal_tac "F : Increasing (tokens o (sub i o allocRel))" 1); |
|
155 |
by (blast_tac |
|
156 |
(claset() addIs [impOfSubs (mono_tokens RS mono_Increasing_o)]) 2); |
|
157 |
by (asm_full_simp_tac (simpset() addsimps [Increasing_def, o_assoc]) 1); |
|
158 |
qed "alloc_refinement"; |
|
159 |
||
160 |