Here is how I make sense of this behavior. When a function that appears in a pattern has attribute Orderless, the pattern-matcher must generate all possible permutations of its argument sequence before trying to match these patterns.
Refer to a simple example expression such as a /. b -> c: in a nutshell, as Fred mentioned in his comment below, I contend that the attribute Orderless causes the system to generate possible alternatives for the b expression, rather than for a.
When the argument sequence of your orderless f function contains more than one argument, then multiple permutations are generated. The specification f[x_, y_, z_] -> {x, y, z} in the second argument of ReplaceList can be thought of as equivalent to the following "expanded form":
{f[x_, y_, z_] -> {x, y, z}, f[x_, z_, y_] -> {x, y, z}, f[y_, x_, z_] -> {x, y, z},
f[y_, z_, x_] -> {x, y, z}, f[z_, x_, y_] -> {x, y, z}, f[z_, y_, x_] -> {x, y, z}}
Each one of those patterns matches f[a, b, c] in the first argument of ReplaceList, hence the multiple results.
However, when the pattern specified in the second argument of ReplaceList contains only one argument, then there are no permutations to account for, so only one "equivalent pattern" is considered, which matches once.
To clarify my point, here is a helper function that approximates my vision of what the pattern matcher is doing for orderless functions. Note that here we use a regular, non-orderless g function, and simulate orderless behavior explicitly.
Clear[generateOrderlessPatterns]
Attributes[g] = {};
generateOrderlessPatterns[functiontoapply_, list_, patterntype_] :=
Table[
functiontoapply[Sequence @@ (Pattern[#, patterntype] & /@ i)] -> list,
{i, Permutations[list]}
]
We can then generate "orderless-style" patterns for the non-orderless g function:
generateOrderlessPatterns[g, {x, y, z}, Blank[]]
(* Out:
{g[x_, y_, z_] -> {x, y, z}, g[x_, z_, y_] -> {x, y, z}, g[y_, x_, z_] -> {x, y, z},
g[y_, z_, x_] -> {x, y, z}, g[z_, x_, y_] -> {x, y, z}, g[z_, y_, x_] -> {x, y, z}}
*)
On the other hand, if we use a BlankSequence pattern, we obtain:
generateOrderlessPatterns[g, {x}, BlankSequence[]]
(* Out: {g[x__] -> {x}} *)
Using these patterns in ReplaceList emulates the Orderless behavior of f:
ReplaceList[g[a, b, c], generateOrderlessPatterns[g, {x, y, z}, Blank[]]]
(* Out:
{{a, b, c}, {a, c, b}, {b, a, c}, {c, a, b}, {b, c, a}, {c, b, a}}
*)
ReplaceList[g[a, b, c], generateOrderlessPatterns[g, {x}, BlankSequence[]]]
(* Out: {{a, b, c}} *)
a /. b -> c, the attributeOrderlessis used to create alternatives forb": That is not only correct, it is actually a nicer and clearer summary than I have in my current answer, so I think I'll add it in if you don't mind. 2. I agree that the behavior withBlankSequencemay be counter-intuitive; on the other hand, it makes sense to me to try and generate alternatives on the simplerbexpression rather than onasince, given the context of pattern matching, on average it can be expected thatais likely to be more complicated thanb. – MarcoB Nov 30 '15 at 19:07ReplaceList[f[p, q, r], f[a__, b__] :> {a}]for an orderlessf. This gives 6 results ({{p}, {q}, {r}, {p, q}, {p, r}, {q, r}}), whereas an equivalent usage of yourgenerateOrderlessPatternsgives only 4. In particular, the results{q}and{p, r}from my snippet cannot be matched without doing some rearranging on the left-hand side as well. At the same time it doesn't do any rearranging within the matches of a given pattern sequence (otherwise there would be 12 results). – Martin Ender Jan 10 '17 at 11:08MatchQ[f[1, 2, 3], f[a__, b__] /; {b} == {1, 3}]andMatchQ[f[1, 2, 3], f[a__, b__] /; {b} == {3, 1}]for orderlessf(they yieldTrueandFalserespectively). Replacingb__with3, 1and dropping the condition givesTrueagain. – Martin Ender Jan 10 '17 at 14:54