src/CCL/hered.ML
changeset 8 c3d2c6dcf3f0
parent 0 a5a9c433f639
child 289 78541329ff35
equal deleted inserted replaced
7:268f93ab3bc4 8:c3d2c6dcf3f0
     7 *)
     7 *)
     8 
     8 
     9 open Hered;
     9 open Hered;
    10 
    10 
    11 fun type_of_terms (Const("Trueprop",_) $ (Const("op =",(Type ("fun", [t,_])))$_$_)) = t;
    11 fun type_of_terms (Const("Trueprop",_) $ (Const("op =",(Type ("fun", [t,_])))$_$_)) = t;
    12 
       
    13 val cong_rls = ccl_mk_congs Hered.thy  ["HTTgen"];
       
    14 
    12 
    15 (*** Hereditary Termination ***)
    13 (*** Hereditary Termination ***)
    16 
    14 
    17 goalw Hered.thy [HTTgen_def]  "mono(%X.HTTgen(X))";
    15 goalw Hered.thy [HTTgen_def]  "mono(%X.HTTgen(X))";
    18 br monoI 1;
    16 br monoI 1;
    52 by (fast_tac term_cs 1);
    50 by (fast_tac term_cs 1);
    53 val HTT_pair = result();
    51 val HTT_pair = result();
    54 
    52 
    55 goal Hered.thy "lam x.f(x) : HTT <-> (ALL x. f(x) : HTT)";
    53 goal Hered.thy "lam x.f(x) : HTT <-> (ALL x. f(x) : HTT)";
    56 br (HTTXH RS iff_trans) 1;
    54 br (HTTXH RS iff_trans) 1;
    57 by (SIMP_TAC term_ss 1);
    55 by (simp_tac term_ss 1);
    58 by (safe_tac term_cs);
    56 by (safe_tac term_cs);
    59 by (ASM_SIMP_TAC term_ss 1);
    57 by (asm_simp_tac term_ss 1);
    60 by (fast_tac term_cs 1);
    58 by (fast_tac term_cs 1);
    61 val HTT_lam = result();
    59 val HTT_lam = result();
    62 
    60 
    63 local
    61 local
    64   val raw_HTTrews = [HTT_bot,HTT_true,HTT_false,HTT_pair,HTT_lam];
    62   val raw_HTTrews = [HTT_bot,HTT_true,HTT_false,HTT_pair,HTT_lam];
    65   fun mk_thm s = prove_goalw Hered.thy data_defs s (fn _ => 
    63   fun mk_thm s = prove_goalw Hered.thy data_defs s (fn _ => 
    66                   [SIMP_TAC (term_ss addrews raw_HTTrews) 1]);
    64                   [simp_tac (term_ss addsimps raw_HTTrews) 1]);
    67 in
    65 in
    68   val HTT_rews = raw_HTTrews @
    66   val HTT_rews = raw_HTTrews @
    69                map mk_thm ["one : HTT",
    67                map mk_thm ["one : HTT",
    70                            "inl(a) : HTT <-> a : HTT",
    68                            "inl(a) : HTT <-> a : HTT",
    71                            "inr(b) : HTT <-> b : HTT",
    69                            "inr(b) : HTT <-> b : HTT",
   113 \                         h.t : HTTgen(lfp(%x. HTTgen(x) Un R Un HTT))"];
   111 \                         h.t : HTTgen(lfp(%x. HTTgen(x) Un R Un HTT))"];
   114 
   112 
   115 (*** Formation Rules for Types ***)
   113 (*** Formation Rules for Types ***)
   116 
   114 
   117 goal Hered.thy "Unit <= HTT";
   115 goal Hered.thy "Unit <= HTT";
   118 by (SIMP_TAC (CCL_ss addrews ([subsetXH,UnitXH] @ HTT_rews)) 1);
   116 by (simp_tac (CCL_ss addsimps ([subsetXH,UnitXH] @ HTT_rews)) 1);
   119 val UnitF = result();
   117 val UnitF = result();
   120 
   118 
   121 goal Hered.thy "Bool <= HTT";
   119 goal Hered.thy "Bool <= HTT";
   122 by (SIMP_TAC (CCL_ss addrews ([subsetXH,BoolXH] @ HTT_rews)) 1);
   120 by (simp_tac (CCL_ss addsimps ([subsetXH,BoolXH] @ HTT_rews)) 1);
   123 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1);
   121 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1);
   124 val BoolF = result();
   122 val BoolF = result();
   125 
   123 
   126 val prems = goal Hered.thy "[| A <= HTT;  B <= HTT |] ==> A + B  <= HTT";
   124 val prems = goal Hered.thy "[| A <= HTT;  B <= HTT |] ==> A + B  <= HTT";
   127 by (SIMP_TAC (CCL_ss addrews ([subsetXH,PlusXH] @ HTT_rews)) 1);
   125 by (simp_tac (CCL_ss addsimps ([subsetXH,PlusXH] @ HTT_rews)) 1);
   128 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1);
   126 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1);
   129 val PlusF = result();
   127 val PlusF = result();
   130 
   128 
   131 val prems = goal Hered.thy 
   129 val prems = goal Hered.thy 
   132      "[| A <= HTT;  !!x.x:A ==> B(x) <= HTT |] ==> SUM x:A.B(x) <= HTT";
   130      "[| A <= HTT;  !!x.x:A ==> B(x) <= HTT |] ==> SUM x:A.B(x) <= HTT";
   133 by (SIMP_TAC (CCL_ss addrews ([subsetXH,SgXH] @ HTT_rews)) 1);
   131 by (simp_tac (CCL_ss addsimps ([subsetXH,SgXH] @ HTT_rews)) 1);
   134 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1);
   132 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1);
   135 val SigmaF = result();
   133 val SigmaF = result();
   136 
   134 
   137 (*** Formation Rules for Recursive types - using coinduction these only need ***)
   135 (*** Formation Rules for Recursive types - using coinduction these only need ***)
   138 (***                                          exhaution rule for type-former ***)
   136 (***                                          exhaution rule for type-former ***)
   139 
   137 
   140 (*Proof by induction - needs induction rule for type*)
   138 (*Proof by induction - needs induction rule for type*)
   141 goal Hered.thy "Nat <= HTT";
   139 goal Hered.thy "Nat <= HTT";
   142 by (SIMP_TAC (term_ss addrews [subsetXH]) 1);
   140 by (simp_tac (term_ss addsimps [subsetXH]) 1);
   143 by (safe_tac set_cs);
   141 by (safe_tac set_cs);
   144 be Nat_ind 1;
   142 be Nat_ind 1;
   145 by (ALLGOALS (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD]))));
   143 by (ALLGOALS (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD]))));
   146 val NatF = result();
   144 val NatF = result();
   147 
   145 
   184 by (fast_tac (ccl_cs addIs prems) 1);
   182 by (fast_tac (ccl_cs addIs prems) 1);
   185 by (safe_tac ccl_cs);
   183 by (safe_tac ccl_cs);
   186 bd (poXH RS iffD1) 1;
   184 bd (poXH RS iffD1) 1;
   187 by (safe_tac (set_cs addSEs [HTT_bot RS notE]));
   185 by (safe_tac (set_cs addSEs [HTT_bot RS notE]));
   188 by (REPEAT_SOME (rtac (POgenXH RS iffD2) ORELSE' etac rev_mp));
   186 by (REPEAT_SOME (rtac (POgenXH RS iffD2) ORELSE' etac rev_mp));
   189 by (ALLGOALS (SIMP_TAC (term_ss addrews HTT_rews)));
   187 by (ALLGOALS (simp_tac (term_ss addsimps HTT_rews)));
   190 by (ALLGOALS (fast_tac ccl_cs));
   188 by (ALLGOALS (fast_tac ccl_cs));
   191 val HTT_po_op = result();
   189 val HTT_po_op = result();
   192 
   190 
   193 val prems = goal Hered.thy "[| t : HTT;  t [= u |] ==> t = u";
   191 val prems = goal Hered.thy "[| t : HTT;  t [= u |] ==> t = u";
   194 by (REPEAT (ares_tac (prems @ [conjI RS (eq_iff RS iffD2),HTT_po_op]) 1));
   192 by (REPEAT (ares_tac (prems @ [conjI RS (eq_iff RS iffD2),HTT_po_op]) 1));