49 | isTrue _ = false; |
49 | isTrue _ = false; |
50 |
50 |
51 in |
51 in |
52 |
52 |
53 val lazy_conj_simproc = |
53 val lazy_conj_simproc = |
54 Simplifier.simproc_global @{theory HOL} "lazy_conj_simp" ["P & Q"] |
54 Simplifier.make_simproc @{context} "lazy_conj_simp" |
55 (fn ctxt => fn t => |
55 {lhss = [@{term "P & Q"}], |
56 (case t of (Const (@{const_name HOL.conj},_) $ P $ Q) => |
56 proc = fn _ => fn ctxt => fn ct => |
57 let |
57 (case Thm.term_of ct of |
58 val P_P' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt P); |
58 Const (@{const_name HOL.conj},_) $ P $ Q => |
59 val P' = P_P' |> Thm.prop_of |> Logic.dest_equals |> #2; |
59 let |
60 in |
60 val P_P' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt P); |
61 if isFalse P' then SOME (conj1_False OF [P_P']) |
61 val P' = P_P' |> Thm.prop_of |> Logic.dest_equals |> #2; |
62 else |
62 in |
63 let |
63 if isFalse P' then SOME (conj1_False OF [P_P']) |
64 val Q_Q' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt Q); |
64 else |
65 val Q' = Q_Q' |> Thm.prop_of |> Logic.dest_equals |> #2; |
65 let |
66 in |
66 val Q_Q' = Simplifier.rewrite ctxt (Thm.cterm_of ctxt Q); |
67 if isFalse Q' then SOME (conj2_False OF [Q_Q']) |
67 val Q' = Q_Q' |> Thm.prop_of |> Logic.dest_equals |> #2; |
68 else if isTrue P' andalso isTrue Q' then SOME (conj_True OF [P_P', Q_Q']) |
68 in |
69 else if P aconv P' andalso Q aconv Q' then NONE |
69 if isFalse Q' then SOME (conj2_False OF [Q_Q']) |
70 else SOME (conj_cong OF [P_P', Q_Q']) |
70 else if isTrue P' andalso isTrue Q' then SOME (conj_True OF [P_P', Q_Q']) |
71 end |
71 else if P aconv P' andalso Q aconv Q' then NONE |
72 end |
72 else SOME (conj_cong OF [P_P', Q_Q']) |
73 | _ => NONE)); |
73 end |
|
74 end |
|
75 | _ => NONE), |
|
76 identifier = []}; |
74 |
77 |
75 fun string_eq_simp_tac ctxt = |
78 fun string_eq_simp_tac ctxt = |
76 simp_tac (put_simpset HOL_basic_ss ctxt |
79 simp_tac (put_simpset HOL_basic_ss ctxt |
77 addsimps (@{thms list.inject} @ @{thms char.inject} @ @{thms list.distinct} @ @{thms simp_thms}) |
80 addsimps (@{thms list.inject} @ @{thms char.inject} @ @{thms list.distinct} @ @{thms simp_thms}) |
78 addsimprocs [lazy_conj_simproc] |
81 addsimprocs [lazy_conj_simproc] |
104 ); |
107 ); |
105 |
108 |
106 val _ = Theory.setup (Context.theory_map (Data.put (lookup_ss, ex_lookup_ss, false))); |
109 val _ = Theory.setup (Context.theory_map (Data.put (lookup_ss, ex_lookup_ss, false))); |
107 |
110 |
108 val lookup_simproc = |
111 val lookup_simproc = |
109 Simplifier.simproc_global @{theory} "lookup_simp" ["lookup d n (update d' c m v s)"] |
112 Simplifier.make_simproc @{context} "lookup_simp" |
110 (fn ctxt => fn t => |
113 {lhss = [@{term "lookup d n (update d' c m v s)"}], |
111 (case t of (Const (@{const_name StateFun.lookup}, lT) $ destr $ n $ |
114 proc = fn _ => fn ctxt => fn ct => |
|
115 (case Thm.term_of ct of (Const (@{const_name StateFun.lookup}, lT) $ destr $ n $ |
112 (s as Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _)) => |
116 (s as Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _)) => |
113 (let |
117 (let |
114 val (_::_::_::_::sT::_) = binder_types uT; |
118 val (_::_::_::_::sT::_) = binder_types uT; |
115 val mi = maxidx_of_term t; |
119 val mi = Term.maxidx_of_term (Thm.term_of ct); |
116 fun mk_upds (Const (@{const_name StateFun.update}, uT) $ d' $ c $ m $ v $ s) = |
120 fun mk_upds (Const (@{const_name StateFun.update}, uT) $ d' $ c $ m $ v $ s) = |
117 let |
121 let |
118 val (_ :: _ :: _ :: fT :: _ :: _) = binder_types uT; |
122 val (_ :: _ :: _ :: fT :: _ :: _) = binder_types uT; |
119 val vT = domain_type fT; |
123 val vT = domain_type fT; |
120 val (s', cnt) = mk_upds s; |
124 val (s', cnt) = mk_upds s; |
163 |> fold Simplifier.add_cong @{thms block_conj_cong}); |
168 |> fold Simplifier.add_cong @{thms block_conj_cong}); |
164 |
169 |
165 in |
170 in |
166 |
171 |
167 val update_simproc = |
172 val update_simproc = |
168 Simplifier.simproc_global @{theory} "update_simp" ["update d c n v s"] |
173 Simplifier.make_simproc @{context} "update_simp" |
169 (fn ctxt => fn t => |
174 {lhss = [@{term "update d c n v s"}], |
170 (case t of |
175 proc = fn _ => fn ctxt => fn ct => |
|
176 (case Thm.term_of ct of |
171 Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _ => |
177 Const (@{const_name StateFun.update}, uT) $ _ $ _ $ _ $ _ $ _ => |
172 let |
178 let |
173 val (_ :: _ :: _ :: _ :: sT :: _) = binder_types uT; |
179 val (_ :: _ :: _ :: _ :: sT :: _) = binder_types uT; |
174 (*"('v => 'a1) => ('a2 => 'v) => 'n => ('a1 => 'a2) => ('n => 'v) => ('n => 'v)"*) |
180 (*"('v => 'a1) => ('a2 => 'v) => 'n => ('a1 => 'a2) => ('n => 'v) => ('n => 'v)"*) |
175 fun init_seed s = (Bound 0, Bound 0, [("s", sT)], [], false); |
181 fun init_seed s = (Bound 0, Bound 0, [("s", sT)], [], false); |
240 |
246 |
241 val ctxt0 = Config.put simp_depth_limit 100 ctxt; |
247 val ctxt0 = Config.put simp_depth_limit 100 ctxt; |
242 val ctxt1 = put_simpset ss' ctxt0; |
248 val ctxt1 = put_simpset ss' ctxt0; |
243 val ctxt2 = put_simpset (#1 (Data.get (Context.Proof ctxt0))) ctxt0; |
249 val ctxt2 = put_simpset (#1 (Data.get (Context.Proof ctxt0))) ctxt0; |
244 in |
250 in |
245 (case mk_updterm [] t of |
251 (case mk_updterm [] (Thm.term_of ct) of |
246 (trm, trm', vars, _, true) => |
252 (trm, trm', vars, _, true) => |
247 let |
253 let |
248 val eq1 = |
254 val eq1 = |
249 Goal.prove ctxt0 [] [] |
255 Goal.prove ctxt0 [] [] |
250 (Logic.list_all (vars, Logic.mk_equals (trm, trm'))) |
256 (Logic.list_all (vars, Logic.mk_equals (trm, trm'))) |
251 (fn _ => resolve_tac ctxt0 [meta_ext] 1 THEN simp_tac ctxt1 1); |
257 (fn _ => resolve_tac ctxt0 [meta_ext] 1 THEN simp_tac ctxt1 1); |
252 val eq2 = Simplifier.asm_full_rewrite ctxt2 (Thm.dest_equals_rhs (Thm.cprop_of eq1)); |
258 val eq2 = Simplifier.asm_full_rewrite ctxt2 (Thm.dest_equals_rhs (Thm.cprop_of eq1)); |
253 in SOME (Thm.transitive eq1 eq2) end |
259 in SOME (Thm.transitive eq1 eq2) end |
254 | _ => NONE) |
260 | _ => NONE) |
255 end |
261 end |
256 | _ => NONE)); |
262 | _ => NONE), |
|
263 identifier = []}; |
257 |
264 |
258 end; |
265 end; |
259 |
266 |
260 |
267 |
261 local |
268 local |
267 in member (fn (s, (n, _)) => n = s) (more :: flds) sel end; |
274 in member (fn (s, (n, _)) => n = s) (more :: flds) sel end; |
268 |
275 |
269 in |
276 in |
270 |
277 |
271 val ex_lookup_eq_simproc = |
278 val ex_lookup_eq_simproc = |
272 Simplifier.simproc_global @{theory HOL} "ex_lookup_eq_simproc" ["Ex t"] |
279 Simplifier.make_simproc @{context} "ex_lookup_eq_simproc" |
273 (fn ctxt => fn t => |
280 {lhss = [@{term "Ex t"}], |
|
281 proc = fn _ => fn ctxt => fn ct => |
274 let |
282 let |
275 val thy = Proof_Context.theory_of ctxt; |
283 val thy = Proof_Context.theory_of ctxt; |
|
284 val t = Thm.term_of ct; |
276 |
285 |
277 val ex_lookup_ss = #2 (Data.get (Context.Proof ctxt)); |
286 val ex_lookup_ss = #2 (Data.get (Context.Proof ctxt)); |
278 val ctxt' = ctxt |> Config.put simp_depth_limit 100 |> put_simpset ex_lookup_ss; |
287 val ctxt' = ctxt |> Config.put simp_depth_limit 100 |> put_simpset ex_lookup_ss; |
279 fun prove prop = |
288 fun prove prop = |
280 Goal.prove_global thy [] [] prop |
289 Goal.prove_global thy [] [] prop |
314 Logic.mk_equals (Const (@{const_name Ex}, Tex) $ Abs (s, T, eq), @{term True})); |
323 Logic.mk_equals (Const (@{const_name Ex}, Tex) $ Abs (s, T, eq), @{term True})); |
315 val thm = Drule.export_without_context (prove prop); |
324 val thm = Drule.export_without_context (prove prop); |
316 val thm' = if swap then swap_ex_eq OF [thm] else thm |
325 val thm' = if swap then swap_ex_eq OF [thm] else thm |
317 in SOME thm' end handle TERM _ => NONE) |
326 in SOME thm' end handle TERM _ => NONE) |
318 | _ => NONE) |
327 | _ => NONE) |
319 end handle Option.Option => NONE); |
328 end handle Option.Option => NONE, |
|
329 identifier = []}; |
320 |
330 |
321 end; |
331 end; |
322 |
332 |
323 val val_sfx = "V"; |
333 val val_sfx = "V"; |
324 val val_prfx = "StateFun." |
334 val val_prfx = "StateFun." |