src/ZF/ex/ParContract.ML
author lcp
Tue, 21 Jun 1994 16:26:34 +0200
changeset 434 89d45187f04d
parent 0 a5a9c433f639
child 477 53fc8ad84b33
permissions -rw-r--r--
Various updates and tidying
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/parcontract.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Parallel contraction
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
HOL system proofs may be found in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
/usr/groups/theory/hvg-aftp/contrib/rule-induction/cl.ml
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
structure ParContract = Inductive_Fun
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
 (val thy = Contract.thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
  val rec_doms = [("parcontract","comb*comb")];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
  val sintrs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
      ["[| p:comb |] ==> p =1=> p",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
       "[| p:comb;  q:comb |] ==> K#p#q =1=> p",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
       "[| p:comb;  q:comb;  r:comb |] ==> S#p#q#r =1=> (p#r)#(q#r)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
       "[| p=1=>q;  r=1=>s |] ==> p#r =1=> q#s"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
  val monos = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
  val con_defs = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
  val type_intrs = Comb.intrs@[SigmaI];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
  val type_elims = [SigmaE2]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
434
89d45187f04d Various updates and tidying
lcp
parents: 0
diff changeset
    25
val [parcontract_refl,K_parcontract,S_parcontract,Ap_parcontract] = 
89d45187f04d Various updates and tidying
lcp
parents: 0
diff changeset
    26
    ParContract.intrs;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
val parcontract_induct = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
    (ParContract.mutual_induct RS spec RS spec RSN (2,rev_mp));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
(*For type checking: replaces a=1=>b by a,b:comb *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
val parcontract_combE2 = ParContract.dom_subset RS subsetD RS SigmaE2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
val parcontract_combD1 = ParContract.dom_subset RS subsetD RS SigmaD1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
val parcontract_combD2 = ParContract.dom_subset RS subsetD RS SigmaD2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
goal ParContract.thy "field(parcontract) = comb";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
by (fast_tac (ZF_cs addIs [equalityI,K_parcontract] 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
	            addSEs [parcontract_combE2]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
val field_parcontract_eq = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
val parcontract_caseE = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
     (ParContract.unfold RS equalityD1 RS subsetD RS CollectE);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
(*Derive a case for each combinator constructor*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
val K_parcontract_case = ParContract.mk_cases Comb.con_defs "K =1=> r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
val S_parcontract_case = ParContract.mk_cases Comb.con_defs "S =1=> r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
val Ap_parcontract_case = ParContract.mk_cases Comb.con_defs "p#q =1=> r";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
val parcontract_cs =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
    ZF_cs addSIs Comb.intrs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
	  addIs  ParContract.intrs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
	  addSEs [Ap_E, K_parcontract_case, S_parcontract_case, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
		  Ap_parcontract_case]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
	  addSEs [parcontract_combD1, parcontract_combD2]     (*type checking*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
          addSEs Comb.free_SEs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
(*** Basic properties of parallel contraction ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
goal ParContract.thy "!!p r. K#p =1=> r ==> (EX p'. r = K#p' & p =1=> p')";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
by (fast_tac parcontract_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
val K1_parcontractD = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
goal ParContract.thy "!!p r. S#p =1=> r ==> (EX p'. r = S#p' & p =1=> p')";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (fast_tac parcontract_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
val S1_parcontractD = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
goal ParContract.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
 "!!p q r. S#p#q =1=> r ==> (EX p' q'. r = S#p'#q' & p =1=> p' & q =1=> q')";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
by (fast_tac (parcontract_cs addSDs [S1_parcontractD]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
val S2_parcontractD = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
(*Church-Rosser property for parallel contraction*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
goalw ParContract.thy [diamond_def] "diamond(parcontract)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
by (rtac (impI RS allI RS allI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
by (etac parcontract_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
by (ALLGOALS 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
    (fast_tac (parcontract_cs addSDs [K1_parcontractD,S2_parcontractD])));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
val diamond_parcontract = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
(*** Transitive closure preserves the Church-Rosser property ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
goalw ParContract.thy [diamond_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
    "!!x y r. [| diamond(r);  <x,y>:r^+ |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
\    ALL y'. <x,y'>:r --> (EX z. <y',z>: r^+ & <y,z>: r)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
by (etac trancl_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
by (fast_tac (ZF_cs addIs [r_into_trancl]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
by (slow_best_tac (ZF_cs addSDs [spec RS mp]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
		         addIs  [r_into_trancl, trans_trancl RS transD]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
val diamond_trancl_lemma = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
val diamond_lemmaE = diamond_trancl_lemma RS spec RS mp RS exE;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
val [major] = goal ParContract.thy "diamond(r) ==> diamond(r^+)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
bw diamond_def;  (*unfold only in goal, not in premise!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
by (rtac (impI RS allI RS allI) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
by (etac trancl_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
by (ALLGOALS
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
    (slow_best_tac (ZF_cs addIs [r_into_trancl, trans_trancl RS transD]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
		          addEs [major RS diamond_lemmaE])));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
val diamond_trancl = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
(*** Equivalence of p--->q and p===>q ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
goal ParContract.thy "!!p q. p-1->q ==> p=1=>q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
by (etac contract_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
by (ALLGOALS (fast_tac (parcontract_cs)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
val contract_imp_parcontract = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
goal ParContract.thy "!!p q. p--->q ==> p===>q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by (forward_tac [rtrancl_type RS subsetD RS SigmaD1] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
by (dtac (field_contract_eq RS equalityD1 RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
by (etac rtrancl_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
by (fast_tac (parcontract_cs addIs [r_into_trancl]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
by (fast_tac (ZF_cs addIs [contract_imp_parcontract, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
			   r_into_trancl, trans_trancl RS transD]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
val reduce_imp_parreduce = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
goal ParContract.thy "!!p q. p=1=>q ==> p--->q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
by (etac parcontract_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
by (fast_tac (contract_cs addIs reduction_rls) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
by (rtac (trans_rtrancl RS transD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
by (ALLGOALS 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
    (fast_tac 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
     (contract_cs addIs [Ap_reduce1, Ap_reduce2]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
                  addSEs [parcontract_combD1,parcontract_combD2])));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
val parcontract_imp_reduce = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
goal ParContract.thy "!!p q. p===>q ==> p--->q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
by (forward_tac [trancl_type RS subsetD RS SigmaD1] 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
by (dtac (field_parcontract_eq RS equalityD1 RS subsetD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
by (etac trancl_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
by (etac parcontract_imp_reduce 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
by (etac (trans_rtrancl RS transD) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
by (etac parcontract_imp_reduce 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
val parreduce_imp_reduce = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
goal ParContract.thy "p===>q <-> p--->q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
by (REPEAT (ares_tac [iffI, parreduce_imp_reduce, reduce_imp_parreduce] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
val parreduce_iff_reduce = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
writeln"Reached end of file.";