src/CCL/coinduction.ML
author huffman
Thu, 26 May 2005 02:23:27 +0200
changeset 16081 81a4b4a245b0
parent 3837 d7f033c74b38
child 17456 bcf7544875b2
permissions -rw-r--r--
cleaned up, added cpair_less and cpair_eq_pair, removed some obsolete stuff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1459
d12da312eff4 expanded tabs
clasohm
parents: 757
diff changeset
     1
(*  Title:      92/CCL/coinduction
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1459
d12da312eff4 expanded tabs
clasohm
parents: 757
diff changeset
     3
    Author:     Martin Coen, Cambridge University Computer Laboratory
0
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
Lemmas and tactics for using the rule coinduct3 on [= and =.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
val [mono,prem] = goal Lfp.thy "[| mono(f);  a : f(lfp(f)) |] ==> a : lfp(f)";
2035
e329b36d9136 Ran expandshort; used stac instead of ssubst
paulson
parents: 1459
diff changeset
    10
by (stac (mono RS lfp_Tarski) 1);
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
    11
by (rtac prem 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    12
qed "lfpI";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
val prems = goal CCL.thy "[| a=a';  a' : A |] ==> a : A";
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    15
by (simp_tac (term_ss addsimps prems) 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    16
qed "ssubst_single";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
val prems = goal CCL.thy "[| a=a';  b=b';  <a',b'> : A |] ==> <a,b> : A";
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    19
by (simp_tac (term_ss addsimps prems) 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    20
qed "ssubst_pair";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
(***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
local 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
fun mk_thm s = prove_goal Term.thy s (fn mono::prems => 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
       [fast_tac (term_cs addIs ((mono RS coinduct3_mono_lemma RS lfpI)::prems)) 1]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
val ci3_RI    = mk_thm "[|  mono(Agen);  a : R |] ==> a : lfp(%x. Agen(x) Un R Un A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
val ci3_AgenI = mk_thm "[|  mono(Agen);  a : Agen(lfp(%x. Agen(x) Un R Un A)) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
\                       a : lfp(%x. Agen(x) Un R Un A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val ci3_AI    = mk_thm "[|  mono(Agen);  a : A |] ==> a : lfp(%x. Agen(x) Un R Un A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
fun mk_genIs thy defs genXH gen_mono s = prove_goalw thy defs s 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
      (fn prems => [rtac (genXH RS iffD2) 1,
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    36
                    (simp_tac term_ss 1),
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
                    TRY (fast_tac (term_cs addIs 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
                            ([genXH RS iffD2,gen_mono RS coinduct3_mono_lemma RS lfpI]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
                             @ prems)) 1)]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
(** POgen **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
goal Term.thy "<a,a> : PO";
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
    44
by (rtac (po_refl RS (XH_to_D PO_iff)) 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    45
qed "PO_refl";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
val POgenIs = map (mk_genIs Term.thy data_defs POgenXH POgen_mono)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
      ["<true,true> : POgen(R)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
       "<false,false> : POgen(R)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
       "[| <a,a'> : R;  <b,b'> : R |] ==> <<a,b>,<a',b'>> : POgen(R)",
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    51
       "[|!!x. <b(x),b'(x)> : R |] ==><lam x. b(x),lam x. b'(x)> : POgen(R)",
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
       "<one,one> : POgen(R)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
       "<a,a'> : lfp(%x. POgen(x) Un R Un PO) ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
\                         <inl(a),inl(a')> : POgen(lfp(%x. POgen(x) Un R Un PO))",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
       "<b,b'> : lfp(%x. POgen(x) Un R Un PO) ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
\                         <inr(b),inr(b')> : POgen(lfp(%x. POgen(x) Un R Un PO))",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
       "<zero,zero> : POgen(lfp(%x. POgen(x) Un R Un PO))",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
       "<n,n'> : lfp(%x. POgen(x) Un R Un PO) ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
\                         <succ(n),succ(n')> : POgen(lfp(%x. POgen(x) Un R Un PO))",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
       "<[],[]> : POgen(lfp(%x. POgen(x) Un R Un PO))",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
       "[| <h,h'> : lfp(%x. POgen(x) Un R Un PO); \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
\          <t,t'> : lfp(%x. POgen(x) Un R Un PO) |] ==> \
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
    63
\       <h$t,h'$t'> : POgen(lfp(%x. POgen(x) Un R Un PO))"];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
fun POgen_tac (rla,rlb) i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
       SELECT_GOAL (safe_tac ccl_cs) i THEN
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
       rtac (rlb RS (rla RS ssubst_pair)) i THEN
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
       (REPEAT (resolve_tac (POgenIs @ [PO_refl RS (POgen_mono RS ci3_AI)] @ 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
                   (POgenIs RL [POgen_mono RS ci3_AgenI]) @ [POgen_mono RS ci3_RI]) i));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
(** EQgen **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
goal Term.thy "<a,a> : EQ";
642
0db578095e6a CCL/Gfp/coinduct2, coinduct3: modified proofs to suppress deep unification
lcp
parents: 289
diff changeset
    74
by (rtac (refl RS (EQ_iff RS iffD1)) 1);
757
2ca12511676d added qed and qed_goal[w]
clasohm
parents: 642
diff changeset
    75
qed "EQ_refl";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
val EQgenIs = map (mk_genIs Term.thy data_defs EQgenXH EQgen_mono)
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    78
["<true,true> : EQgen(R)",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    79
 "<false,false> : EQgen(R)",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    80
 "[| <a,a'> : R;  <b,b'> : R |] ==> <<a,b>,<a',b'>> : EQgen(R)",
3837
d7f033c74b38 fixed dots;
wenzelm
parents: 2035
diff changeset
    81
 "[|!!x. <b(x),b'(x)> : R |] ==> <lam x. b(x),lam x. b'(x)> : EQgen(R)",
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    82
 "<one,one> : EQgen(R)",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    83
 "<a,a'> : lfp(%x. EQgen(x) Un R Un EQ) ==> \
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    84
\                   <inl(a),inl(a')> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    85
 "<b,b'> : lfp(%x. EQgen(x) Un R Un EQ) ==> \
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    86
\                   <inr(b),inr(b')> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    87
 "<zero,zero> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    88
 "<n,n'> : lfp(%x. EQgen(x) Un R Un EQ) ==> \
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    89
\                   <succ(n),succ(n')> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    90
 "<[],[]> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    91
 "[| <h,h'> : lfp(%x. EQgen(x) Un R Un EQ); \
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
\          <t,t'> : lfp(%x. EQgen(x) Un R Un EQ) |] ==> \
289
78541329ff35 changed "." to "$" to eliminate ambiguity
clasohm
parents: 8
diff changeset
    93
\       <h$t,h'$t'> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))"];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
fun EQgen_raw_tac i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
       (REPEAT (resolve_tac (EQgenIs @ [EQ_refl RS (EQgen_mono RS ci3_AI)] @ 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
                   (EQgenIs RL [EQgen_mono RS ci3_AgenI]) @ [EQgen_mono RS ci3_RI]) i));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
(* Goals of the form R <= EQgen(R) - rewrite elements <a,b> : EQgen(R) using rews and *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
(* then reduce this to a goal <a',b'> : R (hopefully?)                                *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
(*      rews are rewrite rules that would cause looping in the simpifier              *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
fun EQgen_tac simp_set rews i = 
8
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
   104
 SELECT_GOAL 
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
   105
   (TRY (safe_tac ccl_cs) THEN
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
   106
    resolve_tac ((rews@[refl]) RL ((rews@[refl]) RL [ssubst_pair])) i THEN
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
   107
    ALLGOALS (simp_tac simp_set) THEN
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
   108
    ALLGOALS EQgen_raw_tac) i;