src/HOL/UNITY/Priority.ML
author paulson
Tue, 27 Feb 2001 16:13:23 +0100
changeset 11185 1b737b4c2108
parent 10782 ddb433987557
permissions -rw-r--r--
Some X-symbols for <notin>, <noteq>, <forall>, <exists> Streamlining of Yahalom proofs Removal of redundant proofs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10782
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Priority
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     2
    ID:         $Id$
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     3
    Author:     Sidi O Ehmety, Cambridge University Computer Laboratory
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     4
    Copyright   2001  University of Cambridge
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     5
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     6
The priority system
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     7
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     8
From Charpentier and Chandy,
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
     9
Examples of Program Composition Illustrating the Use of Universal Properties
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    10
   In J. Rolim (editor), Parallel and Distributed Processing,
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    11
   Spriner LNCS 1586 (1999), pages 1215-1227.
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    12
*)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    13
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    14
Addsimps [Component_def RS def_prg_Init];
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    15
program_defs_ref := [Component_def, system_def];
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    16
Addsimps [highest_def, lowest_def];
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    17
Addsimps [simp_of_act  act_def];
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    18
Addsimps (map simp_of_set [Highest_def, Lowest_def]);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    19
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    20
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    21
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    22
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    23
(**** Component correctness proofs  ****)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    24
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    25
(* neighbors is stable  *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    26
Goal "Component i: stable {s. neighbors k s = n}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    27
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    28
by Auto_tac;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    29
qed "Component_neighbors_stable";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    30
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    31
(* property 4 *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    32
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    33
"Component i: {s. ((i,j):s) = b} Int (- Highest i) co {s. ((i,j):s)=b}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    34
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    35
qed "Component_waits_priority";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    36
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    37
(* property 5: charpentier and Chandy mistakenly express it as
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    38
 'transient Highest i'. Consider the case where i has neighbors *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    39
Goal
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    40
 "Component i: {s. neighbors i s ~= {}} Int Highest i \
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    41
\              ensures - Highest i";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    42
by (ensures_tac "act i" 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    43
by (REPEAT(Fast_tac 1));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    44
qed "Component_yields_priority"; 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    45
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    46
(* or better *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    47
Goal "Component i: Highest i ensures Lowest i";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    48
by (ensures_tac "act i" 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    49
by (REPEAT(Fast_tac 1));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    50
qed "Component_yields_priority'";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    51
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    52
(* property 6: Component doesn't introduce cycle *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    53
Goal "Component i: Highest i co Highest i Un Lowest i";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    54
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    55
by (Fast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    56
qed "Component_well_behaves"; 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    57
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    58
(* property 7: local axiom *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    59
Goal "Component i: stable {s. ALL j k. j~=i & k~=i--> ((j,k):s) = b j k}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    60
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    61
qed "locality";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    62
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    63
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    64
(**** System  properties  ****)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    65
(* property 8: strictly universal *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    66
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    67
Goalw [Safety_def] 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    68
    "system: stable Safety";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    69
by (rtac stable_INT 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    70
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    71
by (Fast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    72
qed "Safety"; 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    73
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    74
(* property 13: universal *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    75
Goal
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    76
"system: {s. s = q} co {s. s=q} Un {s. EX i. derive i q s}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    77
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    78
by (Blast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    79
qed "p13";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    80
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    81
(* property 14: the 'above set' of a Component that hasn't got 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    82
      priority doesn't increase *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    83
Goal
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    84
"ALL j. system: -Highest i Int {s. j~:above i s} co {s. j~:above i s}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    85
by (Clarify_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    86
by (cut_inst_tac [("i", "j")] reach_lemma 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    87
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    88
by (auto_tac (claset(), simpset() addsimps [trancl_converse]));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    89
qed "above_not_increase";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    90
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    91
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    92
"system: -Highest i Int {s. above i s = x} co {s. above i s <= x}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    93
by (cut_inst_tac [("i", "i")] above_not_increase 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    94
by (asm_full_simp_tac (simpset() addsimps 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    95
                 [trancl_converse, constrains_def]) 1); 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    96
by (Blast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    97
qed "above_not_increase'";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    98
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
    99
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   100
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   101
(* p15: universal property: all Components well behave  *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   102
Goal "ALL i. system: Highest i co Highest i Un Lowest i";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   103
by (Clarify_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   104
by (constrains_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   105
by Auto_tac;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   106
qed "system_well_behaves";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   107
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   108
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   109
Goal "Acyclic = (INT i. {s. i~:above i s})";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   110
by (auto_tac (claset(), simpset() 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   111
   addsimps [Acyclic_def, acyclic_def, trancl_converse]));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   112
qed "Acyclic_eq";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   113
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   114
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   115
val lemma = [above_not_increase RS spec, 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   116
           system_well_behaves RS spec] MRS constrains_Un;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   117
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   118
"system: stable Acyclic";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   119
by (auto_tac (claset() addSIs [stable_INT, stableI, 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   120
                               lemma RS constrains_weaken],
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   121
              simpset() addsimps [Acyclic_eq, 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   122
                    image0_r_iff_image0_trancl,trancl_converse]));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   123
qed "Acyclic_stable";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   124
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   125
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   126
Goalw [Acyclic_def, Maximal_def]
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   127
"Acyclic <= Maximal";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   128
by (Clarify_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   129
by (dtac above_lemma_b 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   130
by Auto_tac;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   131
qed "Acyclic_subset_Maximal";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   132
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   133
(* property 17: original one is an invariant *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   134
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   135
"system: stable (Acyclic Int Maximal)";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   136
by (simp_tac (simpset() addsimps 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   137
     [Acyclic_subset_Maximal RS Int_absorb2, Acyclic_stable]) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   138
qed "Acyclic_Maximal_stable";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   139
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   140
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   141
(* propert 5: existential property *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   142
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   143
Goal "system: Highest i leadsTo Lowest i";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   144
by (ensures_tac "act i" 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   145
by (auto_tac (claset(), simpset() addsimps [Component_def]));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   146
qed "Highest_leadsTo_Lowest";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   147
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   148
(* a lowest i can never be in any abover set *) 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   149
Goal "Lowest i <= (INT k. {s. i~:above k s})";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   150
by (auto_tac (claset(), 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   151
          simpset() addsimps [image0_r_iff_image0_trancl, trancl_converse]));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   152
qed  "Lowest_above_subset";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   153
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   154
(* property 18: a simpler proof than the original, one which uses psp *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   155
Goal "system: Highest i leadsTo (INT k. {s. i~:above k s})";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   156
by (rtac leadsTo_weaken_R 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   157
by (rtac Lowest_above_subset 2);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   158
by (rtac Highest_leadsTo_Lowest 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   159
qed "Highest_escapes_above";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   160
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   161
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   162
"system: Highest j Int {s. j:above i s} leadsTo {s. j~:above i s}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   163
by (blast_tac (claset() addIs 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   164
   [[Highest_escapes_above, Int_lower1, INT_lower] MRS leadsTo_weaken]) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   165
qed "Highest_escapes_above'"; 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   166
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   167
(*** The main result: above set decreases ***)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   168
(* The original proof of the following formula was wrong *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   169
val above_decreases_lemma = 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   170
[Highest_escapes_above', above_not_increase'] MRS psp RS leadsTo_weaken;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   171
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   172
Goal "Highest i = {s. above i s ={}}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   173
by (auto_tac (claset(), 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   174
        simpset() addsimps [image0_trancl_iff_image0_r]));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   175
qed "Highest_iff_above0";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   176
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   177
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   178
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   179
"system: (UN j. {s. above i s = x} Int {s. j:above i s} Int Highest j) \
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   180
\          leadsTo {s. above i s < x}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   181
by (rtac leadsTo_UN 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   182
by (rtac single_leadsTo_I 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   183
by (Clarify_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   184
by (res_inst_tac [("x2", "above i x")] above_decreases_lemma 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   185
by (ALLGOALS(full_simp_tac (simpset() delsimps [Highest_def]
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   186
                  addsimps [Highest_iff_above0])));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   187
by (REPEAT(Blast_tac 1));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   188
qed "above_decreases";  
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   189
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   190
(** Just a massage of conditions to have the desired form ***)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   191
Goalw [Maximal_def, Maximal'_def, Highest_def]
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   192
"Maximal = Maximal'";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   193
by (Blast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   194
qed "Maximal_eq_Maximal'";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   195
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   196
Goal "x~={} ==> \
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   197
\   Acyclic Int {s. above i s = x} <= \
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   198
\   (UN j. {s. above i s = x} Int {s. j:above i s} Int Highest j)";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   199
by (res_inst_tac [("B", "Maximal' Int {s. above i s = x}")] subset_trans 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   200
by (simp_tac (simpset() addsimps [Maximal_eq_Maximal' RS sym]) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   201
by (blast_tac (claset() addIs [Acyclic_subset_Maximal RS subsetD]) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   202
by (simp_tac (simpset() delsimps [above_def] addsimps [Maximal'_def, Highest_iff_above0]) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   203
by (Blast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   204
qed "Acyclic_subset";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   205
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   206
val above_decreases' = [above_decreases, Acyclic_subset] MRS leadsTo_weaken_L;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   207
val above_decreases_psp = [above_decreases', Acyclic_stable] MRS psp_stable;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   208
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   209
Goal 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   210
"x~={}==> \
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   211
\ system: Acyclic Int {s. above i s = x} leadsTo Acyclic Int {s. above i s < x}";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   212
by (etac (above_decreases_psp RS leadsTo_weaken) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   213
by (Blast_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   214
by Auto_tac;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   215
qed "above_decreases_psp'";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   216
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   217
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   218
val finite_psubset_induct = wf_finite_psubset RS leadsTo_wf_induct;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   219
val leadsTo_weaken_L' = rotate_prems 1 leadsTo_weaken_L;
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   220
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   221
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   222
Goal "system: Acyclic leadsTo Highest i";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   223
by (res_inst_tac [("f", "%s. above i s")] finite_psubset_induct 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   224
by (asm_simp_tac (simpset() delsimps [Highest_def, above_def] 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   225
                            addsimps [Highest_iff_above0,
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   226
                                      vimage_def, finite_psubset_def]) 1); 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   227
by (Clarify_tac 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   228
by (case_tac "m={}" 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   229
by (rtac (Int_lower2 RS leadsTo_weaken_L') 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   230
by (force_tac (claset(), simpset() addsimps [leadsTo_refl]) 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   231
by (res_inst_tac [("A'", "Acyclic Int {x. above i x < m}")] 
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   232
    leadsTo_weaken_R 1);
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   233
by (REPEAT(blast_tac (claset() addIs [above_decreases_psp']) 1));
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   234
qed "Progress";
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   235
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   236
(* We have proved all (relevant) theorems given in the paper *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   237
(* We didn't assume any thing about the relation r *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   238
(* It is not necessary that r be a priority relation as assumed in the original proof *)
ddb433987557 new examples by Sidi Ehmety
paulson
parents:
diff changeset
   239
(* It suffices that we start from a state which is finite and acyclic *)