src/HOL/UNITY/AllocImpl.ML
author paulson
Thu, 22 Jun 2000 11:36:08 +0200
changeset 9106 0fe9200f64bd
parent 9091 8ae7a2e5119b
child 9110 40d759b9725f
permissions -rw-r--r--
working proofs of the basic merge and distributor properties
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9027
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/AllocImpl
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     2
    ID:         $Id$
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     4
    Copyright   2000  University of Cambridge
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     5
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     6
Implementation of a multiple-client allocator from a single-client allocator
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     7
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     8
add_path "../Induct";
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
     9
time_use_thy "AllocImpl";
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    10
*)
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    11
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    12
AddIs [impOfSubs subset_preserves_o];
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    13
Addsimps [funPair_o_distrib];
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    14
Addsimps [Always_INT_distrib];
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    15
Delsimps [o_apply];
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    16
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    17
Goalw [merge_spec_def,merge_eqOut_def]
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    18
     "[| M: merge_spec; G: preserves merge.Out; G: preserves merge.iOut |] \
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    19
\ ==> M Join G : Always {s. length (merge.Out s) = length (merge.iOut s)}";  
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    20
by (force_tac (claset() addDs [guaranteesD], simpset()) 1);
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    21
qed "Merge_Always_Out_eq_iOut";
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    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
8ae7a2e5119b another brick in the wall
paulson
parents: 9027
diff changeset
    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
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    48
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    49
Goal "M : merge_spec \
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    50
\ ==> M : (INT i: lessThan Nclients. Increasing (sub i o merge.In)) \
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    51
\             guarantees[funPair merge.Out merge.iOut]  \
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    52
\                (bag_of o merge.Out) Fols \
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    53
\                (%s. setsum (%i. (bag_of o sub i o merge.In) s) \
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    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
8ae7a2e5119b another brick in the wall
paulson
parents: 9027
diff changeset
    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
8ae7a2e5119b another brick in the wall
paulson
parents: 9027
diff changeset
    66
8ae7a2e5119b another brick in the wall
paulson
parents: 9027
diff changeset
    67
8ae7a2e5119b another brick in the wall
paulson
parents: 9027
diff changeset
    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
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
    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
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
   101
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
   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
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
   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
daeccd9f885f The Allocator Implementation (not yet working)
paulson
parents:
diff changeset
   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
*)