| # ax2 = # ndx1, jvalid0 ↔ jvalid2, jvalid ↔ jvalid1, abs-log(nx, gstore ↓) = abs-log(nx, gstore2 ↓), ax = ax1, ax0 = ax2, dom fi = dom fi2, dom gstore = dom gstore2, fi1 = fi2, gstore1 = gstore2, jmaxino0 = jmaxino1, jro = jro0, ndx0 = ndx1, nodes(gstore ↓, jro) = nodes(gstore2 ↓, jro), remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, ax2.toSet ∩ range fi2 = ∅, dom gstore0 ∪ elems nx = dom gstore2 ∪ jro0, fi0.inos < pmaxino, fi2.inos < jmaxino1, p_os < pmaxino, jro1 < jmaxino1, fi.inos < jmaxino, inv(gstore0), inv(gstore2 \ jro0), inv-journal(nx, gstore, gstore0, jro), key-cons(ndx1), nodes-cons(ax2, ndx1, gstore2, jro0), nodes-cons(ax, ndx, gstore, jro), refsize-cons(gstore0, range fi0), refsize-cons(gstore2, range fi2), refsize-cons(gstore, range fi), ri-inj(fi0), ri-inj(fi2), ri-inj(fi), pmaxino ≤ jmaxino1, jmaxino1 ≤ jmaxino, ndx1.keys.toSet ⊆ dom fi2, fi0.lebs ⊆ dom gstore0, fi2.lebs ⊆ dom gstore2, fi.lebs ⊆ dom gstore, jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore2, jro0), jvalid0 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro), ∃ ax0, ndx0. # ax0 = # ndx0 ∧ ax2 = ax0 + ax ∧ ndx1 = ndx0 + ndx ∧ fi = fi2[ndx0.keys, ax0] ⊦ ⟪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⟫ ( ( # ax2 = # ndx1 ∧ (∃ ax0, ndx0. # ax0 = # ndx0 ∧ ax2 = ax0 + ax ∧ ndx1 = ndx0 + ndx ∧ fi = fi2[ndx0.keys, ax0]) ∧ dom fi = dom fi2 ∧ inv-journal(nx, gstore, gstore0, jro) ∧ jmaxino1 ≤ jmaxino ∧ fi.inos < jmaxino ∧ refsize-cons(gstore, range fi) ∧ ri-inj(fi) ∧ fi.lebs ⊆ dom gstore ∧ dom gstore = dom gstore2 ∧ nodes-cons(ax, ndx, gstore, jro) ∧ nodes(gstore ↓, jro) = nodes(gstore2 ↓, jro) ∧ abs-log(nx, gstore ↓) = abs-log(nx, gstore2 ↓) ∧ (jvalid0 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro))) ∧ # ax < # ax1), ax = [], jmaxino1 = 0, pmaxino = 0, dups(ax2), dups(nx) |
# ax3 = # ndx2, # ax1 = # ndx, abs-log(nx, gstore ↓) = abs-log(nx, gstore2 ↓), dom gstore = dom gstore2, fi = fi2[ndx2.keys, ax3], nodes(gstore ↓, jro0) = nodes(gstore2 ↓, jro0), remove-refsize0(gstore0) = gstore0, elems nx ∩ jro0 = ∅, range fi2 ∩ ax1.toSet = ∅, range fi2 ∩ ax3.toSet = ∅, dom gstore0 ∪ elems nx = dom gstore2 ∪ jro0, ax1 ≠ [], jmaxino1 ≠ 0, pmaxino ≠ 0, fi0.inos < pmaxino, fi2.inos < jmaxino1, p_os < pmaxino, jro1 < jmaxino1, fi2[ndx2.keys, ax3].inos < jmaxino, inv(gstore \ jro0), inv(gstore0), inv(gstore2 \ jro0), key-cons(ndx), key-cons(ndx2), nodes-cons(ax3 + ax1, ndx2 + ndx, gstore2, jro0), nodes-cons(ax1, ndx, gstore, jro0), refsize-cons(gstore0, range fi0), refsize-cons(gstore2, range fi2), refsize-cons(gstore, range fi2[ndx2.keys, ax3]), ri-inj(fi0), ri-inj(fi2), pmaxino ≤ jmaxino, pmaxino ≤ jmaxino1, jmaxino1 ≤ jmaxino, ndx.keys.toSet ⊆ dom fi2, fi0.lebs ⊆ dom gstore0, fi2.lebs ⊆ dom gstore2, fi2[ndx2.keys, ax3].lebs ⊆ dom gstore2, ndx2.keys.toSet ⊆ dom fi2, ¬ dups(ax1), ¬ dups(ax3), ¬ dups(ax3 + ax1), ¬ dups(nx), jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore2, jro0), jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0) ⊦ ⟪gjournal_index_store#(ndx.head.key, ax1.head, fi0, jro0, gstore0, nx, pmaxino, p_os, jvalid; jmaxino, fi, gstore); ax0 := ax1.tail; ndx0 := ndx.tail⟫ ( (∃ ax2, ndx3. # ax2 = # ndx3 ∧ ax3 + ax1 = ax2 + ax0 ∧ ndx2 + ndx = ndx3 + ndx0 ∧ fi = fi2[ndx3.keys, ax2]) ∧ dom fi = dom fi2 ∧ inv(gstore \ jro0) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ jro0 ∧ jmaxino1 ≤ jmaxino ∧ fi.inos < jmaxino ∧ refsize-cons(gstore, range fi) ∧ ri-inj(fi) ∧ fi.lebs ⊆ dom gstore ∧ dom gstore = dom gstore2 ∧ nodes-cons(ax0, ndx0, gstore, jro0) ∧ nodes(gstore ↓, jro0) = nodes(gstore2 ↓, jro0) ∧ abs-log(nx, gstore ↓) = abs-log(nx, gstore2 ↓) ∧ (jvalid2 ∧ nx ≠ [] → valid-journal-head(nx, gstore, jro0)) ∧ # ax0 < # ax1)
Used simplifier rules: # ax = # kx ⊦ ri-inj(ri) ∧ ¬ dups(ax) ∧ ax.toSet ∩ range ri = ∅ → ri-inj(ri[kx, ax]); (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)%a: ⊦ ¬ dups(ax + ax0) → ¬ dups(ax) ∧ ¬ dups(ax0); (forward) from specification list-dup[address-list-set]%let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat%⊦ 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)% ⊦ key-cons(ndx0 + ndx1) ↔ key-cons(ndx0) ∧ key-cons(ndx1); (s)% ⊦ ks ∪ ks0 ⊆ ks1 ↔ ks ⊆ ks1 ∧ ks0 ⊆ ks1; (ws)%a: ⊦ (kx + kx0) + kx1 = kx + kx0 + kx1; from specification list[key-list-set]% ⊦ (kx + kx0).toSet = kx.toSet ∪ kx0.toSet; (s)% ⊦ (ndx0 + ndx1).keys = ndx0.keys + ndx1.keys; (s)%a: ⊦ (ndx + ndx0) + ndx1 = ndx + ndx0 + ndx1; from specification list[node-list]% ⊦ #(ndx + ndx0) = # ndx + # ndx0; (s)% ⊦ #(ax + ax0) = # ax + # ax0; (s)%unc: ⊦ ks ∪ ks0 = ks0 ∪ ks; from specification set-union[node-index]%una: ⊦ (ks ∪ ks0) ∪ ks1 = ks ∪ ks0 ∪ ks1; from specification set-union[node-index]% ⊦ ks ∪ ks0 = ks0 ↔ ks ⊆ ks0; (s)%# kx = # ax ⊦ dom ri[kx, ax] = dom ri ∪ kx.toSet; (s)% ⊦ # ndx.keys = # ndx; (s)%int-c: ⊦ as ∩ as0 = as0 ∩ as; from specification set-union[node-store]%int-a: ⊦ (as ∩ as0) ∩ as1 = as ∩ as0 ∩ as1; from specification set-union[node-store]%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[node-store]%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[node-store]% ⊦ as ∩ (as0 ∪ as1) = ∅ ↔ as ∩ as0 = ∅ ∧ as ∩ as1 = ∅; (ws)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ (ax + ax0).toSet = ax.toSet ∪ ax0.toSet; (s)