src/Pure/Isar/local_defs.ML
changeset 21699 9395071cc5c5
parent 21687 f689f729afab
child 21708 45e7491bea47
equal deleted inserted replaced
21698:43a842769765 21699:9395071cc5c5
    44       |> Sign.no_vars pp
    44       |> Sign.no_vars pp
    45       |> Logic.dest_def pp Term.is_Free (Variable.is_fixed ctxt) (K true)
    45       |> Logic.dest_def pp Term.is_Free (Variable.is_fixed ctxt) (K true)
    46       handle TERM (msg, _) => err msg | ERROR msg => err msg;
    46       handle TERM (msg, _) => err msg | ERROR msg => err msg;
    47   in (Term.dest_Free (Term.head_of lhs), eq') end;
    47   in (Term.dest_Free (Term.head_of lhs), eq') end;
    48 
    48 
    49 val abs_def = Logic.abs_def #> apfst Term.dest_Free;
    49 val abs_def = Logic.abs_def #>> Term.dest_Free;
    50 
    50 
    51 fun mk_def ctxt args =
    51 fun mk_def ctxt args =
    52   let
    52   let
    53     val (xs, rhss) = split_list args;
    53     val (xs, rhss) = split_list args;
    54     val (bind, _) = ProofContext.bind_fixes xs ctxt;
    54     val (bind, _) = ProofContext.bind_fixes xs ctxt;
    72 fun expand defs =
    72 fun expand defs =
    73   Drule.implies_intr_list defs
    73   Drule.implies_intr_list defs
    74   #> Drule.generalize ([], map (head_of_def o Thm.term_of) defs)
    74   #> Drule.generalize ([], map (head_of_def o Thm.term_of) defs)
    75   #> funpow (length defs) (fn th => Drule.reflexive_thm RS th);
    75   #> funpow (length defs) (fn th => Drule.reflexive_thm RS th);
    76 
    76 
    77 fun expand_term [] = I
    77 fun expand_term defs =
    78   | expand_term defs = Pattern.rewrite_term
    78   let
    79       (Theory.merge_list (map Thm.theory_of_cterm defs))
    79     val eqs = defs |> map (Thm.term_of #> abs_def #> (fn ((x, U), u) => (x, (U, u))));
    80       (map (Logic.dest_equals o Thm.prop_of o Assumption.assume) defs) [];
    80     fun get_def (Free (x, _)) = AList.lookup (op =) eqs x
       
    81       | get_def _ = NONE;
       
    82   in Envir.expand_term get_def end;
    81 
    83 
    82 fun def_export _ defs = (expand defs, expand_term defs);
    84 fun def_export _ defs = (expand defs, expand_term defs);
    83 
    85 
    84 
    86 
    85 (* add defs *)
    87 (* add defs *)