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 |