I don't really understand the behaviour of Default Argument. If I execute this command in Mathematica:
In: {f[a], f[a + b]} /. f[x_ + y_.] -> p[x, y]
Out: {p[a, 0], p[b, a]}
Why is the a and b swapped?
How can I explain the different behaviour of the above compared with the each of the following:
In: {f[a], f[a + b]} /. f[x_ + y_] -> p[x, y]
Out: {f[a], p[a, b]}
In: {f[a], f[a + b]} /. f[x_. + y_] -> p[x, y]
Out: {p[0, a], p[a, b]}
In: {f[a], f[a + b]} /. f[x_. + y_.] -> p[x, y]
Out: {p[a, 0], p[a, b]}
And similarly for:
In: {f[a], f[a b]} /. f[x_ y_.] -> p[x, y]
Out: {p[a, 1], p[b, a]}
In: {f[a], f[a b]} /. f[x_ y_] -> p[x, y]
Out: {f[a], p[a, b]}
In: {f[a], f[a b]} /. f[x_. y_] -> p[x, y]
Out: {p[1, a], p[a, b]}
In: {f[a], f[a b]} /. f[x_. y_.] -> p[x, y]
Out: {p[a, 1], p[a, b]}
From Mathematica help, what I understand is that Mathematica will return the default value if the argument of _. is not inputted. But I still cannot make the above statements any sense. Besides the obvious observable output such as reordering, I don't really understand the logic behind _. How does it relate to sum and multiplication? When will _. be useful in other than this situation?
Thanks.
TracePrint[{f[a], f[a + b]} /. f[x_ + y_.] -> p[x, y]]
shows that there is some reordering done; that is,x_ + y_.
is automagically reordered asy_. + x_
, sincePlus[]
is orderless, and I'm guessingOptional[]
comes beforePattern[]
in canonical order. $\endgroup$Optional[]
(y_.
is internally represented asOptional[Pattern[y, Blank[]]]
) comes beforePattern[]
(x_
is internally represented asPattern[x, Blank[]]
) in canonical order, which is why you're seeing the reordering. But there might be a deeper explanation... $\endgroup$Times[]
andPlus[]
areOrderless
(useAttributes[]
to see this), so they both sort their arguments for the purpose of having a canonical form. $\endgroup$