equal
deleted
inserted
replaced
16 struct |
16 struct |
17 |
17 |
18 |
18 |
19 (** abstract syntax of structure nat: 0, Suc, + **) |
19 (** abstract syntax of structure nat: 0, Suc, + **) |
20 |
20 |
21 (* mk_sum *) |
21 (* mk_sum, mk_norm_sum *) |
22 |
22 |
|
23 val one = HOLogic.mk_nat 1; |
23 val mk_plus = HOLogic.mk_binop "op +"; |
24 val mk_plus = HOLogic.mk_binop "op +"; |
24 |
25 |
25 fun mk_sum [] = HOLogic.zero |
26 fun mk_sum [] = HOLogic.zero |
26 | mk_sum [t] = t |
27 | mk_sum [t] = t |
27 | mk_sum (t :: ts) = mk_plus (t, mk_sum ts); |
28 | mk_sum (t :: ts) = mk_plus (t, mk_sum ts); |
28 |
29 |
|
30 (*normal form of sums: Suc (... (Suc (a + (b + ...))))*) |
|
31 fun mk_norm_sum ts = |
|
32 let val (ones, sums) = partition (equal one) ts in |
|
33 funpow (length ones) HOLogic.mk_Suc (mk_sum sums) |
|
34 end; |
|
35 |
29 |
36 |
30 (* dest_sum *) |
37 (* dest_sum *) |
31 |
38 |
32 val dest_plus = HOLogic.dest_bin "op +" HOLogic.natT; |
39 val dest_plus = HOLogic.dest_bin "op +" HOLogic.natT; |
33 val one = HOLogic.mk_nat 1; |
|
34 |
40 |
35 fun dest_sum tm = |
41 fun dest_sum tm = |
36 if HOLogic.is_zero tm then [] |
42 if HOLogic.is_zero tm then [] |
37 else |
43 else |
38 (case try HOLogic.dest_Suc tm of |
44 (case try HOLogic.dest_Suc tm of |
70 |
76 |
71 (** cancel common summands **) |
77 (** cancel common summands **) |
72 |
78 |
73 structure Sum = |
79 structure Sum = |
74 struct |
80 struct |
75 val mk_sum = mk_sum; |
81 val mk_sum = mk_norm_sum; |
76 val dest_sum = dest_sum; |
82 val dest_sum = dest_sum; |
77 val prove_conv = prove_conv; |
83 val prove_conv = prove_conv; |
78 val norm_tac = simp_all add_rules THEN simp_all add_ac; |
84 val norm_tac = simp_all add_rules THEN simp_all add_ac; |
79 end; |
85 end; |
80 |
86 |
123 |
129 |
124 (** cancel common factor **) |
130 (** cancel common factor **) |
125 |
131 |
126 structure Factor = |
132 structure Factor = |
127 struct |
133 struct |
128 val mk_sum = mk_sum; |
134 val mk_sum = mk_norm_sum; |
129 val dest_sum = dest_sum; |
135 val dest_sum = dest_sum; |
130 val prove_conv = prove_conv; |
136 val prove_conv = prove_conv; |
131 val norm_tac = simp_all (add_rules @ mult_rules) THEN simp_all add_ac; |
137 val norm_tac = simp_all (add_rules @ mult_rules) THEN simp_all add_ac; |
132 end; |
138 end; |
133 |
139 |