| ⊦ simplefwsim(cioaut, aioaut, r, aabs) → fwsim(cioaut, aioaut, r) |
simplefwsim(cioaut, aioaut, r, aabs), ¬ fwsim(cioaut, aioaut, r) ⊦
| simplefwsim(cioaut, aioaut, r, aabs), ¬ fwsim(cioaut, aioaut, r) ⊦ |
cioaut = IOAut(cstart, cstep, cext), simplefwsim(cioaut, aioaut, r, aabs), ¬ fwsim(cioaut, aioaut, r) ⊦
Used simplifier rules: IOAutomaton('s, 'a, 'e) freely generated by IOAut;;
| cioaut = IOAut(cstart, cstep, cext), simplefwsim(cioaut, aioaut, r, aabs), ¬ fwsim(cioaut, aioaut, r) ⊦ |
simplefwsim(IOAut(cstart, cstep, cext), aioaut, r, aabs), ¬ fwsim(IOAut(cstart, cstep, cext), aioaut, r) ⊦
| simplefwsim(IOAut(cstart, cstep, cext), aioaut, r, aabs), ¬ fwsim(IOAut(cstart, cstep, cext), aioaut, r) ⊦ |
aioaut = IOAut(astart, astep, aext), simplefwsim(IOAut(cstart, cstep, cext), aioaut, r, aabs), ¬ fwsim(IOAut(cstart, cstep, cext), aioaut, r) ⊦
Used simplifier rules: IOAutomaton('s, 'a, 'e) freely generated by IOAut;;
| aioaut = IOAut(astart, astep, aext), simplefwsim(IOAut(cstart, cstep, cext), aioaut, r, aabs), ¬ fwsim(IOAut(cstart, cstep, cext), aioaut, r) ⊦ |
simplefwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r, aabs), ¬ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ⊦
| simplefwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r, aabs), ¬ fwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r) ⊦ |
⊦ simplefwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r, aabs) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0))) ∧ (∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)))
¬ 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) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)) ⊦
Used terms: cstep, cext, aext, r, astart, cstart, astep, aabs
| ⊦ simplefwsim(IOAut(cstart, cstep, cext), IOAut(astart, astep, aext), r, aabs) ↔ (∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as))) ∧ (∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0))) ∧ (∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get))) |
| ¬ 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) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)) ⊦ |
⊦ 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)))
∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, 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))) |
| ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, 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) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ¬(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) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ¬(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), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as. r(as, cs) ∧ astart(as)
cstep(cs0, ca, cs1), r(as, cs0), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, 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), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, 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), ∀ ca. (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, 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), (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (cext(ca) = None ⊃ [];cext(ca).get '), as0) ∧ r(as0, cs1)
Used terms: ca
| cstep(cs0, ca, cs1), r(as, cs0), (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)), ∀ cs, ca, cs0, as. r(as, cs) ∧ cstep(cs, ca, cs0) → (aabs(ca) = None ⊃ r(as, cs0);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs0)) ⊦ ∃ 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) → (aabs(ca) = None ⊃ r(as, cs1);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs1)), (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ 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) → (aabs(ca) = None ⊃ r(as, cs1);∃ as0. astep(as, aabs(ca).get, as0) ∧ r(as0, cs1)), (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), ∀ 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), (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), (aabs(ca) = None ⊃ r(as, cs1);astep(as, aabs(ca).get, as0) ∧ r(as0, 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), (aabs(ca) = None ⊃ cext(ca) = None;cext(ca) = aext(aabs(ca).get)), (aabs(ca) = None ⊃ r(as, cs1);astep(as, aabs(ca).get, as0) ∧ r(as0, 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) |
aabs(ca) = None, cext(ca) = None, cstep(cs0, ca, cs1), r(as, cs0), (aabs(ca) = None ⊃ r(as, cs1);astep(as, aabs(ca).get, as0) ∧ r(as0, 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) = aext(aabs(ca).get), aabs(ca) ≠ None, cstep(cs0, ca, cs1), r(as, cs0), (aabs(ca) = None ⊃ r(as, cs1);astep(as, aabs(ca).get, as0) ∧ r(as0, 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)
| aabs(ca) = None, cext(ca) = None, cstep(cs0, ca, cs1), r(as, cs0), (aabs(ca) = None ⊃ r(as, cs1);astep(as, aabs(ca).get, as0) ∧ r(as0, 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) |
aabs(ca) = None, 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, [], as0) ∧ r(as0, cs1)
| aabs(ca) = None, 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, [], as0) ∧ r(as0, cs1) |
Used simplifier rules: ⊦ move(IOAut(start, step, ext))(s, [], s); (s) Used terms: as
| cext(ca) = aext(aabs(ca).get), aabs(ca) ≠ None, cstep(cs0, ca, cs1), r(as, cs0), (aabs(ca) = None ⊃ r(as, cs1);astep(as, aabs(ca).get, as0) ∧ r(as0, 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) = aext(aabs(ca).get), aabs(ca) ≠ None, astep(as, aabs(ca).get, as0), cstep(cs0, ca, cs1), r(as, cs0), r(as0, 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) = aext(aabs(ca).get), aabs(ca) ≠ None, astep(as, aabs(ca).get, as0), cstep(cs0, ca, cs1), r(as, cs0), r(as0, 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) |
aabs(ca) = Some(aa), cext(ca) = aext(aa), aabs(ca) ≠ None, astep(as, aa, as0), cstep(cs0, ca, cs1), r(as0, cs1), r(as, 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)
Used simplifier rules: ⊦ opt ≠ None → (get = opt.get ↔ opt = Some(get)); (elim) Used terms: aabs(ca), aa
| aabs(ca) = Some(aa), cext(ca) = aext(aa), aabs(ca) ≠ None, astep(as, aa, as0), cstep(cs0, ca, cs1), r(as0, cs1), r(as, 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) |
aabs(ca) = Some(aa), cext(ca) = aext(aa), astep(as, aa, as0), cstep(cs0, ca, cs1), r(as0, cs1), r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (aext(aa) = None ⊃ [];aext(aa).get '), as0) ∧ r(as0, cs1)
Used simplifier rules: ⊦ Some(a) ≠ None; (s)
| aabs(ca) = Some(aa), cext(ca) = aext(aa), astep(as, aa, as0), cstep(cs0, ca, cs1), r(as0, cs1), r(as, cs0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ ∃ as0. move(IOAut(astart, astep, aext))(as, (aext(aa) = None ⊃ [];aext(aa).get '), as0) ∧ r(as0, cs1) |
aabs(ca) = Some(aa), cext(ca) = aext(aa), astep(as, aa, as0), cstep(cs0, ca, cs1), r(as, cs0), r(as0, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ move(IOAut(astart, astep, aext))(as, (aext(aa) = None ⊃ [];aext(aa).get '), as0) ∧ r(as0, cs1)
Used terms: as0
| aabs(ca) = Some(aa), cext(ca) = aext(aa), astep(as, aa, as0), cstep(cs0, ca, cs1), r(as, cs0), r(as0, cs1), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ move(IOAut(astart, astep, aext))(as, (aext(aa) = None ⊃ [];aext(aa).get '), as0) ∧ r(as0, cs1) |
aabs(ca) = Some(aa), cext(ca) = aext(aa), astep(as, aa, as0), cstep(cs0, ca, cs1), r(as0, cs1), r(as, cs0), ¬ move(IOAut(astart, astep, aext))(as, (aext(aa) = None ⊃ [];aext(aa).get '), as0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦
| aabs(ca) = Some(aa), cext(ca) = aext(aa), astep(as, aa, as0), cstep(cs0, ca, cs1), r(as0, cs1), r(as, cs0), ¬ move(IOAut(astart, astep, aext))(as, (aext(aa) = None ⊃ [];aext(aa).get '), as0), ∀ cs. cstart(cs) → (∃ as. r(as, cs) ∧ astart(as)) ⊦ |
⊦ step(s, a, s0) → move(IOAut(start, step, ext))(s, ext !(a '), s0)
Used simplifier rules: ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get '); (s) Used terms: as, aext, aa, astart, as0, astep
| ⊦ step(s, a, s0) → move(IOAut(start, step, ext))(s, ext !(a '), s0) |
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.