| ⊦ (o[lst(r)] * hR)[rs, cf, af] ∧ r ≠ null → r ∈ rs |
r ≠ null, (o[lst(r)] * hR)[rs, cf, af], ¬ r ∈ rs ⊦
| r ≠ null, (o[lst(r)] * hR)[rs, cf, af], ¬ r ∈ rs ⊦ |
r ≠ null, (o[_∃(λ x. ls(r, x))] * hR)[rs, cf, af], ¬ r ∈ rs ⊦
Used simplifier rules: lst-rec: ⊦ r ≠ null → lst(r) = _∃(λ x. ls(r, x));
| r ≠ null, (o[_∃(λ x. ls(r, x))] * hR)[rs, cf, af], ¬ r ∈ rs ⊦ |
⊦ (o[_∃ xv] * hR)[rs, cf, af] ↔ (∃ x. (o[xv(x)] * hR)[rs, cf, af])
r ≠ null, ¬ r ∈ rs, ∃ x. (o[ls(r, x)] * hR)[rs, cf, af] ⊦
Used terms: hR, cf, λ x. ls(r, x), rs, af, o
| ⊦ (o[_∃ xv] * hR)[rs, cf, af] ↔ (∃ x. (o[xv(x)] * hR)[rs, cf, af]) |
| r ≠ null, ¬ r ∈ rs, ∃ x. (o[ls(r, x)] * hR)[rs, cf, af] ⊦ |
r ≠ null, (o[ls(r, x)] * hR)[rs, cf, af], ¬ r ∈ rs ⊦
| r ≠ null, (o[ls(r, x)] * hR)[rs, cf, af], ¬ r ∈ rs ⊦ |
⊦ (hR0 * hR1)[rs, f, g] ↔ (∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ hR0[rs0, f, g] ∧ hR1[rs1, f, g])
r ≠ null, ¬ r ∈ rs, ∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ o[ls(r, x)][rs0, cf, af] ∧ hR[rs1, cf, af] ⊦
Used terms: cf, rs, hR, af, o[ls(r, x)]
| ⊦ (hR0 * hR1)[rs, f, g] ↔ (∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ hR0[rs0, f, g] ∧ hR1[rs1, f, g]) |
| r ≠ null, ¬ r ∈ rs, ∃ rs0, rs1. rs0 ∪ rs1 = rs ∧ rs0 ∩ rs1 = ∅ ∧ o[ls(r, x)][rs0, cf, af] ∧ hR[rs1, cf, af] ⊦ |
rs0 ∩ rs1 = ∅, r ≠ null, o[ls(r, x)][rs0, cf, af], hR[rs1, cf, af], ¬ r ∈ rs0, ¬ r ∈ rs1 ⊦
Used simplifier rules: unc: ⊦ s ∪ s0 = s0 ∪ s; from specification set-union[refset] una: ⊦ (s ∪ s0) ∪ s1 = s ∪ s0 ∪ s1; from specification set-union[refset] ⊦ a ∈ s ∪ s0 ↔ ¬(¬ a ∈ s ∧ ¬ a ∈ s0); (ss)
| rs0 ∩ rs1 = ∅, r ≠ null, o[ls(r, x)][rs0, cf, af], hR[rs1, cf, af], ¬ r ∈ rs0, ¬ r ∈ rs1 ⊦ |
⊦ hR[rs, f, g] ↔ hR(mk(rs, f, g))
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], o[ls(r, x)](mk(rs0, cf, af)), ¬ r ∈ rs0, ¬ r ∈ rs1 ⊦
Used terms: o[ls(r, x)], rs0, cf, af
| ⊦ hR[rs, f, g] ↔ hR(mk(rs, f, g)) |
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], o[ls(r, x)](mk(rs0, cf, af)), ¬ r ∈ rs0, ¬ r ∈ rs1 ⊦ |
⊦ a[hP](mk(rs, f, g)) ↔ hP(mk(rs, f)) ∧ (∀ r. r ∈ rs → g(r) = a)
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦
Used terms: cf, o, ls(r, x), rs0, af
| ⊦ a[hP](mk(rs, f, g)) ↔ hP(mk(rs, f)) ∧ (∀ r. r ∈ rs → g(r) = a) |
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
x = a + x0, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦
Used simplifier rules: ls-base: ⊦ ls(r, []) = (emp ∧ ⌜r = null⌝ ); list freely generated by [], +;; ⊦ ⌜false⌝ = false; (s) ⊦ (false ∧ hP) = false; (s) and-ass: ⊦ ((hP0 ∧ hP1) ∧ hP2) = (hP0 ∧ hP1 ∧ hP2); from specification heap-sep and-com: ⊦ (hP0 ∧ hP1) = (hP1 ∧ hP0); from specification heap-sep ⊦ ¬ false(h); (s)
| x = a + x0, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r, x)(mk(rs0, cf)), ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦
Used simplifier rules: ls-rec: ⊦ ls(r, a ' + x) = _∃(λ r0. r => a × r0 * ls(r0, x)); ⊦ (_∃ rP)(h) ↔ (∃ r. rP(r)(h)); (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s)
| rs0 ∩ rs1 = ∅, r ≠ null, ((r => a × r0 * ls(r0, x0)))(mk(rs0, cf)), hR[rs1, cf, af], ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1))
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o, ∃ h0, h1. h0 ⊥ h1 ∧ mk(rs0, cf) = h0 ∪ h1 ∧ ((r => a × r0))(h0) ∧ ls(r0, x0)(h1) ⊦
Used terms: mk(rs0, cf), ls(r0, x0), r => a × r0
| ⊦ ((hP0 * hP1))(h) ↔ (∃ h0, h1. h0 ⊥ h1 ∧ h = h0 ∪ h1 ∧ hP0(h0) ∧ hP1(h1)) |
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o, ∃ h0, h1. h0 ⊥ h1 ∧ mk(rs0, cf) = h0 ∪ h1 ∧ ((r => a × r0))(h0) ∧ ls(r0, x0)(h1) ⊦ |
mk(rs0, cf) = h0 ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦
| mk(rs0, cf) = h0 ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, ((r => a × r0))(h0), hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
⊦ ((r => o))(h) ↔ h = (∅ ++ r)[r, o] ∧ r ≠ null
h0 = (∅ ++ r)[r, a × r0], mk(rs0, cf) = h0 ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦
Used terms: h0, a × r0, r
| ⊦ ((r => o))(h) ↔ h = (∅ ++ r)[r, o] ∧ r ≠ null |
| h0 = (∅ ++ r)[r, a × r0], mk(rs0, cf) = h0 ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), h0 ⊥ h1, ¬ r ∈ rs0, ¬ r ∈ rs1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
mk(rs0, cf) = (∅ ++ r)[r, a × r0] ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ∀ r. r ∈ rs0 → af(r) = o ⊦
Used simplifier rules: r ≠ null ⊦ (∅ ++ r)[r, o] ⊥ h ↔ ¬ r ∈ h; (s)
| mk(rs0, cf) = (∅ ++ r)[r, a × r0] ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
⊦ h0 = h1 ↔ (∀ r. (r ∈ h0 ↔ r ∈ h1) ∧ (r ∈ h0 → h0[r] = h1[r]))
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ∀ r. r ∈ rs0 → af(r) = o, ∀ r1. (r1 ∈ mk(rs0, cf) ↔ r1 ∈ (∅ ++ r)[r, a × r0] ∪ h1) ∧ (r1 ∈ mk(rs0, cf) → mk(rs0, cf)[r1] = ((∅ ++ r)[r, a × r0] ∪ h1)[r1]) ⊦
Used terms: (∅ ++ r)[r, a × r0] ∪ h1, mk(rs0, cf)
| ⊦ h0 = h1 ↔ (∀ r. (r ∈ h0 ↔ r ∈ h1) ∧ (r ∈ h0 → h0[r] = h1[r])) |
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ∀ r. r ∈ rs0 → af(r) = o, ∀ r1. (r1 ∈ mk(rs0, cf) ↔ r1 ∈ (∅ ++ r)[r, a × r0] ∪ h1) ∧ (r1 ∈ mk(rs0, cf) → mk(rs0, cf)[r1] = ((∅ ++ r)[r, a × r0] ∪ h1)[r1]) ⊦ |
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ∀ r. r ∈ rs0 → af(r) = o, ∀ r1. (r1 ∈ rs0 ↔ r1 ∈ (∅ ++ r)[r, a × r0] ∪ h1) ∧ (r1 ∈ rs0 → cf(r1) = ((∅ ++ r)[r, a × r0] ∪ h1)[r1]) ⊦
Used simplifier rules: ⊦ r ∈ rs → mk(rs, f)[r] = f(r); (s) ⊦ r ∈ mk(rs, f) ↔ r ∈ rs; (s)
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ∀ r. r ∈ rs0 → af(r) = o, ∀ r1. (r1 ∈ rs0 ↔ r1 ∈ (∅ ++ r)[r, a × r0] ∪ h1) ∧ (r1 ∈ rs0 → cf(r1) = ((∅ ++ r)[r, a × r0] ∪ h1)[r1]) ⊦ |
r ∈ rs0 ↔ r ∈ (∅ ++ r)[r, a × r0] ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, r ∈ rs0 → cf(r) = ((∅ ++ r)[r, a × r0] ∪ h1)[r], ∀ r. r ∈ rs0 → af(r) = o ⊦
Used terms: r
| r ∈ rs0 ↔ r ∈ (∅ ++ r)[r, a × r0] ∪ h1, rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, r ∈ rs0 → cf(r) = ((∅ ++ r)[r, a × r0] ∪ h1)[r], ∀ r. r ∈ rs0 → af(r) = o ⊦ |
rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ¬ r ∈ (∅ ++ r)[r, a × r0] ∪ h1, ∀ r. r ∈ rs0 → af(r) = o ⊦
| rs0 ∩ rs1 = ∅, r ≠ null, hR[rs1, cf, af], ls(r0, x0)(h1), ¬ r ∈ rs0, ¬ r ∈ rs1, ¬ r ∈ h1, ¬ r ∈ (∅ ++ r)[r, a × r0] ∪ h1, ∀ r. r ∈ rs0 → af(r) = o ⊦ |
⊦ h0 ⊥ h1 → (r ∈ h0 ∪ h1 ↔ r ∈ h0 ∨ r ∈ h1)
Used simplifier rules: r ≠ null ⊦ (∅ ++ r)[r, o] ⊥ h ↔ ¬ r ∈ h; (s) ⊦ r ∈ h[r0, o] ↔ r ∈ h; (s) ⊦ ¬ r ∈ ∅; (s) r0 ≠ null, ¬ r0 ∈ h ⊦ r ∈ h ++ r0 ↔ r = r0 ∨ r ∈ h; (s) Used terms: h1, (∅ ++ r)[r, a × r0], r
| ⊦ h0 ⊥ h1 → (r ∈ h0 ∪ h1 ↔ r ∈ h0 ∨ r ∈ h1) |
The following image shows the proof tree of sequent calculus. The proved goal is at the bottom. You can click on the nodes to view additional rules. See here for details on colors in a proof tree.