author | fleury <Mathias.Fleury@mpi-inf.mpg.de> |
Sun, 18 Sep 2016 11:31:19 +0200 | |
changeset 63908 | ca41b6670904 |
parent 63907 | 36bac3d245d9 |
permissions | -rw-r--r-- |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
1 |
(* Author: Mathias Fleury, MPII |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
2 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
3 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
4 |
Datatructure for the cancelation simprocs for multisets, based on Larry Paulson's simprocs for |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
5 |
natural numbers and numerals. |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
6 |
*) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
7 |
signature MULTISET_CANCEL_COMMON = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
8 |
sig |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
9 |
val mk_sum : typ -> term list -> term |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
10 |
val dest_sum : term -> term list |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
11 |
val mk_coeff : int * term -> term |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
12 |
val dest_coeff : term -> int * term |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
13 |
val find_first_coeff : term -> term list -> int * term list |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
14 |
val trans_tac : Proof.context -> thm option -> tactic |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
15 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
16 |
val norm_ss1 : simpset |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
17 |
val norm_ss2: simpset |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
18 |
val norm_tac: Proof.context -> tactic |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
19 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
20 |
val numeral_simp_tac : Proof.context -> tactic |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
21 |
val simplify_meta_eq : Proof.context -> thm -> thm |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
22 |
val prove_conv : tactic list -> Proof.context -> thm list -> term * term -> thm option |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
23 |
end; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
24 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
25 |
structure Multiset_Cancel_Common : MULTISET_CANCEL_COMMON = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
26 |
struct |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
27 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
28 |
(*** Utilities ***) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
29 |
|
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
30 |
(*No reordering of the arguments.*) |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
31 |
fun fast_mk_repeat_mset (n, mset) = |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
32 |
let val T = fastype_of mset in |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
33 |
Const (@{const_name "repeat_mset"}, @{typ nat} --> T --> T) $ n $ mset |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
34 |
end; |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
35 |
|
63850
32690ddf614f
more robust multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63793
diff
changeset
|
36 |
(*repeat_mset is not symmetric, unlike multiplication over natural numbers.*) |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
37 |
fun mk_repeat_mset (t, u) = |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
38 |
(if fastype_of t = @{typ nat} then (t, u) else (u, t)) |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
39 |
|> fast_mk_repeat_mset; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
40 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
41 |
(*Maps n to #n for n = 1, 2*) |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
42 |
val numeral_syms = |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
43 |
map (fn th => th RS sym) @{thms numeral_One numeral_2_eq_2 numeral_1_eq_Suc_0}; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
44 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
45 |
val numeral_sym_ss = |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
46 |
simpset_of (put_simpset HOL_basic_ss @{context} addsimps numeral_syms); |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
47 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
48 |
fun mk_number 1 = HOLogic.numeral_const HOLogic.natT $ HOLogic.one_const |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
49 |
| mk_number n = HOLogic.mk_number HOLogic.natT n; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
50 |
fun dest_number t = Int.max (0, snd (HOLogic.dest_number t)); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
51 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
52 |
fun find_first_numeral past (t::terms) = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
53 |
((dest_number t, t, rev past @ terms) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
54 |
handle TERM _ => find_first_numeral (t::past) terms) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
55 |
| find_first_numeral _ [] = raise TERM("find_first_numeral", []); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
56 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
57 |
fun typed_zero T = Const (@{const_name "Groups.zero"}, T); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
58 |
val mk_plus = HOLogic.mk_binop @{const_name Groups.plus}; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
59 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
60 |
(*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero.*) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
61 |
fun mk_sum T [] = typed_zero T |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
62 |
| mk_sum _ [t,u] = mk_plus (t, u) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
63 |
| mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
64 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
65 |
val dest_plus = HOLogic.dest_bin @{const_name Groups.plus} dummyT; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
66 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
67 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
68 |
(*** Other simproc items ***) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
69 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
70 |
val bin_simps = |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
71 |
(@{thm numeral_One} RS sym) :: |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
72 |
@{thms add_numeral_left diff_nat_numeral diff_0_eq_0 mult_numeral_left(1) |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
73 |
if_True if_False not_False_eq_True |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
74 |
nat_0 nat_numeral nat_neg_numeral add_mset_commute repeat_mset.simps(1) |
63908
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
75 |
replicate_mset_0 repeat_mset_empty |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
76 |
arith_simps rel_simps}; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
77 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
78 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
79 |
(*** CancelNumerals simprocs ***) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
80 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
81 |
val one = mk_number 1; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
82 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
83 |
fun mk_prod [] = one |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
84 |
| mk_prod [t] = t |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
85 |
| mk_prod (t :: ts) = if t = one then mk_prod ts else mk_repeat_mset (t, mk_prod ts); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
86 |
|
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
87 |
val dest_repeat_mset = HOLogic.dest_bin @{const_name repeat_mset} dummyT; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
88 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
89 |
fun dest_repeat_msets t = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
90 |
let val (t,u) = dest_repeat_mset t in |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
91 |
t :: dest_repeat_msets u end |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
92 |
handle TERM _ => [t]; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
93 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
94 |
fun mk_coeff (k,t) = mk_repeat_mset (mk_number k, t); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
95 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
96 |
(*Express t as a product of (possibly) a numeral with other factors, sorted*) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
97 |
fun dest_coeff t = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
98 |
let |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
99 |
val ts = sort Term_Ord.term_ord (dest_repeat_msets t); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
100 |
val (n, _, ts') = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
101 |
find_first_numeral [] ts |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
102 |
handle TERM _ => (1, one, ts); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
103 |
in (n, mk_prod ts') end; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
104 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
105 |
(*Find first coefficient-term THAT MATCHES u*) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
106 |
fun find_first_coeff _ _ [] = raise TERM("find_first_coeff", []) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
107 |
| find_first_coeff past u (t::terms) = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
108 |
let val (n,u') = dest_coeff t in |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
109 |
if u aconv u' then (n, rev past @ terms) else find_first_coeff (t::past) u terms end |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
110 |
handle TERM _ => find_first_coeff (t::past) u terms; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
111 |
|
63908
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
112 |
(* |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
113 |
Split up a sum into the list of its constituent terms, on the way replace: |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
114 |
* the \<open>add_mset a C\<close> by \<open>add_mset a {#}\<close> and \<open>C\<close>, iff C was not already the empty set; |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
115 |
* the \<open>replicate_mset n a\<close> by \<open>repeat_mset n {#a#}\<close>. |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
116 |
*) |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
117 |
fun dest_add_mset (Const (@{const_name add_mset}, T) $ a $ |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
118 |
Const (@{const_name "Groups.zero_class.zero"}, U), ts) = |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
119 |
Const (@{const_name add_mset}, T) $ a $ typed_zero U :: ts |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
120 |
| dest_add_mset (Const (@{const_name add_mset}, T) $ a $ mset, ts) = |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
121 |
dest_add_mset (mset, Const (@{const_name add_mset}, T) $ a $ |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
122 |
typed_zero (fastype_of mset) :: ts) |
63908
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
123 |
| dest_add_mset (Const (@{const_name replicate_mset}, |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
124 |
Type (_, [_, Type (_, [T, U])])) $ n $ a, ts) = |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
125 |
let val single_a = Const (@{const_name add_mset}, T --> U --> U) $ a $ typed_zero U in |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
126 |
fast_mk_repeat_mset (n, single_a) :: ts end |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
127 |
| dest_add_mset (t, ts) = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
128 |
let val (t1,t2) = dest_plus t in |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
129 |
dest_add_mset (t1, dest_add_mset (t2, ts)) end |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
130 |
handle TERM _ => t :: ts; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
131 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
132 |
fun dest_add_mset_sum t = dest_add_mset (t, []); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
133 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
134 |
val rename_numerals = simplify (put_simpset numeral_sym_ss @{context}) o Thm.transfer @{theory}; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
135 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
136 |
(*Simplify \<open>repeat_mset (Suc 0) n\<close>, \<open>n+0\<close>, and \<open>0+n\<close> to \<open>n\<close>*) |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
137 |
val add_0s = map rename_numerals @{thms Groups.add_0 Groups.add_0_right}; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
138 |
val mult_1s = map rename_numerals @{thms repeat_mset.simps(2)[of 0]}; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
139 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
140 |
|
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
141 |
(*And these help the simproc return False when appropriate. We use the same list as the |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
142 |
simproc for natural numbers, but adapted to multisets.*) |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
143 |
val contra_rules = |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
144 |
@{thms union_mset_add_mset_left union_mset_add_mset_right |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
145 |
empty_not_add_mset add_mset_not_empty subset_mset.le_zero_eq le_zero_eq}; |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
146 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
147 |
val simplify_meta_eq = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
148 |
Arith_Data.simplify_meta_eq |
63907
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
149 |
(@{thms numeral_1_eq_Suc_0 Nat.add_0_right |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
150 |
mult_0 mult_0_right mult_1 mult_1_right |
36bac3d245d9
tuning multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63850
diff
changeset
|
151 |
Groups.add_0 repeat_mset.simps(1) monoid_add_class.add_0_right} @ |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
152 |
contra_rules); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
153 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
154 |
val mk_sum = mk_sum; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
155 |
val dest_sum = dest_add_mset_sum; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
156 |
val mk_coeff = mk_coeff; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
157 |
val dest_coeff = dest_coeff; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
158 |
val find_first_coeff = find_first_coeff []; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
159 |
val trans_tac = Numeral_Simprocs.trans_tac; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
160 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
161 |
val norm_ss1 = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
162 |
simpset_of (put_simpset Numeral_Simprocs.num_ss @{context} addsimps |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
163 |
numeral_syms @ add_0s @ mult_1s @ @{thms ac_simps}); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
164 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
165 |
val norm_ss2 = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
166 |
simpset_of (put_simpset Numeral_Simprocs.num_ss @{context} addsimps |
63908
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
167 |
bin_simps @ |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
168 |
@{thms union_mset_add_mset_left union_mset_add_mset_right |
ca41b6670904
support replicate_mset in multiset simproc
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
63907
diff
changeset
|
169 |
repeat_mset_replicate_mset ac_simps}); |
63793
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
170 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
171 |
fun norm_tac ctxt = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
172 |
ALLGOALS (simp_tac (put_simpset norm_ss1 ctxt)) |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
173 |
THEN ALLGOALS (simp_tac (put_simpset norm_ss2 ctxt)); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
174 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
175 |
val mset_simps_ss = |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
176 |
simpset_of (put_simpset HOL_basic_ss @{context} addsimps bin_simps); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
177 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
178 |
fun numeral_simp_tac ctxt = ALLGOALS (simp_tac (put_simpset mset_simps_ss ctxt)); |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
179 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
180 |
val simplify_meta_eq = simplify_meta_eq; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
181 |
val prove_conv = Arith_Data.prove_conv; |
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
182 |
|
e68a0b651eb5
add_mset constructor in multisets
fleury <Mathias.Fleury@mpi-inf.mpg.de>
parents:
diff
changeset
|
183 |
end |