src/HOL/Tools/Sledgehammer/sledgehammer_isar_compress.ML
changeset 72582 b69a3a7655f2
parent 67560 0fa87bd86566
child 72583 e728d3a3d383
equal deleted inserted replaced
72581:de581f98a3a1 72582:b69a3a7655f2
    62     and update_subproofs [] updates = ([], updates)
    62     and update_subproofs [] updates = ([], updates)
    63       | update_subproofs steps [] = (steps, [])
    63       | update_subproofs steps [] = (steps, [])
    64       | update_subproofs (proof :: subproofs) updates =
    64       | update_subproofs (proof :: subproofs) updates =
    65         update_proof proof (update_subproofs subproofs updates)
    65         update_proof proof (update_subproofs subproofs updates)
    66     and update_proof proof (proofs, []) = (proof :: proofs, [])
    66     and update_proof proof (proofs, []) = (proof :: proofs, [])
    67       | update_proof (Proof (xs, assms, steps)) (proofs, updates) =
    67       | update_proof (Proof {fixes, assumptions, steps}) (proofs, updates) =
    68         let val (steps', updates') = update_steps steps updates in
    68         let val (steps', updates') = update_steps steps updates in
    69           (Proof (xs, assms, steps') :: proofs, updates')
    69           (Proof {fixes = fixes, assumptions = assumptions, steps = steps'} :: proofs, updates')
    70         end
    70         end
    71   in
    71   in
    72     fst (update_steps steps (rev updates))
    72     fst (update_steps steps (rev updates))
    73   end
    73   end
    74 
    74 
   158           nontriv_subs =
   158           nontriv_subs =
   159         if null subs orelse not (compress_further ()) then
   159         if null subs orelse not (compress_further ()) then
   160           Prove (qs, xs, l, t, List.revAppend (nontriv_subs, subs), (lfs, gfs), meths, comment)
   160           Prove (qs, xs, l, t, List.revAppend (nontriv_subs, subs), (lfs, gfs), meths, comment)
   161         else
   161         else
   162           (case subs of
   162           (case subs of
   163             (sub as Proof (_, assms, [Prove (_, _, l', _, [], (lfs', gfs'), meths', _)])) :: subs =>
   163             (sub as Proof {assumptions,
       
   164               steps = [Prove (_, _, l', _, [], (lfs', gfs'), meths', _)], ...}) :: subs =>
   164             let
   165             let
   165               (* merge steps *)
   166               (* merge steps *)
   166               val subs'' = subs @ nontriv_subs
   167               val subs'' = subs @ nontriv_subs
   167               val lfs'' = union (op =) lfs (subtract (op =) (map fst assms) lfs')
   168               val lfs'' = union (op =) lfs (subtract (op =) (map fst assumptions) lfs')
   168               val gfs'' = union (op =) gfs' gfs
   169               val gfs'' = union (op =) gfs' gfs
   169               val (meths'' as _ :: _, hopeless) =
   170               val (meths'' as _ :: _, hopeless) =
   170                 merge_methods (!preplay_data) (l', meths') (l, meths)
   171                 merge_methods (!preplay_data) (l', meths') (l, meths)
   171               val step'' = Prove (qs, xs, l, t, subs'', (lfs'', gfs''), meths'', comment)
   172               val step'' = Prove (qs, xs, l, t, subs'', (lfs'', gfs''), meths'', comment)
   172 
   173 
   270          proof level, the proof steps have no subproofs. In the best case, these steps can be merged
   271          proof level, the proof steps have no subproofs. In the best case, these steps can be merged
   271          into just one step, resulting in a trivial subproof. Going one level up, trivial subproofs
   272          into just one step, resulting in a trivial subproof. Going one level up, trivial subproofs
   272          can be eliminated. In the best case, this once again leads to a proof whose proof steps do
   273          can be eliminated. In the best case, this once again leads to a proof whose proof steps do
   273          not have subproofs. Applying this approach recursively will result in a flat proof in the
   274          not have subproofs. Applying this approach recursively will result in a flat proof in the
   274          best cast. *)
   275          best cast. *)
   275       fun compress_proof (proof as (Proof (xs, assms, steps))) =
   276       fun compress_proof (proof as (Proof {fixes, assumptions, steps})) =
   276         if compress_further () then Proof (xs, assms, compress_steps steps) else proof
   277         if compress_further () then
       
   278           Proof {fixes = fixes, assumptions = assumptions, steps = compress_steps steps}
       
   279         else
       
   280           proof
   277       and compress_steps steps =
   281       and compress_steps steps =
   278         (* bottom-up: compress innermost proofs first *)
   282         (* bottom-up: compress innermost proofs first *)
   279         steps
   283         steps
   280         |> map (fn step => step |> compress_further () ? compress_sub_levels)
   284         |> map (fn step => step |> compress_further () ? compress_sub_levels)
   281         |> compress_further () ? compress_top_level
   285         |> compress_further () ? compress_top_level