wenzelm@22107: (* Title: Pure/Thy/term_style.ML wenzelm@22107: ID: $Id$ wenzelm@22107: Author: Florian Haftmann, TU Muenchen wenzelm@22107: wenzelm@22107: Styles for terms, to use with the "term_style" and "thm_style" wenzelm@22107: antiquotations. wenzelm@22107: *) wenzelm@22107: wenzelm@22107: signature TERM_STYLE = wenzelm@22107: sig wenzelm@22107: val the_style: theory -> string -> (Proof.context -> term -> term) wenzelm@22107: val add_style: string -> (Proof.context -> term -> term) -> theory -> theory wenzelm@22107: val print_styles: theory -> unit wenzelm@22107: end; wenzelm@22107: wenzelm@22107: structure TermStyle: TERM_STYLE = wenzelm@22107: struct wenzelm@22107: wenzelm@22107: (* style data *) wenzelm@22107: wenzelm@23655: fun err_dup_style name = wenzelm@23655: error ("Duplicate declaration of antiquote style: " ^ quote name); wenzelm@22107: wenzelm@22107: structure StyleData = TheoryDataFun wenzelm@22846: ( wenzelm@22107: type T = ((Proof.context -> term -> term) * stamp) Symtab.table; wenzelm@22107: val empty = Symtab.empty; wenzelm@22107: val copy = I; wenzelm@22107: val extend = I; wenzelm@23577: fun merge _ tabs : T = Symtab.merge (eq_snd (op =)) tabs wenzelm@23655: handle Symtab.DUP dup => err_dup_style dup; wenzelm@22846: ); wenzelm@22107: wenzelm@22846: fun print_styles thy = wenzelm@22846: Pretty.writeln (Pretty.strs ("antiquote styles:" :: Symtab.keys (StyleData.get thy))); wenzelm@22107: wenzelm@22107: wenzelm@22107: (* accessors *) wenzelm@22107: wenzelm@22107: fun the_style thy name = wenzelm@22107: (case Symtab.lookup (StyleData.get thy) name of wenzelm@22107: NONE => error ("Unknown antiquote style: " ^ quote name) wenzelm@22107: | SOME (style, _) => style); wenzelm@22107: wenzelm@22107: fun add_style name style thy = wenzelm@22107: StyleData.map (Symtab.update_new (name, (style, stamp ()))) thy wenzelm@23655: handle Symtab.DUP _ => err_dup_style name; wenzelm@22107: wenzelm@22107: wenzelm@22107: (* predefined styles *) wenzelm@22107: wenzelm@22107: fun style_binargs ctxt t = wenzelm@22107: let wenzelm@22107: val concl = ObjectLogic.drop_judgment (ProofContext.theory_of ctxt) wenzelm@22107: (Logic.strip_imp_concl t) wenzelm@22107: in wenzelm@22107: case concl of (_ $ l $ r) => (l, r) wenzelm@22107: | _ => error ("Binary operator expected in term: " ^ ProofContext.string_of_term ctxt concl) wenzelm@22107: end; wenzelm@22107: wenzelm@22107: fun style_parm_premise i ctxt t = wenzelm@22107: let val prems = Logic.strip_imp_prems t in wenzelm@22107: if i <= length prems then nth prems (i - 1) wenzelm@22107: else error ("Not enough premises for prem" ^ string_of_int i ^ wenzelm@22107: " in propositon: " ^ ProofContext.string_of_term ctxt t) wenzelm@22107: end; wenzelm@22107: wenzelm@22107: val _ = Context.add_setup wenzelm@22107: (add_style "lhs" (fst oo style_binargs) #> wenzelm@22107: add_style "rhs" (snd oo style_binargs) #> wenzelm@22107: add_style "prem1" (style_parm_premise 1) #> wenzelm@22107: add_style "prem2" (style_parm_premise 2) #> wenzelm@22107: add_style "prem3" (style_parm_premise 3) #> wenzelm@22107: add_style "prem4" (style_parm_premise 4) #> wenzelm@22107: add_style "prem5" (style_parm_premise 5) #> wenzelm@22107: add_style "prem6" (style_parm_premise 6) #> wenzelm@22107: add_style "prem7" (style_parm_premise 7) #> wenzelm@22107: add_style "prem8" (style_parm_premise 8) #> wenzelm@22107: add_style "prem9" (style_parm_premise 9) #> wenzelm@22107: add_style "prem10" (style_parm_premise 10) #> wenzelm@22107: add_style "prem11" (style_parm_premise 11) #> wenzelm@22107: add_style "prem12" (style_parm_premise 12) #> wenzelm@22107: add_style "prem13" (style_parm_premise 13) #> wenzelm@22107: add_style "prem14" (style_parm_premise 14) #> wenzelm@22107: add_style "prem15" (style_parm_premise 15) #> wenzelm@22107: add_style "prem16" (style_parm_premise 16) #> wenzelm@22107: add_style "prem17" (style_parm_premise 17) #> wenzelm@22107: add_style "prem18" (style_parm_premise 18) #> wenzelm@22107: add_style "prem19" (style_parm_premise 19) #> wenzelm@22107: add_style "concl" (K Logic.strip_imp_concl)); wenzelm@22107: wenzelm@22107: end;