| author | blanchet | 
| Mon, 26 Apr 2010 23:45:32 +0200 | |
| changeset 36406 | 0a2d5138b77c | 
| parent 35762 | af3ff2ba4c54 | 
| child 36543 | 0e7fc5bf38de | 
| permissions | -rw-r--r-- | 
| 35762 | 1 | (* Title: ZF/simpdata.ML | 
| 0 | 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 3 | Copyright 1991 University of Cambridge | |
| 4 | ||
| 35762 | 5 | Rewriting for ZF set theory: specialized extraction of rewrites from theorems. | 
| 0 | 6 | *) | 
| 7 | ||
| 12199 | 8 | (*** New version of mk_rew_rules ***) | 
| 0 | 9 | |
| 10 | (*Should False yield False<->True, or should it solve goals some other way?*) | |
| 11 | ||
| 1036 | 12 | (*Analyse a theorem to atomic rewrite rules*) | 
| 13462 | 13 | fun atomize (conn_pairs, mem_pairs) th = | 
| 1036 | 14 | let fun tryrules pairs t = | 
| 1461 | 15 | case head_of t of | 
| 13462 | 16 | Const(a,_) => | 
| 17325 | 17 | (case AList.lookup (op =) pairs a of | 
| 32952 | 18 | SOME rls => maps (atomize (conn_pairs, mem_pairs)) ([th] RL rls) | 
| 19 | | NONE => [th]) | |
| 1461 | 20 | | _ => [th] | 
| 13462 | 21 | in case concl_of th of | 
| 22 |          Const("Trueprop",_) $ P =>
 | |
| 1461 | 23 | (case P of | 
| 24826 | 24 |                  Const(@{const_name mem},_) $ a $ b => tryrules mem_pairs b
 | 
| 1461 | 25 |                | Const("True",_)         => []
 | 
| 26 |                | Const("False",_)        => []
 | |
| 27 | | A => tryrules conn_pairs A) | |
| 1036 | 28 | | _ => [th] | 
| 29 | end; | |
| 30 | ||
| 0 | 31 | (*Analyse a rigid formula*) | 
| 1036 | 32 | val ZF_conn_pairs = | 
| 24893 | 33 |   [("Ball",     [@{thm bspec}]),
 | 
| 35409 | 34 |    ("All",      [@{thm spec}]),
 | 
| 35 |    ("op -->",   [@{thm mp}]),
 | |
| 36 |    ("op &",     [@{thm conjunct1}, @{thm conjunct2}])];
 | |
| 0 | 37 | |
| 38 | (*Analyse a:b, where b is rigid*) | |
| 13462 | 39 | val ZF_mem_pairs = | 
| 24893 | 40 |   [("Collect",  [@{thm CollectD1}, @{thm CollectD2}]),
 | 
| 41 |    (@{const_name Diff},     [@{thm DiffD1}, @{thm DiffD2}]),
 | |
| 42 |    (@{const_name Int},   [@{thm IntD1}, @{thm IntD2}])];
 | |
| 0 | 43 | |
| 1036 | 44 | val ZF_atomize = atomize (ZF_conn_pairs, ZF_mem_pairs); | 
| 45 | ||
| 17876 | 46 | change_simpset (fn ss => | 
| 47 | ss setmksimps (map mk_eq o ZF_atomize o gen_all) | |
| 24893 | 48 |   addcongs [@{thm if_weak_cong}]);
 | 
| 12209 
09bc6f8456b9
type_solver_tac: use TCSET' to refer to context of goal state (does
 wenzelm parents: 
12199diff
changeset | 49 | |
| 13462 | 50 | local | 
| 11233 | 51 | |
| 24893 | 52 | val unfold_bex_tac = unfold_tac [@{thm Bex_def}];
 | 
| 18324 | 53 | fun prove_bex_tac ss = unfold_bex_tac ss THEN Quantifier1.prove_one_point_ex_tac; | 
| 11233 | 54 | val rearrange_bex = Quantifier1.rearrange_bex prove_bex_tac; | 
| 55 | ||
| 24893 | 56 | val unfold_ball_tac = unfold_tac [@{thm Ball_def}];
 | 
| 18324 | 57 | fun prove_ball_tac ss = unfold_ball_tac ss THEN Quantifier1.prove_one_point_all_tac; | 
| 11233 | 58 | val rearrange_ball = Quantifier1.rearrange_ball prove_ball_tac; | 
| 59 | ||
| 60 | in | |
| 61 | ||
| 26499 
b4db4e165758
functional theory setup -- requires linear access;
 wenzelm parents: 
24893diff
changeset | 62 | val defBEX_regroup = Simplifier.simproc (Theory.deref @{theory_ref})
 | 
| 13462 | 63 | "defined BEX" ["EX x:A. P(x) & Q(x)"] rearrange_bex; | 
| 64 | ||
| 26499 
b4db4e165758
functional theory setup -- requires linear access;
 wenzelm parents: 
24893diff
changeset | 65 | val defBALL_regroup = Simplifier.simproc (Theory.deref @{theory_ref})
 | 
| 13462 | 66 | "defined BALL" ["ALL x:A. P(x) --> Q(x)"] rearrange_ball; | 
| 11233 | 67 | |
| 68 | end; | |
| 69 | ||
| 13462 | 70 | Addsimprocs [defBALL_regroup, defBEX_regroup]; | 
| 71 | ||
| 12199 | 72 | |
| 24893 | 73 | val ZF_ss = @{simpset};
 | 
| 74 |