src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML
changeset 55191 f127ab7368cf
parent 55186 fafdf2424c57
child 55193 78eb7fab3284
equal deleted inserted replaced
55186:fafdf2424c57 55191:f127ab7368cf
    83       lines |> is_only_type_information t ? map (replace_dependencies_in_line (name, []))
    83       lines |> is_only_type_information t ? map (replace_dependencies_in_line (name, []))
    84     else
    84     else
    85       map (replace_dependencies_in_line (name, [])) lines
    85       map (replace_dependencies_in_line (name, [])) lines
    86   | add_line_pass1 line lines = line :: lines
    86   | add_line_pass1 line lines = line :: lines
    87 
    87 
    88 (* Recursively delete empty lines (type information) from the proof.
    88 fun add_lines_pass2 res [] = rev res
    89    (FIXME: needed? And why is "delete_dependency" so complicated?) *)
    89   | add_lines_pass2 res ((name, role, t, rule, deps) :: lines) =
    90 fun add_line_pass2 (line as (name, _, t, _, [])) lines =
       
    91     if is_only_type_information t then delete_dependency name lines else line :: lines
       
    92   | add_line_pass2 line lines = line :: lines
       
    93 and delete_dependency name lines =
       
    94   fold_rev add_line_pass2 (map (replace_dependencies_in_line (name, [])) lines) []
       
    95 
       
    96 fun add_lines_pass3 res [] = rev res
       
    97   | add_lines_pass3 res ((name, role, t, rule, deps) :: lines) =
       
    98     let
    90     let
    99       val is_last_line = null lines
    91       val is_last_line = null lines
   100 
    92 
   101       fun looks_interesting () =
    93       fun looks_interesting () =
   102         not (is_only_type_information t) andalso null (Term.add_tvars t [])
    94         not (is_only_type_information t) andalso null (Term.add_tvars t [])
   107       fun is_before_skolemize_rule () = exists is_skolemizing_line lines
    99       fun is_before_skolemize_rule () = exists is_skolemizing_line lines
   108     in
   100     in
   109       if role <> Plain orelse is_skolemize_rule rule orelse is_arith_rule rule orelse
   101       if role <> Plain orelse is_skolemize_rule rule orelse is_arith_rule rule orelse
   110          is_datatype_rule rule orelse is_last_line orelse looks_interesting () orelse
   102          is_datatype_rule rule orelse is_last_line orelse looks_interesting () orelse
   111          is_before_skolemize_rule () then
   103          is_before_skolemize_rule () then
   112         add_lines_pass3 ((name, role, t, rule, deps) :: res) lines
   104         add_lines_pass2 ((name, role, t, rule, deps) :: res) lines
   113       else
   105       else
   114         add_lines_pass3 res (map (replace_dependencies_in_line (name, deps)) lines)
   106         add_lines_pass2 res (map (replace_dependencies_in_line (name, deps)) lines)
   115     end
   107     end
   116 
   108 
   117 val add_labels_of_proof =
   109 val add_labels_of_proof =
   118   steps_of_proof
   110   steps_of_proof
   119   #> fold_isar_steps (byline_of_step #> (fn SOME ((ls, _), _) => union (op =) ls | _ => I))
   111   #> fold_isar_steps (byline_of_step #> (fn SOME ((ls, _), _) => union (op =) ls | _ => I))
   235           if keep_role role then SOME ((raw_label_of_num num, t), rule) else NONE
   227           if keep_role role then SOME ((raw_label_of_num num, t), rule) else NONE
   236 
   228 
   237         val atp_proof =
   229         val atp_proof =
   238           atp_proof
   230           atp_proof
   239           |> rpair [] |-> fold_rev add_line_pass1
   231           |> rpair [] |-> fold_rev add_line_pass1
   240           |> rpair [] |-> fold_rev add_line_pass2
   232           |> add_lines_pass2 []
   241           |> add_lines_pass3 []
       
   242 
   233 
   243         val conjs =
   234         val conjs =
   244           map_filter (fn (name, role, _, _, _) =>
   235           map_filter (fn (name, role, _, _, _) =>
   245               if member (op =) [Conjecture, Negated_Conjecture] role then SOME name else NONE)
   236               if member (op =) [Conjecture, Negated_Conjecture] role then SOME name else NONE)
   246             atp_proof
   237             atp_proof