reserve s for State of SCM+FSA,
  a, c for read-write Int-Location,
  aa, bb, cc,
  dd, x for Int-Location,
  f for FinSeq-Location,
  I, J for MacroInstruction of SCM+FSA,
  Ig for good MacroInstruction of SCM+FSA,
  i, k for Nat,
  p for Instruction-Sequence of SCM+FSA;
reserve I for MacroInstruction of SCM+FSA;

theorem Th31:
  1 <= s.aa & s.aa <= len (s.f) & 1 <= s.bb & s.bb <= len (s.f) &
s.intloc 0 = 1
 implies IExec(swap(f,aa,bb),p,s).f = s.f+*(s.aa, s.f.(s.bb))+*(
  s.bb, s.f.(s.aa))
proof
  set a = aa, b = bb;
  assume that
A1: 1 <= s.a and
A2: s.a <= len (s.f) and
A3: 1 <= s.b and
A4: s.b <= len (s.f) and
A5: s.intloc 0 = 1;
  set aux1 = 1-stRWNotIn {a, b}, aux2 = 2-ndRWNotIn {a, b};
  set i0 = aux1 := (f,a), i1 = aux2 := (f,b), i2 = (f,a) := aux2;
  set s0 = Initialized s, s1 = Exec(i0, s0), s2 = IExec(i0 ";" i1,p,s);
A6: b = intloc 0 or b is read-write by SCMFSA_M:def 2;
  reconsider sa = s.a as Element of NAT by A1,INT_1:3;
  set s0a = |.s0.a.|, s2a = |.s2.a.|;
A7: a = intloc 0 or a is read-write by SCMFSA_M:def 2;
A8: sa = |.s.a.| by ABSVALUE:def 1;
  then
A9: s0.f = s.f & sa = s0a by A5,A7,SCMFSA_M:9,37;
  reconsider sb = s.b as Element of NAT by A3,INT_1:3;
A10: sb = |.s.b.| by ABSVALUE:def 1;
  set s3 = IExec(i0 ";" i1 ";" i2,p,s);
A11: aux1 <> aux2 by SCMFSA_M:26;
A12: s3.aux1 = Exec(i2, s2).aux1 by SCMFSA6C:6
    .= s2.aux1 by SCMFSA_2:73
    .= Exec(i1, s1).aux1 by SCMFSA6C:8
    .= s1.aux1 by A11,SCMFSA_2:72
    .= (s0.f)/.s0a by Th4
    .= s.f.sa by A1,A2,A9,FINSEQ_4:15;
  set i3 = (f,b) := aux1;
A13: s2.f = Exec(i1, s1).f by SCMFSA6C:9
    .= s1.f by SCMFSA_2:72;
A14: s3.f = Exec(i2, s2).f by SCMFSA6C:7
    .= s2.f+*(s2a, s2.aux2) by Th5;
A15: b in {a, b} by TARSKI:def 2;
  then
A16: b <> aux2 by SCMFSA_M:25;
  b <> aux1 by A15,SCMFSA_M:25;
  then
A17: s1.b = s0.b by SCMFSA_2:72
    .= s.b by A5,A6,SCMFSA_M:9,37;
A18: a in {a, b} by TARSKI:def 2;
  then
A19: a <> aux2 by SCMFSA_M:25;
A20: a <> aux1 by A18,SCMFSA_M:25;
  s2.a = Exec(i1, s1).a by SCMFSA6C:8
    .= s1.a by A19,SCMFSA_2:72
    .= s0.a by A20,SCMFSA_2:72;
  then
A21: sa = s2a by A5,A8,A7,SCMFSA_M:9,37;
  set s1b = |.s1.b.|;
A22: s1.f = s0.f by SCMFSA_2:72
    .= s.f by SCMFSA_M:37;
A23: s3.b = Exec(i2, s2).b by SCMFSA6C:6
    .= s2.b by SCMFSA_2:73
    .= Exec(i1, s1).b by SCMFSA6C:8
    .= s1.b by A16,SCMFSA_2:72;
A24: s2.aux2 = Exec(i1, s1).aux2 by SCMFSA6C:8
    .= (s1.f)/.s1b by Th4
    .= s.f.sb by A3,A4,A10,A22,A17,FINSEQ_4:15;
  thus IExec(swap(f,a,b),p,s).f = Exec(i3, s3).f by SCMFSA6C:7
    .= s.f+*(s.a, s.f.(s.b))+*(s.b, s.f.(s.a)) by A10,A22,A13,A14,A21,A17,A23
,A24,A12,Th5;
end;
