| # ax = # ndx, jvalid0 ↔ jvalid2, jvalid ↔ jvalid1, ax0 = ax, fi1 = fi, gstore1 = gstore, jmaxino0 = jmaxino, jro = jro0, ndx0 = ndx, remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, ax.toSet ∩ range fi = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ jro0, fi0.inos < pmaxino, fi.inos < jmaxino, p_os < pmaxino, jro1 < jmaxino, inv(gstore0), inv(gstore \ jro0), key-cons(ndx), nodes-cons(ax, ndx, gstore, jro0), refsize-cons(gstore0, range fi0), refsize-cons(gstore, range fi), ri-inj(fi0), ri-inj(fi), pmaxino ≤ jmaxino, ndx.keys.toSet ⊆ dom fi, fi0.lebs ⊆ dom gstore0, fi.lebs ⊆ dom gstore, jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ ⟪if ndx.keys.toSet ⊆ dom fi ∧ # ax = # ndx ∧ key-cons(ndx) ∧ ax.toSet ∩ range fi = ∅ ∧ ¬ dups(ax) ∧ nodes-cons(ax, ndx, gstore, jro) then while ax ≠ [] do {/* (inv-gc-update-index : invariant # ax` = # ndx` ∧ (∃ ax0, ndx0. # ax0 = # ndx0 ∧ ax` = ax0 + ax ∧ ndx` = ndx0 + ndx ∧ fi = (fi`)[ndx0.keys, ax0]) ∧ dom fi = dom fi` ∧ inv-journal(nx, gstore, gstore0, jro) ∧ jmaxino` ≤ jmaxino ∧ fi.inos < jmaxino ∧ refsize-cons(gstore, range fi) ∧ ri-inj(fi) ∧ fi.lebs ⊆ dom gstore ∧ dom gstore = dom gstore` ∧ nodes-cons(ax, ndx, gstore, jro) ∧ nodes(gstore ↓, jro) = nodes(gstore` ↓, jro`) ∧ abs-log(nx, gstore ↓) = abs-log(nx`, gstore` ↓) ∧ (jvalid0 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro)) wfbound # ax) */; gjournal_index_store#(ndx.head.key, ax.head, fi0, jro, gstore0, nx, pmaxino, p_os, jvalid; jmaxino, fi, gstore); ax := ax.tail; ndx := ndx.tail} else abort⟫ ( jro1 < jmaxino ∧ pmaxino ≤ jmaxino ∧ fi1[ndx0.keys, ax0].inos < jmaxino ∧ jmaxino ≠ 0 ∧ (jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0)) ∧ fi1[ndx0.keys, ax0].lebs ⊆ dom gstore ∧ refsize-cons(gstore, range fi1[ndx0.keys, ax0]) ∧ inv(gstore \ jro0) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro0 ∧ ri-inj(fi1[ndx0.keys, ax0]) ∧ fi = fi1[ndx0.keys, ax0] ∧ dom gstore = dom gstore1 ∧ nodes(gstore ↓, jro0) = nodes(gstore1 ↓, jro0) ∧ abs-log(nx, gstore ↓) = abs-log(nx, gstore1 ↓) ∧ jmaxino0 ≤ jmaxino), jmaxino = 0, pmaxino = 0, dups(ax), dups(nx) |
# ax = # ndx, jvalid ↔ jvalid1, jvalid0 ↔ jvalid2, ax0 = ax, fi1 = fi, gstore1 = gstore, jmaxino0 = jmaxino, jro = jro0, ndx0 = ndx, remove-refsize0(gstore0) = gstore0, ax.toSet ∩ range fi = ∅, elems nx ∩ jro0 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ jro0, jro1 < jmaxino, p_os < pmaxino, fi.inos < jmaxino, fi0.inos < pmaxino, inv(gstore \ jro0), inv(gstore0), key-cons(ndx), nodes-cons(ax, ndx, gstore, jro0), refsize-cons(gstore, range fi), refsize-cons(gstore0, range fi0), ri-inj(fi), ri-inj(fi0), pmaxino ≤ jmaxino, fi.lebs ⊆ dom gstore, fi0.lebs ⊆ dom gstore0, ndx.keys.toSet ⊆ dom fi, jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ ⟪while ax ≠ [] do {/* (inv-gc-update-index : invariant # ax` = # ndx` ∧ (∃ ax0, ndx0. # ax0 = # ndx0 ∧ ax` = ax0 + ax ∧ ndx` = ndx0 + ndx ∧ fi = (fi`)[ndx0.keys, ax0]) ∧ dom fi = dom fi` ∧ inv-journal(nx, gstore, gstore0, jro) ∧ jmaxino` ≤ jmaxino ∧ fi.inos < jmaxino ∧ refsize-cons(gstore, range fi) ∧ ri-inj(fi) ∧ fi.lebs ⊆ dom gstore ∧ dom gstore = dom gstore` ∧ nodes-cons(ax, ndx, gstore, jro) ∧ nodes(gstore ↓, jro) = nodes(gstore` ↓, jro`) ∧ abs-log(nx, gstore ↓) = abs-log(nx`, gstore` ↓) ∧ (jvalid0 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro)) wfbound # ax) */; gjournal_index_store#(ndx.head.key, ax.head, fi0, jro, gstore0, nx, pmaxino, p_os, jvalid; jmaxino, fi, gstore); ax := ax.tail; ndx := ndx.tail}⟫ ( jro1 < jmaxino ∧ pmaxino ≤ jmaxino ∧ fi1[ndx0.keys, ax0].inos < jmaxino ∧ jmaxino ≠ 0 ∧ (jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0)) ∧ fi1[ndx0.keys, ax0].lebs ⊆ dom gstore ∧ refsize-cons(gstore, range fi1[ndx0.keys, ax0]) ∧ inv(gstore \ jro0) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro0 ∧ ri-inj(fi1[ndx0.keys, ax0]) ∧ fi = fi1[ndx0.keys, ax0] ∧ dom gstore = dom gstore1 ∧ nodes(gstore ↓, jro0) = nodes(gstore1 ↓, jro0) ∧ abs-log(nx, gstore ↓) = abs-log(nx, gstore1 ↓) ∧ jmaxino0 ≤ jmaxino), jmaxino = 0, pmaxino = 0, dups(nx), dups(ax)