| bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), move(IOAut(cstart, cstep, cext))(cs, el, cs0), t(cs0, as0), aINV(as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), move(IOAut(cstart, cstep, cext))(cs, el, cs0), t(cs0, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), move(IOAut(cstart, cstep, cext))(cs, el, cs0), t(cs0, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), move(IOAut(cstart, cstep, cext))(cs, el, cs0), t(cs0, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), move(IOAut(cstart, cstep, cext))(cs, el, cs0), t(cs0, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as) |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), t(cs0, as0), ∃ al, sl. frag*(IOAut(cstart, cstep, cext))(sl, al) ∧ cs = sl[0] ∧ cs0 = sl.last ∧ IOAut(cstart, cstep, cext).ext !(al) = el ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as)
Used terms: IOAut(cstart, cstep, cext), cs, el, cs0
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), t(cs0, as0), ∃ al, sl. frag*(IOAut(cstart, cstep, cext))(sl, al) ∧ cs = sl[0] ∧ cs0 = sl.last ∧ IOAut(cstart, cstep, cext).ext !(al) = el ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, el, as0) ∧ t(cs, as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, cal), t(csl.last, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal), as0) ∧ t(csl[0], as)
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, cal), t(csl.last, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal), as0) ∧ t(csl[0], as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, []), t(csl.last, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !([]), as0) ∧ t(csl[0], as)
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca + cal0), t(csl.last, as0), ∀ aINV, as0, cstart, cstep, cext, astart, astep, aext, t, cINV, csl. aINV(as0) ∧ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ∧ cINV(csl[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl, cal0) ∧ t(csl.last, as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl[0], as)) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca + cal0), as0) ∧ t(csl[0], as)
Used simplifier rules: List('a) freely generated by [], +;;
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, []), t(csl.last, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !([]), as0) ∧ t(csl[0], as) |
csl = csl.head ', aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), t(csl.head, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, [], as0) ∧ t(csl[0], as)
Used simplifier rules: ⊦ ext !([]) = []; (s) ⊦ x = x.head ' → x.last = x.head; (s) ⊦ frag*(IOAut(start, step, ext))(sl, []) ↔ sl = sl.head '; (s)
| csl = csl.head ', aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), t(csl.head, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, [], as0) ∧ t(csl[0], as) |
csl = cs ', csl = cs + csl0, csl ≠ [], aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), t(cs, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, [], as0) ∧ t(csl[0], as)
Used simplifier rules: ⊦ a ' ≠ []; (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: csl, cs, csl0
| csl = cs ', csl = cs + csl0, csl ≠ [], aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), t(cs, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, [], as0) ∧ t(csl[0], as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), t(cs, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, [], as0) ∧ t(cs, as)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), t(cs, as0) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, [], as0) ∧ t(cs, as) |
Used simplifier rules: ⊦ move(IOAut(start, step, ext))(s, [], s); (s) Used terms: as0
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca + cal0), t(csl.last, as0), ∀ aINV, as0, cstart, cstep, cext, astart, astep, aext, t, cINV, csl. aINV(as0) ∧ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ∧ cINV(csl[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl, cal0) ∧ t(csl.last, as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl[0], as)) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca + cal0), as0) ∧ t(csl[0], as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), ∀ aINV, as0, cstart, cstep, cext, astart, astep, aext, t, cINV, csl. aINV(as0) ∧ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ∧ cINV(csl[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl, cal0) ∧ t(csl.last, as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl[0], as)) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s) ⊦ ext !(al + al0) = ext !(al) + ext !(al0); (s) ⊦ a + x = a ' + x; (s)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), ∀ aINV, as0, cstart, cstep, cext, astart, astep, aext, t, cINV, csl. aINV(as0) ∧ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ∧ cINV(csl[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl, cal0) ∧ t(csl.last, as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl[0], as)) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), aINV(as0) ∧ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ∧ cINV(csl.tail[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl.tail, cal0) ∧ t(csl.tail.last, as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl.tail[0], as)) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as)
Used terms: aINV, as0, cstart, cstep, cext, astart, astep, aext, t, cINV, csl.tail
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), aINV(as0) ∧ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ∧ cINV(csl.tail[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl.tail, cal0) ∧ t(csl.tail.last, as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl.tail[0], as)) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), cINV(csl.tail[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl.tail, cal0) ∧ t(csl.tail.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl.tail[0], as) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), cINV(csl.tail[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl.tail, cal0) ∧ t(csl.tail.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl.tail[0], as) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as) |
csl = cs + csl0, csl ≠ [], aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), cINV(csl0[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl0, cal0) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as)
Used simplifier rules: ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: csl, cs, csl0
| csl = cs + csl0, csl ≠ [], aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(csl[0]), frag*(IOAut(cstart, cstep, cext))(csl, ca ' + cal0), t(csl.last, as0), cINV(csl0[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl0, cal0) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(csl[0], as) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, ca ' + cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl0, cal0) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, ca ' + cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl0, cal0) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al)
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, csl0.head), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl0, cal0) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used terms: cal0, cs, cext, csl0, ca, cstart, cstep
| ⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al) |
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, csl0.head), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ frag*(IOAut(cstart, cstep, cext))(csl0, cal0) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, csl0.head), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, csl0.head), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
csl0 = cs0 + csl, csl0 ≠ [], aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used simplifier rules: ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a '.last = a; (s) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: csl0, cs0, csl
| csl0 = cs0 + csl, csl0 ≠ [], aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), t((cs ' + csl0).last, as0), cINV(csl0[0]) ∧ t(csl0.last, as0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(csl0[0], as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), t((cs0 ' + csl).last, as0), cINV(cs0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(cs0, as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) ⊦ a + x = a ' + x; (s) ⊦ (b ' + a ' + x).last = (a ' + x).last; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| aINV(as0), bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), t((cs0 ' + csl).last, as0), cINV(cs0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(cs0, as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
⊦ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ↔ (∀ cs. cstart(cs) → cINV(cs)) ∧ (∀ as. astart(as) → aINV(as)) ∧ (∀ cs, ca, cs0. cINV(cs) ∧ cstep(cs, ca, cs0) → cINV(cs0)) ∧ (∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0)) ∧ (∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as))) ∧ (∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as)) ∧ (∀ cs, ca, cs0, as0. cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as0) ∧ aINV(as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ t(cs, as)))
aINV(as0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), t((cs0 ' + csl).last, as0), cINV(cs0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(cs0, as), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ cs, ca, cs0. cINV(cs) ∧ cstep(cs, ca, cs0) → cINV(cs0), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs, ca, cs0, as0. cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as0) ∧ aINV(as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ t(cs, as)) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used terms: cstep, cext, aext, t, astart, cstart, cINV, astep, aINV
| ⊦ bwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), t, cINV, aINV) ↔ (∀ cs. cstart(cs) → cINV(cs)) ∧ (∀ as. astart(as) → aINV(as)) ∧ (∀ cs, ca, cs0. cINV(cs) ∧ cstep(cs, ca, cs0) → cINV(cs0)) ∧ (∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0)) ∧ (∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as))) ∧ (∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as)) ∧ (∀ cs, ca, cs0, as0. cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as0) ∧ aINV(as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ t(cs, as))) |
| aINV(as0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), t((cs0 ' + csl).last, as0), cINV(cs0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(cs0, as), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ cs, ca, cs0. cINV(cs) ∧ cstep(cs, ca, cs0) → cINV(cs0), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs, ca, cs0, as0. cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as0) ∧ aINV(as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ t(cs, as)) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), t((cs0 ' + csl).last, as0), cINV(cs0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(cs0, as), cINV(cs) ∧ cstep(cs, ca, cs0) → cINV(cs0), ∀ cs, ca, cs0, as0. cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as0) ∧ aINV(as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ t(cs, as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ as. astart(as) → aINV(as), ∀ cs. cstart(cs) → cINV(cs) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used terms: cs, ca, cs0
| aINV(as0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), t((cs0 ' + csl).last, as0), cINV(cs0) → aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(cal0), as0) ∧ t(cs0, as), cINV(cs) ∧ cstep(cs, ca, cs0) → cINV(cs0), ∀ cs, ca, cs0, as0. cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as0) ∧ aINV(as0) → (∃ as. aINV(as) ∧ move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ t(cs, as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ as. astart(as) → aINV(as), ∀ cs. cstart(cs) → cINV(cs) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as0), aINV(as), cINV(cs), cINV(cs0), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), t((cs0 ' + csl).last, as0), t(cs0, as), ∀ cs1, ca0, cs2, as1. cINV(cs1) ∧ cstep(cs1, ca0, cs2) ∧ t(cs2, as1) ∧ aINV(as1) → (∃ as2. aINV(as2) ∧ move(IOAut(astart, astep, aext))(as2, (cext(ca0) = None ⊃ [];cext(ca0).get '), as1) ∧ t(cs1, as2)), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used simplifier rules: ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s)
| aINV(as0), aINV(as), cINV(cs), cINV(cs0), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), t((cs0 ' + csl).last, as0), t(cs0, as), ∀ cs1, ca0, cs2, as1. cINV(cs1) ∧ cstep(cs1, ca0, cs2) ∧ t(cs2, as1) ∧ aINV(as1) → (∃ as2. aINV(as2) ∧ move(IOAut(astart, astep, aext))(as2, (cext(ca0) = None ⊃ [];cext(ca0).get '), as1) ∧ t(cs1, as2)), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as), aINV(as0), cINV(cs0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), t(cs0, as), t((cs0 ' + csl).last, as0), cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as) ∧ aINV(as) → (∃ as2. aINV(as2) ∧ move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as) ∧ t(cs, as2)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ as. astart(as) → aINV(as), ∀ cs. cstart(cs) → cINV(cs) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
Used terms: cs, ca, cs0, as
| aINV(as), aINV(as0), cINV(cs0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), t(cs0, as), t((cs0 ' + csl).last, as0), cINV(cs) ∧ cstep(cs, ca, cs0) ∧ t(cs0, as) ∧ aINV(as) → (∃ as2. aINV(as2) ∧ move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as) ∧ t(cs, as2)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ as. astart(as) → aINV(as), ∀ cs. cstart(cs) → cINV(cs) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as0), aINV(as), aINV(as2), cINV(cs), cINV(cs0), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as), t((cs0 ' + csl).last, as0), t(cs0, as), t(cs, as2), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1)
| aINV(as0), aINV(as), aINV(as2), cINV(cs), cINV(cs0), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as), t((cs0 ' + csl).last, as0), t(cs0, as), t(cs, as2), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as) ⊦ ∃ as1. aINV(as1) ∧ move(IOAut(astart, astep, aext))(as1, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as1) |
aINV(as2), aINV(as), aINV(as0), cINV(cs0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), t(cs, as2), t(cs0, as), t((cs0 ' + csl).last, as0), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ as. astart(as) → aINV(as), ∀ cs. cstart(cs) → cINV(cs) ⊦ aINV(as2) ∧ move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as2)
Used terms: as2
| aINV(as2), aINV(as), aINV(as0), cINV(cs0), cINV(cs), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), t(cs, as2), t(cs0, as), t((cs0 ' + csl).last, as0), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ as. astart(as) → aINV(as), ∀ cs. cstart(cs) → cINV(cs) ⊦ aINV(as2) ∧ move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0) ∧ t(cs, as2) |
aINV(as0), aINV(as), aINV(as2), cINV(cs), cINV(cs0), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as), t((cs0 ' + csl).last, as0), t(cs0, as), t(cs, as2), ¬ move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as) ⊦
| aINV(as0), aINV(as), aINV(as2), cINV(cs), cINV(cs0), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), move(IOAut(astart, astep, aext))(as, cext !(cal0), as0), move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get '), as), t((cs0 ' + csl).last, as0), t(cs0, as), t(cs, as2), ¬ move(IOAut(astart, astep, aext))(as2, (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0), as0), ∀ cs. cstart(cs) → cINV(cs), ∀ as. astart(as) → aINV(as), ∀ as, aa, as0. aINV(as) ∧ astep(as, aa, as0) → aINV(as0), ∀ cs. cINV(cs) → (∃ as. t(cs, as) ∧ aINV(as)), ∀ cs, as. cstart(cs) ∧ t(cs, as) ∧ aINV(as) → astart(as) ⊦ |
⊦ move(IOAut(start, step, ext))(s, el1, s1) ∧ move(IOAut(start, step, ext))(s1, el2, s2) → move(IOAut(start, step, ext))(s, el1 + el2, s2)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: cext !(cal0), as2, aext, as0, astart, (cext(ca) = None ⊃ [];cext(ca).get '), as, astep
| ⊦ move(IOAut(start, step, ext))(s, el1, s1) ∧ move(IOAut(start, step, ext))(s1, el2, s2) → move(IOAut(start, step, ext))(s, el1 + el2, s2) |
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.