reserve x,y,z, X,Y,Z for set,
  n for Element of NAT;

theorem
  for f,g being Function, X being set holds (f|X)*g = f*(X|`g)
proof
  let f,g be Function, X be set;
A1: dom (f|X) = dom f /\ X by RELAT_1:61;
A2: dom ((f|X)*g) = dom (f*(X|`g))
  proof
    thus dom ((f|X)*g) c= dom (f*(X|`g))
    proof
      let x be object;
      assume
A3:   x in dom ((f|X)*g);
      then
A4:   x in dom g by FUNCT_1:11;
A5:   g.x in dom (f|X) by A3,FUNCT_1:11;
      then
A6:   g.x in dom f by A1,XBOOLE_0:def 4;
      g.x in X by A1,A5,XBOOLE_0:def 4;
      then
A7:   x in dom (X|`g) by A4,FUNCT_1:53;
      then g.x = (X|`g).x by FUNCT_1:53;
      hence thesis by A6,A7,FUNCT_1:11;
    end;
    let x be object;
    assume
A8: x in dom (f*(X|`g));
    then
A9: x in dom (X|`g) by FUNCT_1:11;
    then
A10: x in dom g by FUNCT_1:53;
    (X|`g).x in dom f by A8,FUNCT_1:11;
    then
A11: g.x in dom f by A9,FUNCT_1:53;
    g.x in X by A9,FUNCT_1:53;
    then g.x in dom (f|X) by A1,A11,XBOOLE_0:def 4;
    hence thesis by A10,FUNCT_1:11;
  end;
  now
    let x be object;
    assume
A12: x in dom ((f|X)*g);
    then ((f|X)*g).x = (f|X).(g.x) & g.x in dom (f|X) by FUNCT_1:11,12;
    then
A13: ((f|X)*g).x = f.(g.x) by FUNCT_1:47;
    (f*(X|`g)).x = f.((X|`g).x) & x in dom (X|`g) by A2,A12,FUNCT_1:11,12;
    hence ((f|X)*g).x = (f*(X|`g)).x by A13,FUNCT_1:53;
  end;
  hence thesis by A2,FUNCT_1:2;
end;
