equal
deleted
inserted
replaced
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 *) |