151 (typ list -> term option list -> proof -> (proof * proof) option) list -> proof -> proof |
151 (typ list -> term option list -> proof -> (proof * proof) option) list -> proof -> proof |
152 val rew_proof: theory -> proof -> proof |
152 val rew_proof: theory -> proof -> proof |
153 |
153 |
154 val forall_intr_vfs: term -> term |
154 val forall_intr_vfs: term -> term |
155 val forall_intr_vfs_prf: term -> proof -> proof |
155 val forall_intr_vfs_prf: term -> proof -> proof |
|
156 val app_types: int -> term -> typ list -> proof -> proof |
156 val clean_proof: theory -> proof -> proof |
157 val clean_proof: theory -> proof -> proof |
157 |
158 |
158 val proof_serial: unit -> proof_serial |
159 val proof_serial: unit -> proof_serial |
159 val fulfill_norm_proof: theory -> (serial * proof_body) list -> proof_body -> proof_body |
160 val fulfill_norm_proof: theory -> (serial * proof_body) list -> proof_body -> proof_body |
160 val thm_proof: theory -> string -> sort list -> term list -> term -> |
161 val thm_proof: theory -> string -> sort list -> term list -> term -> |
1590 in |
1591 in |
1591 |
1592 |
1592 fun forall_intr_vfs prop = fold_rev Logic.all (variables_of prop) prop; |
1593 fun forall_intr_vfs prop = fold_rev Logic.all (variables_of prop) prop; |
1593 fun forall_intr_vfs_prf prop prf = fold_rev forall_intr_proof' (variables_of prop) prf; |
1594 fun forall_intr_vfs_prf prop prf = fold_rev forall_intr_proof' (variables_of prop) prf; |
1594 |
1595 |
|
1596 fun app_types shift prop Ts prf = |
|
1597 let |
|
1598 val tvars = rev (Term.add_tvars prop []); |
|
1599 val tfrees = rev (Term.add_tfrees prop []); |
|
1600 val vs = map (fn ((a, i), _) => (a, i + shift)) tvars @ map (fn (a, _) => (a, ~1)) tfrees; |
|
1601 fun varify (v as (a, S)) = if member (op =) tfrees v then TVar ((a, ~1), S) else TFree v; |
|
1602 in map_proof_types (typ_subst_TVars (vs ~~ Ts) o map_type_tfree varify) prf end; |
|
1603 |
1595 end; |
1604 end; |
1596 |
1605 |
1597 fun clean_proof thy prf = |
1606 fun clean_proof thy prf = |
1598 let |
1607 let |
1599 fun clean maxidx prfs (AbsP (s, t, prf)) = |
1608 fun clean maxidx prfs (AbsP (s, t, prf)) = |
1619 val prf' = forall_intr_vfs_prf prop (join_proof body); |
1628 val prf' = forall_intr_vfs_prf prop (join_proof body); |
1620 val (maxidx', prfs', prf) = clean (maxidx_proof prf' ~1) prfs prf'; |
1629 val (maxidx', prfs', prf) = clean (maxidx_proof prf' ~1) prfs prf'; |
1621 val prfs'' = (prop, (maxidx', prf)) :: prfs'; |
1630 val prfs'' = (prop, (maxidx', prf)) :: prfs'; |
1622 in (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs'') end |
1631 in (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs'') end |
1623 | SOME (maxidx', prf) => (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs)); |
1632 | SOME (maxidx', prf) => (maxidx' + maxidx + 1, incr_indexes (maxidx + 1) prf, prfs)); |
1624 val tfrees = Term.add_tfrees prop [] |> rev; |
1633 in (maxidx', prfs', app_types (maxidx + 1) prop Ts prf) end |
1625 val tye = map (fn ((s, j), _) => (s, maxidx + 1 + j)) |
|
1626 (Term.add_tvars prop [] |> rev) @ map (rpair ~1 o fst) tfrees ~~ Ts; |
|
1627 val varify = map_type_tfree (fn p as (a, S) => |
|
1628 if member (op =) tfrees p then TVar ((a, ~1), S) else TFree p) |
|
1629 in |
|
1630 (maxidx', prfs', map_proof_types (typ_subst_TVars tye o varify) prf) |
|
1631 end |
|
1632 | clean maxidx prfs prf = (maxidx, prfs, prf); |
1634 | clean maxidx prfs prf = (maxidx, prfs, prf); |
1633 |
1635 |
1634 in rew_proof thy (#3 (clean (maxidx_proof prf ~1) [] prf)) end; |
1636 in rew_proof thy (#3 (clean (maxidx_proof prf ~1) [] prf)) end; |
1635 |
1637 |
1636 |
1638 |