src/HOL/Tools/Metis/metis_reconstruct.ML
changeset 42098 f978caf60bbe
parent 41491 a2ad5b824051
child 42099 447fa058ab22
equal deleted inserted replaced
42097:3717095e0c16 42098:f978caf60bbe
    36 
    36 
    37 fun trace_msg ctxt msg = if Config.get ctxt trace then tracing (msg ()) else ()
    37 fun trace_msg ctxt msg = if Config.get ctxt trace then tracing (msg ()) else ()
    38 fun verbose_warning ctxt msg =
    38 fun verbose_warning ctxt msg =
    39   if Config.get ctxt verbose then warning msg else ()
    39   if Config.get ctxt verbose then warning msg else ()
    40 
    40 
       
    41 val is_zapped_var_name =
       
    42   String.isPrefix Meson_Clausify.new_skolem_var_prefix orf
       
    43   String.isPrefix Meson_Clausify.new_nonskolem_var_prefix
       
    44 
    41 datatype term_or_type = SomeTerm of term | SomeType of typ
    45 datatype term_or_type = SomeTerm of term | SomeType of typ
    42 
    46 
    43 fun terms_of [] = []
    47 fun terms_of [] = []
    44   | terms_of (SomeTerm t :: tts) = t :: terms_of tts
    48   | terms_of (SomeTerm t :: tts) = t :: terms_of tts
    45   | terms_of (SomeType _ :: tts) = terms_of tts;
    49   | terms_of (SomeType _ :: tts) = terms_of tts;
    46 
    50 
    47 fun types_of [] = []
    51 fun types_of [] = []
    48   | types_of (SomeTerm (Var ((a,idx), _)) :: tts) =
    52   | types_of (SomeTerm (Var ((a,idx), _)) :: tts) =
    49       if String.isPrefix "_" a then
    53       if String.isPrefix metis_generated_var_prefix a then
    50           (*Variable generated by Metis, which might have been a type variable.*)
    54           (*Variable generated by Metis, which might have been a type variable.*)
    51           TVar (("'" ^ a, idx), HOLogic.typeS) :: types_of tts
    55           TVar (("'" ^ a, idx), HOLogic.typeS) :: types_of tts
    52       else types_of tts
    56       else types_of tts
    53   | types_of (SomeTerm _ :: tts) = types_of tts
    57   | types_of (SomeTerm _ :: tts) = types_of tts
    54   | types_of (SomeType T :: tts) = T :: types_of tts;
    58   | types_of (SomeType T :: tts) = T :: types_of tts;
   654            if k > j then t else t $ u
   658            if k > j then t else t $ u
   655          | (t, u) => t $ u)
   659          | (t, u) => t $ u)
   656       | repair t = t
   660       | repair t = t
   657     val t' = t |> repair |> fold (curry absdummy) (map snd params)
   661     val t' = t |> repair |> fold (curry absdummy) (map snd params)
   658     fun do_instantiate th =
   662     fun do_instantiate th =
   659       let val var = Term.add_vars (prop_of th) [] |> the_single in
   663       let
   660         th |> term_instantiate thy [(Var var, t')]
   664         val var = Term.add_vars (prop_of th) []
   661       end
   665                   |> filter (is_zapped_var_name o fst o fst)
       
   666                   |> the_single
       
   667       in th |> term_instantiate thy [(Var var, t')] end
   662   in
   668   in
   663     (etac @{thm allE} i
   669     (etac @{thm allE} i
   664      THEN rotate_tac ~1 i
   670      THEN rotate_tac ~1 i
   665      THEN PRIMITIVE do_instantiate) st
   671      THEN PRIMITIVE do_instantiate) st
   666   end
   672   end
   743         let
   749         let
   744           val (tyenv, tenv) =
   750           val (tyenv, tenv) =
   745             Pattern.first_order_match thy p (Vartab.empty, Vartab.empty)
   751             Pattern.first_order_match thy p (Vartab.empty, Vartab.empty)
   746           val tsubst =
   752           val tsubst =
   747             tenv |> Vartab.dest
   753             tenv |> Vartab.dest
       
   754                  |> filter (is_zapped_var_name o fst o fst)
   748                  |> sort (cluster_ord
   755                  |> sort (cluster_ord
   749                           o pairself (Meson_Clausify.cluster_of_zapped_var_name
   756                           o pairself (Meson_Clausify.cluster_of_zapped_var_name
   750                                       o fst o fst))
   757                                       o fst o fst))
   751                  |> map (Meson.term_pair_of
   758                  |> map (Meson.term_pair_of
   752                          #> pairself (Envir.subst_term_types tyenv))
   759                          #> pairself (Envir.subst_term_types tyenv))
   760                      match_term (nth axioms ax_no |> the |> snd, t)))
   767                      match_term (nth axioms ax_no |> the |> snd, t)))
   761           end
   768           end
   762         | _ => raise TERM ("discharge_skolem_premises: Malformed premise",
   769         | _ => raise TERM ("discharge_skolem_premises: Malformed premise",
   763                            [prem])
   770                            [prem])
   764       fun cluster_of_var_name skolem s =
   771       fun cluster_of_var_name skolem s =
   765         let
   772         case try Meson_Clausify.cluster_of_zapped_var_name s of
   766           val ((ax_no, (cluster_no, _)), skolem') =
   773           NONE => NONE
   767             Meson_Clausify.cluster_of_zapped_var_name s
   774         | SOME ((ax_no, (cluster_no, _)), skolem') =>
   768         in
       
   769           if skolem' = skolem andalso cluster_no > 0 then
   775           if skolem' = skolem andalso cluster_no > 0 then
   770             SOME (ax_no, cluster_no)
   776             SOME (ax_no, cluster_no)
   771           else
   777           else
   772             NONE
   778             NONE
   773         end
       
   774       fun clusters_in_term skolem t =
   779       fun clusters_in_term skolem t =
   775         Term.add_var_names t [] |> map_filter (cluster_of_var_name skolem o fst)
   780         Term.add_var_names t [] |> map_filter (cluster_of_var_name skolem o fst)
   776       fun deps_for_term_subst (var, t) =
   781       fun deps_for_term_subst (var, t) =
   777         case clusters_in_term false var of
   782         case clusters_in_term false var of
   778           [] => NONE
   783           [] => NONE
   794         handle Int_Pair_Graph.CYCLES _ =>
   799         handle Int_Pair_Graph.CYCLES _ =>
   795                error "Cannot replay Metis proof in Isabelle without \
   800                error "Cannot replay Metis proof in Isabelle without \
   796                      \\"Hilbert_Choice\"."
   801                      \\"Hilbert_Choice\"."
   797       val outer_param_names =
   802       val outer_param_names =
   798         [] |> fold (Term.add_var_names o snd) (map_filter I axioms)
   803         [] |> fold (Term.add_var_names o snd) (map_filter I axioms)
       
   804            |> filter (is_zapped_var_name o fst)
   799            |> map (`(Meson_Clausify.cluster_of_zapped_var_name o fst))
   805            |> map (`(Meson_Clausify.cluster_of_zapped_var_name o fst))
   800            |> filter (fn (((_, (cluster_no, _)), skolem), _) =>
   806            |> filter (fn (((_, (cluster_no, _)), skolem), _) =>
   801                          cluster_no = 0 andalso skolem)
   807                          cluster_no = 0 andalso skolem)
   802            |> sort shuffle_ord |> map (fst o snd)
   808            |> sort shuffle_ord |> map (fst o snd)
   803       val ax_counts =
   809       val ax_counts =