src/HOL/UNITY/Union.ML
author paulson
Wed, 05 Aug 1998 10:56:58 +0200
changeset 5252 1b0f14d11142
child 5259 86d80749453f
permissions -rw-r--r--
Union primitives and examples
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5252
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     1
(*  Title:      HOL/UNITY/Union.ML
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     2
    ID:         $Id$
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     4
    Copyright   1998  University of Cambridge
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     5
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     6
Unions of programs
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     7
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     8
From Misra's Chapter 5: Asynchronous Compositions of Programs
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
     9
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    10
NOT CLEAR WHETHER ALL THESE FORMS ARE NEEDED: 
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    11
    Maybe Join instead of Un, and JOIN for UNION
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    12
*)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    13
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    14
(*** Safety: constrains, stable, FP ***)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    15
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    16
Goalw [constrains_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    17
    "constrains (UN i:I. acts i) A B = (ALL i:I. constrains (acts i) A B)";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    18
by (Blast_tac 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    19
qed "constrains_UN";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    20
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    21
Goalw [constrains_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    22
    "constrains (actsF Un actsG) A B =  \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    23
\    (constrains actsF A B & constrains actsG A B)";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    24
by (simp_tac (simpset() addsimps [ball_Un]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    25
qed "constrains_Un";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    26
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    27
(*Provable by constrains_Un and constrains_weaken, but why bother?*)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    28
Goalw [constrains_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    29
     "[| constrains actsF A A';  constrains actsG B B' |] \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    30
\     ==> constrains (actsF Un actsG) (A Int B) (A' Un B')";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    31
by (Blast_tac 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    32
qed "constrains_Un_weaken";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    33
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    34
Goalw [stable_def] "stable (UN i:I. acts i) A = (ALL i:I. stable (acts i) A)";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    35
by (simp_tac (simpset() addsimps [constrains_UN]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    36
qed "stable_UN";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    37
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    38
Goalw [stable_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    39
    "stable (actsF Un actsG) A = (stable actsF A & stable actsG A)";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    40
by (simp_tac (simpset() addsimps [constrains_Un]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    41
qed "stable_Un";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    42
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    43
Goal "stable (Acts (Join prgF prgG)) A = \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    44
\     (stable (Acts prgF) A & stable (Acts prgG) A)";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    45
by (simp_tac (simpset() addsimps [Join_def, stable_Un]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    46
qed "stable_Join";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    47
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    48
Goalw [FP_def] "FP (UN i:I. acts i) = (INT i:I. FP (acts i))";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    49
by (simp_tac (simpset() addsimps [stable_UN, INTER_def]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    50
qed "FP_UN";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    51
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    52
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    53
(*** Progress: transient, ensures ***)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    54
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    55
Goalw [transient_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    56
    "transient (UN i:I. acts i) A = (EX i:I. transient (acts i) A)";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    57
by (Simp_tac 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    58
qed "transient_UN";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    59
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    60
Goalw [ensures_def,transient_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    61
    "ensures (UN i:I. acts i) A B = \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    62
\    ((ALL i:I. constrains (acts i) (A-B) (A Un B)) & \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    63
\     (EX i:I. ensures (acts i) A B))";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    64
by (simp_tac (simpset() addsimps [constrains_UN]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    65
by Auto_tac;
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    66
qed "ensures_UN";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    67
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    68
(*Alternative proof: simplify using ensures_def,transient_def,constrains_Un*)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    69
Goal "ensures (actsF Un actsG) A B =     \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    70
\     (constrains actsF (A-B) (A Un B) & \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    71
\      constrains actsG (A-B) (A Un B) & \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    72
\      (ensures actsF A B | ensures actsG A B))";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    73
by (simp_tac (simpset() addcongs [conj_cong]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    74
			addsimps [ensures_UN, Un_eq_UN,
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    75
				  all_bool_eq, ex_bool_eq]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    76
qed "ensures_Un";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    77
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    78
(*Or a longer proof via constrains_imp_subset*)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    79
Goalw [stable_def, constrains_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    80
     "[| stable actsF A;  constrains actsG A A';  id: actsG |] \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    81
\     ==> constrains (actsF Un actsG) A A'";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    82
by (asm_simp_tac (simpset() addsimps [ball_Un]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    83
by (Blast_tac 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    84
qed "stable_constrains_Un";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    85
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    86
Goalw [Join_def]
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    87
      "[| stable (Acts prgF) A;  invariant prgG A |]     \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    88
\      ==> invariant (Join prgF prgG) A";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    89
by (asm_full_simp_tac (simpset() addsimps [invariant_def, stable_Un]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    90
by (Blast_tac 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    91
qed "stable_Join_invariant";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    92
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    93
Goal "[| stable actsF A;  ensures actsG A B |]     \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    94
\     ==> ensures (actsF Un actsG) A B";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    95
by (asm_simp_tac (simpset() addsimps [ensures_Un]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    96
by (asm_full_simp_tac (simpset() addsimps [stable_def, ensures_def]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    97
by (etac constrains_weaken 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    98
by Auto_tac;
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
    99
qed "ensures_stable_Un1";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   100
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   101
Goal "[| stable (Acts prgF) A;  ensures (Acts prgG) A B |]     \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   102
\     ==> ensures (Acts (Join prgF prgG)) A B";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   103
by (asm_simp_tac (simpset() addsimps [Join_def, ensures_stable_Un1]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   104
qed "ensures_stable_Join1";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   105
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   106
(*As above, but exchanging the roles of F and G*)
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   107
Goal "[| ensures actsF A B;  stable actsG A |]     \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   108
\     ==> ensures (actsF Un actsG) A B";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   109
by (stac Un_commute 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   110
by (blast_tac (claset() addIs [ensures_stable_Un1]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   111
qed "ensures_stable_Un2";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   112
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   113
Goal "[| ensures (Acts prgF) A B;  stable (Acts prgG) A |]     \
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   114
\     ==> ensures (Acts (Join prgF prgG)) A B";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   115
by (asm_simp_tac (simpset() addsimps [Join_def, ensures_stable_Un2]) 1);
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   116
qed "ensures_stable_Join2";
1b0f14d11142 Union primitives and examples
paulson
parents:
diff changeset
   117