| gstore[@(m0, m1, m2)] = mkgnode(nd, m, boolvar, boolvar0), fi1 = fi, remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ jro0, jmaxino ≠ 0, pmaxino ≠ 0, jro1 < jmaxino, p_os < pmaxino, fi.inos < jmaxino, fi0.inos < pmaxino, inv(gstore \ jro0), inv(gstore0), key-cons(key, nd), refsize-cons(gstore, range fi), refsize-cons(gstore0, range fi0), ri-inj(fi), ri-inj(fi0), @(m0, m1, m2) ∈ gstore, pmaxino ≤ jmaxino, fi.lebs ⊆ dom gstore, fi0.lebs ⊆ dom gstore0, ¬ dups(nx), ¬ @(m0, m1, m2) ∈ fi, jvalid1 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ ⟪index_index_store#(key, @(m0, m1, m2), fi0, jro0, gstore, gstore0, nx, pmaxino, p_os, jvalid0; adr, jvalid, fi); let n = ? in {jro := jro0; gstore1 := gstore; if jvalid then {index_get_gblock_refsize#(adr.lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid0; ; n); index_set_gblock_refsize#(adr.lnum, n - adr.size, fi, fi0, jro, gstore0, nx, pmaxino, p_os, jvalid0; gstore)}; index_get_gblock_refsize#(m0, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid0; ; n); index_set_gblock_refsize#(m0, n + m2, fi, fi0, jro, gstore0, nx, pmaxino, p_os, jvalid0; gstore)}; jmaxino := max(key.ino + 1, jmaxino)⟫ ( jro1 < jmaxino ∧ pmaxino ≤ jmaxino ∧ fi1.inos ∪ (key.inode? ⊃ ∅ ++ key.ino;∅) < jmaxino ∧ jmaxino ≠ 0 ∧ (jvalid1 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0)) ∧ fi1[key, @(m0, m1, m2)].lebs ⊆ dom gstore ∧ refsize-cons(gstore, range fi1[key, @(m0, m1, m2)]) ∧ inv(gstore \ jro0) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro0 ∧ ri-inj(fi1[key, @(m0, m1, m2)]) ∧ gstore =○refsize gstore1 ∧ fi = fi1[key, @(m0, m1, m2)]) |
inv-journal(nx, gstore, gstore0, ginval), ri-inj(fi), ri-inj(fi0), ¬ adr ∈ fi, adr ∈ gstore, key-cons(key, gstore[adr].nd) ⊦ ⟪index_index_store#(key, adr, fi0, ginval, gstore, gstore0, nx, maxino, ginval0, syn; adr0, syn0, fi)⟫ ri-inj(fi)
syn1 ↔ jvalid0, gstore[@(m0, m1, m2)] = mkgnode(nd, m, boolvar, boolvar0), adr1 = @(m0, m1, m2), fi1 = fi, fi2 = fi0, ginval1 = jro0, ginval2 = p_os, gstore2 = gstore, gstore3 = gstore0, key0 = key, maxino0 = pmaxino, nx0 = nx, remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ jro0, fi0.inos < pmaxino, fi.inos < jmaxino, p_os < pmaxino, jro1 < jmaxino, inv(gstore0), inv(gstore \ jro0), inv-journal(nx, gstore, gstore0, jro0), key-cons(key, nd), key-cons(key, gstore[@(m0, m1, m2)].nd), refsize-cons(gstore0, range fi0), refsize-cons(gstore, range fi), ri-inj(fi), ri-inj(fi0), @(m0, m1, m2) ∈ gstore, pmaxino ≤ jmaxino, fi0.lebs ⊆ dom gstore0, fi.lebs ⊆ dom gstore, jvalid1 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ [index_index_store#(key, @(m0, m1, m2), fi0, jro0, gstore, gstore0, nx, pmaxino, p_os, jvalid0; adr, jvalid, fi)] ( ri-inj(fi) → ⟪let n = ? in {jro := jro0; gstore1 := gstore; if jvalid then {index_get_gblock_refsize#(adr.lnum, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid0; ; n); index_set_gblock_refsize#(adr.lnum, n - adr.size, fi, fi0, jro, gstore0, nx, pmaxino, p_os, jvalid0; gstore)}; index_get_gblock_refsize#(m0, fi, fi0, jro, gstore, gstore0, nx, pmaxino, p_os, jvalid0; ; n); index_set_gblock_refsize#(m0, n + m2, fi, fi0, jro, gstore0, nx, pmaxino, p_os, jvalid0; gstore)}; jmaxino := max(key.ino + 1, jmaxino)⟫ ( jro1 < jmaxino ∧ pmaxino ≤ jmaxino ∧ fi1.inos ∪ (key.inode? ⊃ ∅ ++ key.ino;∅) < jmaxino ∧ jmaxino ≠ 0 ∧ (jvalid1 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0)) ∧ fi1[key, @(m0, m1, m2)].lebs ⊆ dom gstore ∧ refsize-cons(gstore, range fi1[key, @(m0, m1, m2)]) ∧ inv(gstore \ jro0) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro0 ∧ ri-inj(fi1[key, @(m0, m1, m2)]) ∧ gstore =○refsize gstore1 ∧ fi = fi1[key, @(m0, m1, m2)])), jmaxino = 0, pmaxino = 0, dups(nx), @(m0, m1, m2) ∈ fi
Used simplifier rules: ⊦ inv-journal(nx, gstore, gstore0, ginval) ↔ inv(gstore \ ginval) ∧ inv(gstore0) ∧ elems nx ∩ ginval = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ remove-refsize0(gstore0) = gstore0; (s)% ⊦ mkgnode(nd, m, boolvar, boolvar0).nd = nd; (s)