| 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) |
frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s, cs) '⌝ + ⌜pcsl⌝ , ⌜pal⌝ ), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), 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)
| frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s, cs) '⌝ + ⌜pcsl⌝ , ⌜pal⌝ ), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), 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 = # pal, 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α), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), 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)
Used simplifier rules: ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ frag(ioa)(σ, ⌜al⌝ ) ↔ frag*(ioa)(σ.l, al) ∧ finp(σ); (s) ⊦ (⌜x⌝ + ⌜y⌝ ).l = x + y; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl = # al ↔ true); (ss) Used formulas: # pcsl = # pal
| # pcsl = # pal, 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α), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), 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) |
#(pcs + 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) '⌝ + ⌜pcs + pcsl0⌝ , ⌜pal⌝ ), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + (pcs + pcsl0), pal)⌝ ) ⊑ aext !(aα), ∀ pal, start, cstart, step, cstep, ren, cren, ext, cext, s, cs, astart, astep, aext, as, aσ, aα, aren. # pcsl0 = # pal ∧ frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s, cs) '⌝ + ⌜pcsl0⌝ , ⌜pal⌝ ) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + pcsl0, pal)⌝ ) ⊑ aext !(aα) → repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα).head = (s, as) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (pcs + pcsl0), pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (pcs + pcsl0), pal, ⌜as '⌝ + aσ, aα).head = (s, as)
Used simplifier rules: repls-base: ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ', [], ⌜as '⌝ + aσ, aα) = (s, as) '; List('a) freely generated by [], +;; ⊦ # [] = 0; (s) ⊦ # x = 0 ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) ⊦ σ + [] = σ; (s) ⊦ frag(IOAut(start, step, ext))(⌜s '⌝ , α) ↔ α = []; (s) ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ πra(lstep, rstep, lren, rren, (ls, rs) ', []) = []; (s) ⊦ ext !([]) = []; (s) ⊦ ⌜[]⌝ = []; (s) ⊦ [] ⊑ σ; (s) ⊦ a ' ≠ []; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ a '.head = a; (s)
| #(pcs + 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) '⌝ + ⌜pcs + pcsl0⌝ , ⌜pal⌝ ), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + (pcs + pcsl0), pal)⌝ ) ⊑ aext !(aα), ∀ pal, start, cstart, step, cstep, ren, cren, ext, cext, s, cs, astart, astep, aext, as, aσ, aα, aren. # pcsl0 = # pal ∧ frag(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))(⌜(s, cs) '⌝ + ⌜pcsl0⌝ , ⌜pal⌝ ) ∧ frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα) ∧ nounsharedextR(cren, cext, ren) ∧ Πok(ext, cext, ren, cren) ∧ cext !(⌜πra(step, cstep, ren, cren, (s, cs) ' + pcsl0, pal)⌝ ) ⊑ aext !(aα) → repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcsl0, pal, ⌜as '⌝ + aσ, aα).head = (s, as) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (pcs + pcsl0), pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (pcs + pcsl0), pal, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 + 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 ' + pcsl0, pal), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα).head = (s, as)
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 ⊦ a + x = a ' + x; (s) ⊦ frag*(IOAut(start, step, ext))(s ' + sl, al) → (# sl = # al ↔ true); (ss) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜x⌝ + ⌜y⌝ ).l = x + y; (s) ⊦ frag(ioa)(σ, ⌜al⌝ ) ↔ frag*(ioa)(σ.l, al) ∧ finp(σ); (s) ⊦ ⌜x⌝ + ⌜y⌝ + ⌜z⌝ = ⌜x0⌝ ↔ x + y + z = x0; (s) ⊦ finp(σ) ↔ (∃ x. ⌜x⌝ = σ); (as) ⊦ (⌜x⌝ + ⌜y⌝ + ⌜y0⌝ ).l = x + y + y0; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s)
| # pcsl0 + 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 ' + pcsl0, pal), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 + 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) ' + pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα).head = (s, as)
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
| # pcsl0 + 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) ' + pcs ' + pcsl0, pal), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pal))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pal, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # 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) ' + pcs ' + pcsl0, pa ' + pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
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)
| # pcsl0 = # 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) ' + pcs ' + pcsl0, pa ' + pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, pcs = (s1, cs1), 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 ' + pcsl0, pa ' + pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
| # pcsl0 = # pal1, pcs = (s1, cs1), 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 ' + pcsl0, pa ' + pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + pcs ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # 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) ' + (s1, cs1) ' + pcsl0, pa ' + pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
| # pcsl0 = # 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) ' + (s1, cs1) ' + pcsl0, pa ' + pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
⊦ frag*(IOAut(start, step, ext))(s ' + sl, a ' + al) ↔ step(s, a, sl.head) ∧ frag*(IOAut(start, step, ext))(sl, al)
# pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, ((s1, cs1) ' + pcsl0).head), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: pal1, (s, cs), Π(ext, cext, ren, cren), (s1, cs1) ' + pcsl0, 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) |
| # pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, ((s1, cs1) ' + pcsl0).head), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, (s1, cs1)), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).head = a; (s)
| # pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Π(step, cstep, ren, cren, ext, cext)((s, cs), pa, (s1, cs1)), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
⊦ Π(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))
# pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), cs = cs1 ∧ (∃ la. step(s, la, s1) ∧ pa = ren(la) ∧ ¬ cod(cren)(pa)) ∨ s = s1 ∧ (∃ ra. cstep(cs, ra, cs1) ∧ pa = cren(ra) ∧ ¬ cod(ren)(pa)) ∨ (∃ la, ra. step(s, la, s1) ∧ ext(la) ≠ None ∧ pa = ren(la) ∧ cstep(cs, ra, cs1) ∧ cext(ra) ≠ None ∧ pa = cren(ra)) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
Used terms: cext, pa, cs, cstep, ren, ext, cren, cs1, step, s, s1
| ⊦ Π(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)) |
| # pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), cs = cs1 ∧ (∃ la. step(s, la, s1) ∧ pa = ren(la) ∧ ¬ cod(cren)(pa)) ∨ s = s1 ∧ (∃ ra. cstep(cs, ra, cs1) ∧ pa = cren(ra) ∧ ¬ cod(ren)(pa)) ∨ (∃ la, ra. step(s, la, s1) ∧ ext(la) ≠ None ∧ pa = ren(la) ∧ cstep(cs, ra, cs1) ∧ cext(ra) ≠ None ∧ pa = cren(ra)) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), cs = cs1 ∧ step(s, a, s1) ∧ pa = ren(a) ∧ ¬ cod(cren)(ren(a)) ∨ s = s1 ∧ cstep(cs, ca, cs1) ∧ pa = cren(ca) ∧ ¬ cod(ren)(cren(ca)) ∨ step(s, a0, s1) ∧ ext(a0) ≠ None ∧ cren(ca0) = ren(a0) ∧ cstep(cs, ca0, cs1) ∧ cext(ca0) ≠ None ∧ pa = cren(ca0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
| # pcsl0 = # pal1, frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), cs = cs1 ∧ step(s, a, s1) ∧ pa = ren(a) ∧ ¬ cod(cren)(ren(a)) ∨ s = s1 ∧ cstep(cs, ca, cs1) ∧ pa = cren(ca) ∧ ¬ cod(ren)(cren(ca)) ∨ step(s, a0, s1) ∧ ext(a0) ≠ None ∧ cren(ca0) = ren(a0) ∧ cstep(cs, ca0, cs1) ∧ cext(ca0) ≠ None ∧ pa = cren(ca0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, pa = cren(ca), s = s1, cstep(cs, ca, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
# pcsl0 = # pal1, cren(ca0) = ren(a0), pa = cren(ca0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
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α); ⊦ # 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) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (a ' + x).head = a; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| # pcsl0 = # pal1, pa = cren(ca), s = s1, cstep(cs, ca, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, cstep(cs, ca, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, ⌜as '⌝ + aσ, aα).head = (s1, as)
Used simplifier rules: nounsharedextR-notcodren: ⊦ ¬ cod(ren)(cren(ca)) ∧ nounsharedextR(cren, cext, ren) → cext !(ca ') = []; 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α); a: ⊦ (x + y) + z = x + y + z; from specification list append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ [] + x = x; (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)
| # pcsl0 = # pal1, cstep(cs, ca, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ¬ cod(ren)(cren(ca)), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, ⌜as '⌝ + aσ, aα).head = (s1, as) |
Used simplifier rules: ⊦ finp(σ) ↔ ¬(∃ nf. ⌜nf⌝ = σ); (ss) ⊦ σ0 + ⌜x⌝ = ⌜nf0⌝ ↔ σ0 = ⌜nf0⌝ ; (s) ⊦ ⌜x⌝ ≠ ⌜nf⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: pal1, start, cstart, step, cstep, ren, cren, ext, cext, s1, cs1, astart, astep, aext, as, aσ, aα, aren
| # pcsl0 = # pal1, cren(ca0) = ren(a0), pa = cren(ca0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜cext !(πra(step, cstep, ren, cren, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, pa ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜cext(ca0).get '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
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)
| # pcsl0 = # pal1, cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜cext(ca0).get '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
Used simplifier rules: ⊦ opt ≠ None → (get = opt.get ↔ opt = Some(get)); (elim) Used terms: cext(ca0), e
| # pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), cext(ca0) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
| # pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ⊑ aext !(aα), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0)
# pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), ∃ σ1. (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ) + σ1 = aext !(aα) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
Used terms: ⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ , aext !(aα)
| ⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0) |
| # pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), ∃ σ1. (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ) + σ1 = aext !(aα) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
# pcsl0 = # pal1, (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ) + β = aext !(aα), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
| # pcsl0 = # pal1, (⌜e '⌝ + ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ ) + β = aext !(aα), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
⊦ ext !(α) = ⌜e '⌝ + β ↔ (∃ al, a, α0. α = ⌜al⌝ + ⌜a '⌝ + α0 ∧ ext(a) = Some(e) ∧ ext !(⌜al⌝ ) = [] ∧ ext !(α0) = β)
# pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), ∃ al, aa, α0. aα = ⌜al⌝ + ⌜aa '⌝ + α0 ∧ aext(aa) = Some(e) ∧ aext !(⌜al⌝ ) = [] ∧ aext !(α0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as)
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: aext, aα, e, ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β
| ⊦ ext !(α) = ⌜e '⌝ + β ↔ (∃ al, a, α0. α = ⌜al⌝ + ⌜a '⌝ + α0 ∧ ext(a) = Some(e) ∧ ext !(⌜al⌝ ) = [] ∧ ext !(α0) = β) |
| # pcsl0 = # pal1, cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), frag(IOAut(astart, astep, aext))(⌜as '⌝ + aσ, aα), frag*(IOAut(Π(start, cstart), Π(step, cstep, ren, cren, ext, cext), Π(ext, cext, ren, cren)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), ∃ al, aa, α0. aα = ⌜al⌝ + ⌜aa '⌝ + α0 ∧ aext(aa) = Some(e) ∧ aext !(⌜al⌝ ) = [] ∧ aext !(α0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, aα).head = (s, as) |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(aal) = [], # pcsl0 = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0).head = (s, as)
Used simplifier rules: ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(aal) = [], # pcsl0 = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0) ≠ [] ∧ repls(step, cstep, cren, ren, aren, cext, aext, (s, cs) ' + (s1, cs1) ' + pcsl0, ren(a0) ' + pal1, ⌜as '⌝ + aσ, ⌜aal⌝ + ⌜aa '⌝ + aα0).head = (s, as) |
⊦ 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 !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(⌜aal⌝ ) = [], # pcsl0 = # 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, cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0) ≠ [] ∧ ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0) ).head = (s, as)
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, pcsl0, cs1, s1, 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 !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(⌜aal⌝ ) = [], # pcsl0 = # 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, cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0) ≠ [] ∧ ( lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' + repls(step, cstep, cren, ren, aren, cext, aext, (s1, cs1) ' + pcsl0, pal1, (⌜as '⌝ + aσ).drop(# aal + 1), aα0) ).head = (s, as) |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, # pcsl0 = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), (lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ').head ≠ (s, as), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (x + a ' + y).head = (x + a ').head; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s) ⊦ n ≠ 0 → (⌜a '⌝ + σ).drop((* n) + m) = σ.drop((n - 1) + m); (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ ⌜x⌝ = [] ↔ x = []; (s) ⊦ ext !(⌜al⌝ ) = ⌜ext !(al)⌝ ; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, # pcsl0 = # pal1, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), (lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ').head ≠ (s, as), Some(e) ≠ None, ext(a0) ≠ None, cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(aal) = [], # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' = pas + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' ≠ [], Some(e) ≠ None, ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦
Used simplifier rules: ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ', pas, x0
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(aal) = [], # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' = pas + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' ≠ [], Some(e) ≠ None, ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0) ⊦ |
aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(aal) = [], # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' = pas ' + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), (s, (⌜as '⌝ + aσ)[# aal]) = pas ∨ (s, (⌜as '⌝ + aσ)[# aal]) ∈ x0, pas ∈ lift((⌜as '⌝ + aσ).take(# aal), s) ∨ pas = (s, (⌜as '⌝ + aσ)[# aal]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' ↔ a = a0; (s) ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a + x = a ' + x; (s)
| aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, aext !(aal) = [], # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, (⌜as '⌝ + aσ)[# aal]) ' = pas ' + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), (s, (⌜as '⌝ + aσ)[# aal]) = pas ∨ (s, (⌜as '⌝ + aσ)[# aal]) ∈ x0, pas ∈ lift((⌜as '⌝ + aσ).take(# aal), s) ∨ pas = (s, (⌜as '⌝ + aσ)[# aal]) ⊦ |
⊦ ¬ ⌜m⌝ < # σ → (σ + σ1)[m] = σ1[m - (# σ).n]
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, aσ[# aal - (# ⌜as '⌝ ).n]) ' = pas ' + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ¬ ⌜# aal⌝ < # ⌜as '⌝ , ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), pas ∈ lift((⌜as '⌝ + aσ).take(# aal), s) ∨ pas = (s, aσ[# aal - (# ⌜as '⌝ ).n]), (s, aσ[# aal - (# ⌜as '⌝ ).n]) = pas ∨ (s, aσ[# aal - (# ⌜as '⌝ ).n]) ∈ x0 ⊦
Used simplifier rules: lift-base: ⊦ lift([], s) = []; ⊦ ⌜m⌝ < # σ → (σ + σ1)[m] = σ[m]; (s) ⊦ ⌜x⌝ [n] = x[n]; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # a ' = 0 +1; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ m < 1 ↔ m = 0; (s) ⊦ # x = 0 ↔ x = []; (s) in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ σ.take(0) = []; (s) ⊦ # [] = 0; (s) ⊦ a '[0] = a; (s) ⊦ [] + x = x; (s) ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: ⌜as '⌝ , aσ, # aal
| ⊦ ¬ ⌜m⌝ < # σ → (σ + σ1)[m] = σ1[m - (# σ).n] |
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, aσ[# aal - (# ⌜as '⌝ ).n]) ' = pas ' + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ¬ ⌜# aal⌝ < # ⌜as '⌝ , ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), pas ∈ lift((⌜as '⌝ + aσ).take(# aal), s) ∨ pas = (s, aσ[# aal - (# ⌜as '⌝ ).n]), (s, aσ[# aal - (# ⌜as '⌝ ).n]) = pas ∨ (s, aσ[# aal - (# ⌜as '⌝ ).n]) ∈ x0 ⊦ |
aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, aσ[# aal - 1]) ' = pas ' + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), (s, aσ[# aal - 1]) = pas ∨ (s, aσ[# aal - 1]) ∈ x0, pas ∈ lift((⌜as '⌝ + aσ).take(# aal), s) ∨ pas = (s, aσ[# aal - 1]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' ↔ a = a0; (s) ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list ⊦ ⌜n⌝ .n = n; (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ # x = 0 ↔ x = []; (s) ⊦ m < 1 ↔ m = 0; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s)
| aext !(aal) = [], aext !(aα0) = ⌜cext !(πra(step, cstep, ren, cren, (s1, cs1) ' + pcsl0, pal1))⌝ + β, # pcsl0 = # pal1, lift((⌜as '⌝ + aσ).take(# aal), s) + (s, aσ[# aal - 1]) ' = pas ' + x0, aext(aa) = Some(e), cext(ca0) = Some(e), cren(ca0) = ren(a0), Some(e) ≠ None, aal ≠ [], ext(a0) ≠ None, pas ≠ (s, as), cstep(cs, ca0, cs1), 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)))((s1, cs1) ' + pcsl0, pal1), nounsharedextR(cren, cext, ren), step(s, a0, s1), Πok(ext, cext, ren, cren), ∀ pal0, start0, cstart0, step0, cstep0, ren0, cren0, ext0, cext0, s0, cs0, astart0, astep0, aext0, as0, aσ0, aα0, aren0. frag*(IOAut(Π(start0, cstart0), Π(step0, cstep0, ren0, cren0, ext0, cext0), Π(ext0, cext0, ren0, cren0)))((s0, cs0) ' + pcsl0, pal0) ∧ finp(⌜(s0, cs0) '⌝ + ⌜pcsl0⌝ ) ∧ frag(IOAut(astart0, astep0, aext0))(⌜as0 '⌝ + aσ0, aα0) ∧ nounsharedextR(cren0, cext0, ren0) ∧ Πok(ext0, cext0, ren0, cren0) ∧ ⌜cext0 !(πra(step0, cstep0, ren0, cren0, (s0, cs0) ' + pcsl0, pal0))⌝ ⊑ aext0 !(aα0) → repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0) ≠ [] ∧ repls(step0, cstep0, cren0, ren0, aren0, cext0, aext0, (s0, cs0) ' + pcsl0, pal0, ⌜as0 '⌝ + aσ0, aα0).head = (s0, as0), (s, aσ[# aal - 1]) = pas ∨ (s, aσ[# aal - 1]) ∈ x0, pas ∈ lift((⌜as '⌝ + aσ).take(# aal), s) ∨ pas = (s, aσ[# aal - 1]) ⊦ |
Used simplifier rules: lift-rec: ⊦ lift(as ' + asl, s) = (s, as) ' + lift(asl, s); ⊦ # x = 0 ↔ x = []; (s) in-15: ⊦ x + a ' = y → a ∈ y; (forward) from specification list in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ n ≠ 0 → (⌜a '⌝ + σ).take((* n) + m) = a ' + σ.take((n - 1) + m); (s) ⊦ n + 0 = n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y; (ws) a: ⊦ (x + y) + z = x + y + z; from specification list n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim) Used terms: # aal, n0
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.