Pattern Matching

The symbols Blank, BlankSequence, BlankNullSequence, Alternatives, Pattern, Optional, Repeated, RepeatedNull, Condition, PatternTest, Verbatim, HoldPattern, Default, Orderless, Flat, and OneIdentity are all related to pattern matching in Mathematica. Each of these symbols are discussed in this notebook.

Some examples

A pattern must match the FullForm

Finding the right pattern needed to make a transformation on an algebraic expression can be non-trivial. Consider the next cell where we would like to make the transformation

on each term.

This is a simplified example of a real world problem I encountered when I needed to change the transfer function of a continuous filter to the transfer function (in the z-domain) of the corresponding discrete filter. The most intuitive attempt to make this transformation is shown in the next cell, and you can see it doesn't work.

The attempt above doesn't work because the pattern doesn't match the FullForm

of the expression we want to change. The next cell indicates what the

FullForm is.

The transformation in the next cell mathces the FullForm and does what we

want.

For more examples in pattern matching see the sections on MatchQ and HoldPattern.

Note: The attributes Orderless, Flat, and OneIdentity have an effect on pattern matching.

The pattern matcher doesn't look inside "atoms"

Integers, rational numbers, and complex numbers are "atoms", and the

pattern matcher doesn't look at the individual parts of these things. That

is why we get only only one Position from the next input.

Keep in mind that the functions in the table below can be used to take apart

atoms.

Also be aware that the real and imaginary parts of a complex number can each

be Real, Rational, or Integer values.

Head | Function to take apart the atom |

Complex | Re, Im |

Rational | Numerator, Denominator |

Real | RealDigits |

Integer | IntegerDigits |

String | Characters |

The pattern (x_Symbol) may not be specific enough

In the next input a function f[x, n] is defined where x must be a symbol and

n must be an integer.

Below we see that the above definition is used for f[π,3] and[s,3] when (s) evaluates to the symbol (t).

However you might want to require that the first argument of (f) is a

variable and π is clearly not a variable. The next definition does the

job.

However, it gets a more complicated if you want to account for symbols that were removed. This was explained by Robby Villegas of Wolfram Research at the 1999 Developer Converence. See "Working With Unevaluated Expressions " posted at

http://library.wolfram.com/conferences/devconf99/#programming.

Below the symbol (t) is removed, so (s) evaluates to Removed["t"]. When f[s, 3] is evaluated the first argument Removed["t"] matches the pattern (x_Symbol?(!NumericQ[#]&)). One would think Removed["t"] would be an expression with Head Removed and argument "t", but it doesn't work that way.

In the next cell I give a new definition for (f) that requires that the first

argument is a non-numeric symbol that hasn't been Removed.

You might find the function (UserSymbolQ) below useful. It returns True when

it's argument is a Non-numeric symbol that hasn't been removed and is not in

the System Context.

In the cell below the only "UserSymbol" is t4.

Created by Mathematica (May 17, 2004)