src/Pure/Proof/extraction.ML
changeset 17223 430edc6b7826
parent 17203 29b2563f5c11
child 17232 148c241d2492
equal deleted inserted replaced
17222:819bc7f22423 17223:430edc6b7826
   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