reserve x,y,y1,y2,z,a,b for object, X,Y,Z,V1,V2 for set,
  f,g,h,h9,f1,f2 for Function,
  i for Nat,
  P for Permutation of X,
  D,D1,D2,D3 for non empty set,
  d1 for Element of D1,
  d2 for Element of D2,
  d3 for Element of D3;

theorem Th4:
  curry f = curry' ~f & uncurry f = ~uncurry' f
proof
A1: dom curry ~~f = proj1 dom ~~f by FUNCT_5:def 1;
A2: dom curry f = proj1 dom f by FUNCT_5:def 1;
A3: dom curry ~~f = dom curry f
  proof
    thus dom curry ~~f c= dom curry f
    proof
      let x be object;
      assume x in dom curry ~~f;
      then consider y being object such that
A4:   [x,y] in dom ~~f by A1,XTUPLE_0:def 12;
      [y,x] in dom ~f by A4,FUNCT_4:42;
      then [x,y] in dom f by FUNCT_4:42;
      hence thesis by A2,XTUPLE_0:def 12;
    end;
    let x be object;
    assume x in dom curry f;
    then consider y being object such that
A5: [x,y] in dom f by A2,XTUPLE_0:def 12;
    [y,x] in dom ~f by A5,FUNCT_4:42;
    then [x,y] in dom ~~f by FUNCT_4:42;
    hence thesis by A1,XTUPLE_0:def 12;
  end;
A6: curry' ~f = curry ~~f by FUNCT_5:def 3;
  now
    let x be object;
    assume
A7: x in dom curry f;
    reconsider g = (curry f).x, h = (curry' ~f).x as Function;
A8: dom g = proj2 (dom f /\ [:{x},proj2 dom f:]) by A7,FUNCT_5:31;
A9: dom h = proj1 (dom ~f /\ [:proj1 dom ~f,{x}:]) by A6,A3,A7,FUNCT_5:34;
A10: dom g = dom h
    proof
      thus dom g c= dom h
      proof
        let a be object;
        assume a in dom g;
        then consider b being object such that
A11:    [b,a] in dom f /\ [:{x},proj2 dom f:] by A8,XTUPLE_0:def 13;
        [b,a] in [:{x},proj2 dom f:] by A11,XBOOLE_0:def 4;
        then
A12:    [a,b] in [:proj2 dom f,{x}:] by ZFMISC_1:88;
        [b,a] in dom f by A11,XBOOLE_0:def 4;
        then
A13:    [a,b] in dom ~f by FUNCT_4:42;
        proj2 dom f = proj1 dom ~f by FUNCT_5:17;
        then [a,b] in dom ~f /\ [:proj1 dom ~f,{x}:] by A13,A12,XBOOLE_0:def 4;
        hence thesis by A9,XTUPLE_0:def 12;
      end;
      let a be object;
      assume a in dom h;
      then consider b being object such that
A14:  [a,b] in dom ~f /\ [:proj1 dom ~f,{x}:] by A9,XTUPLE_0:def 12;
      [a,b] in [:proj1 dom ~f,{x}:] by A14,XBOOLE_0:def 4;
      then
A15:  [b,a] in [:{x},proj1 dom ~f:] by ZFMISC_1:88;
      [a,b] in dom ~f by A14,XBOOLE_0:def 4;
      then
A16:  [b,a] in dom f by FUNCT_4:42;
      proj2 dom f = proj1 dom ~f by FUNCT_5:17;
      then [b,a] in dom f /\ [:{x},proj2 dom f:] by A16,A15,XBOOLE_0:def 4;
      hence thesis by A8,XTUPLE_0:def 13;
    end;
    now
      let a be object;
      assume
A17:  a in dom g;
      then
A18:  [x,a] in dom f & g.a = f.(x,a) by A7,FUNCT_5:31;
      h.a = (~f).(a,x) by A6,A3,A7,A10,A17,FUNCT_5:34;
      hence g.a = h.a by A18,FUNCT_4:def 2;
    end;
    hence (curry f).x = (curry' ~f).x by A10;
  end;
  hence curry f = curry' ~f by A6,A3;
A19: dom uncurry f = dom ~~uncurry f
  proof
    thus dom uncurry f c= dom ~~uncurry f
    proof
      let a be object;
      assume
A20:  a in dom uncurry f;
      then consider x,g,y such that
A21:  a = [x,y] and
      x in dom f and
      g = f.x and
      y in dom g by FUNCT_5:def 2;
      [y,x] in dom ~uncurry f by A20,A21,FUNCT_4:42;
      hence thesis by A21,FUNCT_4:42;
    end;
    let a be object;
    assume a in dom ~~uncurry f;
    then ex x,y being object st a = [y,x] & [x,y] in dom ~uncurry f
       by FUNCT_4:def 2;
    hence thesis by FUNCT_4:42;
  end;
A22: now
    let a be object;
    assume a in dom ~~uncurry f;
    then consider x,y being object such that
A23: a = [y,x] and
A24: [x,y] in dom ~uncurry f by FUNCT_4:def 2;
    (~uncurry f).(x,y) = (uncurry f).(y,x) & (~uncurry f).(x,y) = (~~
    uncurry f). (y,x) by A24,FUNCT_4:43,def 2;
    hence (uncurry f).a = (~~uncurry f).a by A23;
  end;
  uncurry' f = ~uncurry f by FUNCT_5:def 4;
  hence thesis by A19,A22;
end;
