src/CCL/coinduction.ML
author lcp
Mon, 20 Sep 1993 17:02:11 +0200
changeset 8 c3d2c6dcf3f0
parent 0 a5a9c433f639
child 289 78541329ff35
permissions -rw-r--r--
Installation of new simplfier. Previously appeared to set up the old simplifier to rewrite with the partial ordering [=, something not possible with the new simplifier. But such rewriting appears not to have actually been used, and there were few complications. In terms.ML setloop was used to avoid infinite rewriting with the letrec rule. Congruence rules were deleted, and an occasional SIMP_TAC had to become asm_simp_tac.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	92/CCL/coinduction
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Martin Coen, Cambridge University Computer Laboratory
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)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
br ((mono RS lfp_Tarski) RS ssubst) 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
br prem 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
val lfpI = result();
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);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
val ssubst_single = result();
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);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
val ssubst_pair = result();
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";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
br (po_refl RS (XH_to_D PO_iff)) 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
val PO_refl = result();
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)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
       "[|!!x. <b(x),b'(x)> : R |] ==><lam x.b(x),lam x.b'(x)> : POgen(R)",
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) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
\       <h.t,h'.t'> : POgen(lfp(%x. POgen(x) Un R Un PO))"];
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";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
br (refl RS (EQ_iff RS iffD1)) 1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
val EQ_refl = result();
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)",
c3d2c6dcf3f0 Installation of new simplfier. Previously appeared to set up the old
lcp
parents: 0
diff changeset
    81
 "[|!!x. <b(x),b'(x)> : R |] ==> <lam x.b(x),lam x.b'(x)> : EQgen(R)",
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) |] ==> \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
\       <h.t,h'.t'> : EQgen(lfp(%x. EQgen(x) Un R Un EQ))"];
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;