src/HOL/simpdata.ML
changeset 20014 729a45534001
parent 19472 896eb8056e97
child 20046 9c8909fc5865
equal deleted inserted replaced
20013:57505678692d 20014:729a45534001
   174 
   174 
   175 local
   175 local
   176 val Let_folded = thm "Let_folded";
   176 val Let_folded = thm "Let_folded";
   177 val Let_unfold = thm "Let_unfold";
   177 val Let_unfold = thm "Let_unfold";
   178 
   178 
   179 val f_Let_unfold = 
   179 val (f_Let_unfold,x_Let_unfold) = 
   180       let val [(_$(f$_)$_)] = prems_of Let_unfold in cterm_of (sign_of (the_context ())) f end
   180       let val [(_$(f$x)$_)] = prems_of Let_unfold 
   181 val f_Let_folded = 
   181       in (cterm_of (sign_of (the_context ())) f,cterm_of (sign_of (the_context ())) x) end
   182       let val [(_$(f$_)$_)] = prems_of Let_folded in cterm_of (sign_of (the_context ())) f end;
   182 val (f_Let_folded,x_Let_folded) = 
       
   183       let val [(_$(f$x)$_)] = prems_of Let_folded 
       
   184       in (cterm_of (sign_of (the_context ())) f, cterm_of (sign_of (the_context ())) x) end;
   183 val g_Let_folded = 
   185 val g_Let_folded = 
   184       let val [(_$_$(g$_))] = prems_of Let_folded in cterm_of (sign_of (the_context ())) g end;
   186       let val [(_$_$(g$_))] = prems_of Let_folded in cterm_of (sign_of (the_context ())) g end;
   185 in
   187 in
   186 val let_simproc =
   188 val let_simproc =
   187   Simplifier.simproc (Theory.sign_of (the_context ())) "let_simp" ["Let x f"] 
   189   Simplifier.simproc (Theory.sign_of (the_context ())) "let_simp" ["Let x f"] 
   188    (fn sg => fn ss => fn t =>
   190    (fn sg => fn ss => fn t =>
       
   191 (* FIXME: very slow (replace t by t' in case below)
       
   192      let val ctxt = Simplifier.the_context ss;
       
   193          val ([t'],ctxt') = Variable.import_terms false [t] ctxt;
       
   194      in Option.map (hd o Variable.export ctxt' ctxt o single)
       
   195 *)
   189       (case t of (Const ("Let",_)$x$f) => (* x and f are already in normal form *)
   196       (case t of (Const ("Let",_)$x$f) => (* x and f are already in normal form *)
   190          if not (!use_let_simproc) then NONE
   197          if not (!use_let_simproc) then NONE
   191          else if is_Free x orelse is_Bound x orelse is_Const x 
   198          else if is_Free x orelse is_Bound x orelse is_Const x 
   192          then SOME Let_def  
   199          then SOME Let_def  
   193          else
   200          else
   200              val (_$_$g) = prop_of fx_g;
   207              val (_$_$g) = prop_of fx_g;
   201              val g' = abstract_over (x,g);
   208              val g' = abstract_over (x,g);
   202            in (if (g aconv g') 
   209            in (if (g aconv g') 
   203                then
   210                then
   204                   let
   211                   let
   205                     val rl = cterm_instantiate [(f_Let_unfold,cf)] Let_unfold;
   212                     val rl = cterm_instantiate [(f_Let_unfold,cf),(x_Let_unfold,cx)] Let_unfold;
   206                   in SOME (rl OF [fx_g]) end 
   213                   in SOME (rl OF [fx_g]) end 
   207                else if Term.betapply (f,x) aconv g then NONE (*avoid identity conversion*)
   214                else if Term.betapply (f,x) aconv g then NONE (*avoid identity conversion*)
   208                else let 
   215                else let 
   209                      val abs_g'= Abs (n,xT,g');
   216                      val abs_g'= Abs (n,xT,g');
   210                      val g'x = abs_g'$x;
   217                      val g'x = abs_g'$x;
   211                      val g_g'x = symmetric (beta_conversion false (cterm_of sg g'x));
   218                      val g_g'x = symmetric (beta_conversion false (cterm_of sg g'x));
   212                      val rl = cterm_instantiate
   219                      val rl = cterm_instantiate
   213                                [(f_Let_folded,cterm_of sg f),
   220                                [(f_Let_folded,cterm_of sg f),(x_Let_folded,cx),
   214                                 (g_Let_folded,cterm_of sg abs_g')]
   221                                 (g_Let_folded,cterm_of sg abs_g')]
   215                                Let_folded; 
   222                                Let_folded; 
   216                    in SOME (rl OF [transitive fx_g g_g'x]) end)
   223                    in SOME (rl OF [transitive fx_g g_g'x]) 
       
   224                    end)
   217            end
   225            end
   218         | _ => NONE))
   226         | _ => NONE)
       
   227  (*  FIXME: continue
       
   228   end*)
       
   229  )
   219 end
   230 end
   220 
   231 
   221 (*** Case splitting ***)
   232 (*** Case splitting ***)
   222 
   233 
   223 (*Make meta-equalities.  The operator below is Trueprop*)
   234 (*Make meta-equalities.  The operator below is Trueprop*)