src/HOL/Lambda/Eta.ML
changeset 2116 73bbf2cc7651
parent 2083 b56425a385b9
child 2159 e650a3f6f600
equal deleted inserted replaced
2115:9709f9188549 2116:73bbf2cc7651
    10 *)
    10 *)
    11 
    11 
    12 open Eta;
    12 open Eta;
    13 
    13 
    14 Addsimps eta.intrs;
    14 Addsimps eta.intrs;
    15 Addsimps [imp_disj];
       
    16 
    15 
    17 val eta_cases = map (eta.mk_cases db.simps)
    16 val eta_cases = map (eta.mk_cases db.simps)
    18     ["Fun s -e> z","s @ t -e> u","Var i -e> t"];
    17     ["Fun s -e> z","s @ t -e> u","Var i -e> t"];
    19 
    18 
    20 val beta_cases = map (beta.mk_cases db.simps)
    19 val beta_cases = map (beta.mk_cases db.simps)
    21     ["s @ t -> u","Var i -> t"];
    20     ["s @ t -> u","Var i -> t"];
    22 
    21 
    23 AddIs eta.intrs;
    22 AddIs eta.intrs;
    24 AddSEs (beta_cases@eta_cases);
    23 AddSEs (beta_cases@eta_cases);
    25 
       
    26 section "Arithmetic lemmas";
       
    27 
       
    28 goal HOL.thy "!!P. P ==> P=True";
       
    29 by (fast_tac HOL_cs 1);
       
    30 qed "True_eq";
       
    31 
       
    32 Addsimps [less_not_sym RS True_eq];
       
    33 
       
    34 goal Arith.thy "i < j --> pred i < j";
       
    35 by (nat_ind_tac "j" 1);
       
    36 by (ALLGOALS(asm_simp_tac(!simpset addsimps [less_Suc_eq])));
       
    37 by (nat_ind_tac "j1" 1);
       
    38 by (ALLGOALS Asm_simp_tac);
       
    39 qed_spec_mp "less_imp_pred_less";
       
    40 
       
    41 goal Arith.thy "i<j --> ~ pred j < i";
       
    42 by (nat_ind_tac "j" 1);
       
    43 by (ALLGOALS(asm_simp_tac(!simpset addsimps [less_Suc_eq])));
       
    44 qed_spec_mp "less_imp_not_pred_less";
       
    45 Addsimps [less_imp_not_pred_less];
       
    46 
       
    47 goal Nat.thy "i < j --> j < Suc(Suc i) --> j = Suc i";
       
    48 by (nat_ind_tac "j" 1);
       
    49 by (ALLGOALS Simp_tac);
       
    50 by (simp_tac(!simpset addsimps [less_Suc_eq])1);
       
    51 by (fast_tac (HOL_cs addDs [less_not_sym]) 1);
       
    52 qed_spec_mp "less_interval1";
       
    53 
       
    54 
    24 
    55 section "decr and free";
    25 section "decr and free";
    56 
    26 
    57 goal Eta.thy "!i k. free (lift t k) i = \
    27 goal Eta.thy "!i k. free (lift t k) i = \
    58 \                   (i < k & free t i | k < i & free t (pred i))";
    28 \                   (i < k & free t i | k < i & free t (pred i))";
    59 by (db.induct_tac "t" 1);
    29 by (db.induct_tac "t" 1);
    60 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong])));
    30 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong])));
    61 by (fast_tac HOL_cs 2);
    31 by (fast_tac HOL_cs 2);
    62 by (safe_tac (HOL_cs addSIs [iffI]));
    32 by(simp_tac (!simpset addsimps [pred_def]
    63 by (dtac Suc_mono 1);
    33                       setloop (split_tac [expand_nat_case])) 1);
    64 by (ALLGOALS(Asm_full_simp_tac));
    34 by (safe_tac HOL_cs);
    65 by (dtac less_trans_Suc 1 THEN atac 1);
    35 by (ALLGOALS trans_tac);
    66 by (dtac less_trans_Suc 2 THEN atac 2);
       
    67 by (ALLGOALS(Asm_full_simp_tac));
       
    68 qed "free_lift";
    36 qed "free_lift";
    69 Addsimps [free_lift];
    37 Addsimps [free_lift];
    70 
    38 
    71 goal Eta.thy "!i k t. free (s[t/k]) i = \
    39 goal Eta.thy "!i k t. free (s[t/k]) i = \
    72 \              (free s k & free t i | free s (if i<k then i else Suc i))";
    40 \              (free s k & free t i | free s (if i<k then i else Suc i))";
    73 by (db.induct_tac "s" 1);
    41 by (db.induct_tac "s" 1);
    74 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addsimps
    42 by (Asm_simp_tac 2);
    75 [less_not_refl2,less_not_refl2 RS not_sym])));
    43 by (Fast_tac 2);
    76 by (fast_tac HOL_cs 2);
    44 by (asm_full_simp_tac (addsplit (!simpset)) 2);
    77 by (safe_tac (HOL_cs addSIs [iffI]));
    45 by(simp_tac (!simpset addsimps [pred_def,subst_Var]
    78 by (ALLGOALS(Asm_simp_tac));
    46                       setloop (split_tac [expand_if,expand_nat_case])) 1);
    79 by (fast_tac (HOL_cs addEs [less_imp_not_pred_less RS notE]) 1);
    47 by (safe_tac (HOL_cs addSEs [nat_neqE]));
    80 by (fast_tac (HOL_cs addDs [less_not_sym]) 1);
    48 by (ALLGOALS trans_tac);
    81 by (dtac Suc_mono 1);
       
    82 by (dtac less_interval1 1 THEN atac 1);
       
    83 by (asm_full_simp_tac (!simpset addsimps [eq_sym_conv]) 1);
       
    84 by (dtac less_trans_Suc 1 THEN atac 1);
       
    85 by (Asm_full_simp_tac 1);
       
    86 qed "free_subst";
    49 qed "free_subst";
    87 Addsimps [free_subst];
    50 Addsimps [free_subst];
    88 
    51 
    89 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i";
    52 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i";
    90 by (etac eta.induct 1);
    53 by (etac eta.induct 1);
   246   by (res_inst_tac [("db","t")] db_case_distinction 1);
   209   by (res_inst_tac [("db","t")] db_case_distinction 1);
   247     by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   210     by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   248     by (fast_tac (HOL_cs addDs [less_not_refl2]) 1);
   211     by (fast_tac (HOL_cs addDs [less_not_refl2]) 1);
   249    by (Simp_tac 1);
   212    by (Simp_tac 1);
   250   by (Simp_tac 1);
   213   by (Simp_tac 1);
   251  by (asm_simp_tac (!simpset addsimps [de_Morgan_disj]) 1);
   214  by (Asm_simp_tac 1);
   252  by (etac thin_rl 1);
   215  by (etac thin_rl 1);
   253  by (etac thin_rl 1);
   216  by (etac thin_rl 1);
   254  by (rtac allI 1);
   217  by (rtac allI 1);
   255  by (rtac iffI 1);
   218  by (rtac iffI 1);
   256   by (REPEAT(eresolve_tac [conjE,exE] 1));
   219   by (REPEAT(eresolve_tac [conjE,exE] 1));