I used to thought that calling a function is equal to applying a rule, i.e. applying a rule of f[x_]->sth. is equal to calling a function f with definition f[x_]:=sth.
However, given
disOut[dot[add[y__], z__]] := dot[#, z] & /@ add[y];
dot[add[a, b, c], d, e, f] // disOut (*would produce*)
add[dot[a, d, e, f], dot[b, d, e, f], dot[c, d, e, f]]
while
dot[add[a, b, c], d, e, f] /. dot[add[y__], z__] -> dot[#, z] & /@ add[y](*would be*)
add[dot[a, b, c, d, e, f]]
Why? What's the difference between functions and replacement?