Unless f is a flat function, a pattern like f[x_,y_] stands only for instances of the function with exactly two arguments. Sometimes you need to set up patterns that can allow any number of arguments.
"Double blanks" __ stand for sequences of one or more expressions. "Triple blanks" ___ stand for sequences of zero or more expressions. You should be very careful whenever you use triple blank patterns. It is easy to make a mistake that can lead to an infinite loop. For example, if you define p[x_,y___]:=p[x] q[y], then typing in p[a] will lead to an infinite loop, with y repeatedly matching a sequence with zero elements. Unless you are sure you want to include the case of zero elements, you should always use double blanks rather than triple blanks.
|_||any single expression|
|x_||any single expression, to be named x|
|__||any sequence of one or more expressions|
|x__||sequence named x|
|x__h||sequence of expressions, all of whose heads are h|
|___||any sequence of zero or more expressions|
|x___||sequence of zero or more expressions named x|
|x___h||sequence of zero or more expressions, all of whose heads are h|
Notice that with flat functions such as Plus and Times, the Wolfram Language automatically handles variable numbers of arguments, so you do not explicitly need to use double or triple blanks, as discussed in "Flat and Orderless Functions".
When you use multiple blanks, there are often several matches that are possible for a particular expression. By default, the Wolfram Language tries first those matches that assign the shortest sequences of arguments to the first multiple blanks that appear in the pattern. You can change this order by wrapping Longest or Shortest around parts of the pattern.
|Longest[p]||match the longest sequence consistent with the pattern p|
|Shortest[p]||match the shortest sequence consistent with the pattern p|