src/HOL/TPTP/mash_export.ML
changeset 50519 2951841ec011
parent 50515 c4a27ab89c9b
child 50523 0799339fea0f
equal deleted inserted replaced
50518:d4fdda801e19 50519:2951841ec011
   110 
   110 
   111 fun generate_isar_or_prover_dependencies ctxt params_opt thys include_thys
   111 fun generate_isar_or_prover_dependencies ctxt params_opt thys include_thys
   112                                          file_name =
   112                                          file_name =
   113   let
   113   let
   114     val path = file_name |> Path.explode
   114     val path = file_name |> Path.explode
   115     val _ = File.write path ""
       
   116     val facts =
   115     val facts =
   117       all_facts ctxt |> not include_thys ? filter_out (has_thys thys o snd)
   116       all_facts ctxt |> not include_thys ? filter_out (has_thys thys o snd)
   118     val all_names = build_all_names nickname_of facts
   117     val all_names = build_all_names nickname_of facts
   119     fun do_fact (_, th) =
   118     fun do_fact (_, th) =
   120       let
   119       let
   121         val name = nickname_of th
   120         val name = nickname_of th
   122         val deps =
   121         val deps =
   123           isar_or_prover_dependencies_of ctxt params_opt facts all_names th NONE
   122           isar_or_prover_dependencies_of ctxt params_opt facts all_names th NONE
   124         val s = escape_meta name ^ ": " ^ escape_metas deps ^ "\n"
   123       in escape_meta name ^ ": " ^ escape_metas deps ^ "\n" end
   125       in File.append path s end
   124     val lines = Par_List.map do_fact facts
   126   in List.app do_fact facts end
   125   in File.write_list path lines end
   127 
   126 
   128 fun generate_isar_dependencies ctxt =
   127 fun generate_isar_dependencies ctxt =
   129   generate_isar_or_prover_dependencies ctxt NONE
   128   generate_isar_or_prover_dependencies ctxt NONE
   130 
   129 
   131 fun generate_prover_dependencies ctxt params =
   130 fun generate_prover_dependencies ctxt params =
   138 
   137 
   139 fun generate_isar_or_prover_commands ctxt prover params_opt thys file_name =
   138 fun generate_isar_or_prover_commands ctxt prover params_opt thys file_name =
   140   let
   139   let
   141     val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover
   140     val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover
   142     val path = file_name |> Path.explode
   141     val path = file_name |> Path.explode
   143     val _ = File.write path ""
       
   144     val facts = all_facts ctxt
   142     val facts = all_facts ctxt
   145     val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd)
   143     val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd)
   146     val all_names = build_all_names nickname_of facts
   144     val all_names = build_all_names nickname_of facts
   147     fun do_fact ((_, stature), th) prevs =
   145     fun do_fact ((name, ((_, stature), th)), prevs) =
   148       let
   146       let
   149         val name = nickname_of th
       
   150         val feats =
   147         val feats =
   151           features_of ctxt prover (theory_of_thm th) stature [prop_of th]
   148           features_of ctxt prover (theory_of_thm th) stature [prop_of th]
   152         val isar_deps = isar_dependencies_of all_names th
   149         val isar_deps = isar_dependencies_of all_names th
   153         val deps =
   150         val deps =
   154           isar_or_prover_dependencies_of ctxt params_opt facts all_names th
   151           isar_or_prover_dependencies_of ctxt params_opt facts all_names th
   158           encode_features feats
   155           encode_features feats
   159         val query =
   156         val query =
   160           if is_bad_query ctxt ho_atp th (these isar_deps) then ""
   157           if is_bad_query ctxt ho_atp th (these isar_deps) then ""
   161           else "? " ^ core ^ "\n"
   158           else "? " ^ core ^ "\n"
   162         val update = "! " ^ core ^ "; " ^ escape_metas deps ^ "\n"
   159         val update = "! " ^ core ^ "; " ^ escape_metas deps ^ "\n"
   163         val _ = File.append path (query ^ update)
   160       in query ^ update end
   164       in [name] end
       
   165     val thy_map = old_facts |> thy_map_from_facts
   161     val thy_map = old_facts |> thy_map_from_facts
   166     val parents = fold (add_thy_parent_facts thy_map) thys []
   162     val parents = fold (add_thy_parent_facts thy_map) thys []
   167   in fold do_fact new_facts parents; () end
   163     val new_facts = new_facts |> map (`(nickname_of o snd))
       
   164     val prevss = fst (split_last (parents :: map (single o fst) new_facts))
       
   165     val lines = Par_List.map do_fact (new_facts ~~ prevss)
       
   166   in File.write_list path lines end
   168 
   167 
   169 fun generate_isar_commands ctxt prover =
   168 fun generate_isar_commands ctxt prover =
   170   generate_isar_or_prover_commands ctxt prover NONE
   169   generate_isar_or_prover_commands ctxt prover NONE
   171 
   170 
   172 fun generate_prover_commands ctxt (params as {provers = prover :: _, ...}) =
   171 fun generate_prover_commands ctxt (params as {provers = prover :: _, ...}) =
   175 fun generate_mepo_suggestions ctxt (params as {provers = prover :: _, ...}) thys
   174 fun generate_mepo_suggestions ctxt (params as {provers = prover :: _, ...}) thys
   176                               max_facts file_name =
   175                               max_facts file_name =
   177   let
   176   let
   178     val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover
   177     val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover
   179     val path = file_name |> Path.explode
   178     val path = file_name |> Path.explode
   180     val _ = File.write path ""
       
   181     val facts = all_facts ctxt
   179     val facts = all_facts ctxt
   182     val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd)
   180     val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd)
   183     val all_names = build_all_names nickname_of facts
   181     val all_names = build_all_names nickname_of facts
   184     fun do_fact (fact as (_, th)) old_facts =
   182     fun do_fact (fact as (_, th), old_facts) =
   185       let
   183       let
   186         val name = nickname_of th
   184         val name = nickname_of th
   187         val goal = goal_of_thm (Proof_Context.theory_of ctxt) th
   185         val goal = goal_of_thm (Proof_Context.theory_of ctxt) th
   188         val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal ctxt goal 1
   186         val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal ctxt goal 1
   189         val isar_deps = isar_dependencies_of all_names th
   187         val isar_deps = isar_dependencies_of all_names th
   190         val _ =
   188       in
   191           if is_bad_query ctxt ho_atp th (these isar_deps) then
   189         if is_bad_query ctxt ho_atp th (these isar_deps) then
   192             ()
   190           ""
   193           else
   191         else
   194             let
   192           let
   195               val suggs =
   193             val suggs =
   196                 old_facts
   194               old_facts
   197                 |> Sledgehammer_MePo.mepo_suggested_facts ctxt params prover
   195               |> Sledgehammer_MePo.mepo_suggested_facts ctxt params prover
   198                        max_facts NONE hyp_ts concl_t
   196                      max_facts NONE hyp_ts concl_t
   199                 |> map (nickname_of o snd)
   197               |> map (nickname_of o snd)
   200               val s = escape_meta name ^ ": " ^ escape_metas suggs ^ "\n"
   198           in escape_meta name ^ ": " ^ escape_metas suggs ^ "\n" end
   201             in File.append path s end
   199       end
   202       in fact :: old_facts end
   200     fun accum x (yss as ys :: _) = (x :: ys) :: yss
   203   in fold do_fact new_facts old_facts; () end
   201     val old_factss = tl (fold accum new_facts [old_facts])
       
   202     val lines = Par_List.map do_fact (new_facts ~~ rev old_factss)
       
   203   in File.write_list path lines end
   204 
   204 
   205 end;
   205 end;