8

2

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.

1A look at the output of

`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 as`y_. + x_`

, since`Plus[]`

is orderless, and I'm guessing`Optional[]`

comes before`Pattern[]`

in canonical order. – J. M.'s ennui – 2013-05-19T03:16:48.823@J.M. Thanks. I know it is reordered, but what is the logic behind it. Why adding _. can reorder it, why it is only the first case that a and b are reordered? – user71346 – 2013-05-19T04:56:50.223

1I did give my guess that

`Optional[]`

(`y_.`

is internally represented as`Optional[Pattern[y, Blank[]]]`

) comes before`Pattern[]`

(`x_`

is internally represented as`Pattern[x, Blank[]]`

) in canonical order, which is why you're seeing the reordering. But there might be a deeper explanation... – J. M.'s ennui – 2013-05-19T04:58:43.8674Both

`Times[]`

and`Plus[]`

are`Orderless`

(use`Attributes[]`

to see this), so they both sort their arguments for the purpose of having a canonical form. – J. M.'s ennui – 2013-05-19T05:10:49.760