182 |
182 |
183 (** outer syntax **) |
183 (** outer syntax **) |
184 |
184 |
185 local structure P = OuterParse and K = OuterKeyword in |
185 local structure P = OuterParse and K = OuterKeyword in |
186 |
186 |
187 (* copied from HOL/Tools/typedef_package.ML *) |
187 (* cf. HOL/Tools/typedef_package.ML *) |
188 val typedef_proof_decl = |
188 val typedef_proof_decl = |
189 Scan.optional (P.$$$ "(" |-- |
189 Scan.optional (P.$$$ "(" |-- |
190 ((P.$$$ "open" >> K false) -- Scan.option P.name || P.name >> (fn s => (true, SOME s))) |
190 ((P.$$$ "open" >> K false) -- Scan.option P.name || P.name >> (fn s => (true, SOME s))) |
191 --| P.$$$ ")") (true, NONE) -- |
191 --| P.$$$ ")") (true, NONE) -- |
192 (P.type_args -- P.name) -- P.opt_infix -- (P.$$$ "=" |-- P.term) -- |
192 (P.type_args -- P.name) -- P.opt_infix -- (P.$$$ "=" |-- P.term) -- |
194 |
194 |
195 fun mk_pcpodef_proof pcpo ((((((def, opt_name), (vs, t)), mx), A), morphs)) = |
195 fun mk_pcpodef_proof pcpo ((((((def, opt_name), (vs, t)), mx), A), morphs)) = |
196 (if pcpo then pcpodef_proof else cpodef_proof) |
196 (if pcpo then pcpodef_proof else cpodef_proof) |
197 ((def, the_default (Syntax.type_name t mx) opt_name), (t, vs, mx), A, morphs); |
197 ((def, the_default (Syntax.type_name t mx) opt_name), (t, vs, mx), A, morphs); |
198 |
198 |
199 val pcpodefP = |
199 val _ = |
200 OuterSyntax.command "pcpodef" "HOLCF type definition (requires admissibility proof)" K.thy_goal |
200 OuterSyntax.command "pcpodef" "HOLCF type definition (requires admissibility proof)" K.thy_goal |
201 (typedef_proof_decl >> |
201 (typedef_proof_decl >> |
202 (Toplevel.print oo (Toplevel.theory_to_proof o mk_pcpodef_proof true))); |
202 (Toplevel.print oo (Toplevel.theory_to_proof o mk_pcpodef_proof true))); |
203 |
203 |
204 val cpodefP = |
204 val _ = |
205 OuterSyntax.command "cpodef" "HOLCF type definition (requires admissibility proof)" K.thy_goal |
205 OuterSyntax.command "cpodef" "HOLCF type definition (requires admissibility proof)" K.thy_goal |
206 (typedef_proof_decl >> |
206 (typedef_proof_decl >> |
207 (Toplevel.print oo (Toplevel.theory_to_proof o mk_pcpodef_proof false))); |
207 (Toplevel.print oo (Toplevel.theory_to_proof o mk_pcpodef_proof false))); |
208 |
208 |
209 val _ = OuterSyntax.add_parsers [pcpodefP, cpodefP]; |
|
210 |
|
211 end; |
209 end; |
212 |
210 |
213 end; |
211 end; |