src/ZF/Tools/typechk.ML
changeset 58828 6d076fdd933d
parent 58048 aa6296d09e0e
child 58838 59203adfc33f
equal deleted inserted replaced
58826:2ed2eaabe3df 58828:6d076fdd933d
    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;