| x0 = a0 + x, ((o[r => a × r0] * o[ls(r0, x1)]) * R)[rs, cf, af], (o[ls(r, x0)] * R0)[rs, cf, af], ∀ o, r, x0, R0, rs, cf, af, R. (o[ls(r, x0)] * R0)[rs, cf, af] ∧ (o[ls(r, x1)] * R)[rs, cf, af] → x1 = x0 ⊦ a ' + x1 = x0 |
((o[r => a × r0] * o[ls(r0, x1)]) * R)[rs, cf, af], ((o[r => a × r0] * o[ls(r0, x)]) * R0)[rs, cf, af], ∀ o, r, x0, R0, rs, cf, af, R. (o[ls(r, x0)] * R0)[rs, cf, af] ∧ (o[ls(r, x1)] * R)[rs, cf, af] → x1 = x0 ⊦ x1 = x
Used simplifier rules: ls-rec: ⊦ ls(r, a ' + x) = _∃(λ r0. r => a × r0 * ls(r0, x));% ⊦ a ' + x = b ' + y ↔ a = b ∧ x = y; (ws)% ⊦ a × r = a0 × r0 ↔ a = a0 ∧ r = r0; (ws)%map2: ⊦ (o1[r => ce] * R)[rs, cf, af] ∧ (o1[r => ce0] * R0)[rs, cf, af] → ce = ce0; (forward) from specification embed-aux[cell-heap-aux]%sep-com: ⊦ R0 * R1 = R1 * R0; from specification heap-sep[heap-aux]%sep-ass: ⊦ (R0 * R1) * R2 = R0 * R1 * R2; from specification heap-sep[heap-aux]% ⊦ (_∃ rR * R)[rs, cf, af] ↔ (∃ r. (rR(r) * R)[rs, cf, af]); (s)%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep% ⊦ o[P0 * P1] = o[P0] * o[P1]; (s)% ⊦ o[_∃ rP] = _∃(λ r. o[rP(r)]); (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ a + x = a ' + x; (s)