src/HOL/Orderings.thy
changeset 58826 2ed2eaabe3df
parent 57447 87429bdecad5
child 58889 5b7a9633cfa8
equal deleted inserted replaced
58825:2065f49da190 58826:2ed2eaabe3df
   398 ML {*
   398 ML {*
   399 signature ORDERS =
   399 signature ORDERS =
   400 sig
   400 sig
   401   val print_structures: Proof.context -> unit
   401   val print_structures: Proof.context -> unit
   402   val order_tac: Proof.context -> thm list -> int -> tactic
   402   val order_tac: Proof.context -> thm list -> int -> tactic
       
   403   val add_struct: string * term list -> string -> attribute
       
   404   val del_struct: string * term list -> attribute
   403 end;
   405 end;
   404 
   406 
   405 structure Orders: ORDERS =
   407 structure Orders: ORDERS =
   406 struct
   408 struct
   407 
   409 
   481   FIRST' (map (fn s => CHANGED o struct_tac s ctxt facts) (Data.get (Context.Proof ctxt)));
   483   FIRST' (map (fn s => CHANGED o struct_tac s ctxt facts) (Data.get (Context.Proof ctxt)));
   482 
   484 
   483 
   485 
   484 (* attributes *)
   486 (* attributes *)
   485 
   487 
   486 fun add_struct_thm s tag =
   488 fun add_struct s tag =
   487   Thm.declaration_attribute
   489   Thm.declaration_attribute
   488     (fn thm => Data.map (AList.map_default struct_eq (s, Order_Tac.empty TrueI) (Order_Tac.update tag thm)));
   490     (fn thm => Data.map (AList.map_default struct_eq (s, Order_Tac.empty TrueI) (Order_Tac.update tag thm)));
   489 fun del_struct s =
   491 fun del_struct s =
   490   Thm.declaration_attribute
   492   Thm.declaration_attribute
   491     (fn _ => Data.map (AList.delete struct_eq s));
   493     (fn _ => Data.map (AList.delete struct_eq s));
   492 
   494 
   493 val _ =
       
   494   Theory.setup
       
   495     (Attrib.setup @{binding order}
       
   496       (Scan.lift ((Args.add -- Args.name >> (fn (_, s) => SOME s) || Args.del >> K NONE) --|
       
   497         Args.colon (* FIXME || Scan.succeed true *) ) -- Scan.lift Args.name --
       
   498         Scan.repeat Args.term
       
   499         >> (fn ((SOME tag, n), ts) => add_struct_thm (n, ts) tag
       
   500              | ((NONE, n), ts) => del_struct (n, ts)))
       
   501       "theorems controlling transitivity reasoner");
       
   502 
       
   503 end;
   495 end;
   504 *}
   496 *}
       
   497 
       
   498 attribute_setup order = {*
       
   499   Scan.lift ((Args.add -- Args.name >> (fn (_, s) => SOME s) || Args.del >> K NONE) --|
       
   500     Args.colon (* FIXME || Scan.succeed true *) ) -- Scan.lift Args.name --
       
   501     Scan.repeat Args.term
       
   502     >> (fn ((SOME tag, n), ts) => Orders.add_struct (n, ts) tag
       
   503          | ((NONE, n), ts) => Orders.del_struct (n, ts))
       
   504 *} "theorems controlling transitivity reasoner"
   505 
   505 
   506 method_setup order = {*
   506 method_setup order = {*
   507   Scan.succeed (fn ctxt => SIMPLE_METHOD' (Orders.order_tac ctxt []))
   507   Scan.succeed (fn ctxt => SIMPLE_METHOD' (Orders.order_tac ctxt []))
   508 *} "transitivity reasoner"
   508 *} "transitivity reasoner"
   509 
   509