| \A ∀ Inpf, S, Outf. [:Inpf, S, Outf | SPAWN#(n0; Inpf, S, Outf)] ∧ GInv(S) ∧ Prton(n0)(S) → (Rton(n0)(S', S'') ∧ (GInv(S') → GInv(S''))) -+-> (last ⊃ Poton(n0)(S) ∧ GInv(S);Gton(n0)(S, S') ∧ ¬ blocked ∧ (GInv(S) → GInv(S'))), [:Inpf, S, Outf | SPAWN#(n0 + 1; Inpf, S, Outf)], GInv(S), Prton(n0 + 1)(S) ⊦ (Rton(n0 + 1)(S', S'') ∧ (GInv(S') → GInv(S''))) -+-> (last ⊃ Poton(n0 + 1)(S) ∧ GInv(S);Gton(n0 + 1)(S, S') ∧ ¬ blocked ∧ (GInv(S) → GInv(S'))) |
[:Inpf, S, Outf | if* n = 0 then SEQ#(0, Inpf(n); S, Outf(n)) else SEQ#(n, Inpf(n); S, Outf(n)) ∥ SPAWN#(n - 1; Inpf, S, Outf)], \A ∀ Inpf, S, Outf. [:Inpf, S, Outf | SPAWN#(n0; Inpf, S, Outf)] ∧ GInv(S) ∧ Prton(n0)(S) → (Rton(n0)(S', S'') ∧ (GInv(S') → GInv(S''))) -+-> (last ⊃ Poton(n0)(S) ∧ GInv(S);Gton(n0)(S, S') ∧ ¬ blocked ∧ (GInv(S) → GInv(S'))), GInv(S), Prton(n0 + 1)(S), n = n0 + 1 ⊦ (Rton(n0 + 1)(S', S'') ∧ (GInv(S') → GInv(S''))) -+-> (last ⊃ Poton(n0 + 1)(S) ∧ GInv(S);Gton(n0 + 1)(S, S') ∧ ¬ blocked ∧ (GInv(S) → GInv(S')))
Used simplifier rules: SPAWN#(n; Inpf, S, Outf) {if* n = 0 then SEQ#(0, Inpf(n); S, Outf(n)) else SEQ#(n, Inpf(n); S, Outf(n)) ∥ SPAWN#(n - 1; Inpf, S, Outf) };