| move(IOAut(start, step, ext))(s, [], s2), s ≠ s2 ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2) |
s ≠ s2, move(IOAut(start, step, ext))(s, [], s2) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2)
| s ≠ s2, move(IOAut(start, step, ext))(s, [], s2) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2) |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
s ≠ s2, ∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ s = sl[0] ∧ s2 = sl.last ∧ IOAut(start, step, ext).ext !(al) = [] ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2)
Used terms: IOAut(start, step, ext), s, [], s2
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| s ≠ s2, ∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ s = sl[0] ∧ s2 = sl.last ∧ IOAut(start, step, ext).ext !(al) = [] ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2) |
ext !(al) = [], sl[0] ≠ sl.last, frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(sl[0], a, s1) ∧ move(IOAut(start, step, ext))(s1, [], sl.last)
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| ext !(al) = [], sl[0] ≠ sl.last, frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(sl[0], a, s1) ∧ move(IOAut(start, step, ext))(s1, [], sl.last) |
ext !(al) = [], sl = s + sl0, sl[0] ≠ sl.last, frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(sl[0], a, s1) ∧ move(IOAut(start, step, ext))(s1, [], sl.last)
Used simplifier rules: not-finfrag-empty: ⊦ ¬ frag*(IOAut(start, step, ext))([], al); List('a) freely generated by [], +;;
| ext !(al) = [], sl = s + sl0, sl[0] ≠ sl.last, frag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(sl[0], a, s1) ∧ move(IOAut(start, step, ext))(s1, [], sl.last) |
ext !(al) = [], s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(s ' + sl0, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last)
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s)
| ext !(al) = [], s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(s ' + sl0, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last) |
ext !(al) = [], al = a0 + al0, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(s ' + sl0, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last)
Used simplifier rules: finfrag-onlyone: ⊦ frag*(IOAut(start, step, ext))(sl, []) ↔ sl = sl.head '; List('a) freely generated by [], +;; ⊦ ext !([]) = []; (s) ⊦ (a ' + x).head = a; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a '.last = a; (s)
| ext !(al) = [], al = a0 + al0, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(s ' + sl0, al) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last) |
ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(s ' + sl0, a0 ' + al0) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last)
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s) ⊦ ext !(al + al0) = ext !(al) + ext !(al0); (s)
| ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(s ' + sl0, a0 ' + al0) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last) |
⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al)
ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: al0, s, ext, sl0, a0, start, step
| ⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al) |
| ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], (s ' + sl0).last) |
ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ ext(a0) = None ∧ step(s, a0, hd(⌜sl0⌝ )) ∧ move(IOAut(start, step, ext))(hd(⌜sl0⌝ ), [], (s ' + sl0).last)
Used terms: hd(⌜sl0⌝ ), a0
| ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ ext(a0) = None ∧ step(s, a0, hd(⌜sl0⌝ )) ∧ move(IOAut(start, step, ext))(hd(⌜sl0⌝ ), [], (s ' + sl0).last) |
ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ move(IOAut(start, step, ext))(hd(⌜sl0⌝ ), [], (s ' + sl0).last)
| ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ move(IOAut(start, step, ext))(hd(⌜sl0⌝ ), [], (s ' + sl0).last) |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ (∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ hd(⌜sl0⌝ ) = sl[0] ∧ (s ' + sl0).last = sl.last ∧ IOAut(start, step, ext).ext !(al) = [])
Used terms: IOAut(start, step, ext), hd(⌜sl0⌝ ), [], (s ' + sl0).last
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ (∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ hd(⌜sl0⌝ ) = sl[0] ∧ (s ' + sl0).last = sl.last ∧ IOAut(start, step, ext).ext !(al) = []) |
ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ (∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ hd(⌜sl0⌝ ) = sl[0] ∧ (s ' + sl0).last = sl.last ∧ ext !(al) = [])
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| ext !(al0) = [], ext(a0) = None, s ≠ (s ' + sl0).last, frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, sl0.head) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ (∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ hd(⌜sl0⌝ ) = sl[0] ∧ (s ' + sl0).last = sl.last ∧ ext !(al) = []) |
ext !(al0) = [], ext(a0) = None, sl0 = s0 + sl1, s ≠ (s ' + sl0).last, sl0 ≠ [], frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, s0) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ (∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ hd(⌜sl0⌝ ) = sl[0] ∧ (s ' + sl0).last = sl.last ∧ ext !(al) = [])
Used simplifier rules: ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a '.last = a; (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: sl0, s0, sl1
| ext !(al0) = [], ext(a0) = None, sl0 = s0 + sl1, s ≠ (s ' + sl0).last, sl0 ≠ [], frag*(IOAut(start, step, ext))(sl0, al0), step(s, a0, s0) ⊦ step(s, a0, hd(⌜sl0⌝ )) ∧ (∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ hd(⌜sl0⌝ ) = sl[0] ∧ (s ' + sl0).last = sl.last ∧ ext !(al) = []) |
ext !(al0) = [], ext(a0) = None, s ≠ (s0 ' + sl1).last, frag*(IOAut(start, step, ext))(s0 ' + sl1, al0), step(s, a0, s0) ⊦ ∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ s0 = sl[0] ∧ (sl[0] ' + sl1).last = sl.last ∧ ext !(al) = []
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (b ' + a ' + x).last = (a ' + x).last; (s) ⊦ a + x = a ' + x; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ hd(⌜a '⌝ + ⌜x⌝ ) = a; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| ext !(al0) = [], ext(a0) = None, s ≠ (s0 ' + sl1).last, frag*(IOAut(start, step, ext))(s0 ' + sl1, al0), step(s, a0, s0) ⊦ ∃ al, sl. frag*(IOAut(start, step, ext))(sl, al) ∧ s0 = sl[0] ∧ (sl[0] ' + sl1).last = sl.last ∧ ext !(al) = [] |
Used simplifier rules: ⊦ (a ' + x)[0] = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: al0, s0 ' + sl1
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.