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