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*) |