| fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), frag*(IOAut(cstart, cstep, cext))(csl, cal), r(as, csl[0]) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl.last) |
frag*(IOAut(cstart, cstep, cext))(csl, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, csl[0]) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl.last)
| frag*(IOAut(cstart, cstep, cext))(csl, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, csl[0]) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl.last) |
frag*(IOAut(cstart, cstep, cext))(cs + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, (cs + csl0)[0]), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs + csl0).last)
Used simplifier rules: List('a) freely generated by [], +;; ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s)
| frag*(IOAut(cstart, cstep, cext))(cs + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, (cs + csl0)[0]), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs + csl0).last) |
frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last)
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s)
| frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last) |
cal = [], frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last)
cal = ca + cal0, frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last)
Used simplifier rules: List('a) freely generated by [], +;;
| cal = [], frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last) |
fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ [] = aext !(aal) ∧ r(asl.last, cs)
Used simplifier rules: ⊦ a '.last = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) ⊦ ext !([]) = []; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) ⊦ (a ' + x).head = a; (s) ⊦ frag*(IOAut(start, step, ext))(sl, []) ↔ sl = sl.head '; (s)
| fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ [] = aext !(aal) ∧ r(asl.last, cs) |
Used simplifier rules: ⊦ a '[0] = a; (s) ⊦ frag*(IOAut(start, step, ext))(s ', []); (s) ⊦ ext !([]) = []; (s) ⊦ a '.last = a; (s) Used terms: as ', []
| cal = ca + cal0, frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, cal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last) |
frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, ca ' + cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last)
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)
| frag*(IOAut(cstart, cstep, cext))(cs ' + csl0, ca ' + cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last) |
⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al)
cstep(cs, ca, csl0.head), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last)
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) |
| cstep(cs, ca, csl0.head), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last) |
csl0 = cs0 + csl, csl0 ≠ [], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last)
Used simplifier rules: ⊦ ¬ 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 ≠ [], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(csl0, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart, cstep, cext, cal, astart, astep, aext, r, as. frag*(IOAut(cstart, cstep, cext))(csl0, cal) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(as, csl0[0]) → (∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal) = aext !(aal) ∧ r(asl.last, csl0.last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs ' + csl0).last) |
cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).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 ' + x)[0] = a; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last) |
⊦ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0)))
cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0))), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)
Used terms: cstep, cext, aext, r, astart, cstart, astep
| ⊦ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0))) |
| cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0))), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last) |
cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs1, ca0, cs2, as0. r(as0, cs1) ∧ cstep(cs1, ca0, cs2) → (∃ as1. move(IOAut(astart, astep, aext))(as0, (cext(ca0) = None ⊃ [];cext(ca0).get '), as1) ∧ r(as1, cs2)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)
Used simplifier rules: ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s)
| cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs1, ca0, cs2, as0. r(as0, cs1) ∧ cstep(cs1, ca0, cs2) → (∃ as1. move(IOAut(astart, astep, aext))(as0, (cext(ca0) = None ⊃ [];cext(ca0).get '), as1) ∧ r(as1, cs2)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last) |
cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as1. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as1) ∧ r(as1, cs0)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)
Used terms: cs, ca, cs0, as
| cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as, cs), r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as1. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as1) ∧ r(as1, cs0)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last) |
cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as1), r(as, cs), r(as1, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)
| cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as1), r(as, cs), r(as1, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last) |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as1, cs0), r(as, cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∃ al, sl. frag*(IOAut(astart, astep, aext))(sl, al) ∧ as = sl[0] ∧ as1 = sl.last ∧ IOAut(astart, astep, aext).ext !(al) = (cext(ca) = None ⊃ [];cext(ca).get ') ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)
Used terms: IOAut(astart, astep, aext), as, (cext(ca) = None ⊃ [];cext(ca).get '), as1
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as1, cs0), r(as, cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∃ al, sl. frag*(IOAut(astart, astep, aext))(sl, al) ∧ as = sl[0] ∧ as1 = sl.last ∧ IOAut(astart, astep, aext).ext !(al) = (cext(ca) = None ⊃ [];cext(ca).get ') ⊦ ∃ asl, aal. asl[0] = as ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
⊦ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0)))
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl.last, cs0), r(asl[0], cs), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0))), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used terms: cstep, cext, aext, r, astart, cstart, astep
| ⊦ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0))) |
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl.last, cs0), r(asl[0], cs), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(as, cext !(ca '), as0) ∧ r(as0, cs0))), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs1, ca0, cs2, as. r(as, cs1) ∧ cstep(cs1, ca0, cs2) → (∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca0) = None ⊃ [];cext(ca0).get '), as0) ∧ r(as0, cs2)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used simplifier rules: ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs1, ca0, cs2, as. r(as, cs1) ∧ cstep(cs1, ca0, cs2) → (∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca0) = None ⊃ [];cext(ca0).get '), as0) ∧ r(as0, cs2)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl.last, cs0), r(asl[0], cs), r(asl[0], cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(asl[0], (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs0)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used terms: cs, ca, cs0, asl[0]
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl.last, cs0), r(asl[0], cs), r(asl[0], cs) ∧ cstep(cs, ca, cs0) → (∃ as0. move(IOAut(astart, astep, aext))(asl[0], (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs0)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), move(IOAut(astart, astep, aext))(asl[0], aext !(aal), as0), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), move(IOAut(astart, astep, aext))(asl[0], aext !(aal), as0), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∃ al, sl. frag*(IOAut(astart, astep, aext))(sl, al) ∧ asl[0] = sl[0] ∧ as0 = sl.last ∧ IOAut(astart, astep, aext).ext !(al) = aext !(aal) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used terms: IOAut(astart, astep, aext), asl[0], aext !(aal), as0
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∃ al, sl. frag*(IOAut(astart, astep, aext))(sl, al) ∧ asl[0] = sl[0] ∧ as0 = sl.last ∧ IOAut(astart, astep, aext).ext !(al) = aext !(aal) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), ∀ cstart0, cstep0, cext0, cal, astart0, astep0, aext0, r0, as0. frag*(IOAut(cstart0, cstep0, cext0))(cs0 ' + csl, cal) ∧ fwsim(IOAut(cstart0, cstep0, cext0), IOAut(astart0, astep0, aext0), r0) ∧ r0(as0, cs0) → (∃ asl, aal. asl[0] = as0 ∧ frag*(IOAut(astart0, astep0, aext0))(asl, aal) ∧ cext0 !(cal) = aext0 !(aal) ∧ r0(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(asl0.last, cs0) → (∃ asl, aal. asl[0] = asl0.last ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
Used terms: cstart, cstep, cext, cal0, astart, astep, aext, r, asl0.last
| aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0) ∧ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ∧ r(asl0.last, cs0) → (∃ asl, aal. asl[0] = asl0.last ∧ frag*(IOAut(astart, astep, aext))(asl, aal) ∧ cext !(cal0) = aext !(aal) ∧ r(asl.last, (cs0 ' + csl).last)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + cext !(cal0) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], asl1[0] = asl0.last, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl1, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl1[0], cs0), r(asl1.last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + aext !(aal1) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], asl1[0] = asl0.last, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl1, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl1[0], cs0), r(asl1.last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ asl0, aal. asl0[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0, aal) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + aext !(aal1) = aext !(aal) ∧ r(asl0.last, (cs0 ' + csl).last) |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl1[0] = asl0.last, asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl1, aal1), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl1.last, (cs0 ' + csl).last), r(asl1[0], cs0), r(asl.last, cs0), r(asl0[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl1.tail)[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl1.tail, aal0 + aal1) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + aext !(aal1) = aext !(aal0 + aal1) ∧ r((asl0 + asl1.tail).last, (cs0 ' + csl).last)
Used terms: asl0 + asl1.tail, aal0 + aal1
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl1[0] = asl0.last, asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl1, aal1), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl1.last, (cs0 ' + csl).last), r(asl1[0], cs0), r(asl.last, cs0), r(asl0[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl1.tail)[0] = asl[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl1.tail, aal0 + aal1) ∧ (cext(ca) = None ⊃ [];cext(ca).get ') + aext !(aal1) = aext !(aal0 + aal1) ∧ r((asl0 + asl1.tail).last, (cs0 ' + csl).last) |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl1[0] = asl0.last, asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl1, aal1), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl1.last, (cs0 ' + csl).last), r(asl1[0], cs0), r(asl.last, cs0), r(asl0[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl1.tail)[0] = asl0[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl1.tail, aal0 + aal1) ∧ r((asl0 + asl1.tail).last, (cs0 ' + csl).last)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # y = # y0 → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) ⊦ ext !(al + al0) = ext !(al) + ext !(al0); (s)
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl1[0] = asl0.last, asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl1, aal1), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl1.last, (cs0 ' + csl).last), r(asl1[0], cs0), r(asl.last, cs0), r(asl0[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl1.tail)[0] = asl0[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl1.tail, aal0 + aal1) ∧ r((asl0 + asl1.tail).last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], asl1[0] = asl0.last, asl1 = as0 + asl2, asl1 ≠ [], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl1, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl1[0], cs0), r(asl1.last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl2)[0] = asl0[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl2, aal0 + aal1) ∧ r((asl0 + asl2).last, (cs0 ' + csl).last)
Used simplifier rules: ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: asl1, as0, asl2
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], asl1[0] = asl0.last, asl1 = as0 + asl2, asl1 ≠ [], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl1, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl1[0], cs0), r(asl1.last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl2)[0] = asl0[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl2, aal0 + aal1) ∧ r((asl0 + asl2).last, (cs0 ' + csl).last) |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl2)[0] = asl0[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl2, aal0 + aal1) ∧ r((asl0 + asl2).last, (cs0 ' + csl).last)
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ (asl0 + asl2)[0] = asl0[0] ∧ frag*(IOAut(astart, astep, aext))(asl0 + asl2, aal0 + aal1) ∧ r((asl0 + asl2).last, (cs0 ' + csl).last) |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], (asl0 + asl2)[0] ≠ asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), ¬ frag*(IOAut(astart, astep, aext))(asl0 + asl2, aal0 + aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), ¬ r((asl0 + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], (asl0 + asl2)[0] ≠ asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
Used simplifier rules: ⊦ ¬ n < # x → (x + y)[n] = y[n - # x]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ 0 < m ↔ m ≠ 0; (s) ⊦ # x = 0 ↔ x = []; (s) ⊦ # [] = 0; (s) ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) Used terms: 0, asl0, asl2
| ⊦ n < # x → (x + y)[n] = x[n] |
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), ¬ frag*(IOAut(astart, astep, aext))(asl0 + asl2, aal0 + aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
⊦ ¬ # al < n ∧ n < # sl → ( frag*(IOAut(start, step, ext))(sl, al) ↔ frag*(IOAut(start, step, ext))(sl.take(n + 1), al.take(n)) ∧ frag*(IOAut(start, step, ext))(sl.drop(n), al.drop(n)))
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], # aal0 < #(asl0 + asl2), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ¬ #(aal0 + aal1) < # aal0, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).take(# aal0 + 1), (aal0 + aal1).take(# aal0)) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), (aal0 + aal1).drop(# aal0)) ⊦
Used simplifier rules: ⊦ ¬ m + n < m; (s) ⊦ #(x + y) = # x + # y; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# sl + n ≤ # al ↔ false); (as) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: aal0 + aal1, aext, asl0 + asl2, astart, # aal0, astep
| ⊦ ¬ # al < n ∧ n < # sl → ( frag*(IOAut(start, step, ext))(sl, al) ↔ frag*(IOAut(start, step, ext))(sl.take(n + 1), al.take(n)) ∧ frag*(IOAut(start, step, ext))(sl.drop(n), al.drop(n))) |
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], # aal0 < #(asl0 + asl2), cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ¬ #(aal0 + aal1) < # aal0, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).take(# aal0 + 1), (aal0 + aal1).take(# aal0)) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), (aal0 + aal1).drop(# aal0)) ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], # aal0 < # asl0 + # asl2, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (x + y).drop(# x) = y; (s) ⊦ (x + y).take(# x) = x; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ m + n < m; (s) ⊦ #(x + y) = # x + # y; (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = asl0[0], # aal0 < # asl0 + # asl2, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl0[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦ |
⊦ n ≤ # x → (x + y).take(n) = x.take(n)
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], # aal0 < # asl0 + # asl2, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), # aal0 + 1 ≤ # asl0, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl0.take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦
Used simplifier rules: ⊦ m + 1 ≤ n ↔ m < n; (s) ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# al < # sl ↔ true); (ss) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: # aal0 + 1, asl0, asl2
| ⊦ n ≤ # x → (x + y).take(n) = x.take(n) |
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], # aal0 < # asl0 + # asl2, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), # aal0 + 1 ≤ # asl0, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl0.take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦ |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0.head, asl0 ≠ [], # aal0 < # asl0, # aal0 < # asl0 + # asl2, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl0.take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦
Used simplifier rules: ⊦ x ≠ [] → x[0] = x.head; (s) ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≤ n ↔ m < n; (s)
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0.head, asl0 ≠ [], # aal0 < # asl0, # aal0 < # asl0 + # asl2, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl[0], cs), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl0.take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = as0, asl0 = as0 + asl1, asl0 ≠ [], # aal0 < # asl0 + # asl2, # aal0 < # asl0, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl0.take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: asl0, as0, asl1
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), asl[0] = as0, asl0 = as0 + asl1, asl0 ≠ [], # aal0 < # asl0 + # asl2, # aal0 < # asl0, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(asl0.last, cs0), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl0.take(# aal0 + 1), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))((asl0 + asl2).drop(# aal0), aal1) ⊦ |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), r((asl[0] ' + asl1).last, cs0), r(asl.last, cs0), r(asl[0], cs), # aal0 ≤ # asl1 + # asl2, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1.take(# aal0), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))(((asl[0] ' + asl1) + asl2).drop(# aal0), aal1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + x).take(n + 1) = a + x.take(n); (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl < # al ↔ false); (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), r((asl[0] ' + asl1).last, cs0), r(asl.last, cs0), r(asl[0], cs), # aal0 ≤ # asl1 + # asl2, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1.take(# aal0), aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))(((asl[0] ' + asl1) + asl2).drop(# aal0), aal1) ⊦ |
⊦ # x = n → x.take(n) = x
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r((asl[0] ' + asl1).last, cs0), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), # aal0 ≤ # asl1 + # asl2, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))(((asl[0] ' + asl1) + asl2).drop(# aal0), aal1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl = # al ↔ true); (ss) Used terms: asl1, # aal0
| ⊦ # x = n → x.take(n) = x |
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r((asl[0] ' + asl1).last, cs0), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), # aal0 ≤ # asl1 + # asl2, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ¬ frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0) ∨ ¬ frag*(IOAut(astart, astep, aext))(((asl[0] ' + asl1) + asl2).drop(# aal0), aal1) ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r((asl[0] ' + asl1).last, cs0), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), ¬ frag*(IOAut(astart, astep, aext))(((asl[0] ' + asl1) + asl2).drop(# aal0), aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m ≤ m + n; (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r((asl[0] ' + asl1).last, cs0), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), ¬ frag*(IOAut(astart, astep, aext))(((asl[0] ' + asl1) + asl2).drop(# aal0), aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
⊦ n ≤ # x → (x + y).drop(n) = x.drop(n) + y
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), r((asl[0] ' + asl1).last, cs0), r(asl.last, cs0), r(asl[0], cs), # aal0 ≤ #(asl[0] ' + asl1), ¬ frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
Used simplifier rules: ⊦ #(a ' + x) = (# x)+1; (s) ⊦ m +1 = m + 1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m ≤ n ↔ ¬ n < m; (ss) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: # aal0, asl[0] ' + asl1, asl2
| ⊦ n ≤ # x → (x + y).drop(n) = x.drop(n) + y |
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), r((asl[0] ' + asl1).last, cs0), r(asl.last, cs0), r(asl[0], cs), # aal0 ≤ #(asl[0] ' + asl1), ¬ frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), r((asl[0] ' + asl1).last, cs0), r(asl.last, cs0), r(asl[0], cs), ¬ frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m ≤ m + n; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s)
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(((asl[0] ' + asl1).last ' + asl2).last, (cs0 ' + csl).last), r((asl[0] ' + asl1).last, cs0), r(asl.last, cs0), r(asl[0], cs), ¬ frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', asl[0] ' + asl1 ≠ [], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), ¬ frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
Used simplifier rules: ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list x ≠ [] ⊦ a = x.last ∧ y = x.butlast ↔ x = y + a '; (elim) Used terms: asl[0] ' + asl1, as0, asl0
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', asl[0] ' + asl1 ≠ [], cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl[0] ' + asl1, aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), ¬ frag*(IOAut(astart, astep, aext))((asl[0] ' + asl1).drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), ¬ frag*(IOAut(astart, astep, aext))((asl0 + as0 ').drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), asl[0] ∈ asl0 ∨ asl[0] = as0, as0 = asl[0] ∨ as0 ∈ asl1 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a ∈ a0 ' ↔ a = a0; (s) ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), ¬ frag*(IOAut(astart, astep, aext))((asl0 + as0 ').drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), asl[0] ∈ asl0 ∨ asl[0] = as0, as0 = asl[0] ∨ as0 ∈ asl1 ⊦ |
⊦ # x ≤ m → (x + y).drop(m) = y.drop(m - # x)
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), ¬ frag*(IOAut(astart, astep, aext))((asl0 + as0 ').drop(# aal0) + asl2, aal1), ¬ # asl0 ≤ # aal0, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as0 = asl[0] ∨ as0 ∈ asl1, asl[0] ∈ asl0 ∨ asl[0] = as0 ⊦
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(# aal0 - # asl0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as0 = asl[0] ∨ as0 ∈ asl1, asl[0] ∈ asl0 ∨ asl[0] = as0 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: # aal0, asl0, as0 '
| ⊦ # x ≤ m → (x + y).drop(m) = y.drop(m - # x) |
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), ¬ frag*(IOAut(astart, astep, aext))((asl0 + as0 ').drop(# aal0) + asl2, aal1), ¬ # asl0 ≤ # aal0, ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as0 = asl[0] ∨ as0 ∈ asl1, asl[0] ∈ asl0 ∨ asl[0] = as0 ⊦ |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', asl0 ≠ [], # aal0 < # asl0, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), as0 ∈ asl1, asl[0] ∈ asl0, ¬ frag*(IOAut(astart, astep, aext))((asl0 + as0 ').drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list inapp-08: ⊦ a ' + x = y + a0 ' ∧ y ≠ [] → a ∈ y ∧ a0 ∈ x; (forward) from specification list ⊦ a ' + x = x0 + x1 → (a ∈ x0 ↔ x0 ≠ []); (ss) lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic ni: ⊦ x + a ' = y + z ∧ ¬ a ∈ z → z = []; (forward) from specification list ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ m ≤ n ↔ ¬ n < m; (ss)
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', asl0 ≠ [], # aal0 < # asl0, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), as0 ∈ asl1, asl[0] ∈ asl0, ¬ frag*(IOAut(astart, astep, aext))((asl0 + as0 ').drop(# aal0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1]))
Used simplifier rules: ⊦ #(x + y) = # x + # y; (s) ⊦ # a ' = 0 +1; (s) ⊦ m + n = m + n0 ↔ n = n0; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ # x = n → (x + x0).drop(n) = x0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: IOAut(astart, astep, aext), asl0 + as0 ', aal0
| ⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1])) |
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(# aal0 - # asl0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as0 = asl[0] ∨ as0 ∈ asl1, asl[0] ∈ asl0 ∨ asl[0] = as0 ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, # aal0 = n0 + # asl0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(n0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), asl[0] ∈ asl0 ∨ asl[0] = as0, as0 = asl[0] ∨ as0 ∈ asl1 ⊦
Used simplifier rules: n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: # aal0, # asl0, n0
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, # aal0 = n0 + # asl0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(n0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), asl[0] ∈ asl0 ∨ asl[0] = as0, as0 = asl[0] ∨ as0 ∈ asl1 ⊦ |
cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # aal0 = n0 + # asl0, # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', n0 = n +1, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(n0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as0 = asl[0] ∨ as0 ∈ asl1, asl[0] ∈ asl0 ∨ asl[0] = as0 ⊦
Used simplifier rules: Nat freely generated by 0, +1;; ⊦ n + 0 = n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ x.drop(0) = x; (s)
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), # aal0 = n0 + # asl0, # asl1 = # aal0, asl[0] ' + asl1 = asl0 + as0 ', n0 = n +1, cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((as0 ' + asl2).last, (cs0 ' + csl).last), r(as0, cs0), r(asl.last, cs0), r(asl[0], cs), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(n0) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as0 = asl[0] ∨ as0 ∈ asl1, asl[0] ∈ asl0 ∨ asl[0] = as0 ⊦ |
aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, # aal0 = (n + 1) + # asl0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(n + 1) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), asl[0] ∈ asl0 ∨ asl[0] = as0, as0 = asl[0] ∨ as0 ∈ asl1 ⊦
Used simplifier rules: ⊦ m +1 = m + 1; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
| aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), aext !(aal0) = aext !(aal), cext !(cal0) = aext !(aal1), # asl1 = # aal0, # aal0 = (n + 1) + # asl0, asl[0] ' + asl1 = asl0 + as0 ', cstep(cs, ca, cs0), frag*(IOAut(astart, astep, aext))(as0 ' + asl2, aal1), frag*(IOAut(astart, astep, aext))(asl0 + as0 ', aal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r(asl[0], cs), r(asl.last, cs0), r(as0, cs0), r((as0 ' + asl2).last, (cs0 ' + csl).last), # asl0 ≤ # aal0, ¬ frag*(IOAut(astart, astep, aext))(as0 '.drop(n + 1) + asl2, aal1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), asl[0] ∈ asl0 ∨ asl[0] = as0, as0 = asl[0] ∨ as0 ∈ asl1 ⊦ |
⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1]))
Used simplifier rules: ⊦ #(x + y) = # x + # y; (s) ⊦ # a ' = 0 +1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m + n = m + n0 ↔ n = n0; (s) ⊦ m = m0 + 1 + n → m ≠ n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: IOAut(astart, astep, aext), asl0 + as0 ', aal0
| ⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1])) |
| cext !(cal0) = aext !(aal1), aext !(aal0) = aext !(aal), aext !(aal) = (cext(ca) = None ⊃ [];cext(ca).get '), asl[0] = asl0[0], cstep(cs, ca, cs0), frag*(IOAut(cstart, cstep, cext))(cs0 ' + csl, cal0), frag*(IOAut(astart, astep, aext))(asl, aal), frag*(IOAut(astart, astep, aext))(asl0, aal0), frag*(IOAut(astart, astep, aext))(asl0.last ' + asl2, aal1), fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), r((asl0.last ' + asl2).last, (cs0 ' + csl).last), r(asl0.last, cs0), r(asl.last, cs0), r(asl0[0], cs), ¬ r((asl0 + asl2).last, (cs0 ' + csl).last), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
⊦ y ≠ [] → (x + y).last = y.last
Used simplifier rules: ⊦ y ≠ [] → (x + y).last = y.last; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a '.last = a; (s) ⊦ frag*(IOAut(start, step, ext))(s ', al) ↔ al = []; (s) ⊦ x + [] = x; (s) Used terms: asl0.last ', asl2
| ⊦ y ≠ [] → (x + y).last = y.last |
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.