| ⊦ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ Πok(ext, aext, ren, aren) ∧ oinj(cext) ∧ oinj(aext) ∧ oinj(ext) ∧ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl, pal) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ cext !(⌜πra(step, cstep, ren, cren, pcsl, pal)⌝ ) ⊑ aext !(aα) ∧ sameshared(cren, aren, ren) → frag*(Π(IOAut(start, step, ext), IOAut(astart, astep, aext), ren, aren)) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα)) |
frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), cext !(⌜πra(step, cstep, ren, cren, pcsl, pal)⌝ ) ⊑ aext !(aα), ¬ frag*(Π(IOAut(start, step, ext), IOAut(astart, astep, aext), ren, aren)) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα)) ⊦
| frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), cext !(⌜πra(step, cstep, ren, cren, pcsl, pal)⌝ ) ⊑ aext !(aα), ¬ frag*(Π(IOAut(start, step, ext), IOAut(astart, astep, aext), ren, aren)) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα)) ⊦ |
frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα)) ⊦
Used simplifier rules: ⊦ Π(IOAut(lstart, lstep, lext), IOAut(rstart, rstep, rext), lren, rren) = IOAut (Π(lstart, rstart), Π(lstep, rstep, lren, rren, lext, rext), Π(lext, rext, lren, rren)); (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl, pal, ⌜as '⌝ + aσ, aα)) ⊦ |
frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, pcs + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart, astep, aext, as, aσ, aα, start, cstart, step, cstep, ren, cren, ext, cext, pal, aren. ¬ ( frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl0, pal) ∧ nounsharedextR(cren, cext, ren) ∧ oinj(ext) ∧ oinj(aext) ∧ oinj(cext) ∧ sameshared(cren, aren, ren) ∧ Πok(ext, aext, ren, aren) ∧ Πok(ext, cext, ren, cren) ∧ ⌜cext !(πra(step, cstep, ren, cren, pcsl0, pal))⌝ ⊑ aext !(aα) ∧ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl0, pal, ⌜as '⌝ + aσ, aα))) ⊦
Used simplifier rules: List('a) freely generated by [], +;; ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s)
| frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, pcs + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart, astep, aext, as, aσ, aα, start, cstart, step, cstep, ren, cren, ext, cext, pal, aren. ¬ ( frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcsl0, pal) ∧ nounsharedextR(cren, cext, ren) ∧ oinj(ext) ∧ oinj(aext) ∧ oinj(cext) ∧ sameshared(cren, aren, ren) ∧ Πok(ext, aext, ren, aren) ∧ Πok(ext, cext, ren, cren) ∧ ⌜cext !(πra(step, cstep, ren, cren, pcsl0, pal))⌝ ⊑ aext !(aα) ∧ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcsl0, pal, ⌜as '⌝ + aσ, aα))) ⊦ |
frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s)
| frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl0 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl = # al ↔ true); (ss) Used formulas: # pcsl0 = # pal
| # pcsl0 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl0 = # pal, pcs = (s, cs), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl0 = # pal, pcs = (s, cs), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl0 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl0 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl0 = # pal, pcsl0 = pcs + pcsl, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: repls-base: ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ', [], ⌜as '⌝ + aσ, aα) = (s, as) '; repla-base: ⊦ repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ', [], ⌜as '⌝ + aσ, aα) = []; List('a) freely generated by [], +;; ⊦ # [] = 0; (s) ⊦ # x = 0 ↔ x = []; (s) ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ¬ frag*(IOAut(start, step, ext))([], al); (s) ⊦ πra(lstep, rstep, lren, rren, (ls, rs) ', []) = []; (s) ⊦ ext !([]) = []; (s) ⊦ ⌜[]⌝ = []; (s) ⊦ [] ⊑ σ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ frag*(IOAut(start, step, ext))(s ', []); (s)
| # pcsl0 = # pal, pcsl0 = pcs + pcsl, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcsl0, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcsl0, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcsl0, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcsl0, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl + 1 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcs ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcs ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcs ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s)
| # pcsl + 1 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcs ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcs ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcs ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl + 1 = # pal, pcs = (s0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcs ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcs ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcs ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl + 1 = # pal, pcs = (s0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + pcs ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))(pcs ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, pcs ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, pcs ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl + 1 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl + 1 = # pal, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl + 1 = # pal, pal = pa + pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: List('a) freely generated by [], +;; ⊦ # [] = 0; (s) ⊦ m + n = 0 ↔ m = 0 ∧ n = 0; (ws) ⊦ # x = 0 ↔ x = []; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic
| # pcsl + 1 = # pal, pal = pa + pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsl, pal), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pal))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + n = m + n0 ↔ n = n0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s)
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al)
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, ((s0, cs0) ' + pcsl).head), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: pal1, (s, cs), Π(ext, cext, ren, cren), (s0, cs0) ' + pcsl, pa, Π(start, cstart), Π(step, cstep, ren, cren, ext, cext)
| ⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al) |
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, ((s0, cs0) ' + pcsl).head), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, (s0, cs0)), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).head = a; (s)
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, (s0, cs0)), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
⊦ Π(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))
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), cs = cs0 ∧ (∃ la. step(s, la, s0) ∧ pa = ren(la) ∧ ¬ cod(cren)(pa)) ∨ s = s0 ∧ (∃ ra. cstep(cs, ra, cs0) ∧ pa = cren(ra) ∧ ¬ cod(ren)(pa)) ∨ (∃ la, ra. step(s, la, s0) ∧ ext(la) ≠ None ∧ pa = ren(la) ∧ cstep(cs, ra, cs0) ∧ cext(ra) ≠ None ∧ pa = cren(ra)) ⊦
Used terms: cext, pa, 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)) |
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), cs = cs0 ∧ (∃ la. step(s, la, s0) ∧ pa = ren(la) ∧ ¬ cod(cren)(pa)) ∨ s = s0 ∧ (∃ ra. cstep(cs, ra, cs0) ∧ pa = cren(ra) ∧ ¬ cod(ren)(pa)) ∨ (∃ la, ra. step(s, la, s0) ∧ ext(la) ≠ None ∧ pa = ren(la) ∧ cstep(cs, ra, cs0) ∧ cext(ra) ≠ None ∧ pa = cren(ra)) ⊦ |
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), cs = cs0 ∧ step(s, a, s0) ∧ pa = ren(a) ∧ ¬ cod(cren)(ren(a)) ∨ s = s0 ∧ cstep(cs, ca, cs0) ∧ pa = cren(ca) ∧ ¬ cod(ren)(cren(ca)) ∨ step(s, a0, s0) ∧ ext(a0) ≠ None ∧ cren(ca0) = ren(a0) ∧ cstep(cs, ca0, cs0) ∧ cext(ca0) ≠ None ∧ pa = cren(ca0) ⊦
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), cs = cs0 ∧ step(s, a, s0) ∧ pa = ren(a) ∧ ¬ cod(cren)(ren(a)) ∨ s = s0 ∧ cstep(cs, ca, cs0) ∧ pa = cren(ca) ∧ ¬ cod(ren)(cren(ca)) ∨ step(s, a0, s0) ∧ ext(a0) ≠ None ∧ cren(ca0) = ren(a0) ∧ cstep(cs, ca0, cs0) ∧ cext(ca0) ≠ None ∧ pa = cren(ca0) ⊦ |
# pcsl = # pal1, cs = cs0, pa = ren(a), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
# pcsl = # pal1, pa = cren(ca), s = s0, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
# pcsl = # pal1, cren(ca0) = ren(a0), pa = cren(ca0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl = # pal1, cs = cs0, pa = ren(a), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s, as) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), ren(a) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: repls-rec-addS: ⊦ step(s, a, s0) ∧ ¬ cod(cren)(ren(a)) → repls (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs) ' + pcsl, ren(a) ' + pal, ⌜as '⌝ + aσ, aα) = (s, as) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα); repla-rec-addS: ⊦ step(s, a, s0) ∧ ¬ cod(cren)(ren(a)) → repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs) ' + pcsl, ren(a) ' + pal, ⌜as '⌝ + aσ, aα) = ren(a) ' + repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα); a: ⊦ (x + y) + z = x + y + z; from specification list append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # psl = # pal ∧ lstep(ls, la, ls0) ∧ ¬ cod(rren)(lren(la)) → πra(lstep, rstep, lren, rren, (ls, rs) ' + (ls0, rs) ' + psl, lren(la) ' + pal) = πra(lstep, rstep, lren, rren, (ls0, rs) ' + psl, pal); (s)
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s, as) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), ren(a) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al)
# pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext) ((s, as), ren(a), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα).head) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), (s, as), Π(ext, aext, ren, aren), repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), ren(a), Π(start, astart), Π(step, astep, ren, aren, ext, aext)
| ⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al) |
| # pcsl = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext) ((s, as), ren(a), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα).head) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, 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) '⌝ + ⌜pcsl⌝ , ⌜pal⌝ ), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + pcsl, pal)⌝ ) ⊑ aext !(aα) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα).head = (s, as)
# pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα).head = (s0, as), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) ≠ [], frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext) ((s, as), ren(a), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα).head) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used simplifier rules: ⊦ frag(ioa)(σ, ⌜al⌝ ) ↔ frag*(ioa)(σ.l, al) ∧ finp(σ); (s) ⊦ (⌜x⌝ + ⌜y⌝ ).l = x + y; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ finp(σ) ↔ ¬(∃ nf. ⌜nf⌝ = σ); (ss) ⊦ σ0 + ⌜x⌝ = ⌜nf0⌝ ↔ σ0 = ⌜nf0⌝ ; (s) ⊦ ⌜x⌝ ≠ ⌜nf⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: aren, ren, cstep, cext, s0, as, aext, aα, ext, astart, cstart, start, pal1, cren, astep, pcsl, cs0, aσ, step
| 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) '⌝ + ⌜pcsl⌝ , ⌜pal⌝ ), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + pcsl, pal)⌝ ) ⊑ aext !(aα) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα).head = (s, as) |
| # pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα).head = (s0, as), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) ≠ [], frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext) ((s, as), ren(a), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα).head) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦ |
# pcsl = # pal1, pas = (s0, as), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = pas + x0, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) ≠ [], frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), ren(a), pas) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), pas, x0
| # pcsl = # pal1, pas = (s0, as), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = pas + x0, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) ≠ [], frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), ren(a), pas) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦ |
# pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), ren(a), (s0, as)) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ a + x = a ' + x; (s)
| # pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), ren(a), (s0, as)) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, 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))
# pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ ( as = as ∧ (∃ la. step(s, la, s0) ∧ ren(a) = ren(la) ∧ ¬ cod(aren)(ren(a))) ∨ s = s0 ∧ (∃ ra. astep(as, ra, as) ∧ ren(a) = aren(ra) ∧ ¬ cod(ren)(ren(a))) ∨ (∃ la, ra. step(s, la, s0) ∧ ext(la) ≠ None ∧ ren(a) = ren(la) ∧ astep(as, ra, as) ∧ aext(ra) ≠ None ∧ ren(a) = aren(ra))) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used terms: aext, ren(a), as, astep, ren, ext, aren, as, 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)) |
| # pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ¬ ( as = as ∧ (∃ la. step(s, la, s0) ∧ ren(a) = ren(la) ∧ ¬ cod(aren)(ren(a))) ∨ s = s0 ∧ (∃ ra. astep(as, ra, as) ∧ ren(a) = aren(ra) ∧ ¬ cod(ren)(ren(a))) ∨ (∃ la, ra. step(s, la, s0) ∧ ext(la) ≠ None ∧ ren(a) = ren(la) ∧ astep(as, ra, as) ∧ aext(ra) ≠ None ∧ ren(a) = aren(ra))) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦ |
# pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), cod(aren)(ren(a)) ∧ ¬(∃ ra. astep(as, ra, as) ∧ ren(a) = aren(ra)) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used simplifier rules: ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (lext(la) = None ↔ false); (as) ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (rext(ra) = None ↔ false); (as) ⊦ Πok(lext, rext, lren, rren) → (lren(la1) = lren(la2) ↔ la1 = la2); (s) ⊦ cod(f)(f(a)); (s)
| # pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), cod(aren)(ren(a)) ∧ ¬(∃ ra. astep(as, ra, as) ∧ ren(a) = aren(ra)) ∨ ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦ |
# pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: sameshared-notcodc-notcoda: ⊦ sameshared(cren, aren, ren) ∧ ¬ cod(cren)(ren(a)) → aren(aa) ≠ ren(a); ⊦ cod(f)(b) ↔ (∃ a. f(a) = b); (as)
| # pcsl = # pal1, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα) = (s0, as) ' + x0, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(cren)(ren(a)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ((s0, as) ' + x0, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
Used terms: astart, astep, aext, as, aσ, aα, start, cstart, step, cstep, ren, cren, ext, cext, pal1, aren
| # pcsl = # pal1, pa = cren(ca), s = s0, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(ca ')⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: repls-rec-skip: ⊦ cstep(cs, ca, cs0) ∧ ¬ cod(ren)(cren(ca)) → repls (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s, cs0) ' + pcsl, cren(ca) ' + pal, ⌜as '⌝ + aσ, aα) = repls (step, cstep, cren, ren, aren, cext, aext, (s, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα); repla-rec-skip: ⊦ cstep(cs, ca, cs0) ∧ ¬ cod(ren)(cren(ca)) → repla (step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s, cs0) ' + pcsl, cren(ca) ' + pal, ⌜as '⌝ + aσ, aα) = repla (step, cstep, cren, ren, aren, cext, aext, (s, cs0) ' + pcsl, pal, ⌜as '⌝ + aσ, aα); a: ⊦ (x + y) + z = x + y + z; from specification list append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ ext !(al + al0) = ext !(al) + ext !(al0); (s) ⊦ a + x = a ' + x; (s) ⊦ # psl = # pal ∧ rstep(rs, ra, rs0) ∧ ¬ cod(lren)(rren(ra)) → πra(lstep, rstep, lren, rren, (ls, rs) ' + (ls, rs0) ' + psl, rren(ra) ' + pal) = ra + πra(lstep, rstep, lren, rren, (ls, rs0) + psl, pal); (s)
| # pcsl = # pal1, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(ca ')⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(ca ')⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ¬ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∨ ¬ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1) ∨ ¬ nounsharedextR(cren, cext, ren) ∨ ¬ oinj(ext) ∨ ¬ oinj(aext) ∨ ¬ oinj(cext) ∨ ¬ sameshared(cren, aren, ren) ∨ ¬ Πok(ext, aext, ren, aren) ∨ ¬ Πok(ext, cext, ren, cren) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦
Used terms: astart, astep, aext, as, aσ, aα, start, cstart, step, cstep, ren, cren, ext, cext, pal1, aren
| # pcsl = # pal1, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(ca ')⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ¬ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∨ ¬ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1) ∨ ¬ nounsharedextR(cren, cext, ren) ∨ ¬ oinj(ext) ∨ ¬ oinj(aext) ∨ ¬ oinj(cext) ∨ ¬ sameshared(cren, aren, ren) ∨ ¬ Πok(ext, aext, ren, aren) ∨ ¬ Πok(ext, cext, ren, cren) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)) ⊦ |
# pcsl = # pal1, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(ca ')⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα) ⊦
| # pcsl = # pal1, cstep(cs, ca, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext !(ca ')⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜as '⌝ + aσ, aα)), ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα) ⊦ |
⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get ')
Used simplifier rules: nounsharedextR-notcodren-internal: ⊦ ¬ cod(ren)(cren(ca)) ∧ nounsharedextR(cren, cext, ren) → (cext(ca) = None ↔ true); ⊦ ⌜[]⌝ = []; (s) ⊦ [] + σ = σ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: cext, ca
| ⊦ ext !(a ') = (ext(a) = None ⊃ [];ext(a).get ') |
| # pcsl = # pal1, cren(ca0) = ren(a0), pa = cren(ca0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, pa ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext(ca0).get '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ ext(a) ≠ None → ext !(a ' + al) = ext(a).get ' + ext !(al); (s) ⊦ a + x = a ' + x; (s) pa = lren(la) ⊦ # psl = # pal ∧ rstep(rs, ra, rs0) ∧ rren(ra) = lren(la) ∧ lstep(ls, la, ls0) → πra(lstep, rstep, lren, rren, (ls, rs) ' + (ls0, rs0) ' + psl, pa ' + pal) = ra + πra(lstep, rstep, lren, rren, (ls0, rs0) ' + psl, pal); (s)
| # pcsl = # pal1, cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜cext(ca0).get '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: ⊦ opt ≠ None → (get = opt.get ↔ opt = Some(get)); (elim) Used terms: cext(ca0), e
| # pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
# pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0)
# pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ∃ σ1. (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ) + σ1 = aext !(aα) ⊦
Used terms: ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ , aext !(aα)
| ⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0) |
| # pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ∃ σ1. (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ) + σ1 = aext !(aα) ⊦ |
# pcsl = # pal1, (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ) + β = aext !(aα), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
| # pcsl = # pal1, (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ) + β = aext !(aα), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
⊦ ext !(α) = ⌜e '⌝ + β ↔ (∃ al, a, α0. α = ⌜al⌝ + ⌜a '⌝ + α0 ∧ ext(a) = Some(e) ∧ ext !(⌜al⌝ ) = [] ∧ ext !(α0) = β)
# pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ∃ al, aa, α0. aα = ⌜al⌝ + ⌜aa '⌝ + α0 ∧ aext(aa) = Some(e) ∧ aext !(⌜al⌝ ) = [] ∧ aext !(α0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: aext, aα, e, ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β
| ⊦ ext !(α) = ⌜e '⌝ + β ↔ (∃ al, a, α0. α = ⌜al⌝ + ⌜a '⌝ + α0 ∧ ext(a) = Some(e) ∧ ext !(⌜al⌝ ) = [] ∧ ext !(α0) = β) |
| # pcsl = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)), ∃ al, aa, α0. aα = ⌜al⌝ + ⌜aa '⌝ + α0 ∧ aext(aa) = Some(e) ∧ aext !(⌜al⌝ ) = [] ∧ aext !(α0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used simplifier rules: ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ¬ # α < ⌜n⌝ → (frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)) ↔ true)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ #(⌜aal⌝ + ⌜aa '⌝ + aα0) < ⌜# aal + 1⌝ → (frag(IOAut(astart, astep, aext))((⌜as '⌝ + aσ).drop(# aal + 1), (⌜aal⌝ + ⌜aa '⌝ + aα0).drop(# aal + 1)) ↔ true), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα0, astart, ⌜as '⌝ + aσ, # aal + 1, astep
| ⊦ frag(IOAut(start, step, ext))(σ, α) ∧ ¬ # α < ⌜n⌝ → (frag(IOAut(start, step, ext))(σ.drop(n), α.drop(n)) ↔ true) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ #(⌜aal⌝ + ⌜aa '⌝ + aα0) < ⌜# aal + 1⌝ → (frag(IOAut(astart, astep, aext))((⌜as '⌝ + aσ).drop(# aal + 1), (⌜aal⌝ + ⌜aa '⌝ + aα0).drop(# aal + 1)) ↔ true), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦
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) ⊦ n + 0 = n; (s) ⊦ n ≠ 0 → (⌜a '⌝ + σ).drop((* n) + m) = σ.drop((n - 1) + 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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ astart0, astep0, aext0, as0, aσ0, aα0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, pal0, aren0. ¬ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∨ ¬ frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl, pal0) ∨ ¬ nounsharedextR(cren0, cext0, ren0) ∨ ¬ oinj(ext0) ∨ ¬ oinj(aext0) ∨ ¬ oinj(cext0) ∨ ¬ sameshared(cren0, aren0, ren0) ∨ ¬ Πok(ext0, aext0, ren0, aren0) ∨ ¬ Πok(ext0, cext0, ren0, cren0) ∨ ¬ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl, pal0))⌝ ⊑ aext0 !(aα0) ∨ frag*(IOAut(Π(start0, astart0), Π(step0, astep0, ren0, aren0, ext0, aext0), Π(ext0, aext0, ren0, aren0))) (repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0), repla(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl, pal0, ⌜as0 '⌝ + aσ0, aα0)) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1) ∨ ¬ nounsharedextR(cren, cext, ren) ∨ ¬ oinj(ext) ∨ ¬ oinj(aext) ∨ ¬ oinj(cext) ∨ ¬ sameshared(cren, aren, ren) ∨ ¬ Πok(ext, aext, ren, aren) ∨ ¬ Πok(ext, cext, ren, cren) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
Used terms: astart, astep, aext, aσ[# aal], aσ.drop(# aal + 1), aα0, start, cstart, step, cstep, ren, cren, ext, cext, pal1, aren
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1) ∨ ¬ nounsharedextR(cren, cext, ren) ∨ ¬ oinj(ext) ∨ ¬ oinj(aext) ∨ ¬ oinj(cext) ∨ ¬ sameshared(cren, aren, ren) ∨ ¬ Πok(ext, aext, ren, aren) ∨ ¬ Πok(ext, cext, ren, cren) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ ⌜# aal⌝ < # aσ, ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ[# aal] + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
Used terms: aσ, # aal
| ⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ ⌜# aal⌝ < # aσ, ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1]))
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], #(⌜as '⌝ + aσ) = #(⌜aal⌝ + ⌜aa '⌝ + aα0) + ⌜1⌝ , # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ ⌜# aal⌝ < # aσ, ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ n. ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) → astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], (⌜as '⌝ + aσ)[n +1]), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα0, astart, ⌜as '⌝ + aσ, astep
| ⊦ frag(IOAut(start, step, ext))(σ, α) ↔ # σ = # α + ⌜1⌝ ∧ (∀ n. ⌜n⌝ < # α → step(σ[n], α[n], σ[n +1])) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], #(⌜as '⌝ + aσ) = #(⌜aal⌝ + ⌜aa '⌝ + aα0) + ⌜1⌝ , # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ ⌜# aal⌝ < # aσ, ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ n. ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) → astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], (⌜as '⌝ + aσ)[n +1]), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # aσ = ⌜1⌝ + ⌜# aal⌝ + # aα0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ ⌜# aal⌝ < # aσ, ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ n. ¬ ⌜# aal⌝ + # aα0 < ⌜n⌝ → astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], aσ[n]), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
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 '⌝ + σ)[n + 1] = σ[n]; (s) ⊦ 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) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ n < m → (⌜(* n)⌝ + n∞1 = ⌜(* m)⌝ + n∞2 ↔ n∞1 = ⌜m - n⌝ + n∞2); (s) ⊦ ⌜(* n)⌝ + ⌜(* m)⌝ = ⌜n + m⌝ ; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # aσ = ⌜1⌝ + ⌜# aal⌝ + # aα0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ.drop(# aal), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ ⌜# aal⌝ < # aσ, ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ n. ¬ ⌜# aal⌝ + # aα0 < ⌜n⌝ → astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], aσ[n]), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
Used simplifier rules: ⊦ ⌜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) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(aσ[# aal] + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ∨ ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦
Used simplifier rules: ⊦ a + σ = ⌜a '⌝ + σ; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ∨ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ⊦
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)) ⊦
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ¬ ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ ⊑ aext !(aα0) ⊦ |
⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ σ1. ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + σ1 ≠ aext !(aα0) ⊦
Used terms: ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ , aext !(aα0)
| ⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)), ∀ σ1. ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + σ1 ≠ aext !(aα0) ⊦ |
Used terms: β
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)) ⊦ |
⊦ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ aext !(⌜aal⌝ ) = [] ∧ cext(ca) = aext(aa) ∧ cren(ca) = ren(a) ∧ n = # aal → repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a) ' + pal, aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = lift(aσ.take(n), s) + (s, aσ[n]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal, aσ.drop(n + 1), aα)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], aext !(⌜aal⌝ ) = [], # pcsl = # pal1, # aal = # aal, aext(aa) = Some(e), cext(ca0) = Some(e), cext(ca0) = aext(aa), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)) ⊦
Used simplifier rules: ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ ⌜x⌝ = [] ↔ x = []; (s) Used terms: aren, ren, cstep, cext, aa, s, aext, aα0, ca0, a0, pal1, cren, aal, pcsl, cs0, s0, cs, # aal, ⌜as '⌝ + aσ, step
| ⊦ step(s, a, s0) ∧ cstep(cs, ca, cs0) ∧ aext !(⌜aal⌝ ) = [] ∧ cext(ca) = aext(aa) ∧ cren(ca) = ren(a) ∧ n = # aal → repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a) ' + pal, aσ, ⌜aal⌝ + ⌜aa '⌝ + aα) = lift(aσ.take(n), s) + (s, aσ[n]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal, aσ.drop(n + 1), aα) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], aext !(⌜aal⌝ ) = [], # pcsl = # pal1, # aal = # aal, aext(aa) = Some(e), cext(ca0) = Some(e), cext(ca0) = aext(aa), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list 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) ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s0, cs0) ' + pcsl, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0)) ⊦ |
⊦ 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α)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(⌜aal⌝ ) = [], # pcsl = # pal1, # aal = # aal, aext(aa) = Some(e), cext(ca0) = Some(e), cext(ca0) = aext(aa), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0)) ⊦
Used simplifier rules: ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ ⌜x⌝ = [] ↔ x = []; (s) Used terms: aren, ren, cstep, cext, aa, s, aext, aα0, ca0, a0, pal1, cren, aal, pcsl, cs0, s0, cs, # aal, ⌜as '⌝ + 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α) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(⌜aal⌝ ) = [], # pcsl = # pal1, # aal = # aal, aext(aa) = Some(e), cext(ca0) = Some(e), cext(ca0) = aext(aa), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0)) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list 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) ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) ⊦ |
⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1]))
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), # ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) ≠ #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) + 1 ∨ (∃ n. ¬ ( n < #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) → IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)).step (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n +1 ]))) ⊦
Used terms: IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)), lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aal.map(aren) + aren(aa) ' + repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)
| ⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1])) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren))) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), # ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) ≠ #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) + 1 ∨ (∃ n. ¬ ( n < #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) → IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)).step (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n +1 ]))) ⊦ |
⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1]))
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ n. n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)).step (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n +1]), # ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) ≠ #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) + 1 ∨ (∃ n. ¬ ( n < #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) → IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)).step (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n +1 ]))) ⊦
Used terms: IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)), repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)
| ⊦ frag*(ioa)(sl, al) ↔ # sl = # al + 1 ∧ (∀ n. n < # al → ioa.step(sl[n], al[n], sl[n +1])) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ n. n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)).step (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n +1]), # ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) ≠ #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) + 1 ∨ (∃ n. ¬ ( n < #(aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)) → IOAut(Π(start, astart), Π(step, astep, ren, aren, ext, aext), Π(ext, aext, ren, aren)).step (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n +1 ]))) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) + 1 ∨ ¬ ( ¬ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) < n → Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ])) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ⊦ IOAut(start, step, ext).step = step; (s) ⊦ m +1 = m + 1; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m < n + 1 ↔ ¬ n < m; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(a ' + x) = (# x)+1; (s) ⊦ # x.map(f) = # x; (s) ⊦ #(x + y) = # x + # y; (s) n < n0 ⊦ m + (* n) = m0 + (* n0) ↔ m = m0 + (n0 - n); (s) ⊦ m + n = m + n0 ↔ n = n0; (s) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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∞ + n∞1 < n∞1; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) + 1 ∨ ¬ ( ¬ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) < n → Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ])) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) + 1 ∨ ¬ ( ¬ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) < n → Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ])) ⊦
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) + 1 ∨ ¬ ( ¬ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) < n → Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ])) ⊦
Used formulas: 1 + # repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) + 1 ∨ ¬ ( ¬ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) < n → Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ])) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1)
Used simplifier rules: ⊦ a + σ = ⌜a '⌝ + σ; (s) c: ⊦ m + n = n + m; from specification nat-basic Used terms: aσ, # aal
| ⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) + 1 ∨ ¬ ( ¬ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) < n → Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ])) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss) c: ⊦ m + n = n + m; from specification nat-basic
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: product-ok-refine-cext-imp-aext: ⊦ Πok(ext, cext, ren, cren) ∧ Πok(ext, aext, ren, aren) ∧ oinj(aext) ∧ oinj(ext) ∧ aext(aa) = Some(e) ∧ cext(ca0) = Some(e) ∧ cren(ca0) = ren(a0) → (aren(aa) = ren(a0) ↔ true); Used formulas: aren(aa) = ren(a0)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + aren(aa) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n < # aal.map(aren), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal.map(aren), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], aal.map(aren)[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used terms: aal.map(aren), ren(a0) ' + repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), n
| ⊦ n < # x → (x + y)[n] = x[n] |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n < # aal.map(aren), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), # aal ≤ n, n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m ≤ m + n; (s) let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ # x.map(f) = # x; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), # aal ≤ n, n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), # aal ≤ n, ¬ n + 1 < # lift((⌜as '⌝ + aσ).take(# aal), s), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 - # lift((⌜as '⌝ + aσ).take(# aal), s) ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # a ' = 0 +1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ¬ 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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat ⊦ # x = 0 ↔ x = []; (s) ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: lift((⌜as '⌝ + aσ).take(# aal), s), (s, (⌜as '⌝ + aσ)[# aal]) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), n + 1
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), # aal ≤ n, ¬ n + 1 < # lift((⌜as '⌝ + aσ).take(# aal), s), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], ((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 - # lift((⌜as '⌝ + aσ).take(# aal), s) ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), # aal ≤ n, n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), # aal ≤ n + 1, ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n - # aal]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; a: ⊦ (x + y) + z = x + y + z; from specification list c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + x)[n + 1] = x[n]; (s) ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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∞ + n∞1 < n∞1; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), # aal ≤ n, n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), # aal ≤ n + 1, ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n - # aal]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n = n1 + # aal, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), # aal ≤ n + 1, n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), # aal ≤ n, ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: n, # aal, n1
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n = n1 + # aal, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), # aal ≤ n + 1, n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), # aal ≤ n, ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1 + # aal], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m ≤ m + n; (s) ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal ], (aal.map(aren) + ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1 + # aal], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n1 + # aal < # aal.map(aren), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal ], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal - # aal.map(aren) ], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ # x.map(f) = # x; (s) ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: aal.map(aren), ren(a0) ' + repla (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), n1 + # aal
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n1 + # aal < # aal.map(aren), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal ], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal - # aal.map(aren) ], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal ], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
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) ⊦ # x.map(f) = # x; (s) ⊦ ¬ m + n < m; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal ], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n1 + # aal < # lift((⌜as '⌝ + aσ).take(# aal), s), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal - # lift((⌜as '⌝ + aσ).take(# aal), s) ], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # a ' = 0 +1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ¬ 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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: lift((⌜as '⌝ + aσ).take(# aal), s), (s, (⌜as '⌝ + aσ)[# aal]) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), n1 + # aal
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n1 + # aal < # lift((⌜as '⌝ + aσ).take(# aal), s), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n1 + # aal - # lift((⌜as '⌝ + aσ).take(# aal), s) ], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; 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) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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∞ + n∞1 < n∞1; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ ¬ m + n < m; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n1 = 0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n1 = n +1, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: Nat freely generated by 0, +1;;
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n1 = 0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) ⊦ 0 ≤ m; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
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) '⌝ + ⌜pcsl⌝ , ⌜pal⌝ ), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + pcsl, pal)⌝ ) ⊑ aext !(aα) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα).head = (s, as)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s0, cs0) '⌝ + ⌜pcsl⌝ , ⌜pal1⌝ ) ∧ cext !(⌜πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1)⌝ ) ⊑ aext !(aα0)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0).head = (s0, aσ[# aal]), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ≠ [], ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used terms: aren, ren, cstep, cext, s0, aσ[# aal], aext, aα0, ext, astart, cstart, start, pal1, cren, astep, pcsl, cs0, aσ.drop(# aal + 1), step
| 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) '⌝ + ⌜pcsl⌝ , ⌜pal⌝ ), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + pcsl, pal)⌝ ) ⊑ aext !(aα) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl, pal, ⌜as '⌝ + aσ, aα).head = (s, as) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s0, cs0) '⌝ + ⌜pcsl⌝ , ⌜pal1⌝ ) ∧ cext !(⌜πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1)⌝ ) ⊑ aext !(aα0) |
⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s0, cs0) '⌝ + ⌜pcsl⌝ , ⌜pal1⌝ ) ∧ (∃ σ1. cext !(⌜πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1)⌝ ) + σ1 = aext !(aα0))
Used terms: cext !(⌜πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1)⌝ ), aext !(aα0)
| ⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s0, cs0) '⌝ + ⌜pcsl⌝ , ⌜pal1⌝ ) ∧ (∃ σ1. cext !(⌜πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1)⌝ ) + σ1 = aext !(aα0)) |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ ∃ σ1. ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + σ1 = aext !(aα0)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ ⌜x⌝ + ⌜y⌝ = ⌜z⌝ ↔ x + y = z; (s) ⊦ finp(σ) ↔ (∃ x. ⌜x⌝ = σ); (as) ⊦ ⌜x⌝ ≠ ⌜nf⌝ ; (s) ⊦ σ0 + ⌜x⌝ = ⌜nf0⌝ ↔ σ0 = ⌜nf0⌝ ; (s) ⊦ finp(σ) ↔ ¬(∃ nf. ⌜nf⌝ = σ); (ss) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ (⌜x⌝ + ⌜y⌝ ).l = x + y; (s) ⊦ frag(ioa)(σ, ⌜al⌝ ) ↔ frag*(ioa)(σ.l, al) ∧ finp(σ); (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ ∃ σ1. ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + σ1 = aext !(aα0) |
Used terms: β
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0).head = (s0, aσ[# aal]), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ≠ [], ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), pas = (s0, aσ[# aal]), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = pas + x0, Some(e) ≠ None, ext(a0) ≠ None, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ≠ [], ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), pas, x0
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), pas = (s0, aσ[# aal]), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = pas + x0, Some(e) ≠ None, ext(a0) ≠ None, repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) ≠ [], ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + n = m + n0 ↔ n = n0; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ x = a ' + x0 → x[m + 1] = x0[m]; (s) ⊦ a + x = a ' + x; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[0]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦ |
⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ[# aal] + aσ.drop(# aal + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ[# aal] + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ[# aal] + aσ.drop(# aal + 1), aα0)[0]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦
Used terms: aσ, # aal
| ⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ[# aal] + aσ.drop(# aal + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ[# aal] + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) ((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ[# aal] + aσ.drop(# aal + 1), aα0)[0]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), (s0, aσ[# aal])), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + n = m + n0 ↔ n = n0; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ a + σ = ⌜a '⌝ + σ; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[# aal]), ren(a0), (s0, aσ[# aal])), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦ |
⊦ Π(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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ la, ra. ¬(step(s, la, s0) ∧ ext(la) ≠ None ∧ ren(a0) = ren(la) ∧ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∧ aext(ra) ≠ None ∧ ren(a0) = aren(ra)), (⌜as '⌝ + aσ)[# aal] ≠ aσ[# aal] ∨ (∀ la. ¬(step(s, la, s0) ∧ ren(a0) = ren(la) ∧ ¬ cod(aren)(ren(a0)))), s ≠ s0 ∨ (∀ ra. ¬(astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∧ ren(a0) = aren(ra) ∧ ¬ cod(ren)(ren(a0)))) ⊦
Used terms: aext, ren(a0), (⌜as '⌝ + aσ)[# aal], astep, ren, ext, aren, aσ[# aal], 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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ la, ra. ¬(step(s, la, s0) ∧ ext(la) ≠ None ∧ ren(a0) = ren(la) ∧ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∧ aext(ra) ≠ None ∧ ren(a0) = aren(ra)), (⌜as '⌝ + aσ)[# aal] ≠ aσ[# aal] ∨ (∀ la. ¬(step(s, la, s0) ∧ ren(a0) = ren(la) ∧ ¬ cod(aren)(ren(a0)))), s ≠ s0 ∨ (∀ ra. ¬(astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∧ ren(a0) = aren(ra) ∧ ¬ cod(ren)(ren(a0)))) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), aren(aa0) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra) ⊦
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) → (lren(la1) = lren(la2) ↔ la1 = la2); (s) ⊦ cod(f)(f(a)); (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), aren(aa0) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa0) = ren(a0), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]) ∨ ren(a0) ≠ aren(aa) ⊦
Used terms: aa
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa0) = ren(a0), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]) ∨ ren(a0) ≠ aren(aa) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), aren(aa0) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra) ⊦
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), aren(aa0) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra) ⊦ |
⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa0) = ren(a0), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦ ⌜# aal⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ astep((⌜as '⌝ + aσ)[# aal], (⌜aal⌝ + ⌜aa '⌝ + aα0)[# aal], (⌜as '⌝ + aσ)[# aal + 1])
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα0, astart, ⌜as '⌝ + aσ, # aal, astep
| ⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), aext(aa) = Some(e), aren(aa0) = ren(a0), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]) ⊦ ⌜# aal⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ astep((⌜as '⌝ + aσ)[# aal], (⌜aal⌝ + ⌜aa '⌝ + aα0)[# aal], (⌜as '⌝ + aσ)[# aal + 1]) |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), aren(aa0) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[# aal], (⌜aal⌝ + ⌜aa '⌝ + aα0)[# aal], aσ[# aal]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra) ⊦
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 '⌝ + σ)[n + 1] = σ[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∞ + n∞1 < n∞1; (s) ⊦ ⌜n⌝ < ⌜1⌝ + n∞ ↔ ¬ n∞ < ⌜n⌝ ; (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # x0 = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), # pcsl = # pal1, aext(aa) = Some(e), aren(aa) = ren(a0), aren(aa0) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = (s0, aσ[# aal]) ' + x0, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[# aal], (⌜aal⌝ + ⌜aa '⌝ + aα0)[# aal], aσ[# aal]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ astep((⌜as '⌝ + aσ)[# aal], aa, aσ[# aal]), ∀ n0. n0 < # x0 → Π(step, astep, ren, aren, ext, aext) (((s0, aσ[# aal]) ' + x0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], x0[n0]), ∀ ra. ¬ astep((⌜as '⌝ + aσ)[# aal], ra, aσ[# aal]) ∨ ren(a0) ≠ aren(ra) ⊦ |
⊦ ¬ ⌜m⌝ < # σ → (σ + σ1)[m] = σ1[m - (# σ).n]
Used simplifier rules: ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜n⌝ .n = n; (s) ⊦ m - m = 0; (s) ⊦ (⌜a '⌝ + σ)[0] = a; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ ⌜m⌝ < # σ → (σ + σ1)[m] = σ[m]; (s) ⊦ ⌜x⌝ [n] = x[n]; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ ¬ n < n; (s) Used terms: ⌜aal⌝ , ⌜aa '⌝ + aα0, # aal
| ⊦ ¬ ⌜m⌝ < # σ → (σ + σ1)[m] = σ1[m - (# σ).n] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n1 = n +1, Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n1 ≤ # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (((s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], (ren(a0) ' + repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0))[n1], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ [], n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n + 1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ m +1 = m + 1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + x)[n + 1] = x[n]; (s) ⊦ m + 1 ≤ n ↔ m < n; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ [], n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n + 1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ [], ⌜# aal⌝ < # aσ, n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n + 1]), n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n + 1]) ⊦
Used terms: n
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) ≠ [], ⌜# aal⌝ < # aσ, n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0)[n + 1]), n < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n + 1]) ⊦ |
⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1)
Used simplifier rules: ⊦ a + σ = ⌜a '⌝ + σ; (s) Used terms: aσ, # aal
| ⊦ ⌜n⌝ < # σ → σ.drop(n) = σ[n] + σ.drop(n + 1) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal.map(aren), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], aal.map(aren)[n], ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ n < # x → x.map(f)[n] = f(x[n]); (s) ⊦ # x.map(f) = # x; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n ], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, n < # lift((⌜as '⌝ + aσ).take(# aal), s), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # a ' = 0 +1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ¬ 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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n → (n ≤ m ↔ false); (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: lift((⌜as '⌝ + aσ).take(# aal), s), (s, (⌜as '⌝ + aσ)[# aal]) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), n
| ⊦ n < # x → (x + y)[n] = x[n] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, n < # lift((⌜as '⌝ + aσ).take(# aal), s), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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∞ + n∞1 < n∞1; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext) (lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n + 1 < # lift((⌜as '⌝ + aσ).take(# aal), s), ¬ Π(step, astep, ren, aren, ext, aext) (lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, ⌜# aal⌝ < # aσ, n + 1 < # lift((⌜as '⌝ + aσ).take(# aal), s), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), lift((⌜as '⌝ + aσ).take(# aal), s)[n + 1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used terms: lift((⌜as '⌝ + aσ).take(# aal), s), (s, (⌜as '⌝ + aσ)[# aal]) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), n + 1
| ⊦ n < # x → (x + y)[n] = x[n] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ n + 1 < # lift((⌜as '⌝ + aσ).take(# aal), s), ¬ Π(step, astep, ren, aren, ext, aext) (lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) )[n + 1 ]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) (((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (lift(aσ.take(n), s) + (s, aσ[n]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0))[n]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; lift-rec: ⊦ lift(as ' + asl, s) = (s, as) ' + lift(asl, s); c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ n < n; (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[n + 1] = x[n]; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜a '⌝ + σ)[n + 1] = σ[n]; (s) ⊦ n + 0 = n; (s) ⊦ n ≠ 0 → (⌜a '⌝ + σ).take((* n) + m) = a ' + σ.take((n - 1) + m); (s) ⊦ m ≤ m + n; (s) ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) ⊦ m < n → (n ≤ m + 1 ↔ n = m + 1); (s) ⊦ m + 1 ≠ 0; (s) lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic eqle-one: ⊦ m = n + 1 ∧ n < n0 → m ≤ n0; (forward) from specification nat ⊦ m < n ↔ ¬ n ≤ m; (ss) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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∞ + n∞1 < n∞1; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext) (((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (lift(aσ.take(n), s) + (s, aσ[n]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0))[n]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ n < # lift(aσ.take(n), s), ¬ Π(step, astep, ren, aren, ext, aext) (((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), ((s, aσ[n]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0))[n - # lift(aσ.take(n), s)]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ⌜n⌝ + ⌜m⌝ < ⌜n0⌝ ↔ n + m < n0; (s) ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic 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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) ⊦ ¬ n < n; (s) Used terms: lift(aσ.take(n), s), (s, aσ[n]) ' + repls (step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), n
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ n < # lift(aσ.take(n), s), ¬ Π(step, astep, ren, aren, ext, aext) (((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), ((s, aσ[n]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0))[n - # lift(aσ.take(n), s)]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[0] = a; (s) ⊦ m - m = 0; (s) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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 c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ m + n < m; (s) ⊦ ⌜n⌝ + ⌜m⌝ < ⌜n0⌝ ↔ n + m < n0; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ m ≤ m; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], (⌜as '⌝ + aσ)[n + 1])
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα0, astart, ⌜as '⌝ + aσ, n, astep
| ⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], (⌜as '⌝ + aσ)[n + 1]) |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: 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) 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) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜a '⌝ + σ)[n + 1] = σ[n]; (s) ⊦ ⌜n⌝ < ⌜1⌝ + n∞ ↔ ¬ n∞ < ⌜n⌝ ; (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
⊦ ⌜m⌝ < # σ → (σ + σ1)[m] = σ[m]
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, ⌜n⌝ < # ⌜aal⌝ , astep((⌜as '⌝ + aσ)[n], ⌜aal⌝ [n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ ¬ ⌜m⌝ < # σ → (σ + σ1)[m] = σ1[m - (# σ).n]; (s) ⊦ ⌜n⌝ .n = n; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m = n + 1 → ¬ m ≤ n; (s) Used terms: ⌜aal⌝ , ⌜aa '⌝ + aα0, n
| ⊦ ⌜m⌝ < # σ → (σ + σ1)[m] = σ[m] |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, ⌜n⌝ < # ⌜aal⌝ , astep((⌜as '⌝ + aσ)[n], ⌜aal⌝ [n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ n < n; (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜x⌝ [n] = x[n]; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, # pcsl = # pal1, # aal = n + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n = 0, Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n = n1 +1, Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦
Used simplifier rules: Nat freely generated by 0, +1;;
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n = 0, Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0), aal = aal.head ', aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), # aσ ≠ ⌜1⌝ , Some(e) ≠ None, aal ≠ [], aσ ≠ [], ext(a0) ≠ None, astep(as, aal.head, aσ[0]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[1] '⌝ + aσ.drop(2), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), aren(aal.head), (s, aσ[0])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-base: ⊦ lift([], s) = []; c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ x ≠ [] → x[0] = x.head; (s) ⊦ a '[0] = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s) ⊦ σ.take(0) = []; (s) ⊦ # σ = ⌜0⌝ ↔ σ = []; (s) ⊦ ⌜1⌝ < n∞ ↔ n∞ ≠ ⌜0⌝ ∧ n∞ ≠ ⌜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)⌝ + ⌜(* m)⌝ = ⌜n + m⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜a '⌝ + σ)[0] = a; (s) ⊦ a + x = a ' + x; (s) ⊦ # x = 1 ↔ x = x.head + []; (as)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0), aal = aal.head ', aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), # aσ ≠ ⌜1⌝ , Some(e) ≠ None, aal ≠ [], aσ ≠ [], ext(a0) ≠ None, astep(as, aal.head, aσ[0]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[1] '⌝ + aσ.drop(2), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), aren(aal.head), (s, aσ[0])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0), aal = aa0 ', aal = aa0 + aal0, aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), # aσ ≠ ⌜1⌝ , Some(e) ≠ None, aal ≠ [], aσ ≠ [], ext(a0) ≠ None, astep(as, aa0, aσ[0]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[1] '⌝ + aσ.drop(2), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), aren(aa0), (s, aσ[0])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: aal, aa0, aal0
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0), aal = aa0 ', aal = aa0 + aal0, aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), # aσ ≠ ⌜1⌝ , Some(e) ≠ None, aal ≠ [], aσ ≠ [], ext(a0) ≠ None, astep(as, aa0, aσ[0]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[1] '⌝ + aσ.drop(2), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), aren(aa0), (s, aσ[0])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0 + 1]) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0), aext(aa0) = None, aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), # aσ ≠ ⌜1⌝ , Some(e) ≠ None, aσ ≠ [], ext(a0) ≠ None, astep(as, aa0, aσ[0]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[1] '⌝ + aσ.drop(2), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aa0 '⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), aren(aa0), (s, aσ[0])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0 + 1]) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ [] + σ = σ; (s) ⊦ ⌜[]⌝ = []; (s) ⊦ ext !([]) = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a + x = a ' + x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ ext !(a ') = [] ↔ ext(a) = None; (s) ⊦ ext !(al + al0) = ext !(al) + ext !(al0); (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(1), aα0), aext(aa0) = None, aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), # aσ ≠ ⌜1⌝ , Some(e) ≠ None, aσ ≠ [], ext(a0) ≠ None, astep(as, aa0, aσ[0]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[1] '⌝ + aσ.drop(2), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aa0 '⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)((s, as), aren(aa0), (s, aσ[0])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[1] '⌝ + aσ.drop(2), aα0)[n0 + 1]) ⊦ |
⊦ Π(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))
Used simplifier rules: ⊦ Πok(lext, rext, lren, rren) → (rren(ra1) = rren(ra2) ↔ ra1 = ra2); (s) ⊦ cod(f)(b) ↔ (∃ a. f(a) = b); (as) ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (rext(ra) = None ↔ false); (as) Used terms: aext, aren(aa0), as, astep, ren, ext, aren, aσ[0], step, s, s
| ⊦ Π(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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = n + 1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(n + 1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), n = n1 +1, Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜n⌝ + ⌜1⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)(((s, as) ' + lift(aσ.take(n), s))[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[n + 1] '⌝ + aσ.drop(2 + n), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, # pcsl = # pal1, # aal = 2 + n1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(lift(aσ.take(n1 + 1), s)[n1], aren(aal[n1 + 1]), (s, aσ[n1 + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦
Used simplifier rules: a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ m +1 = m + 1; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x)[n + 1] = x[n]; (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 ⊦ ⌜(* n)⌝ + ⌜(* m)⌝ = ⌜n + m⌝ ; (s) ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜a '⌝ + σ)[n + 1] = σ[n]; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, # pcsl = # pal1, # aal = 2 + n1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)(lift(aσ.take(n1 + 1), s)[n1], aren(aal[n1 + 1]), (s, aσ[n1 + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦ |
⊦ n < # asl → lift(asl, s)[n] = (s, asl[n])
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, n1 < # aσ.take(n1 + 1), astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)((s, aσ.take(n1 + 1)[n1]), aren(aal[n1 + 1]), (s, aσ[n1 + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) ⊦ # σ < ⌜n⌝ + ⌜1⌝ ↔ ¬ ⌜n⌝ < # σ; (s) lsle-trans: ⊦ n∞ < n∞1 ∧ ¬ n∞2 < n∞1 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ⌜n⌝ + ⌜m⌝ < ⌜n0⌝ ↔ n + m < n0; (s) ⊦ ¬ m + n < m; (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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ ¬ n < n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: aσ.take(n1 + 1), s, n1
| ⊦ n < # asl → lift(asl, s)[n] = (s, asl[n]) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, n1 < # aσ.take(n1 + 1), astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ Π(step, astep, ren, aren, ext, aext)((s, aσ.take(n1 + 1)[n1]), aren(aal[n1 + 1]), (s, aσ[n1 + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, # pcsl = # pal1, # aal = 2 + n1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)((s, aσ[n1]), aren(aal[n1 + 1]), (s, aσ[n1 + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦
Used simplifier rules: m < n, ¬ # σ < ⌜n⌝ ⊦ σ.take(n)[m] = σ[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 c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ m + n < m; (s) ⊦ ⌜n⌝ + ⌜m⌝ < ⌜n0⌝ ↔ n + m < n0; (s) lsle-trans: ⊦ n∞ < n∞1 ∧ ¬ n∞2 < n∞1 → n∞ < n∞2; (forward) from specification nat-inf ⊦ # σ < ⌜n⌝ + ⌜1⌝ ↔ ¬ ⌜n⌝ < # σ; (s) ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) ⊦ ¬ n < n; (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, # pcsl = # pal1, # aal = 2 + n1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ Π(step, astep, ren, aren, ext, aext)((s, aσ[n1]), aren(aal[n1 + 1]), (s, aσ[n1 + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦ |
⊦ Π(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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]), ∀ la, ra. ¬(step(s, la, s) ∧ ext(la) ≠ None ∧ aren(aal[n1 + 1]) = ren(la) ∧ astep(aσ[n1], ra, aσ[n1 + 1]) ∧ aext(ra) ≠ None ∧ aren(aal[n1 + 1]) = aren(ra)), aσ[n1] ≠ aσ[n1 + 1] ∨ (∀ la. ¬(step(s, la, s) ∧ aren(aal[n1 + 1]) = ren(la) ∧ ¬ cod(aren)(aren(aal[n1 + 1])))), s ≠ s ∨ (∀ ra. ¬(astep(aσ[n1], ra, aσ[n1 + 1]) ∧ aren(aal[n1 + 1]) = aren(ra) ∧ ¬ cod(ren)(aren(aal[n1 + 1])))) ⊦
Used terms: aext, aren(aal[n1 + 1]), aσ[n1], astep, ren, ext, aren, aσ[n1 + 1], step, s, s
| ⊦ Π(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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]), ∀ la, ra. ¬(step(s, la, s) ∧ ext(la) ≠ None ∧ aren(aal[n1 + 1]) = ren(la) ∧ astep(aσ[n1], ra, aσ[n1 + 1]) ∧ aext(ra) ≠ None ∧ aren(aal[n1 + 1]) = aren(ra)), aσ[n1] ≠ aσ[n1 + 1] ∨ (∀ la. ¬(step(s, la, s) ∧ aren(aal[n1 + 1]) = ren(la) ∧ ¬ cod(aren)(aren(aal[n1 + 1])))), s ≠ s ∨ (∀ ra. ¬(astep(aσ[n1], ra, aσ[n1 + 1]) ∧ aren(aal[n1 + 1]) = aren(ra) ∧ ¬ cod(ren)(aren(aal[n1 + 1])))) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n1 + 1]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ Πok(lext, rext, lren, rren) → (lren(la1) = lren(la2) ↔ la1 = la2); (s) ⊦ Π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) ⊦ cod(f)(b) ↔ (∃ a. f(a) = b); (as)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n1 + 1]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦ |
⊦ ext !(al) = [] ↔ (∀ n. n < # al → ext(al[n]) = None)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, # pcsl = # pal1, # aal = 2 + n1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n1 + 1]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]), ∀ n. n < # aal → aext(aal[n]) = None ⊦
Used terms: aext, aal
| ⊦ ext !(al) = [] ↔ (∀ n. n < # al → ext(al[n]) = None) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, # pcsl = # pal1, # aal = 2 + n1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n1 + 1]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]), ∀ n. n < # aal → aext(aal[n]) = None ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n1 + 1]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ step(s, a, s), ∀ n. n < 2 + n1 → aext(aal[n]) = None, ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # aal = 2 + n1, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(2 + n1), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n1 + 1]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜2⌝ + ⌜n1⌝ < # aσ, astep(aσ[n1], aal[n1 + 1], aσ[n1 + 1]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), ¬ step(s, a, s), ∀ n. n < 2 + n1 → aext(aal[n]) = None, ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[2 + n1] '⌝ + aσ.drop(3 + n1), aα0)[n0 + 1]) ⊦ |
Used simplifier rules: ⊦ m + n < m + n0 ↔ n < n0; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ Πok(lext, rext, lren, rren) ∧ lren(la) = rren(ra) → (rext(ra) = None ↔ false); (as) Used terms: n1 + 1
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, ⌜# aal⌝ < # aσ, n + 1 < # lift((⌜as '⌝ + aσ).take(# aal), s), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), lift((⌜as '⌝ + aσ).take(# aal), s)[n + 1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, n + 1 < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), lift((⌜as '⌝ + aσ).take(# aal), s)[n + 1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: lift-size: ⊦ # lift(asl, s) = # asl; ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = 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∞ + n∞1 < n∞1; (s) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, n + 1 < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), lift((⌜as '⌝ + aσ).take(# aal), s)[n + 1]), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ n < # asl → lift(asl, s)[n] = (s, asl[n])
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n + 1 < # aal, n < # aal, ⌜# aal⌝ < # aσ, n + 1 < # (⌜as '⌝ + aσ).take(# aal), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), (s, (⌜as '⌝ + aσ).take(# aal)[n + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # a ' = 0 +1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ¬ 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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) eqle-one: ⊦ m = n + 1 ∧ n < n0 → m ≤ n0; (forward) from specification nat f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic lf: ⊦ m < n ∧ n < n0 → m +1 < n0; (forward) from specification nat-basic lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic trans-Nat: ⊦ n < n0 ∧ n0 < n1 → n < n1; (forward) from specification nat-basic ⊦ m + 1 ≠ 0; (s) ⊦ m < n → (n ≤ m + 1 ↔ n = m + 1); (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: (⌜as '⌝ + aσ).take(# aal), s, n + 1
| ⊦ n < # asl → lift(asl, s)[n] = (s, asl[n]) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n + 1 < # aal, n < # aal, ⌜# aal⌝ < # aσ, n + 1 < # (⌜as '⌝ + aσ).take(# aal), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), (s, (⌜as '⌝ + aσ).take(# aal)[n + 1])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, n + 1 < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
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 '⌝ + σ)[n + 1] = σ[n]; (s) m < n, ¬ # σ < ⌜n⌝ ⊦ σ.take(n)[m] = σ[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) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n < # aal, n + 1 < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)(lift((⌜as '⌝ + aσ).take(# aal), s)[n], aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ n < # asl → lift(asl, s)[n] = (s, asl[n])
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n + 1 < # aal, n < # aal, ⌜# aal⌝ < # aσ, n < # (⌜as '⌝ + aσ).take(# aal), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ).take(# aal)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ #(σ + σ1) = # σ + # σ1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # a ' = 0 +1; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf ⊦ ¬ 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 ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n → (n ≤ m ↔ false); (s) Used terms: (⌜as '⌝ + aσ).take(# aal), s, n
| ⊦ n < # asl → lift(asl, s)[n] = (s, asl[n]) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n + 1 < # aal, n < # aal, ⌜# aal⌝ < # aσ, n < # (⌜as '⌝ + aσ).take(# aal), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ).take(# aal)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: m < n, ¬ # σ < ⌜n⌝ ⊦ σ.take(n)[m] = σ[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) ls-trans: ⊦ n∞ < n∞1 ∧ n∞1 < n∞2 → n∞ < n∞2; (forward) from specification nat-inf append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) ¬ # σ < ⌜n⌝ ⊦ # σ.take(n) = n; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], (⌜as '⌝ + aσ)[n + 1])
Used terms: aext, ⌜aal⌝ + ⌜aa '⌝ + aα0, astart, ⌜as '⌝ + aσ, n, astep
| ⌜n⌝ < # α ⊦ ¬ step(σ[n], α[n], σ[n + 1]) → (frag(IOAut(start, step, ext))(σ, α) ↔ false) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ ⌜n⌝ < #(⌜aal⌝ + ⌜aa '⌝ + aα0) ∧ ¬ astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], (⌜as '⌝ + aσ)[n + 1]) |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
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 '⌝ + σ)[n + 1] = σ[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 ⊦ m < n → ⌜m⌝ < ⌜n⌝ + n∞0; (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], (⌜aal⌝ + ⌜aa '⌝ + aα0)[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ ⌜m⌝ < # σ → (σ + σ1)[m] = σ[m]
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, ⌜n⌝ < # ⌜aal⌝ , astep((⌜as '⌝ + aσ)[n], ⌜aal⌝ [n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ ¬ ⌜m⌝ < # σ → (σ + σ1)[m] = σ1[m - (# σ).n]; (s) ⊦ ⌜n⌝ .n = n; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n → (n ≤ m ↔ false); (s) Used terms: ⌜aal⌝ , ⌜aa '⌝ + aα0, n
| ⊦ ⌜m⌝ < # σ → (σ + σ1)[m] = σ[m] |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, ⌜n⌝ < # ⌜aal⌝ , astep((⌜as '⌝ + aσ)[n], ⌜aal⌝ [n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜x⌝ [n] = x[n]; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, aext, ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ Π(step, astep, ren, aren, ext, aext)((s, (⌜as '⌝ + aσ)[n]), aren(aal[n]), (s, aσ[n])), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ Π(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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), ∀ la, ra. ¬(step(s, la, s) ∧ ext(la) ≠ None ∧ aren(aal[n]) = ren(la) ∧ astep((⌜as '⌝ + aσ)[n], ra, aσ[n]) ∧ aext(ra) ≠ None ∧ aren(aal[n]) = aren(ra)), (⌜as '⌝ + aσ)[n] ≠ aσ[n] ∨ (∀ la. ¬(step(s, la, s) ∧ aren(aal[n]) = ren(la) ∧ ¬ cod(aren)(aren(aal[n])))), s ≠ s ∨ (∀ ra. ¬(astep((⌜as '⌝ + aσ)[n], ra, aσ[n]) ∧ aren(aal[n]) = aren(ra) ∧ ¬ cod(ren)(aren(aal[n])))) ⊦
Used terms: aext, aren(aal[n]), (⌜as '⌝ + aσ)[n], astep, ren, ext, aren, aσ[n], step, s, s
| ⊦ Π(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 !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), ∀ la, ra. ¬(step(s, la, s) ∧ ext(la) ≠ None ∧ aren(aal[n]) = ren(la) ∧ astep((⌜as '⌝ + aσ)[n], ra, aσ[n]) ∧ aext(ra) ≠ None ∧ aren(aal[n]) = aren(ra)), (⌜as '⌝ + aσ)[n] ≠ aσ[n] ∨ (∀ la. ¬(step(s, la, s) ∧ aren(aal[n]) = ren(la) ∧ ¬ cod(aren)(aren(aal[n])))), s ≠ s ∨ (∀ ra. ¬(astep((⌜as '⌝ + aσ)[n], ra, aσ[n]) ∧ aren(aal[n]) = aren(ra) ∧ ¬ cod(ren)(aren(aal[n])))) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ Πok(lext, rext, lren, rren) → (lren(la1) = lren(la2) ↔ la1 = la2); (s) ⊦ Π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) ⊦ cod(f)(b) ↔ (∃ a. f(a) = b); (as)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), Πok(ext, cext, ren, cren), Πok(ext, aext, ren, aren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ Πok(lext, rext, lren, rren) ↔ inj(lren) ∧ inj(rren) ∧ surj(lren, rren) ∧ sharingok(lext, rext, lren, rren)
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), sharingok(ext, aext, ren, aren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used terms: ext, aext, ren, aren
| ⊦ Πok(lext, rext, lren, rren) ↔ inj(lren) ∧ inj(rren) ∧ surj(lren, rren) ∧ sharingok(lext, rext, lren, rren) |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), sharingok(ext, aext, ren, aren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ sharingok(lext, rext, lren, rren) ↔ (∀ la, ra. (lren(la) = rren(ra) → lext(la) ≠ None ∧ rext(ra) ≠ None ∧ lext(la) = rext(ra)) ∧ (¬ cod(rren)(lren(la)) ∧ ¬ cod(lren)(rren(ra)) ∧ lext(la) ≠ None ∧ rext(ra) ≠ None → lext(la) ≠ rext(ra)))
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(aren), inj(ren), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)) ⊦
Used terms: ext, aext, ren, aren
| ⊦ sharingok(lext, rext, lren, rren) ↔ (∀ la, ra. (lren(la) = rren(ra) → lext(la) ≠ None ∧ rext(ra) ≠ None ∧ lext(la) = rext(ra)) ∧ (¬ cod(rren)(lren(la)) ∧ ¬ cod(lren)(rren(ra)) ∧ lext(la) ≠ None ∧ rext(ra) ≠ None → lext(la) ≠ rext(ra))) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, aext !(aal) = [], # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(aren), inj(ren), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ren(a) = aren(aal[n]) → ext(a) ≠ None ∧ aext(aal[n]) ≠ None ∧ ext(a) = aext(aal[n]), ¬ cod(aren)(ren(a)) ∧ ¬ cod(ren)(aren(aal[n])) ∧ ext(a) ≠ None ∧ aext(aal[n]) ≠ None → ext(a) ≠ aext(aal[n]), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used terms: a, aal[n]
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ren(a) = aren(aal[n]) → ext(a) ≠ None ∧ aext(aal[n]) ≠ None ∧ ext(a) = aext(aal[n]), ¬ cod(aren)(ren(a)) ∧ ¬ cod(ren)(aren(aal[n])) ∧ ext(a) ≠ None ∧ aext(aal[n]) ≠ None → ext(a) ≠ aext(aal[n]), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ext(a) = aext(aal[n]), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
Used simplifier rules: ⊦ cod(f)(f(a)); (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ext(a) = aext(aal[n]), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
⊦ ext !(al) = [] ↔ (∀ n. n < # al → ext(al[n]) = None)
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ext(a) = aext(aal[n]), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a) ≠ None, ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(aren), inj(ren), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n. n < # aal → aext(aal[n]) = None ⊦
Used terms: aext, aal
| ⊦ ext !(al) = [] ↔ (∀ n. n < # al → ext(al[n]) = None) |
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # pcsl = # pal1, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ext(a) = aext(aal[n]), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a) ≠ None, ext(a0) ≠ None, n < # aal, n + 1 < # aal, ⌜# aal⌝ < # aσ, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(aren), inj(ren), nounsharedextR(cren, cext, ren), oinj(cext), oinj(aext), oinj(ext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]), ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n. n < # aal → aext(aal[n]) = None ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ext(a) = aext(aal[n]), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n. n < # aal → aext(aal[n]) = None, ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s0, cs0) ' + pcsl, pal1))⌝ + β, # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) = # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) + 1, # pcsl = # pal1, 1 + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0) = # repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), aext(aa) = Some(e), aren(aa) = ren(a0), cext(ca0) = Some(e), cren(ca0) = ren(a0), ext(a) = aext(aal[n]), ren(a) = aren(aal[n]), Some(e) ≠ None, aal ≠ [], ext(a) ≠ None, ext(a0) ≠ None, ⌜# aal⌝ < # aσ, n + 1 < # aal, n < # aal, astep((⌜as '⌝ + aσ)[n], aal[n], aσ[n]), cstep(cs, ca0, cs0), frag(IOAut(astart, astep, aext))(⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s0, cs0) ' + pcsl, pal1), inj(ren), inj(aren), nounsharedextR(cren, cext, ren), oinj(ext), oinj(aext), oinj(cext), sameshared(cren, aren, ren), step(s, a0, s0), surj(ren, aren), Πok(ext, cext, ren, cren), n ≤ # aal + # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, aσ.drop(# aal), aα0), ¬ step(s, a, s), ∀ n. n < # aal → aext(aal[n]) = None, ∀ la, ra. (ren(la) = aren(ra) → ext(la) ≠ None ∧ aext(ra) ≠ None ∧ ext(la) = aext(ra)) ∧ (¬ cod(aren)(ren(la)) ∧ ¬ cod(ren)(aren(ra)) ∧ ext(la) ≠ None ∧ aext(ra) ≠ None → ext(la) ≠ aext(ra)), ∀ n0. n0 < # repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0) → Π(step, astep, ren, aren, ext, aext) (repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repla(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0], repls(step, cstep, cren, ren, aren, cext, aext, (s0, cs0) ' + pcsl, pal1, ⌜aσ[# aal] '⌝ + aσ.drop(# aal + 1), aα0)[n0 + 1]) ⊦ |
Used terms: n
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.