170 raise THM ("No data entry for structure key", 0, [key]); |
167 raise THM ("No data entry for structure key", 0, [key]); |
171 val fns = {is_const = is_const phi, dest_const = dest_const phi, |
168 val fns = {is_const = is_const phi, dest_const = dest_const phi, |
172 mk_const = mk_const phi, conv = conv phi}; |
169 mk_const = mk_const phi, conv = conv phi}; |
173 in AList.map_entry Thm.eq_thm key (apsnd (K fns)) data end); |
170 in AList.map_entry Thm.eq_thm key (apsnd (K fns)) data end); |
174 |
171 |
175 |
|
176 (* concrete syntax *) |
|
177 |
|
178 local |
|
179 |
|
180 fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K (); |
|
181 fun keyword2 k1 k2 = Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.colon) >> K (); |
|
182 fun keyword3 k1 k2 k3 = |
|
183 Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.$$$ k3 -- Args.colon) >> K (); |
|
184 |
|
185 val opsN = "ops"; |
|
186 val rulesN = "rules"; |
|
187 |
|
188 val normN = "norm"; |
|
189 val constN = "const"; |
|
190 val delN = "del"; |
|
191 |
|
192 val any_keyword = |
|
193 keyword2 semiringN opsN || keyword2 semiringN rulesN || |
|
194 keyword2 ringN opsN || keyword2 ringN rulesN || |
|
195 keyword2 fieldN opsN || keyword2 fieldN rulesN || |
|
196 keyword2 idomN rulesN || keyword2 idealN rulesN; |
|
197 |
|
198 val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat; |
|
199 val terms = thms >> map Drule.dest_term; |
|
200 |
|
201 fun optional scan = Scan.optional scan []; |
|
202 |
|
203 in |
|
204 |
|
205 val normalizer_setup = |
|
206 Attrib.setup @{binding normalizer} |
|
207 (Scan.lift (Args.$$$ delN >> K del) || |
|
208 ((keyword2 semiringN opsN |-- terms) -- |
|
209 (keyword2 semiringN rulesN |-- thms)) -- |
|
210 (optional (keyword2 ringN opsN |-- terms) -- |
|
211 optional (keyword2 ringN rulesN |-- thms)) -- |
|
212 (optional (keyword2 fieldN opsN |-- terms) -- |
|
213 optional (keyword2 fieldN rulesN |-- thms)) -- |
|
214 optional (keyword2 idomN rulesN |-- thms) -- |
|
215 optional (keyword2 idealN rulesN |-- thms) |
|
216 >> (fn ((((sr, r), f), id), idl) => |
|
217 add {semiring = sr, ring = r, field = f, idom = id, ideal = idl})) |
|
218 "semiring normalizer data"; |
|
219 |
|
220 end; |
|
221 |
172 |
222 open Conv; |
173 open Conv; |
223 |
174 |
224 (* Very basic stuff for terms *) |
175 (* Very basic stuff for terms *) |
225 |
176 |
857 NONE => reflexive tm |
808 NONE => reflexive tm |
858 | SOME res => semiring_normalize_ord_wrapper ctxt res ord tm); |
809 | SOME res => semiring_normalize_ord_wrapper ctxt res ord tm); |
859 |
810 |
860 fun semiring_normalize_conv ctxt = semiring_normalize_ord_conv ctxt simple_cterm_ord; |
811 fun semiring_normalize_conv ctxt = semiring_normalize_ord_conv ctxt simple_cterm_ord; |
861 |
812 |
862 (* theory setup *) |
813 |
863 |
814 (** Isar setup **) |
864 val setup = normalizer_setup |
815 |
|
816 local |
|
817 |
|
818 fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K (); |
|
819 fun keyword2 k1 k2 = Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.colon) >> K (); |
|
820 fun keyword3 k1 k2 k3 = |
|
821 Scan.lift (Args.$$$ k1 -- Args.$$$ k2 -- Args.$$$ k3 -- Args.colon) >> K (); |
|
822 |
|
823 val opsN = "ops"; |
|
824 val rulesN = "rules"; |
|
825 |
|
826 val normN = "norm"; |
|
827 val constN = "const"; |
|
828 val delN = "del"; |
|
829 |
|
830 val any_keyword = |
|
831 keyword2 semiringN opsN || keyword2 semiringN rulesN || |
|
832 keyword2 ringN opsN || keyword2 ringN rulesN || |
|
833 keyword2 fieldN opsN || keyword2 fieldN rulesN || |
|
834 keyword2 idomN rulesN || keyword2 idealN rulesN; |
|
835 |
|
836 val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat; |
|
837 val terms = thms >> map Drule.dest_term; |
|
838 |
|
839 fun optional scan = Scan.optional scan []; |
|
840 |
|
841 in |
|
842 |
|
843 val setup = |
|
844 Attrib.setup @{binding normalizer} |
|
845 (Scan.lift (Args.$$$ delN >> K del) || |
|
846 ((keyword2 semiringN opsN |-- terms) -- |
|
847 (keyword2 semiringN rulesN |-- thms)) -- |
|
848 (optional (keyword2 ringN opsN |-- terms) -- |
|
849 optional (keyword2 ringN rulesN |-- thms)) -- |
|
850 (optional (keyword2 fieldN opsN |-- terms) -- |
|
851 optional (keyword2 fieldN rulesN |-- thms)) -- |
|
852 optional (keyword2 idomN rulesN |-- thms) -- |
|
853 optional (keyword2 idealN rulesN |-- thms) |
|
854 >> (fn ((((sr, r), f), id), idl) => |
|
855 add {semiring = sr, ring = r, field = f, idom = id, ideal = idl})) |
|
856 "semiring normalizer data"; |
865 |
857 |
866 end; |
858 end; |
|
859 |
|
860 end; |