793 else |
793 else |
794 let |
794 let |
795 val term = Term.subst_bounds_same args; |
795 val term = Term.subst_bounds_same args; |
796 |
796 |
797 fun proof lev (AbsP (a, t, p)) = |
797 fun proof lev (AbsP (a, t, p)) = |
798 (AbsP (a, Same.map_option (term lev) t, Same.commit (proof lev) p) |
798 (AbsP (a, Same.map_option (term lev) t, Same.commit (proof lev) p) |
799 handle Same.SAME => AbsP (a, t, proof lev p)) |
799 handle Same.SAME => AbsP (a, t, proof lev p)) |
800 | proof lev (Abst (a, T, p)) = Abst (a, T, proof (lev + 1) p) |
800 | proof lev (Abst (a, T, p)) = Abst (a, T, proof (lev + 1) p) |
801 | proof lev (p %% q) = (proof lev p %% Same.commit (proof lev) q |
801 | proof lev (p %% q) = |
802 handle Same.SAME => p %% proof lev q) |
802 (proof lev p %% Same.commit (proof lev) q |
803 | proof lev (p % t) = (proof lev p % Option.map (Same.commit (term lev)) t |
803 handle Same.SAME => p %% proof lev q) |
804 handle Same.SAME => p % Same.map_option (term lev) t) |
804 | proof lev (p % t) = |
|
805 (proof lev p % Option.map (Same.commit (term lev)) t |
|
806 handle Same.SAME => p % Same.map_option (term lev) t) |
805 | proof _ _ = raise Same.SAME; |
807 | proof _ _ = raise Same.SAME; |
806 in Same.commit (proof 0) prf end; |
808 in Same.commit (proof 0) prf end; |
807 |
809 |
808 fun subst_pbounds args prf = |
810 fun subst_pbounds args prf = |
809 let |
811 let |
812 (if i < Plev then raise Same.SAME (*var is locally bound*) |
814 (if i < Plev then raise Same.SAME (*var is locally bound*) |
813 else if i - Plev < n then incr_boundvars Plev tlev (nth args (i - Plev)) |
815 else if i - Plev < n then incr_boundvars Plev tlev (nth args (i - Plev)) |
814 else PBound (i - n) (*loose: change it*)) |
816 else PBound (i - n) (*loose: change it*)) |
815 | proof Plev tlev (AbsP (a, t, p)) = AbsP (a, t, proof (Plev + 1) tlev p) |
817 | proof Plev tlev (AbsP (a, t, p)) = AbsP (a, t, proof (Plev + 1) tlev p) |
816 | proof Plev tlev (Abst (a, T, p)) = Abst (a, T, proof Plev (tlev + 1) p) |
818 | proof Plev tlev (Abst (a, T, p)) = Abst (a, T, proof Plev (tlev + 1) p) |
817 | proof Plev tlev (p %% q) = (proof Plev tlev p %% Same.commit (proof Plev tlev) q |
819 | proof Plev tlev (p %% q) = |
818 handle Same.SAME => p %% proof Plev tlev q) |
820 (proof Plev tlev p %% Same.commit (proof Plev tlev) q |
|
821 handle Same.SAME => p %% proof Plev tlev q) |
819 | proof Plev tlev (p % t) = proof Plev tlev p % t |
822 | proof Plev tlev (p % t) = proof Plev tlev p % t |
820 | proof _ _ _ = raise Same.SAME; |
823 | proof _ _ _ = raise Same.SAME; |
821 in if null args then prf else Same.commit (proof 0 0) prf end; |
824 in if null args then prf else Same.commit (proof 0 0) prf end; |
822 |
825 |
823 |
826 |