| ⊦ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜ren(a) '⌝ + ⌜paf⌝ )) ⊑ aext !(⌜aa '⌝ + aα) ∧ frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ∧ aext !(⌜aal⌝ ) = [] ∧ n = # aal ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ∧ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ ren(a) = cren(ca) ∧ cext(ca) = aext(aa) → repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜ren(a) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(n + 1), aα) |
aext !(⌜aal⌝ ) = [], cext(ca) = aext(aa), n = # aal, ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜ren(a) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(n + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜ren(a) '⌝ + ⌜paf⌝ )) ⊑ aext !(⌜aa '⌝ + aα) ⊦
| aext !(⌜aal⌝ ) = [], cext(ca) = aext(aa), n = # aal, ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜ren(a) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(n + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜ren(a) '⌝ + ⌜paf⌝ )) ⊑ aext !(⌜aa '⌝ + aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ oe + β = (oe = None ⊃ [];⌜oe.get '⌝ ) + β; (s) ⊦ ext !(⌜a '⌝ + α) = ext(a) + ext !(α); (s) ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦ |
⊦ cext !(πra(step, cstep, ren, cren, ⌜pcs '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → repla(step, cstep, cren, ren, aren, cext, aext, ⌜pcs '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ, aα) = lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, pcs + pcsf.take(n), paf.take(n), aσ, aα)⌝ ⌝ )
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
Used terms: aren, ren, cstep, cext, aext, aα, cren, (s0, cs0), paf, aσ.drop(# aal + 1), step, pcsf
| ⊦ cext !(πra(step, cstep, ren, cren, ⌜pcs '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → repla(step, cstep, cren, ren, aren, cext, aext, ⌜pcs '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ, aα) = lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, pcs + pcsf.take(n), paf.take(n), aσ, aα)⌝ ⌝ ) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
pa = rren(ra) ⊦ Πok(lext, rext, lren, rren) ∧ fragω(IOAut(Π(lstart, rstart), Π(lstep, rstep, lren, rren, lext, rext), Π(lext, rext, lren, rren)))((ls0, rs0) ' + psf, paf) ∧ lstep(ls, la, ls0) ∧ rstep(rs, ra, rs0) ∧ lren(la) = rren(ra) → πra(lstep, rstep, lren, rren, ⌜(ls, rs) '⌝ + ⌜(ls0, rs0) '⌝ + ⌜psf⌝ , pa + ⌜paf⌝ ) = ⌜ra '⌝ + πra(lstep, rstep, lren, rren, ⌜(ls0, rs0) '⌝ + ⌜psf⌝ , ⌜paf⌝ )
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ∧ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ ren(a) = cren(ca) → πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ren(a) + ⌜paf⌝ ) = ⌜ca '⌝ + πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ ) ⊦
Used terms: cext, ren(a), cs, cstart, cstep, pcsf, ca, ren, ext, cren, a, cs0, step, start, paf, s, s0
| pa = rren(ra) ⊦ Πok(lext, rext, lren, rren) ∧ fragω(IOAut(Π(lstart, rstart), Π(lstep, rstep, lren, rren, lext, rext), Π(lext, rext, lren, rren)))((ls0, rs0) ' + psf, paf) ∧ lstep(ls, la, ls0) ∧ rstep(rs, ra, rs0) ∧ lren(la) = rren(ra) → πra(lstep, rstep, lren, rren, ⌜(ls, rs) '⌝ + ⌜(ls0, rs0) '⌝ + ⌜psf⌝ , pa + ⌜paf⌝ ) = ⌜ra '⌝ + πra(lstep, rstep, lren, rren, ⌜(ls0, rs0) '⌝ + ⌜psf⌝ , ⌜paf⌝ ) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ∧ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ ren(a) = cren(ca) → πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ren(a) + ⌜paf⌝ ) = ⌜ca '⌝ + πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ ) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ ) = ⌜ca '⌝ + πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ ), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
Used simplifier rules: ⊦ a + σ = ⌜a '⌝ + σ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ ) = ⌜ca '⌝ + πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ ), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(⌜ca '⌝ + πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(⌜ca '⌝ + πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), ⌜aext(aa).get '⌝ + cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (rext(ra) = None ↔ false); (as) ⊦ oe + β = (oe = None ⊃ [];⌜oe.get '⌝ ) + β; (s) ⊦ ext !(⌜a '⌝ + α) = ext(a) + ext !(α); (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ , aσ.drop(# aal + 1), aα), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), ⌜aext(aa).get '⌝ + cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
Used simplifier rules: ⊦ ⌜x⌝ + σ1 ⊑ ⌜x⌝ + σ2 ↔ σ1 ⊑ σ2; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ [] + σ = σ; (s) ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (rext(ra) = None ↔ false); (as)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ a + x = a ' + x; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦ |
⊦ cext !(πra(step, cstep, ren, cren, ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → repla(step, cstep, cren, ren, aren, cext, aext, ⌜pcsf⌝ , ⌜paf⌝ , aσ, aα) = lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, pcsf.take(n + 1), paf.take(n), aσ, aα)⌝ ⌝ )
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f⌝ , ⌜(⌜cren(ca) '⌝ + ⌜paf⌝ ).f⌝ )) ⊑ aext !(⌜aal⌝ + ⌜aa '⌝ + aα) → repla (step, cstep, cren, ren, aren, cext, aext, ⌜(⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f⌝ , ⌜(⌜cren(ca) '⌝ + ⌜paf⌝ ).f⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f.take(n + 1), (⌜cren(ca) '⌝ + ⌜paf⌝ ).f.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ⊦
Used terms: aren, ren, cstep, cext, aext, ⌜aal⌝ + ⌜aa '⌝ + aα, cren, (⌜cren(ca) '⌝ + ⌜paf⌝ ).f, aσ, step, (⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f
| ⊦ cext !(πra(step, cstep, ren, cren, ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → repla(step, cstep, cren, ren, aren, cext, aext, ⌜pcsf⌝ , ⌜paf⌝ , aσ, aα) = lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, pcsf.take(n + 1), paf.take(n), aσ, aα)⌝ ⌝ ) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f⌝ , ⌜(⌜cren(ca) '⌝ + ⌜paf⌝ ).f⌝ )) ⊑ aext !(⌜aal⌝ + ⌜aa '⌝ + aα) → repla (step, cstep, cren, ren, aren, cext, aext, ⌜(⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f⌝ , ⌜(⌜cren(ca) '⌝ + ⌜paf⌝ ).f⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f.take(n + 1), (⌜cren(ca) '⌝ + ⌜paf⌝ ).f.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ [] + σ = σ; (s) ⊦ ⌜[]⌝ = []; (s) ⊦ (⌜x⌝ + ⌜nf⌝ ).f = x + nf; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (⌜a '⌝ + ⌜x⌝ + ⌜nf⌝ ).f.take(n + 1) = a ' + (⌜x⌝ + ⌜nf⌝ ).f.take(n); (s) ⊦ ⌜x + nf⌝ = ⌜x⌝ + ⌜nf⌝ ; (s) ⊦ ⌜(⌜x⌝ + ⌜y⌝ + ⌜nf⌝ ).f⌝ = ⌜x⌝ + ⌜y⌝ + ⌜nf⌝ ; (s) ⊦ oe + β = (oe = None ⊃ [];⌜oe.get '⌝ ) + β; (s) ⊦ ext !(⌜a '⌝ + α) = ext(a) + ext !(α); (s) ⊦ ext !(⌜al⌝ + α2) = ⌜ext !(al)⌝ + ext !(α2); (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), repla(step, cstep, cren, ren, aren, cext, aext, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ , aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦ |
⊦ mon(⌜σf⌝ ) → lim(⌜σf⌝ ) = lim(⌜λ n. σf(n + m)⌝ )
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ⊦
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n + 1), (cren(ca) ' + paf).take(n + 1), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
Used terms: λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , 1
| ⊦ mon(⌜σf⌝ ) → lim(⌜σf⌝ ) = lim(⌜λ n. σf(n + m)⌝ ) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ⊦ |
⊦ mon(σσ) ↔ (∀ n. ⌜n⌝ + ⌜1⌝ < # σσ → σσ[n] ⊑ σσ[n + 1])
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ∃ n. ¬ ( ⌜n⌝ + ⌜1⌝ < # ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ → ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ [n ] ⊑ ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ [n + 1 ]) ⊦
Used terms: ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝
| ⊦ mon(σσ) ↔ (∀ n. ⌜n⌝ + ⌜1⌝ < # σσ → σσ[n] ⊑ σσ[n + 1]) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ∃ n. ¬ ( ⌜n⌝ + ⌜1⌝ < # ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ → ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ [n ] ⊑ ⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ [n + 1 ]) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + nf).take(n + 1) = a ' + nf.take(n); (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ⌜nf⌝ [n] = nf(n); (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜n⌝ ≠ ∞; (s) ⊦ ⌜m⌝ + n∞ = ∞ ↔ n∞ = ∞; (s) ⊦ n∞ < ∞ ↔ n∞ ≠ ∞; (s) ⊦ # ⌜nf⌝ = ∞; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊦ |
⊦ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsf, paf) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ cext !(πra(step, cstep, ren, cren, (s, cs) + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n), paf.take(n), ⌜as '⌝ + aσ, aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n + 1), paf.take(n + 1), ⌜as '⌝ + aσ, aα)⌝
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ , nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren))) ((s, cs) ' + (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f, (⌜cren(ca) '⌝ + ⌜paf⌝ ).f) ∧ frag(IOAut(astart, astep, aext))(⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ∧ cext !(πra(step, cstep, ren, cren, (s, cs) + ⌜(⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f⌝ , ⌜(⌜cren(ca) '⌝ + ⌜paf⌝ ).f⌝ )) ⊑ aext !(⌜aal⌝ + ⌜aa '⌝ + aα) → ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) + (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f.take(n), (⌜cren(ca) '⌝ + ⌜paf⌝ ).f.take(n), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) + (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f.take(n + 1), (⌜cren(ca) '⌝ + ⌜paf⌝ ).f.take(n + 1), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦
Used terms: aren, ren, cstep, cext, s, hd(aσ), aext, ⌜aal⌝ + ⌜aa '⌝ + aα, ext, astart, cstart, start, cren, astep, (⌜cren(ca) '⌝ + ⌜paf⌝ ).f, cs, n, tl(aσ), step, (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f
| ⊦ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsf, paf) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ cext !(πra(step, cstep, ren, cren, (s, cs) + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n), paf.take(n), ⌜as '⌝ + aσ, aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n + 1), paf.take(n + 1), ⌜as '⌝ + aσ, aα)⌝ |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ , nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren))) ((s, cs) ' + (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f, (⌜cren(ca) '⌝ + ⌜paf⌝ ).f) ∧ frag(IOAut(astart, astep, aext))(⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ∧ cext !(πra(step, cstep, ren, cren, (s, cs) + ⌜(⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f⌝ , ⌜(⌜cren(ca) '⌝ + ⌜paf⌝ ).f⌝ )) ⊑ aext !(⌜aal⌝ + ⌜aa '⌝ + aα) → ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) + (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f.take(n), (⌜cren(ca) '⌝ + ⌜paf⌝ ).f.take(n), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) + (⌜(s0, cs0) '⌝ + ⌜pcsf⌝ ).f.take(n + 1), (⌜cren(ca) '⌝ + ⌜paf⌝ ).f.take(n + 1), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ , fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsf, cren(ca) ' + paf) ∧ frag(IOAut(astart, astep, aext))(⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) → ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ [] + σ = σ; (s) ⊦ ⌜[]⌝ = []; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + nf).take(n + 1) = a ' + nf.take(n); (s) ⊦ (⌜x⌝ + ⌜nf⌝ ).f = x + nf; (s) ⊦ a + x = a ' + x; (s) ⊦ oe + β = (oe = None ⊃ [];⌜oe.get '⌝ ) + β; (s) ⊦ ext !(⌜a '⌝ + α) = ext(a) + ext !(α); (s) ⊦ ext !(⌜al⌝ + α2) = ⌜ext !(al)⌝ + ext !(α2); (s) ⊦ ⌜x + nf⌝ = ⌜x⌝ + ⌜nf⌝ ; (s) ⊦ a + σ = ⌜a '⌝ + σ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ , fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsf, cren(ca) ' + paf) ∧ frag(IOAut(astart, astep, aext))(⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) → ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜hd(aσ) '⌝ + tl(aσ), ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦ |
aext !(aal) = [], aσ = as + σ0, cext(ca) = aext(aa), ren(a) = cren(ca), aσ ≠ [], lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ , fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsf, cren(ca) ' + paf) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) → ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦
Used simplifier rules: ⊦ ¬ frag(IOAut(start, step, ext))([], α); (s) ⊦ σ ≠ [] → (a = hd(σ) ∧ σ0 = tl(σ) ↔ σ = a + σ0); (elim) Used terms: aσ, as, σ0
| aext !(aal) = [], aσ = as + σ0, cext(ca) = aext(aa), ren(a) = cren(ca), aσ ≠ [], lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ , fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsf, cren(ca) ' + paf) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) → ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsf, cren(ca) ' + paf), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + σ = ⌜a '⌝ + σ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s) ⊦ n ≠ 0 → (⌜a '⌝ + σ).drop((* n) + m) = σ.drop((n - 1) + m); (s) ⊦ ⌜a '⌝ + σ ≠ []; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsf, cren(ca) ' + paf), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦ |
⊦ fragω(IOAut(start, step, ext))(s ' + sf, a ' + af) ↔ step(s, a, sf(0)) ∧ fragω(IOAut(start, step, ext))(sf, af)
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , ¬ Π(step, cstep, ren, cren, ext, cext)((s, cs), cren(ca), (((s0, cs0) ' + pcsf))(0)) ∨ ¬ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ⊦
Used terms: (s, cs), Π(ext, cext, ren, cren), cren(ca), Π(start, cstart), (s0, cs0) ' + pcsf, paf, Π(step, cstep, ren, cren, ext, cext)
| ⊦ fragω(IOAut(start, step, ext))(s ' + sf, a ' + af) ↔ step(s, a, sf(0)) ∧ fragω(IOAut(start, step, ext))(sf, af) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , ¬ Π(step, cstep, ren, cren, ext, cext)((s, cs), cren(ca), (((s0, cs0) ' + pcsf))(0)) ∨ ¬ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ Π(step, cstep, ren, cren, ext, cext)((s, cs), cren(ca), (s0, cs0)), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦
Used simplifier rules: ⊦ ((a ' + nf))(0) = a; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ Π(step, cstep, ren, cren, ext, cext)((s, cs), cren(ca), (s0, cs0)), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊦ |
⊦ Π(lstep, rstep, lren, rren, lext, rext)((ls, rs), pa, (ls0, rs0)) ↔ rs = rs0 ∧ (∃ la. lstep(ls, la, ls0) ∧ pa = lren(la) ∧ ¬ cod(rren)(pa)) ∨ ls = ls0 ∧ (∃ ra. rstep(rs, ra, rs0) ∧ pa = rren(ra) ∧ ¬ cod(lren)(pa)) ∨ (∃ la, ra. lstep(ls, la, ls0) ∧ lext(la) ≠ None ∧ pa = lren(la) ∧ rstep(rs, ra, rs0) ∧ rext(ra) ≠ None ∧ pa = rren(ra))
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , ∀ la, ra. ¬(step(s, la, s0) ∧ ext(la) ≠ None ∧ cren(ca) = ren(la) ∧ cstep(cs, ra, cs0) ∧ cext(ra) ≠ None ∧ cren(ca) = cren(ra)), cs ≠ cs0 ∨ (∀ la. ¬(step(s, la, s0) ∧ cren(ca) = ren(la) ∧ ¬ cod(cren)(cren(ca)))), s ≠ s0 ∨ (∀ ra. ¬(cstep(cs, ra, cs0) ∧ cren(ca) = cren(ra) ∧ ¬ cod(ren)(cren(ca)))) ⊦
Used terms: cext, cren(ca), cs, cstep, ren, ext, cren, cs0, step, s, s0
| ⊦ Π(lstep, rstep, lren, rren, lext, rext)((ls, rs), pa, (ls0, rs0)) ↔ rs = rs0 ∧ (∃ la. lstep(ls, la, ls0) ∧ pa = lren(la) ∧ ¬ cod(rren)(pa)) ∨ ls = ls0 ∧ (∃ ra. rstep(rs, ra, rs0) ∧ pa = rren(ra) ∧ ¬ cod(lren)(pa)) ∨ (∃ la, ra. lstep(ls, la, ls0) ∧ lext(la) ≠ None ∧ pa = lren(la) ∧ rstep(rs, ra, rs0) ∧ rext(ra) ≠ None ∧ pa = rren(ra)) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , ∀ la, ra. ¬(step(s, la, s0) ∧ ext(la) ≠ None ∧ cren(ca) = ren(la) ∧ cstep(cs, ra, cs0) ∧ cext(ra) ≠ None ∧ cren(ca) = cren(ra)), cs ≠ cs0 ∨ (∀ la. ¬(step(s, la, s0) ∧ cren(ca) = ren(la) ∧ ¬ cod(cren)(cren(ca)))), s ≠ s0 ∨ (∀ ra. ¬(cstep(cs, ra, cs0) ∧ cren(ca) = cren(ra) ∧ ¬ cod(ren)(cren(ca)))) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), ren(a0) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , ∀ la. ¬ step(s, la, s0) ∨ cren(ca) ≠ ren(la) ⊦
Used simplifier rules: ⊦ cod(f)(b) ↔ (∃ a. f(a) = b); (as) ⊦ ¬ cod(f)(b) → b ≠ f(a); (as) ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (rext(ra) = None ↔ false); (as) ⊦ Πok(lext, rext, lren, rren) → (rren(ra1) = rren(ra2) ↔ ra1 = ra2); (s) ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (lext(la) = None ↔ false); (as) ⊦ cod(f)(f(a)); (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), ren(a0) = cren(ca), lim (⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n0), (cren(ca) ' + paf).take(n0), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), σ0.drop(# aal), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), ⌜as '⌝ + σ0, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ , ∀ la. ¬ step(s, la, s0) ∨ cren(ca) ≠ ren(la) ⊦ |
Used terms: a
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n + 1), (cren(ca) ' + paf).take(n + 1), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + nf).take(n + 1) = a ' + nf.take(n); (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦ |
aext !(aal) = [], (λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ) = (λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ), cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), (λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ) ≠ (λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦
Used formulas: (λ n. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ) = (λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα) ⌝ )
| aext !(aal) = [], (λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ) = (λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ), cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦ |
⊦ mon(⌜σf⌝ ) → lim(⌜λ n. ⌜x⌝ + σf(n)⌝ ) = ⌜x⌝ + lim(⌜σf⌝ )
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ mon(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ⊦
Used simplifier rules: ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # x = # y → (⌜x⌝ + σ = ⌜y⌝ + σ0 ↔ x = y ∧ σ = σ0); (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: aal.map(aren) + aren(aa) ', λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα) ⌝
| ⊦ mon(⌜σf⌝ ) → lim(⌜λ n. ⌜x⌝ + σf(n)⌝ ) = ⌜x⌝ + lim(⌜σf⌝ ) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ mon(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ mon(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ mon(⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ⊦ |
⊦ mon(σσ) ↔ (∀ n. ⌜n⌝ + ⌜1⌝ < # σσ → σσ[n] ⊑ σσ[n + 1])
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ∃ n. ¬ ( ⌜n⌝ + ⌜1⌝ < # ⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ → ⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ [n] ⊑ ⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ [n + 1]) ⊦
Used terms: ⌜λ n0. ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα) ⌝ ⌝
| ⊦ mon(σσ) ↔ (∀ n. ⌜n⌝ + ⌜1⌝ < # σσ → σσ[n] ⊑ σσ[n + 1]) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ∃ n. ¬ ( ⌜n⌝ + ⌜1⌝ < # ⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ → ⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ [n] ⊑ ⌜λ n0. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n0), paf.take(n0), aσ.drop(# aal + 1), aα)⌝ ⌝ [n + 1]) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ ⊦
Used simplifier rules: ⊦ ⌜nf⌝ [n] = nf(n); (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜n⌝ ≠ ∞; (s) ⊦ ⌜m⌝ + n∞ = ∞ ↔ n∞ = ∞; (s) ⊦ n∞ < ∞ ↔ n∞ ≠ ∞; (s) ⊦ # ⌜nf⌝ = ∞; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ ⊦ |
⊦ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsf, paf) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ cext !(πra(step, cstep, ren, cren, (s, cs) + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n), paf.take(n), ⌜as '⌝ + aσ, aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n + 1), paf.take(n + 1), ⌜as '⌝ + aσ, aα)⌝
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ∧ frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ∧ cext !(πra(step, cstep, ren, cren, (s0, cs0) + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦
Used terms: aren, ren, cstep, cext, s0, aσ[# aal + 1], aext, aα, ext, astart, cstart, start, cren, astep, paf, cs0, n, aσ.drop(# aal + 2), step, pcsf
| ⊦ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsf, paf) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ cext !(πra(step, cstep, ren, cren, (s, cs) + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n), paf.take(n), ⌜as '⌝ + aσ, aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) + pcsf.take(n + 1), paf.take(n + 1), ⌜as '⌝ + aσ, aα)⌝ |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf) ∧ frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ∧ cext !(πra(step, cstep, ren, cren, (s0, cs0) + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s) ⊦ a + σ = ⌜a '⌝ + σ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦ |
⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ¬ # α < ⌜n⌝ → (frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)) ↔ true)
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ , frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ∧ ¬ #(⌜aal⌝ + ⌜aa '⌝ + aα) < ⌜# aal + 1⌝ → (frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), (⌜aal⌝ + ⌜aa '⌝ + aα).drop(# aal + 1)) ↔ true) ⊦
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα, astart, aσ, # aal + 1, astep
| ⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ¬ # α < ⌜n⌝ → (frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)) ↔ true) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ , frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ∧ ¬ #(⌜aal⌝ + ⌜aa '⌝ + aα) < ⌜# aal + 1⌝ → (frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), (⌜aal⌝ + ⌜aa '⌝ + aα).drop(# aal + 1)) ↔ true) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (⌜a '⌝ + σ).drop(1) = σ; (s) ⊦ (⌜x⌝ + σ).drop(m + # x) = σ.drop(m); (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ¬ n∞ + n∞1 < n∞1; (s) ⊦ n∞ + ⌜0⌝ = n∞; (s) ⊦ m ≤ n → (⌜(* m)⌝ + n∞2 < ⌜(* n)⌝ + n∞1 ↔ n∞2 < ⌜n - m⌝ + n∞1); (s) ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦ |
⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1)
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜# aal + 1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ a + σ = ⌜a '⌝ + σ; (s) Used terms: aσ, # aal + 1
| ⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1) |
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜# aal + 1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜# aal⌝ + ⌜1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜# aal⌝ + ⌜1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ ⊦ |
⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1]))
aext !(aal) = [], # aσ = #(⌜aal⌝ + ⌜aa '⌝ + aα) + ⌜1⌝ , cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜# aal⌝ + ⌜1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ , ∀ n. ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα) → astep(aσ[n], (⌜aal⌝ + ⌜aa '⌝ + aα)[n], aσ[n +1]) ⊦
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα, astart, aσ, astep
| ⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1])) |
| aext !(aal) = [], # aσ = #(⌜aal⌝ + ⌜aa '⌝ + aα) + ⌜1⌝ , cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), ¬ ⌜# aal⌝ + ⌜1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ , ∀ n. ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα) → astep(aσ[n], (⌜aal⌝ + ⌜aa '⌝ + aα)[n], aσ[n +1]) ⊦ |
aext !(aal) = [], # aσ = ⌜2⌝ + ⌜# aal⌝ + # aα, cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜# aal⌝ + ⌜1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ , ∀ n0. ¬ ⌜# aal⌝ + # aα < ⌜n0⌝ → astep(aσ[n0], (⌜aal⌝ + ⌜aa '⌝ + aα)[n0], aσ[n0 + 1]) ⊦
Used simplifier rules: ⊦ m +1 = m + 1; (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜n⌝ < ⌜1⌝ + n∞ ↔ ¬ n∞ < ⌜n⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ⌜(* n)⌝ + ⌜(* m)⌝ = ⌜n + m⌝ ; (s)
| aext !(aal) = [], # aσ = ⌜2⌝ + ⌜# aal⌝ + # aα, cext(ca) = aext(aa), ren(a) = cren(ca), lim (⌜λ n. (⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ ) + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal + 1), aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), ¬ ⌜# aal⌝ + ⌜1⌝ < # aσ, ¬ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⊑ ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), aσ.drop(# aal + 1), aα)⌝ , frag(IOAut(astart, astep, aext))(⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) → ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα)⌝ ⊑ ⌜repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n + 1), paf.take(n + 1), ⌜aσ[# aal + 1] '⌝ + aσ.drop(# aal + 2), aα) ⌝ , ∀ n0. ¬ ⌜# aal⌝ + # aα < ⌜n0⌝ → astep(aσ[n0], (⌜aal⌝ + ⌜aa '⌝ + aα)[n0], aσ[n0 + 1]) ⊦ |
Used simplifier rules: ⊦ m ≤ n → (⌜(* m)⌝ + n∞2 < ⌜(* n)⌝ + n∞1 ↔ n∞2 < ⌜n - m⌝ + n∞1); (s) ⊦ ⌜n⌝ < ⌜1⌝ + n∞ ↔ ¬ n∞ < ⌜n⌝ ; (s) ⊦ ¬ n∞ + n∞1 < n∞1; (s) add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), (λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ) ≠ (λ n. ⌜aal.map(aren) + aren(aa) '⌝ + ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα) ⊦ |
aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα) ≠ repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ ⌜x⌝ + ⌜y⌝ + ⌜z⌝ = ⌜x0⌝ ↔ x + y + z = x0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s)
| aext !(aal) = [], cext(ca) = aext(aa), ren(a) = cren(ca), aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα) ≠ repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), lim (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsf.take(n), cren(ca) ' + paf.take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα)⌝ ⌝ ) ≠ ⌜aal.map(aren)⌝ + ⌜aren(aa) '⌝ + lim(⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsf.take(n), paf.take(n), aσ.drop(# aal + 1), aα)⌝ ⌝ ), cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(aσ, ⌜aal⌝ + ⌜aa '⌝ + aα), fragω(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsf, paf), mon (⌜λ n. ⌜repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + ((s0, cs0) ' + pcsf).take(n), (cren(ca) ' + paf).take(n), aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) ⌝ ⌝ ), nounsharedextR(cren, cext, ren), step(s, a, s0), Πok(ext, cext, ren, cren), cext !(πra(step, cstep, ren, cren, ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜paf⌝ )) ⊑ aext !(aα), cext !(πra(step, cstep, ren, cren, ⌜(s, cs) '⌝ + ⌜(s0, cs0) '⌝ + ⌜pcsf⌝ , ⌜cren(ca) '⌝ + ⌜paf⌝ )) ⊑ (aext(aa) = None ⊃ [];⌜aext(aa).get '⌝ ) + aext !(aα) ⊦ |
⊦ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ cren(ca) = ren(a) ∧ aext !(⌜aal⌝ ) = [] ∧ cext(ca) = aext(aa) ∧ n = # aal → repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a) ' + pal, aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal, aσ.drop(n + 1), aα)
Used simplifier rules: ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ ⌜x⌝ = [] ↔ x = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: aren, ren, cstep, cext, aa, s, aext, aα, ca, a, paf.take(n), cren, aal, pcsf.take(n), cs0, s0, cs, # aal, aσ, step
| ⊦ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ cren(ca) = ren(a) ∧ aext !(⌜aal⌝ ) = [] ∧ cext(ca) = aext(aa) ∧ n = # aal → repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a) ' + pal, aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal, aσ.drop(n + 1), aα) |
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.