| bfwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ⊦ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) |
bfwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), ¬ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ⊦
| bfwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r), ¬ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ⊦ |
⊦ bfwsim(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) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ))
¬ 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) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ) ⊦
Used terms: cstep, cext, aext, r, astart, cstart, astep
| ⊦ bfwsim(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) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) )) |
| ¬ 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) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ) ⊦ |
⊦ 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, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), (∃ 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)))) ⊦
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))) |
| ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), (∃ 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)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ¬(cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∨ ¬(r(as, cs0) ∧ cstep(cs0, ca, cs1) → (∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1))) ⊦
Used simplifier rules: ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s)
| ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ¬(cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∨ ¬(r(as, cs0) ∧ cstep(cs0, ca, cs1) → (∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1))) ⊦ |
cstart(cs), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as. r(as, cs) ∧ astart(as)
cstep(cs0, ca, cs1), r(as, cs0), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1)
| cstart(cs), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as. r(as, cs) ∧ astart(as) |
Used terms: cs
| cstep(cs0, ca, cs1), r(as, cs0), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (cext(ca) = None ⊃ r(as, cs0) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs0) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1) |
cstep(cs0, ca, cs1), r(as, cs0), r(as, cs0) ∧ cstep(cs0, ca, cs1) → (cext(ca) = None ⊃ r(as, cs1) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs0)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs1) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1)
Used terms: cs0, ca, cs1, as
| cstep(cs0, ca, cs1), r(as, cs0), r(as, cs0) ∧ cstep(cs0, ca, cs1) → (cext(ca) = None ⊃ r(as, cs1) ;∃ asl, aal, aa, as1. frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs0)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs1) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1) |
cstep(cs0, ca, cs1), r(as, cs0), (cext(ca) = None ⊃ r(as, cs1) ; frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs0)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs1) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1)
| cstep(cs0, ca, cs1), r(as, cs0), (cext(ca) = None ⊃ r(as, cs1) ; frag*(IOAut(astart, astep, aext))(asl, aal) ∧ aext !(aal) = [] ∧ asl.head = as ∧ (∀ as. as ∈ asl → r(as, cs0)) ∧ astep(asl.last, aa, as1) ∧ cext(ca) = aext(aa) ∧ r(as1, cs1) ), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1) |
cext(ca) = None, cstep(cs0, ca, cs1), r(as, cs0), r(as, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1)
aext !(aal) = [], asl.head = as, cext(ca) = aext(aa), cext(ca) ≠ None, astep(asl.last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl, aal), r(as, cs0), r(as1, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl → r(as, cs0) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1)
| cext(ca) = None, cstep(cs0, ca, cs1), r(as, cs0), r(as, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1) |
cext(ca) = None, cstep(cs0, ca, cs1), r(as, cs1), r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, [], as0) ∧ r(as0, cs1)
| cext(ca) = None, cstep(cs0, ca, cs1), r(as, cs1), r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, [], as0) ∧ r(as0, cs1) |
Used simplifier rules: ⊦ move(IOAut(start, step, ext))(s, [], s); (s) Used terms: as
| aext !(aal) = [], asl.head = as, cext(ca) = aext(aa), cext(ca) ≠ None, astep(asl.last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl, aal), r(as, cs0), r(as1, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl → r(as, cs0) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1) |
aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep(asl.last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl, aal), r(as1, cs1), r(asl.head, cs0), ∀ as. as ∈ asl → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(asl.head, aext(aa).get ', as0) ∧ r(as0, cs1)
| aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep(asl.last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl, aal), r(as1, cs1), r(asl.head, cs0), ∀ as. as ∈ asl → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(asl.head, aext(aa).get ', as0) ∧ r(as0, cs1) |
aext !(aal) = [], asl = as2 + asl0, cext(ca) = aext(aa), aext(aa) ≠ None, asl ≠ [], astep(asl.last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl, aal), r(as2, cs0), r(as1, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl → r(as, cs0) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as0) ∧ r(as0, cs1)
Used simplifier rules: ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: asl, as2, asl0
| aext !(aal) = [], asl = as2 + asl0, cext(ca) = aext(aa), aext(aa) ≠ None, asl ≠ [], astep(asl.last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl, aal), r(as2, cs0), r(as1, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl → r(as, cs0) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as0) ∧ r(as0, cs1) |
aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep((as2 ' + asl0).last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as1, cs1), r(as2, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as0) ∧ r(as0, cs1)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep((as2 ' + asl0).last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as1, cs1), r(as2, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as0) ∧ r(as0, cs1) |
aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep((as2 ' + asl0).last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as2, cs0), r(as1, cs1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1) ∧ r(as1, cs1)
Used terms: as1
| aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep((as2 ' + asl0).last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as2, cs0), r(as1, cs1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1) ∧ r(as1, cs1) |
aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep((as2 ' + asl0).last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as1, cs1), r(as2, cs0), ¬ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0) ⊦
| aext !(aal) = [], cext(ca) = aext(aa), aext(aa) ≠ None, astep((as2 ' + asl0).last, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as1, cs1), r(as2, cs0), ¬ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0) ⊦ |
aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), as2 ' + asl0 ≠ [], aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as2, cs0), r(as1, cs1), ¬ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ 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: as2 ' + asl0, as0, asl
| aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), as2 ' + asl0 ≠ [], aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(as2 ' + asl0, aal), r(as2, cs0), r(as1, cs1), ¬ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as2, cs0), r(as1, cs1), ¬ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as2 ∈ asl ∨ as2 = as0, as0 = as2 ∨ as0 ∈ asl0 ⊦
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) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as2, cs0), r(as1, cs1), ¬ move(IOAut(astart, astep, aext))(as2, aext(aa).get ', as1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), as2 ∈ asl ∨ as2 = as0, as0 = as2 ∨ as0 ∈ asl0 ⊦ |
⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el)
aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as1, cs1), r(as2, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0), ∀ al, sl. ¬(frag*(IOAut(astart, astep, aext))(sl, al) ∧ as2 = sl[0] ∧ as1 = sl.last ∧ IOAut(astart, astep, aext).ext !(al) = aext(aa).get '), as0 = as2 ∨ as0 ∈ asl0, as2 ∈ asl ∨ as2 = as0 ⊦
Used terms: IOAut(astart, astep, aext), as2, aext(aa).get ', as1
| ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) |
| aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as1, cs1), r(as2, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0), ∀ al, sl. ¬(frag*(IOAut(astart, astep, aext))(sl, al) ∧ as2 = sl[0] ∧ as1 = sl.last ∧ IOAut(astart, astep, aext).ext !(al) = aext(aa).get '), as0 = as2 ∨ as0 ∈ asl0, as2 ∈ asl ∨ as2 = as0 ⊦ |
aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as2, cs0), r(as1, cs1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ al, sl. ¬ frag*(IOAut(astart, astep, aext))(sl, al) ∨ as2 ≠ sl[0] ∨ as1 ≠ sl.last ∨ aext !(al) ≠ aext(aa).get ', as2 ∈ asl ∨ as2 = as0, as0 = as2 ∨ as0 ∈ asl0 ⊦
Used simplifier rules: ⊦ IOAut(start, step, ext).ext = ext; (s)
| aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as2, cs0), r(as1, cs1), ∀ as. as ∈ asl0 → r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ al, sl. ¬ frag*(IOAut(astart, astep, aext))(sl, al) ∨ as2 ≠ sl[0] ∨ as1 ≠ sl.last ∨ aext !(al) ≠ aext(aa).get ', as2 ∈ asl ∨ as2 = as0, as0 = as2 ∨ as0 ∈ asl0 ⊦ |
aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as1, cs1), r(as2, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0), as0 = as2 ∨ as0 ∈ asl0, as2 ∈ asl ∨ as2 = as0, ¬ frag*(IOAut(astart, astep, aext))(as2 ' + asl0 + as1 ', aal + aa ') ∨ as2 ≠ (as2 ' + asl0 + as1 ')[0] ∨ as1 ≠ (as2 ' + asl0 + as1 ').last ∨ aext !(aal + aa ') ≠ aext(aa).get ' ⊦
Used terms: aal + aa ', as2 ' + asl0 + as1 '
| aext !(aal) = [], as2 ' + asl0 = asl + as0 ', cext(ca) = aext(aa), aext(aa) ≠ None, astep(as0, aa, as1), cstep(cs0, ca, cs1), frag*(IOAut(astart, astep, aext))(asl + as0 ', aal), r(as1, cs1), r(as2, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ as. as ∈ asl0 → r(as, cs0), as0 = as2 ∨ as0 ∈ asl0, as2 ∈ asl ∨ as2 = as0, ¬ frag*(IOAut(astart, astep, aext))(as2 ' + asl0 + as1 ', aal + aa ') ∨ as2 ≠ (as2 ' + asl0 + as1 ')[0] ∨ as1 ≠ (as2 ' + asl0 + as1 ').last ∨ aext !(aal + aa ') ≠ aext(aa).get ' ⊦ |
⊦ frag*(IOAut(start, step, ext))(sl + s ', al + a ') ↔ step(sl.last, a, s) ∧ frag*(IOAut(start, step, ext))(sl, al)
Used simplifier rules: ⊦ (a ' + x)[0] = a; (s) ⊦ (a ' + x + b ').last = b; (s) ⊦ ext !(al + al0) = ext !(al) + ext !(al0); (s) ⊦ ext(a) ≠ None → ext !(a ') = ext(a).get '; (s) ⊦ a ' = x + a0 ' ↔ a = a0 ∧ x = []; (ws) ⊦ (x + a ').last = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: aal, as1, aext, as2 ' + asl0, aa, astart, astep
| ⊦ frag*(IOAut(start, step, ext))(sl + s ', al + a ') ↔ step(sl.last, a, s) ∧ frag*(IOAut(start, step, ext))(sl, al) |
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.