| replay-log(log, fs, fi ⊖ fo) = ri ⊖ ro, log-cons(log, fs), node-cons(nd.key, nd), replay-safe(log, fs, fi ⊖ fo), ri-cons(ri, fs) ⊦ replay-safe(log + adr ', fs[adr, nd], fi ⊖ fo) ∧ replay(log + adr ', fs[adr, nd], fi, fo) = ri[nd.key, adr] ⊖ ro ↔ replay-one(adr, nd, ri ⊖ ro) = ri[nd.key, adr] ⊖ ro, adr ∈ fs |
replay-log(log, fs, fi ⊖ fo) = ri ⊖ ro, log-cons(log, fs), node-cons(nd.key, nd), replay-safe(log, fs, fi ⊖ fo), ri-cons(ri, fs) ⊦ replay-safe(log + adr ', fs[adr, nd], fi ⊖ fo) ∧ replay-one(adr, nd, replay-log(log, fs[adr, nd], fi ⊖ fo)) = ri[nd.key, adr] ⊖ ro ↔ replay-one(adr, nd, ri ⊖ ro) = ri[nd.key, adr] ⊖ ro, adr ∈ fs
Used simplifier rules: replay-split: ⊦ replay(ax0 + ax1, fs, fi, fo) = replay-log(ax1, fs, replay(ax0, fs, fi, fo));%replay: ⊦ replay(log, fs, fi, fo) = replay-log(log, fs, fi ⊖ fo);%replay-log-one: ⊦ replay-log(adr ', fs, ri) = replay-one(adr, fs[adr], ri);%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ fs[adr, nd][adr] = nd; (s)