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')] |