[Imprint][Data Privacy Statement][E-Mail]

Back to main index. View the specification. View theorem base summary, View theorem base listing, the used properties by spec, the dependency list, the symbol table,

Theorem base for Specification IOtrace

This is a listing of all goals defined over the current specification. Axioms are marked yellow, proved theorems green and unproved theorems blue. Click on individual names to get more information on the proof.

Name: Sequent: Type:
frag-to ⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ¬ # α < ⌜n⌝ → frag*(IOAut(start, step, ext))(σ.take(n + 1), α.take(n)) A User Theorem
move ⊦ move(ioa)(s1, el, s2) ↔ (∃ al, sl. frag*(ioa)(sl, al) ∧ s1 = sl[0] ∧ s2 = sl.last ∧ ioa.ext !(al) = el) An Axiom
preserve-INVfrag(IOAut(start, step, ext))(σ, α), iNV(σ[0]), ∀ s, a, s0. iNV(s) ∧ step(s, a, s0) → iNV(s0) ⊦ ∀ n. ⌜n⌝ < # σ → iNV(σ[n]) A User Theorem
frag-inf-sl ⊦ frag(ioa)(⌜sf⌝ , α) ↔ fragω(ioa)(sf, α.f) ∧ ¬ finp(α) A User Theorem
frag-finite-sl ⊦ frag(ioa)(⌜sl⌝ , α) ↔ frag*(ioa)(sl, α.l) ∧ finp(α) A User Theorem
trace-fininf-append ⊦ traceω(IOAut(start, step, ext))(el + nf) → (trace*(IOAut(start, step, ext))(el) ↔ true) A User Theorem
fragfin-size-ls1 ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# al + 1 < # sl ↔ false) A User Theorem
frag-move ⊦ frag*(IOAut(start, step, ext))(sl, al) → move(IOAut(start, step, ext))(sl.head, ext !(al), sl.last) A User Theorem
finfrag-split⊦ ¬ # 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))) A User Theorem
frag-from-fin ⊦ frag*(IOAut(start, step, ext))(sl, al) ∧ n < # al → (frag*(IOAut(start, step, ext))(sl.drop(n), al.drop(n)) ↔ true) A User Theorem
finfrag-onlyone ⊦ frag*(IOAut(start, step, ext))(sl, []) ↔ sl = sl.head ' A User Theorem
fragfin-size-le1 ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# sl + n ≤ # al ↔ false) A User Theorem
frag-step-inf ⊦ ¬ step(sf(n), α[n], sf(n + 1)) → (frag(IOAut(start, step, ext))(⌜sf⌝ , α) ↔ false) A User Theorem
frag-one ⊦ frag(IOAut(start, step, ext))(⌜s '⌝ , []) A User Theorem
not-frag-empty ⊦ ¬ frag(IOAut(start, step, ext))([], α) A User Theorem
finfrag-one-action ⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ') ↔ step(s, a, sl.head) ∧ sl ≠ [] ∧ sl.tail = [] A User Theorem
not-frag-fin-inf ⊦ ¬ frag(ioa)(⌜sf⌝ , ⌜al⌝ ) A User Theorem
inffrag-rec1 ⊦ fragω(IOAut(start, step, ext))(s ' + sf, af) ↔ step(s, af(0), sf(0)) ∧ fragω(IOAut(start, step, ext))(sf, λ n. af(n + 1)) A User Theorem
frag-rec ⊦ frag(IOAut(start, step, ext))(⌜s '⌝ + σ, ⌜a '⌝ + α) ↔ step(s, a, hd(σ)) ∧ frag(IOAut(start, step, ext))(σ, α) A User Theorem
frag-split⊦ ¬ # α < ⌜n⌝ ∧ ⌜n⌝ < # σ → ( frag(IOAut(start, step, ext))(σ, α) ↔ frag*(IOAut(start, step, ext))(σ.take(n + 1), α.take(n)) ∧ frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n))) A User Theorem
infappend-moves-genstart(sf(0)), ∀ n. move(IOAut(start, step, ext))(sf(n), cext !(caf(n) '), sf(n + 1)) ⊦ trace(IOAut(start, step, ext))(cext !(⌜caf⌝ )) A User Theorem
move-cutmove(IOAut(start, step, ext))(s, el1 + el2, s2) ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el1, s1) A User Theorem
frag-size-2 ⊦ frag(IOAut(start, step, ext))(σ, α) → (# α < # σ ↔ finp(α)) A User Theorem
move-trans ⊦ move(IOAut(start, step, ext))(s, el1, s1) ∧ move(IOAut(start, step, ext))(s1, el2, s2) → move(IOAut(start, step, ext))(s, el1 + el2, s2) A User Theorem
move-cut-2¬ # el < n, move(IOAut(start, step, ext))(s, el, s2) ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) A User Theorem
fragstar ⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1])) A User Theorem
inffrag-split⊦ fragω(IOAut(start, step, ext))(sf, af) ↔ frag*(IOAut(start, step, ext))(sf.take(n + 1), af.take(n)) ∧ fragω(IOAut(start, step, ext))(sf.drop(n), af.drop(n)) A User Theorem
emptymove-splitfirstmove(IOAut(start, step, ext))(s, [], s2), s ≠ s2 ⊦ ∃ s1, a. ext(a) = None ∧ step(s, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2) A User Theorem
not-exec-empty ⊦ ¬ exec(IOAut(start, step, ext))([], α) A User Theorem
inffrag-rec ⊦ fragω(IOAut(start, step, ext))(s ' + sf, a ' + af) ↔ step(s, a, sf(0)) ∧ fragω(IOAut(start, step, ext))(sf, af) A User Theorem
fragfin-size-notls ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# al < # sl ↔ true) A User Theorem
not-frag-inf-fin ⊦ ¬ frag(ioa)(⌜sl⌝ , ⌜af⌝ ) A User Theorem
fragfin-size-notls-02 ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# al < # sl ↔ false) A User Theorem
traceomega ⊦ trace(ioa)(⌜ef⌝ ) ↔ traceω(ioa)(ef) An Axiom
finfrag-two ⊦ frag*(IOAut(start, step, ext))(s ' + s0 ', a ') ↔ step(s, a, s0) A User Theorem
fintrace ⊦ trace*(IOAut(start, step, ext))(el) ↔ (∃ sl, al. el = ext !(al) ∧ exec*(IOAut(start, step, ext))(sl, al)) A User Theorem
frag-from ⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ⌜n⌝ < # α → frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)) A User Theorem
exec-step-inf ⊦ ¬ step(sf(n), α[n], sf(n + 1)) → (exec(IOAut(start, step, ext))(⌜sf⌝ , α) ↔ false) A User Theorem
frag-step-finn + 1 < # sl ⊦ ¬ step(sl[n], α[n], sl[n + 1]) → (frag(IOAut(start, step, ext))(⌜sl⌝ , α) ↔ false) A User Theorem
frag-step-inf-inf ⊦ ¬ step(sf(n), af(n), sf(n + 1)) → (fragω(IOAut(start, step, ext))(sf, af) ↔ false) A User Theorem
exec-step-finn + 1 < # sl ⊦ ¬ step(sl[n], α[n], sl[n + 1]) → (exec(IOAut(start, step, ext))(⌜sl⌝ , α) ↔ false) A User Theorem
moveone-splitstepmove(IOAut(start, step, ext))(s, e ', s2) ⊦ ∃ s0, s1, a. ext(a) = Some(e) ∧ move(IOAut(start, step, ext))(s, [], s0) ∧ step(s0, a, s1) ∧ move(IOAut(start, step, ext))(s1, [], s2) A User Theorem
frag ⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1])) An Axiom
fragfin-size-02 ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl = # al ↔ true) A User Theorem
fragfin-size-le ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# sl ≤ # al ↔ false) A User Theorem
frag-notsizeleq ⊦ frag*(IOAut(start, step, ext))(sl1 + sl, al1 + al) → ¬ # sl1 + # sl ≤ # al1 A User Theorem
execstar ⊦ exec(ioa)(⌜sl⌝ , ⌜al⌝ ) ↔ exec*(ioa)(sl, al) An Axiom
tracestar-def ⊦ trace(ioa)(⌜el⌝ ) ↔ trace*(ioa)(el) An Axiom
finfrag-rec-end ⊦ frag*(IOAut(start, step, ext))(sl + s ', al + a ') ↔ step(sl.last, a, s) ∧ frag*(IOAut(start, step, ext))(sl, al) A User Theorem
frag-step-fin-zeroα ≠ [] ⊦ ¬ step(sl[0], α[0], sl[1]) → (frag(IOAut(start, step, ext))(⌜sl⌝ , α) ↔ false) A User Theorem
frag-inf-al ⊦ frag(ioa)(σ, ⌜af⌝ ) ↔ fragω(ioa)(σ.f, af) ∧ ¬ finp(σ) A User Theorem
frag-size ⊦ frag(IOAut(start, step, ext))(σ, α) → (# σ < # α ↔ false) A User Theorem
exec-step-fin-zeroα ≠ [] ⊦ ¬ step(sl[0], α[0], sl[1]) → (exec(IOAut(start, step, ext))(⌜sl⌝ , α) ↔ false) A User Theorem
frag-from-1 ⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ¬ # α < ⌜n⌝ → (frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)) ↔ true) A User Theorem
fragfin-size ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# sl = # al + 1 ↔ true) A User Theorem
infappend-frags∀ n. frag*(IOAut(start, step, ext))(slf(n), alf(n)) ∧ slf(n + 1).head = slf(n).last ⊦ ∃ σ, α, ii. frag(IOAut(start, step, ext))(σ, α) ∧ ii(0) = 0 ∧ (finp(α) ⊃ ∃ n. # α = ⌜ii(n)⌝ ∧ (∀ m. n ≤ m → alf(m) = [] ∧ ii(m) = ii(n));∀ n. ∃ m. ii(m) ≤ n ∧ n < ii(m + 1)) ∧ (∀ n. ii(n + 1) = ii(n) + # alf(n) ∧ ⌜ii(n + 1)⌝ < # σ ∧ α.take(ii(n + 1)).drop(ii(n)) = alf(n) ∧ σ.take(ii(n + 1) + 1).drop(ii(n)) = slf(n)) A User Theorem
frag-onestate ⊦ frag(IOAut(start, step, ext))(⌜s '⌝ , α) ↔ α = [] A User Theorem
fragfin-size-ls-02 ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl < # al ↔ false) A User Theorem
frag-finite-al ⊦ frag(ioa)(σ, ⌜al⌝ ) ↔ frag*(ioa)(σ.l, al) ∧ finp(σ) A User Theorem
frag-to-inf ⊦ fragω(IOAut(start, step, ext))(sf, af) → (frag*(IOAut(start, step, ext))(sf.take(n + 1), af.take(n)) ↔ true) A User Theorem
frag-rec-end ⊦ frag(IOAut(start, step, ext))(⌜sl⌝ + ⌜s '⌝ , α + ⌜a '⌝ ) ↔ step(sl.last, a, s) ∧ frag(IOAut(start, step, ext))(⌜sl⌝ , α) A User Theorem
frag-transfrag*(IOAut(start, step, ext))(sl, al), frag*(IOAut(start, step, ext))(sl0, al0), sl0[0] = sl.last ⊦ frag*(IOAut(start, step, ext))(sl.butlast + sl0, al + al0) A User Theorem
infappend-movesstart(sf(0)), ∀ n. move(IOAut(start, step, ext))(sf(n), ext !(af(n) '), sf(n + 1)) ⊦ trace(IOAut(start, step, ext))(ext !(⌜af⌝ )) A User Theorem
fragomega-def ⊦ frag(ioa)(⌜sf⌝ , ⌜af⌝ ) ↔ fragω(ioa)(sf, af) An Axiom
move-empty ⊦ move(IOAut(start, step, ext))(s, [], s) A User Theorem
trace ⊦ trace(IOAut(start, step, ext))(β) ↔ (∃ σ, α. β = ext !(α) ∧ exec(IOAut(start, step, ext))(σ, α)) An Axiom
trace-finany-append ⊦ traceω(IOAut(start, step, ext))(nf) ∧ ⌜nf⌝ = ⌜el⌝ + β → (trace*(IOAut(start, step, ext))(el) ↔ true) A User Theorem
frag-noactions ⊦ frag(IOAut(start, step, ext))(σ, []) ↔ (∃ s. σ = ⌜s '⌝ ) A User Theorem
trace-append ⊦ trace(IOAut(start, step, ext))(⌜el⌝ + β) → (trace*(IOAut(start, step, ext))(el) ↔ true) A User Theorem
finfrag-rec ⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al) A User Theorem
frag-step-zeroα ≠ [] ⊦ ¬ step(σ[0], α[0], σ[1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false) A User Theorem
finfrag-one ⊦ frag*(IOAut(start, step, ext))(s ', []) A User Theorem
exec-fin2 ⊦ ¬ exec(IOAut(start, step, ext))(⌜sl⌝ , ⌜af⌝ ) A User Theorem
fragstar-def ⊦ frag(ioa)(⌜sl⌝ , ⌜al⌝ ) ↔ frag*(ioa)(sl, al) An Axiom
infexec ⊦ execω(ioa)(sf, af) ↔ fragω(ioa)(sf, af) ∧ ioa.start(sf(0)) A User Theorem
preserve-INV-finfrag*(IOAut(start, step, ext))(sl, al), iNV(sl[0]), ∀ s, a, s0. iNV(s) ∧ step(s, a, s0) → iNV(s0) ⊦ iNV(sl.last) A User Theorem
exec ⊦ exec(ioa)(σ, α) ↔ frag(ioa)(σ, α) ∧ ioa.start(σ[0]) An Axiom
fragfin-size-ls ⊦ frag*(IOAut(start, step, ext))(sl, al) → (# sl < # al ↔ false) A User Theorem
move-one ⊦ step(s, a, s0) → move(IOAut(start, step, ext))(s, ext !(a '), s0) A User Theorem
fragstar-onestate ⊦ frag*(IOAut(start, step, ext))(s ', al) ↔ al = [] A User Theorem
execomega ⊦ exec(ioa)(⌜sf⌝ , ⌜af⌝ ) ↔ execω(ioa)(sf, af) An Axiom
frag-two ⊦ frag(IOAut(start, step, ext))(⌜s ' + s0 '⌝ , ⌜a '⌝ ) ↔ step(s, a, s0) A User Theorem
frag-step-inf-zero ⊦ ¬ step(sf(0), α[0], sf(1)) → (frag(IOAut(start, step, ext))(⌜sf⌝ , α) ↔ false) A User Theorem
move-split¬ # el < n, move(IOAut(start, step, ext))(s, el, s2) ⊦ ∃ s1. move(IOAut(start, step, ext))(s, el.take(n), s1) ∧ move(IOAut(start, step, ext))(s1, el.drop(n), s2) A User Theorem
fraginf ⊦ fragω(ioa)(sf, af) ↔ (∀ n. ioa.step(sf(n), af(n), sf(n +1))) A User Theorem
not-finfrag-empty ⊦ ¬ frag*(IOAut(start, step, ext))([], al) A User Theorem
exec-step-inf-zero ⊦ ¬ step(sf(0), α[0], sf(1)) → (exec(IOAut(start, step, ext))(⌜sf⌝ , α) ↔ false) A User Theorem
frag-rec-end2 ⊦ frag(IOAut(start, step, ext))(⌜sl0⌝ + ⌜sl⌝ + ⌜s '⌝ , α + ⌜a '⌝ ) ↔ step((sl0 + sl).last, a, s) ∧ frag(IOAut(start, step, ext))(⌜sl0⌝ + ⌜sl⌝ , α) A User Theorem
inftrace ⊦ traceω(IOAut(start, step, ext))(ef) ↔ (∃ sf, af. ⌜ef⌝ = ext !(⌜af⌝ ) ∧ execω(IOAut(start, step, ext))(sf, af)) A User Theorem
exec-step⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (exec(IOAut(start, step, ext))(σ, α) ↔ false) A User Theorem
exec-step-fin-2⌜n⌝ < # α ⊦ ¬ step(sl[n], α[n], sl[n + 1]) → (exec(IOAut(start, step, ext))(⌜sl⌝ , α) ↔ false) A User Theorem
frag-to-fin ⊦ frag*(IOAut(start, step, ext))(sl, al) ∧ ¬ # al < n → (frag*(IOAut(start, step, ext))(sl.take(n + 1), al.take(n)) ↔ true) A User Theorem
frag-from-inf ⊦ fragω(IOAut(start, step, ext))(sf, af) → (fragω(IOAut(start, step, ext))(sf.drop(n), af.drop(n)) ↔ true) A User Theorem
inffrag-rec2 ⊦ fragω(IOAut(start, step, ext))(sf, a ' + af) ↔ step(sf(0), a, sf(1)) ∧ fragω(IOAut(start, step, ext))(λ n. sf(n + 1), af) A User Theorem
exec-step-zeroα ≠ [] ⊦ ¬ step(σ[0], α[0], σ[1]) → (exec(IOAut(start, step, ext))(σ, α) ↔ false) A User Theorem
frag-step-fin-2⌜n⌝ < # α ⊦ ¬ step(sl[n], α[n], sl[n + 1]) → (frag(IOAut(start, step, ext))(⌜sl⌝ , α) ↔ false) A User Theorem
finexec ⊦ exec*(ioa)(sl, al) ↔ frag*(ioa)(sl, al) ∧ ioa.start(sl[0]) A User Theorem
shortest-fragfrag*(IOAut(start, step, ext))(sl, al) ⊦ ∃ sl0, al0. sl0.head = sl.head ∧ sl0.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl0, al0) ∧ (∀ sl1, al1. sl1.head = sl.head ∧ sl1.last = sl.last ∧ frag*(IOAut(start, step, ext))(sl1, al1) → # sl0 ≤ # sl1) A User Theorem
move-one-ext ⊦ step(s, a, s0) ∧ ext(a) = Some(e) → move(IOAut(start, step, ext))(s, e ', s0) A User Theorem
frag-step⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false) A User Theorem
exec-fin1 ⊦ ¬ exec(IOAut(start, step, ext))(⌜sf⌝ , ⌜al⌝ ) A User Theorem
allfragto-frag# σ = # α + ⌜1⌝ , ∀ n. ¬ # α < ⌜n⌝ → frag*(IOAut(start, step, ext))(σ.take(n + 1), α.take(n)) ⊦ frag(IOAut(start, step, ext))(σ, α) A User Theorem