src/Pure/Proof/extraction.ML
changeset 13609 73c3915553b4
parent 13417 12cc77f90811
child 13714 bdd483321f4b
equal deleted inserted replaced
13608:9a6f43b8eae1 13609:73c3915553b4
   443             val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye;
   443             val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye;
   444             val T = etype_of sg vs' [] prop;
   444             val T = etype_of sg vs' [] prop;
   445             val defs' = if T = nullT then defs
   445             val defs' = if T = nullT then defs
   446               else fst (extr d defs vs ts Ts hs prf0)
   446               else fst (extr d defs vs ts Ts hs prf0)
   447           in
   447           in
   448             if T = nullT andalso realizes_null vs' prop = prop then (defs, prf0)
   448             if T = nullT andalso realizes_null vs' prop aconv prop then (defs, prf0)
   449             else case Symtab.lookup (realizers, name) of
   449             else case Symtab.lookup (realizers, name) of
   450               None => (case find vs' (find' name defs') of
   450               None => (case find vs' (find' name defs') of
   451                 None =>
   451                 None =>
   452                   let
   452                   let
   453                     val _ = assert (T = nullT) "corr: internal error";
   453                     val _ = assert (T = nullT) "corr: internal error";
   474       | corr d defs vs ts Ts hs (prf0 as PAxm (s, prop, Some Ts')) _ _ =
   474       | corr d defs vs ts Ts hs (prf0 as PAxm (s, prop, Some Ts')) _ _ =
   475           let
   475           let
   476             val (vs', tye) = find_inst prop Ts ts vs;
   476             val (vs', tye) = find_inst prop Ts ts vs;
   477             val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye
   477             val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye
   478           in
   478           in
   479             case find vs' (Symtab.lookup_multi (realizers, s)) of
   479             if etype_of sg vs' [] prop = nullT andalso
       
   480               realizes_null vs' prop aconv prop then (defs, prf0)
       
   481             else case find vs' (Symtab.lookup_multi (realizers, s)) of
   480               Some (_, prf) => (defs, prf_subst_TVars tye' prf)
   482               Some (_, prf) => (defs, prf_subst_TVars tye' prf)
   481             | None => error ("corr: no realizer for instance of axiom " ^
   483             | None => error ("corr: no realizer for instance of axiom " ^
   482                 quote s ^ ":\n" ^ Sign.string_of_term sg (Envir.beta_norm
   484                 quote s ^ ":\n" ^ Sign.string_of_term sg (Envir.beta_norm
   483                   (Reconstruct.prop_of (proof_combt (prf0, ts)))))
   485                   (Reconstruct.prop_of (proof_combt (prf0, ts)))))
   484           end
   486           end
   576             val (vs', tye) = find_inst prop Ts ts vs;
   578             val (vs', tye) = find_inst prop Ts ts vs;
   577             val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye
   579             val tye' = (map fst (term_tvars prop) ~~ Ts') @ tye
   578           in
   580           in
   579             case find vs' (Symtab.lookup_multi (realizers, s)) of
   581             case find vs' (Symtab.lookup_multi (realizers, s)) of
   580               Some (t, _) => (defs, subst_TVars tye' t)
   582               Some (t, _) => (defs, subst_TVars tye' t)
   581             | None => error ("no realizer for instance of axiom " ^
   583             | None => error ("extr: no realizer for instance of axiom " ^
   582                 quote s ^ ":\n" ^ Sign.string_of_term sg (Envir.beta_norm
   584                 quote s ^ ":\n" ^ Sign.string_of_term sg (Envir.beta_norm
   583                   (Reconstruct.prop_of (proof_combt (prf0, ts)))))
   585                   (Reconstruct.prop_of (proof_combt (prf0, ts)))))
   584           end
   586           end
   585 
   587 
   586       | extr d defs vs ts Ts hs _ = error "extr: bad proof";
   588       | extr d defs vs ts Ts hs _ = error "extr: bad proof";