equal
deleted
inserted
replaced
299 let val {realizes_eqns, typeof_eqns, types, realizers, |
299 let val {realizes_eqns, typeof_eqns, types, realizers, |
300 defs, expand, prep} = ExtractionData.get thy |
300 defs, expand, prep} = ExtractionData.get thy |
301 in |
301 in |
302 ExtractionData.put |
302 ExtractionData.put |
303 {realizes_eqns = realizes_eqns, typeof_eqns = typeof_eqns, types = types, |
303 {realizes_eqns = realizes_eqns, typeof_eqns = typeof_eqns, types = types, |
304 realizers = foldr Symtab.update_multi |
304 realizers = fold (Symtab.curried_update_multi o prep_rlz thy) rs realizers, |
305 realizers (map (prep_rlz thy) (rev rs)), |
|
306 defs = defs, expand = expand, prep = prep} thy |
305 defs = defs, expand = expand, prep = prep} thy |
307 end |
306 end |
308 |
307 |
309 fun prep_realizer thy = |
308 fun prep_realizer thy = |
310 let |
309 let |
563 val T = etype_of thy' vs' [] prop; |
562 val T = etype_of thy' vs' [] prop; |
564 val defs' = if T = nullT then defs |
563 val defs' = if T = nullT then defs |
565 else fst (extr d defs vs ts Ts hs prf0) |
564 else fst (extr d defs vs ts Ts hs prf0) |
566 in |
565 in |
567 if T = nullT andalso realizes_null vs' prop aconv prop then (defs, prf0) |
566 if T = nullT andalso realizes_null vs' prop aconv prop then (defs, prf0) |
568 else case Symtab.lookup (realizers, name) of |
567 else case Symtab.curried_lookup realizers name of |
569 NONE => (case find vs' (find' name defs') of |
568 NONE => (case find vs' (find' name defs') of |
570 NONE => |
569 NONE => |
571 let |
570 let |
572 val _ = assert (T = nullT) "corr: internal error"; |
571 val _ = assert (T = nullT) "corr: internal error"; |
573 val _ = msg d ("Building correctness proof for " ^ quote name ^ |
572 val _ = msg d ("Building correctness proof for " ^ quote name ^ |
599 val (vs', tye) = find_inst prop Ts ts vs; |
598 val (vs', tye) = find_inst prop Ts ts vs; |
600 val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye |
599 val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye |
601 in |
600 in |
602 if etype_of thy' vs' [] prop = nullT andalso |
601 if etype_of thy' vs' [] prop = nullT andalso |
603 realizes_null vs' prop aconv prop then (defs, prf0) |
602 realizes_null vs' prop aconv prop then (defs, prf0) |
604 else case find vs' (Symtab.lookup_multi (realizers, s)) of |
603 else case find vs' (Symtab.curried_lookup_multi realizers s) of |
605 SOME (_, prf) => (defs, prf_subst_TVars tye' prf) |
604 SOME (_, prf) => (defs, prf_subst_TVars tye' prf) |
606 | NONE => error ("corr: no realizer for instance of axiom " ^ |
605 | NONE => error ("corr: no realizer for instance of axiom " ^ |
607 quote s ^ ":\n" ^ Sign.string_of_term thy' (Envir.beta_norm |
606 quote s ^ ":\n" ^ Sign.string_of_term thy' (Envir.beta_norm |
608 (Reconstruct.prop_of (proof_combt (prf0, ts))))) |
607 (Reconstruct.prop_of (proof_combt (prf0, ts))))) |
609 end |
608 end |
647 | extr d defs vs ts Ts hs (prf0 as PThm ((s, _), prf, prop, SOME Ts')) = |
646 | extr d defs vs ts Ts hs (prf0 as PThm ((s, _), prf, prop, SOME Ts')) = |
648 let |
647 let |
649 val (vs', tye) = find_inst prop Ts ts vs; |
648 val (vs', tye) = find_inst prop Ts ts vs; |
650 val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye |
649 val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye |
651 in |
650 in |
652 case Symtab.lookup (realizers, s) of |
651 case Symtab.curried_lookup realizers s of |
653 NONE => (case find vs' (find' s defs) of |
652 NONE => (case find vs' (find' s defs) of |
654 NONE => |
653 NONE => |
655 let |
654 let |
656 val _ = msg d ("Extracting " ^ quote s ^ |
655 val _ = msg d ("Extracting " ^ quote s ^ |
657 (if null vs' then "" |
656 (if null vs' then "" |
706 | extr d defs vs ts Ts hs (prf0 as PAxm (s, prop, SOME Ts')) = |
705 | extr d defs vs ts Ts hs (prf0 as PAxm (s, prop, SOME Ts')) = |
707 let |
706 let |
708 val (vs', tye) = find_inst prop Ts ts vs; |
707 val (vs', tye) = find_inst prop Ts ts vs; |
709 val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye |
708 val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye |
710 in |
709 in |
711 case find vs' (Symtab.lookup_multi (realizers, s)) of |
710 case find vs' (Symtab.curried_lookup_multi realizers s) of |
712 SOME (t, _) => (defs, subst_TVars tye' t) |
711 SOME (t, _) => (defs, subst_TVars tye' t) |
713 | NONE => error ("extr: no realizer for instance of axiom " ^ |
712 | NONE => error ("extr: no realizer for instance of axiom " ^ |
714 quote s ^ ":\n" ^ Sign.string_of_term thy' (Envir.beta_norm |
713 quote s ^ ":\n" ^ Sign.string_of_term thy' (Envir.beta_norm |
715 (Reconstruct.prop_of (proof_combt (prf0, ts))))) |
714 (Reconstruct.prop_of (proof_combt (prf0, ts))))) |
716 end |
715 end |