| jvalid1 ↔ jvalid, jvalid ↔ true, err = err0, err = ESUCCESS, fi = fi2, fi0 = fi, fi2 = fi4, fi3 = fi2, gstore = gstore3, gstore0 = crash(gstore2, gstore3, jro3, nx3), gstore1 = gstore, jmaxino = pmaxino, jmaxino1 = pmaxino, jro = jro3, jro0 = p_os, jro1 = p_os, jro4 = jro, nx = nx3, nx0 = nx, nx1 = nx, nx2 = nx0, p_os = jro5, pmaxino = jmaxino0, remove-refsize0(gstore3) = gstore3, elems nx3 ∩ jro3 = ∅, dom gstore3 ∪ elems nx3 = dom gstore2 ∪ jro3, jro2 < jmaxino3, jro5 < jmaxino0, fi1.inos < jmaxino3, fi4.inos < jmaxino0, inv(gstore2 \ jro3), inv(gstore3), refsize-cons(gstore2, range fi1), refsize-cons(gstore3, range fi4), ri-inj(fi1), ri-inj(fi4), jmaxino0 ≤ jmaxino3, fi1.lebs ⊆ dom gstore2, fi4.lebs ⊆ dom gstore3, jvalid0 ∧ nx3 ≠ [] → valid-journal-head(nx3, gstore2, jro3), ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ ⟪gjournal_restore_log#(nx2, fi0, fi3, jro4, gstore0, gstore1, nx1, jmaxino1, jro1, jvalid1; log; err); ks := jro0.keys⟫ ( err = ESUCCESS → jvalid1 ∧ jro0 < jmaxino ∧ jro1 < jmaxino1 ∧ jmaxino1 ≤ jmaxino ∧ fi0.inos < jmaxino ∧ fi3.inos < jmaxino1 ∧ jmaxino ≠ 0 ∧ jmaxino1 ≠ 0 ∧ fi0.lebs ⊆ dom gstore0 ∧ fi3.lebs ⊆ dom gstore1 ∧ refsize-cons(gstore0, range fi0) ∧ refsize-cons(gstore1, range fi3) ∧ inv(gstore0 \ jro4) ∧ inv(gstore1) ∧ elems nx1 ∩ jro4 = ∅ ∧ ¬ dups(nx1) ∧ dom gstore1 ∪ elems nx1 = dom gstore0 ∪ jro4 ∧ remove-refsize0(gstore1) = gstore1 ∧ ri-inj(fi0) ∧ ri-inj(fi3)), jmaxino0 = 0, jmaxino3 = 0, dups(nx3) |
remove-refsize0(gstore3) = gstore3, elems nx3 ∩ jro3 = ∅, dom gstore3 ∪ elems nx3 = dom gstore2 ∪ jro3, jmaxino0 ≠ 0, jmaxino3 ≠ 0, fi4.inos < jmaxino0, fi1.inos < jmaxino3, jro5 < jmaxino0, jro2 < jmaxino3, inv(gstore3), inv(gstore2 \ jro3), refsize-cons(gstore3, range fi4), refsize-cons(gstore2, range fi1), ri-inj(fi4), ri-inj(fi1), jmaxino0 ≤ jmaxino3, fi4.lebs ⊆ dom gstore3, fi1.lebs ⊆ dom gstore2, ¬ dups(nx3), jvalid0 ∧ nx3 ≠ [] → valid-journal-head(nx3, gstore2, jro3) ⊦ ⟪gjournal_restore_log#(nx3, fi4, fi4, jro3, crash(gstore2, gstore3, jro3, nx3), gstore3, nx3, jmaxino0, jro5, true; log; err); ks := jro5.keys⟫ (err = ESUCCESS → fi4.lebs ⊆ dom gstore2 ∪ jro3 ∧ dom gstore3 ∪ elems nx3 = (dom gstore2 ∪ jro3) ∪ jro3)
Used simplifier rules: ⊦ inv(gstore \ ginval) ∧ inv(gstore0) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval → inv(crash(gstore, gstore0, ginval, nx) \ ginval); (ss)%⊦ refsize-cons(gstore0, range fi) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ fi.lebs ⊆ dom gstore0 → refsize-cons(crash(gstore, gstore0, ginval, nx), range fi); (ss)%unc: ⊦ ns ∪ ns0 = ns0 ∪ ns; from specification set-union[nat-set]%una: ⊦ (ns ∪ ns0) ∪ ns1 = ns ∪ ns0 ∪ ns1; from specification set-union[nat-set]% ⊦ dom crash(gstore, gstore0, ginval, nx) = dom gstore ∪ ginval; (s)% ⊦ m ≤ m; (s)% ⊦ ns < n ∧ n ≤ m → (ns < m ↔ true); (ss)% ⊦ ¬ ⌊ESUCCESS⌋ ; (s)