check alpha equality after applying beta and eta conversion in let-simproc, otherwise the simplifier may loop
authorhoelzl
Wed, 06 Feb 2013 17:18:01 +0100
changeset 51021 1cf4faed8b22
parent 51020 242cd1632b0b
child 51022 78de6c7e8a58
check alpha equality after applying beta and eta conversion in let-simproc, otherwise the simplifier may loop
src/HOL/HOL.thy
--- a/src/HOL/HOL.thy	Tue Feb 05 17:19:13 2013 +0100
+++ b/src/HOL/HOL.thy	Wed Feb 06 17:18:01 2013 +0100
@@ -1265,15 +1265,15 @@
           val fx_g = Simplifier.rewrite ss (Thm.apply cf cx);
           val (_ $ _ $ g) = prop_of fx_g;
           val g' = abstract_over (x,g);
+          val abs_g'= Abs (n,xT,g');
         in (if (g aconv g')
              then
                 let
                   val rl =
                     cterm_instantiate [(f_Let_unfold, cf), (x_Let_unfold, cx)] @{thm Let_unfold};
                 in SOME (rl OF [fx_g]) end
-             else if Term.betapply (f, x) aconv g then NONE (*avoid identity conversion*)
+             else if (Envir.beta_eta_contract f) aconv (Envir.beta_eta_contract abs_g') then NONE (*avoid identity conversion*)
              else let
-                   val abs_g'= Abs (n,xT,g');
                    val g'x = abs_g'$x;
                    val g_g'x = Thm.symmetric (Thm.beta_conversion false (cterm_of thy g'x));
                    val rl = cterm_instantiate