67 open Unsynchronized |
67 open Unsynchronized |
68 val metis_fail = ref false |
68 val metis_fail = ref false |
69 in |
69 in |
70 fun handle_metis_fail try_metis () = |
70 fun handle_metis_fail try_metis () = |
71 try_metis () handle exp => |
71 try_metis () handle exp => |
72 (if debug then raise exp else metis_fail := true; SOME Time.zeroTime) |
72 (if Exn.is_interrupt exp orelse debug then reraise exp |
|
73 else metis_fail := true; SOME Time.zeroTime) |
73 fun get_time lazy_time = |
74 fun get_time lazy_time = |
74 if !metis_fail then SOME Time.zeroTime else Lazy.force lazy_time |
75 if !metis_fail then SOME Time.zeroTime else Lazy.force lazy_time |
75 val metis_fail = fn () => !metis_fail |
76 val metis_fail = fn () => !metis_fail |
76 end |
77 end |
77 |
78 |
206 val (step_constructor, lfs2, gfs2) = |
207 val (step_constructor, lfs2, gfs2) = |
207 (case step2 of |
208 (case step2 of |
208 (Prove (qs2, label2, t, By_Metis (lfs2, gfs2))) => |
209 (Prove (qs2, label2, t, By_Metis (lfs2, gfs2))) => |
209 (fn by => Prove (qs2, label2, t, by), lfs2, gfs2) |
210 (fn by => Prove (qs2, label2, t, by), lfs2, gfs2) |
210 | (Obtain(qs2, xs, label2, t, By_Metis (lfs2, gfs2))) => |
211 | (Obtain(qs2, xs, label2, t, By_Metis (lfs2, gfs2))) => |
211 (fn by => Obtain (qs2, xs, label2, t, by), lfs2, gfs2) ) |
212 (fn by => Obtain (qs2, xs, label2, t, by), lfs2, gfs2) |
|
213 | _ => error "Internal error: unmergeable Isar steps" ) |
212 val lfs = remove (op =) label1 lfs2 |> union (op =) lfs1 |
214 val lfs = remove (op =) label1 lfs2 |> union (op =) lfs1 |
213 val gfs = union (op =) gfs1 gfs2 |
215 val gfs = union (op =) gfs1 gfs2 |
214 in step_constructor (By_Metis (lfs, gfs)) end |
216 in step_constructor (By_Metis (lfs, gfs)) end |
215 | merge _ _ = error "Internal error: Unmergeable Isar steps" |
217 | merge _ _ = error "Internal error: unmergeable Isar steps" |
216 |
218 |
217 fun try_merge metis_time (s1, i) (s2, j) = |
219 fun try_merge metis_time (s1, i) (s2, j) = |
218 (case get i metis_time |> Lazy.force of |
220 (case get i metis_time |> Lazy.force of |
219 NONE => (NONE, metis_time) |
221 NONE => (NONE, metis_time) |
220 | SOME t1 => |
222 | SOME t1 => |