src/HOL/HOL.thy
changeset 51021 1cf4faed8b22
parent 50360 628b37b9e8a2
child 51304 0e71a248cacb
equal deleted inserted replaced
51020:242cd1632b0b 51021:1cf4faed8b22
  1263           val {T = xT, ...} = rep_cterm cx;
  1263           val {T = xT, ...} = rep_cterm cx;
  1264           val cf = cterm_of thy f;
  1264           val cf = cterm_of thy f;
  1265           val fx_g = Simplifier.rewrite ss (Thm.apply cf cx);
  1265           val fx_g = Simplifier.rewrite ss (Thm.apply cf cx);
  1266           val (_ $ _ $ g) = prop_of fx_g;
  1266           val (_ $ _ $ g) = prop_of fx_g;
  1267           val g' = abstract_over (x,g);
  1267           val g' = abstract_over (x,g);
       
  1268           val abs_g'= Abs (n,xT,g');
  1268         in (if (g aconv g')
  1269         in (if (g aconv g')
  1269              then
  1270              then
  1270                 let
  1271                 let
  1271                   val rl =
  1272                   val rl =
  1272                     cterm_instantiate [(f_Let_unfold, cf), (x_Let_unfold, cx)] @{thm Let_unfold};
  1273                     cterm_instantiate [(f_Let_unfold, cf), (x_Let_unfold, cx)] @{thm Let_unfold};
  1273                 in SOME (rl OF [fx_g]) end
  1274                 in SOME (rl OF [fx_g]) end
  1274              else if Term.betapply (f, x) aconv g then NONE (*avoid identity conversion*)
  1275              else if (Envir.beta_eta_contract f) aconv (Envir.beta_eta_contract abs_g') then NONE (*avoid identity conversion*)
  1275              else let
  1276              else let
  1276                    val abs_g'= Abs (n,xT,g');
       
  1277                    val g'x = abs_g'$x;
  1277                    val g'x = abs_g'$x;
  1278                    val g_g'x = Thm.symmetric (Thm.beta_conversion false (cterm_of thy g'x));
  1278                    val g_g'x = Thm.symmetric (Thm.beta_conversion false (cterm_of thy g'x));
  1279                    val rl = cterm_instantiate
  1279                    val rl = cterm_instantiate
  1280                              [(f_Let_folded, cterm_of thy f), (x_Let_folded, cx),
  1280                              [(f_Let_folded, cterm_of thy f), (x_Let_folded, cx),
  1281                               (g_Let_folded, cterm_of thy abs_g')]
  1281                               (g_Let_folded, cterm_of thy abs_g')]