equal
deleted
inserted
replaced
107 let |
107 let |
108 (* identify morphism function *) |
108 (* identify morphism function *) |
109 val ([a, D], ctxt2) = ctxt1 |
109 val ([a, D], ctxt2) = ctxt1 |
110 |> Variable.import true (map Drule.mk_term [raw_a, raw_D]) |
110 |> Variable.import true (map Drule.mk_term [raw_a, raw_D]) |
111 |>> map Drule.dest_term o snd; |
111 |>> map Drule.dest_term o snd; |
112 val transform = Thm.capply @{cterm "Trueprop"} o Thm.capply D; |
112 val transform = Thm.apply @{cterm "Trueprop"} o Thm.apply D; |
113 val T = Thm.typ_of (Thm.ctyp_of_term a); |
113 val T = Thm.typ_of (Thm.ctyp_of_term a); |
114 val (aT, bT) = (Term.range_type T, Term.domain_type T); |
114 val (aT, bT) = (Term.range_type T, Term.domain_type T); |
115 |
115 |
116 (* determine variables to transfer *) |
116 (* determine variables to transfer *) |
117 val ctxt3 = ctxt2 |
117 val ctxt3 = ctxt2 |
122 val vars = filter (fn ((v, _), T) => Type.could_unify (T, aT) andalso |
122 val vars = filter (fn ((v, _), T) => Type.could_unify (T, aT) andalso |
123 not (member (op =) leave v)) (Term.add_vars (Thm.prop_of thm) []); |
123 not (member (op =) leave v)) (Term.add_vars (Thm.prop_of thm) []); |
124 val c_vars = map (certify o Var) vars; |
124 val c_vars = map (certify o Var) vars; |
125 val (vs', ctxt4) = Variable.variant_fixes (map (fst o fst) vars) ctxt3; |
125 val (vs', ctxt4) = Variable.variant_fixes (map (fst o fst) vars) ctxt3; |
126 val c_vars' = map (certify o (fn v => Free (v, bT))) vs'; |
126 val c_vars' = map (certify o (fn v => Free (v, bT))) vs'; |
127 val c_exprs' = map (Thm.capply a) c_vars'; |
127 val c_exprs' = map (Thm.apply a) c_vars'; |
128 |
128 |
129 (* transfer *) |
129 (* transfer *) |
130 val (hyps, ctxt5) = ctxt4 |
130 val (hyps, ctxt5) = ctxt4 |
131 |> Assumption.add_assumes (map transform c_vars'); |
131 |> Assumption.add_assumes (map transform c_vars'); |
132 val simpset = |
132 val simpset = |