src/HOL/Lambda/Eta.ML
changeset 2159 e650a3f6f600
parent 2116 73bbf2cc7651
child 2891 d8f254ad1ab9
equal deleted inserted replaced
2158:77dfe65b5bb3 2159:e650a3f6f600
    11 
    11 
    12 open Eta;
    12 open Eta;
    13 
    13 
    14 Addsimps eta.intrs;
    14 Addsimps eta.intrs;
    15 
    15 
    16 val eta_cases = map (eta.mk_cases db.simps)
    16 val eta_cases = map (eta.mk_cases dB.simps)
    17     ["Fun s -e> z","s @ t -e> u","Var i -e> t"];
    17     ["Abs s -e> z","s @ t -e> u","Var i -e> t"];
    18 
    18 
    19 val beta_cases = map (beta.mk_cases db.simps)
    19 val beta_cases = map (beta.mk_cases dB.simps)
    20     ["s @ t -> u","Var i -> t"];
    20     ["s @ t -> u","Var i -> t"];
    21 
    21 
    22 AddIs eta.intrs;
    22 AddIs eta.intrs;
    23 AddSEs (beta_cases@eta_cases);
    23 AddSEs (beta_cases@eta_cases);
    24 
    24 
    25 section "decr and free";
    25 section "eta, subst and free";
       
    26 
       
    27 goal Eta.thy "!i t u. ~free s i --> s[t/i] = s[u/i]";
       
    28 by (dB.induct_tac "s" 1);
       
    29 by (ALLGOALS(simp_tac (addsplit (!simpset))));
       
    30 by (fast_tac HOL_cs 1);
       
    31 by (fast_tac HOL_cs 1);
       
    32 qed_spec_mp "subst_not_free";
       
    33 Addsimps [subst_not_free RS eqTrueI];
    26 
    34 
    27 goal Eta.thy "!i k. free (lift t k) i = \
    35 goal Eta.thy "!i k. free (lift t k) i = \
    28 \                   (i < k & free t i | k < i & free t (pred i))";
    36 \                   (i < k & free t i | k < i & free t (pred i))";
    29 by (db.induct_tac "t" 1);
    37 by (dB.induct_tac "t" 1);
    30 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong])));
    38 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong])));
    31 by (fast_tac HOL_cs 2);
    39 by (fast_tac HOL_cs 2);
    32 by(simp_tac (!simpset addsimps [pred_def]
    40 by(simp_tac (!simpset addsimps [pred_def]
    33                       setloop (split_tac [expand_nat_case])) 1);
    41                       setloop (split_tac [expand_nat_case])) 1);
    34 by (safe_tac HOL_cs);
    42 by (safe_tac HOL_cs);
    36 qed "free_lift";
    44 qed "free_lift";
    37 Addsimps [free_lift];
    45 Addsimps [free_lift];
    38 
    46 
    39 goal Eta.thy "!i k t. free (s[t/k]) i = \
    47 goal Eta.thy "!i k t. free (s[t/k]) i = \
    40 \              (free s k & free t i | free s (if i<k then i else Suc i))";
    48 \              (free s k & free t i | free s (if i<k then i else Suc i))";
    41 by (db.induct_tac "s" 1);
    49 by (dB.induct_tac "s" 1);
    42 by (Asm_simp_tac 2);
    50 by (Asm_simp_tac 2);
    43 by (Fast_tac 2);
    51 by (Fast_tac 2);
    44 by (asm_full_simp_tac (addsplit (!simpset)) 2);
    52 by (asm_full_simp_tac (addsplit (!simpset)) 2);
    45 by(simp_tac (!simpset addsimps [pred_def,subst_Var]
    53 by(simp_tac (!simpset addsimps [pred_def,subst_Var]
    46                       setloop (split_tac [expand_if,expand_nat_case])) 1);
    54                       setloop (split_tac [expand_if,expand_nat_case])) 1);
    49 qed "free_subst";
    57 qed "free_subst";
    50 Addsimps [free_subst];
    58 Addsimps [free_subst];
    51 
    59 
    52 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i";
    60 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i";
    53 by (etac eta.induct 1);
    61 by (etac eta.induct 1);
    54 by (ALLGOALS(asm_simp_tac (!simpset addsimps [decr_def] addcongs [conj_cong])));
    62 by (ALLGOALS(asm_simp_tac (!simpset addcongs [conj_cong])));
    55 qed_spec_mp "free_eta";
    63 qed_spec_mp "free_eta";
    56 
    64 
    57 goal Eta.thy "!!s. [| s -e> t; ~free s i |] ==> ~free t i";
    65 goal Eta.thy "!!s. [| s -e> t; ~free s i |] ==> ~free t i";
    58 by (asm_simp_tac (!simpset addsimps [free_eta]) 1);
    66 by (asm_simp_tac (!simpset addsimps [free_eta]) 1);
    59 qed "not_free_eta";
    67 qed "not_free_eta";
    60 
    68 
    61 goal Eta.thy "!i t u. ~free s i --> s[t/i] = s[u/i]";
       
    62 by (db.induct_tac "s" 1);
       
    63 by (ALLGOALS(simp_tac (addsplit (!simpset))));
       
    64 by (fast_tac HOL_cs 1);
       
    65 by (fast_tac HOL_cs 1);
       
    66 qed_spec_mp "subst_not_free";
       
    67 
       
    68 goalw Eta.thy [decr_def] "!!s. ~free s i ==> s[t/i] = decr s i";
       
    69 by (etac subst_not_free 1);
       
    70 qed "subst_decr";
       
    71 
       
    72 goal Eta.thy "!!s. s -e> t ==> !u i. s[u/i] -e> t[u/i]";
    69 goal Eta.thy "!!s. s -e> t ==> !u i. s[u/i] -e> t[u/i]";
    73 by (etac eta.induct 1);
    70 by (etac eta.induct 1);
    74 by (ALLGOALS(asm_simp_tac (!simpset addsimps [subst_subst RS sym,decr_def])));
    71 by (ALLGOALS(asm_simp_tac (!simpset addsimps [subst_subst RS sym])));
    75 by (asm_simp_tac (!simpset addsimps [subst_decr]) 1);
       
    76 qed_spec_mp "eta_subst";
    72 qed_spec_mp "eta_subst";
    77 Addsimps [eta_subst];
    73 Addsimps [eta_subst];
    78 
       
    79 goalw Eta.thy [decr_def] "!!s. s -e> t ==> decr s i -e> decr t i";
       
    80 by (etac eta_subst 1);
       
    81 qed "eta_decr";
       
    82 
    74 
    83 section "Confluence of -e>";
    75 section "Confluence of -e>";
    84 
    76 
    85 goalw Eta.thy [square_def,id_def]  "square eta eta (eta^=) (eta^=)";
    77 goalw Eta.thy [square_def,id_def]  "square eta eta (eta^=) (eta^=)";
    86 by (rtac (impI RS allI RS allI) 1);
    78 by (rtac (impI RS allI RS allI) 1);
    87 by (Simp_tac 1);
    79 by (Simp_tac 1);
    88 by (etac eta.induct 1);
    80 by (etac eta.induct 1);
    89 by (best_tac (!claset addSIs [eta_decr]
    81 by (slow_tac (!claset addIs [subst_not_free,eta_subst]
    90                       addIs [free_eta RS iffD1] addss !simpset) 1);
    82                       addIs [free_eta RS iffD1] addss !simpset) 1);
    91 by (slow_tac (!claset) 1);
    83 by (slow_tac (!claset) 1);
    92 by (slow_tac (!claset) 1);
    84 by (slow_tac (!claset) 1);
    93 by (slow_tac (!claset addSIs [eta_decr]
    85 by (slow_tac (!claset addSIs [eta_subst]
    94                      addIs [free_eta RS iffD1]) 1);
    86                            addIs [free_eta RS iffD1]) 1);
    95 val lemma = result();
    87 qed "square_eta";
    96 
    88 
    97 goal Eta.thy "confluent(eta)";
    89 goal Eta.thy "confluent(eta)";
    98 by (rtac (lemma RS square_reflcl_confluent) 1);
    90 by (rtac (square_eta RS square_reflcl_confluent) 1);
    99 qed "eta_confluent";
    91 qed "eta_confluent";
   100 
    92 
   101 section "Congruence rules for -e>>";
    93 section "Congruence rules for -e>>";
   102 
    94 
   103 goal Eta.thy "!!s. s -e>> s' ==> Fun s -e>> Fun s'";
    95 goal Eta.thy "!!s. s -e>> s' ==> Abs s -e>> Abs s'";
   104 by (etac rtrancl_induct 1);
    96 by (etac rtrancl_induct 1);
   105 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl])));
    97 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl])));
   106 qed "rtrancl_eta_Fun";
    98 qed "rtrancl_eta_Abs";
   107 
    99 
   108 goal Eta.thy "!!s. s -e>> s' ==> s @ t -e>> s' @ t";
   100 goal Eta.thy "!!s. s -e>> s' ==> s @ t -e>> s' @ t";
   109 by (etac rtrancl_induct 1);
   101 by (etac rtrancl_induct 1);
   110 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl])));
   102 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl])));
   111 qed "rtrancl_eta_AppL";
   103 qed "rtrancl_eta_AppL";
   125 goal Eta.thy "!!s t. s -> t ==> (!i. free t i --> free s i)";
   117 goal Eta.thy "!!s t. s -> t ==> (!i. free t i --> free s i)";
   126 by (etac beta.induct 1);
   118 by (etac beta.induct 1);
   127 by (ALLGOALS(Asm_full_simp_tac));
   119 by (ALLGOALS(Asm_full_simp_tac));
   128 qed_spec_mp "free_beta";
   120 qed_spec_mp "free_beta";
   129 
   121 
   130 goalw Eta.thy [decr_def] "!!s t. s -> t ==> (!i. decr s i -> decr t i)";
   122 goal Eta.thy "!!s t. s -> t ==> !u i. s[u/i] -> t[u/i]";
   131 by (etac beta.induct 1);
   123 by (etac beta.induct 1);
   132 by (ALLGOALS(asm_full_simp_tac (!simpset addsimps [subst_subst RS sym])));
   124 by (ALLGOALS(asm_full_simp_tac (!simpset addsimps [subst_subst RS sym])));
   133 qed_spec_mp "beta_decr";
   125 qed_spec_mp "beta_subst";
   134 
   126 AddIs [beta_subst];
   135 goalw Eta.thy [decr_def]
   127 
   136   "decr (Var i) k = (if i<=k then Var i else Var(pred i))";
   128 goal Eta.thy "!i. t[Var i/i] = t[Var(i)/Suc i]";
   137 by (simp_tac (addsplit (!simpset) addsimps [le_def]) 1);
   129 by (dB.induct_tac "t" 1);
   138 qed "decr_Var";
   130 by (ALLGOALS (asm_simp_tac (addsplit (!simpset))));
   139 Addsimps [decr_Var];
   131 by(safe_tac (HOL_cs addSEs [nat_neqE]));
   140 
   132 by(ALLGOALS trans_tac);
   141 goalw Eta.thy [decr_def] "decr (s@t) i = (decr s i)@(decr t i)";
   133 qed_spec_mp "subst_Var_Suc";
   142 by (Simp_tac 1);
   134 Addsimps [subst_Var_Suc];
   143 qed "decr_App";
       
   144 Addsimps [decr_App];
       
   145 
       
   146 goalw Eta.thy [decr_def] "decr (Fun s) i = Fun (decr s (Suc i))";
       
   147 by (Simp_tac 1);
       
   148 qed "decr_Fun";
       
   149 Addsimps [decr_Fun];
       
   150 
       
   151 goal Eta.thy "!i. ~free t (Suc i) --> decr t (Suc i) = decr t i";
       
   152 by (db.induct_tac "t" 1);
       
   153 by (ALLGOALS
       
   154     (asm_simp_tac (addsplit (!simpset) addsimps [le_def, less_Suc_eq])));
       
   155 qed_spec_mp "decr_not_free";
       
   156 Addsimps [decr_not_free];
       
   157 
   135 
   158 goal Eta.thy "!!s t. s -e> t ==> (!i. lift s i -e> lift t i)";
   136 goal Eta.thy "!!s t. s -e> t ==> (!i. lift s i -e> lift t i)";
   159 by (etac eta.induct 1);
   137 by (etac eta.induct 1);
   160 by (ALLGOALS(asm_simp_tac (addsplit (!simpset) addsimps [decr_def])));
   138 by (ALLGOALS(asm_simp_tac (addsplit (!simpset))));
   161 by (asm_simp_tac (!simpset addsimps [subst_decr]) 1);
       
   162 qed_spec_mp "eta_lift";
   139 qed_spec_mp "eta_lift";
   163 Addsimps [eta_lift];
   140 Addsimps [eta_lift];
   164 
   141 
   165 goal Eta.thy "!s t i. s -e> t --> u[s/i] -e>> u[t/i]";
   142 goal Eta.thy "!s t i. s -e> t --> u[s/i] -e>> u[t/i]";
   166 by (db.induct_tac "u" 1);
   143 by (dB.induct_tac "u" 1);
   167 by (ALLGOALS(asm_simp_tac (addsplit (!simpset))));
   144 by (ALLGOALS(asm_simp_tac (addsplit (!simpset))));
   168 by (fast_tac (!claset addIs [r_into_rtrancl]) 1);
   145 by (fast_tac (!claset addIs [r_into_rtrancl]) 1);
   169 by (fast_tac (!claset addSIs [rtrancl_eta_App]) 1);
   146 by (fast_tac (!claset addSIs [rtrancl_eta_App]) 1);
   170 by (fast_tac (!claset addSIs [rtrancl_eta_Fun,eta_lift]) 1);
   147 by (fast_tac (!claset addSIs [rtrancl_eta_Abs,eta_lift]) 1);
   171 qed_spec_mp "rtrancl_eta_subst";
   148 qed_spec_mp "rtrancl_eta_subst";
   172 
   149 
   173 goalw Eta.thy [square_def] "square beta eta (eta^*) (beta^=)";
   150 goalw Eta.thy [square_def] "square beta eta (eta^*) (beta^=)";
   174 by (rtac (impI RS allI RS allI) 1);
   151 by (rtac (impI RS allI RS allI) 1);
   175 by (etac beta.induct 1);
   152 by (etac beta.induct 1);
   176 by (strip_tac 1);
   153 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_subst,eta_subst]
   177 by (eresolve_tac eta_cases 1);
   154                       addss !simpset) 1);
   178 by (eresolve_tac eta_cases 1);
       
   179 by (fast_tac (!claset addss (!simpset addsimps [subst_decr])) 1);
       
   180 by (slow_tac (!claset addIs [r_into_rtrancl,eta_subst]) 1);
       
   181 by (slow_tac (!claset addIs [rtrancl_eta_subst]) 1);
       
   182 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppL]) 1);
   155 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppL]) 1);
   183 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppR]) 1);
   156 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppR]) 1);
   184 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_Fun,free_beta,beta_decr]
   157 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_Abs,free_beta]
   185                   addss (!simpset addsimps[subst_decr,symmetric decr_def])) 1);
   158                       addss !simpset) 1);
   186 qed "square_beta_eta";
   159 qed "square_beta_eta";
   187 
   160 
   188 goal Eta.thy "confluent(beta Un eta)";
   161 goal Eta.thy "confluent(beta Un eta)";
   189 by (REPEAT(ares_tac [square_rtrancl_reflcl_commute,confluent_Un,
   162 by (REPEAT(ares_tac [square_rtrancl_reflcl_commute,confluent_Un,
   190                     beta_confluent,eta_confluent,square_beta_eta] 1));
   163                     beta_confluent,eta_confluent,square_beta_eta] 1));
   191 qed "confluent_beta_eta";
   164 qed "confluent_beta_eta";
   192 
   165 
   193 
   166 section "Implicit definition of -e>: Abs(lift s 0 @ Var 0) -e> s";
   194 section "Implicit definition of -e>: Fun(lift s 0 @ Var 0) -e> s";
       
   195 
   167 
   196 goal Eta.thy "!i. (~free s i) = (? t. s = lift t i)";
   168 goal Eta.thy "!i. (~free s i) = (? t. s = lift t i)";
   197 by (db.induct_tac "s" 1);
   169 by (dB.induct_tac "s" 1);
   198   by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   170   by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   199   by (SELECT_GOAL(safe_tac HOL_cs)1);
   171   by (SELECT_GOAL(safe_tac HOL_cs)1);
   200    by (res_inst_tac [("m","nat"),("n","i")] nat_less_cases 1);
   172    by(etac nat_neqE 1);
   201      by (res_inst_tac [("x","Var nat")] exI 1);
   173     by (res_inst_tac [("x","Var nat")] exI 1);
   202      by (Asm_simp_tac 1);
   174     by (Asm_simp_tac 1);
   203     by (fast_tac HOL_cs 1);
       
   204    by (res_inst_tac [("x","Var(pred nat)")] exI 1);
   175    by (res_inst_tac [("x","Var(pred nat)")] exI 1);
   205    by (Asm_simp_tac 1);
   176    by (Asm_simp_tac 1);
   206   by (rtac notE 1);
   177   by (rtac notE 1);
   207    by (assume_tac 2);
   178    by (assume_tac 2);
   208   by (etac thin_rl 1);
   179   by (etac thin_rl 1);
   209   by (res_inst_tac [("db","t")] db_case_distinction 1);
   180   by (res_inst_tac [("dB","t")] dB_case_distinction 1);
   210     by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   181     by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   211     by (fast_tac (HOL_cs addDs [less_not_refl2]) 1);
   182     by (fast_tac (HOL_cs addDs [less_not_refl2]) 1);
   212    by (Simp_tac 1);
   183    by (Simp_tac 1);
   213   by (Simp_tac 1);
   184   by (Simp_tac 1);
   214  by (Asm_simp_tac 1);
   185  by (Asm_simp_tac 1);
   220   by (rename_tac "u1 u2" 1);
   191   by (rename_tac "u1 u2" 1);
   221   by (res_inst_tac [("x","u1@u2")] exI 1);
   192   by (res_inst_tac [("x","u1@u2")] exI 1);
   222   by (Asm_simp_tac 1);
   193   by (Asm_simp_tac 1);
   223  by (etac exE 1);
   194  by (etac exE 1);
   224  by (etac rev_mp 1);
   195  by (etac rev_mp 1);
   225  by (res_inst_tac [("db","t")] db_case_distinction 1);
   196  by (res_inst_tac [("dB","t")] dB_case_distinction 1);
   226    by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   197    by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   227   by (Simp_tac 1);
   198   by (Simp_tac 1);
   228   by (fast_tac HOL_cs 1);
   199   by (fast_tac HOL_cs 1);
   229  by (Simp_tac 1);
   200  by (Simp_tac 1);
   230 by (Asm_simp_tac 1);
   201 by (Asm_simp_tac 1);
   231 by (etac thin_rl 1);
   202 by (etac thin_rl 1);
   232 by (rtac allI 1);
   203 by (rtac allI 1);
   233 by (rtac iffI 1);
   204 by (rtac iffI 1);
   234  by (etac exE 1);
   205  by (etac exE 1);
   235  by (res_inst_tac [("x","Fun t")] exI 1);
   206  by (res_inst_tac [("x","Abs t")] exI 1);
   236  by (Asm_simp_tac 1);
   207  by (Asm_simp_tac 1);
   237 by (etac exE 1);
   208 by (etac exE 1);
   238 by (etac rev_mp 1);
   209 by (etac rev_mp 1);
   239 by (res_inst_tac [("db","t")] db_case_distinction 1);
   210 by (res_inst_tac [("dB","t")] dB_case_distinction 1);
   240   by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   211   by (simp_tac (!simpset setloop (split_tac [expand_if])) 1);
   241  by (Simp_tac 1);
   212  by (Simp_tac 1);
   242 by (Simp_tac 1);
   213 by (Simp_tac 1);
   243 by (fast_tac HOL_cs 1);
   214 by (fast_tac HOL_cs 1);
   244 qed_spec_mp "not_free_iff_lifted";
   215 qed_spec_mp "not_free_iff_lifted";
   245 
   216 
   246 goalw Eta.thy [decr_def]
   217 goal Eta.thy "(!s u. (~free s 0) --> R(Abs(s @ Var 0))(s[u/0])) = \
   247  "(!s. (~free s 0) --> R(Fun(s @ Var 0))(decr s 0)) = \
   218 \             (!s. R(Abs(lift s 0 @ Var 0))(s))";
   248 \ (!s. R(Fun(lift s 0 @ Var 0))(s))";
   219 by (fast_tac (HOL_cs addss (!simpset addsimps [not_free_iff_lifted])) 1);
   249 by (fast_tac (HOL_cs addss (!simpset addsimps [lemma,not_free_iff_lifted])) 1);
       
   250 qed "explicit_is_implicit";
   220 qed "explicit_is_implicit";