11 val TC_add: attribute |
11 val TC_add: attribute |
12 val TC_del: attribute |
12 val TC_del: attribute |
13 val typecheck_tac: Proof.context -> tactic |
13 val typecheck_tac: Proof.context -> tactic |
14 val type_solver_tac: Proof.context -> thm list -> int -> tactic |
14 val type_solver_tac: Proof.context -> thm list -> int -> tactic |
15 val type_solver: solver |
15 val type_solver: solver |
16 val setup: theory -> theory |
|
17 end; |
16 end; |
18 |
17 |
19 structure TypeCheck: TYPE_CHECK = |
18 structure TypeCheck: TYPE_CHECK = |
20 struct |
19 struct |
21 |
20 |
107 |
106 |
108 val type_solver = |
107 val type_solver = |
109 Simplifier.mk_solver "ZF typecheck" (fn ctxt => |
108 Simplifier.mk_solver "ZF typecheck" (fn ctxt => |
110 type_solver_tac ctxt (Simplifier.prems_of ctxt)); |
109 type_solver_tac ctxt (Simplifier.prems_of ctxt)); |
111 |
110 |
|
111 val _ = Theory.setup (map_theory_simpset (fn ctxt => ctxt setSolver type_solver)); |
|
112 |
112 |
113 |
113 (* concrete syntax *) |
114 (* concrete syntax *) |
114 |
115 |
115 val typecheck_setup = |
116 val _ = |
116 Method.setup @{binding typecheck} |
117 Theory.setup |
117 (Method.sections |
118 (Attrib.setup @{binding TC} (Attrib.add_del TC_add TC_del) |
118 [Args.add -- Args.colon >> K (Method.modifier TC_add @{here}), |
119 "declaration of type-checking rule" #> |
119 Args.del -- Args.colon >> K (Method.modifier TC_del @{here})] |
120 Method.setup @{binding typecheck} |
120 >> K (fn ctxt => SIMPLE_METHOD (CHANGED (typecheck_tac ctxt)))) |
121 (Method.sections |
121 "ZF type-checking"; |
122 [Args.add -- Args.colon >> K (Method.modifier TC_add @{here}), |
|
123 Args.del -- Args.colon >> K (Method.modifier TC_del @{here})] |
|
124 >> K (fn ctxt => SIMPLE_METHOD (CHANGED (typecheck_tac ctxt)))) |
|
125 "ZF type-checking"); |
122 |
126 |
123 val _ = |
127 val _ = |
124 Outer_Syntax.improper_command @{command_spec "print_tcset"} "print context of ZF typecheck" |
128 Outer_Syntax.improper_command @{command_spec "print_tcset"} "print context of ZF typecheck" |
125 (Scan.succeed (Toplevel.unknown_context o |
129 (Scan.succeed (Toplevel.unknown_context o |
126 Toplevel.keep (print_tcset o Toplevel.context_of))); |
130 Toplevel.keep (print_tcset o Toplevel.context_of))); |
127 |
131 |
128 |
|
129 (* theory setup *) |
|
130 |
|
131 val setup = |
|
132 Attrib.setup @{binding TC} (Attrib.add_del TC_add TC_del) "declaration of type-checking rule" #> |
|
133 typecheck_setup #> |
|
134 map_theory_simpset (fn ctxt => ctxt setSolver type_solver); |
|
135 |
|
136 end; |
132 end; |