.. _pattern-matching-examples: Pattern-matching examples ========================= The following examples demonstrate different features of the pattern-matching syntax, and particular behaviours that might not be immediately obvious. In the following, the :term:`Use commutativity` and :term:`Use associativity` modes are enabled, and :term:`Allow other terms` is disabled, unless otherwise specified. Match exactly the expression ``1+2``:: 1 + 2 If commutativity is enabled, ``2 + 1`` will also match this pattern. Whitespace and brackets are ignored when they don't change the meaning of the expression, so ``1+2``, ``1 + 2`` and ``(1)+(2)`` all match this pattern. Any power of 2:: 2^? Forbid decimals anywhere (so only allow integers):: `!m_anywhere(decimal:$n) A sum consisting of any number of fractions, all over the same denominator, which is captured as ``d``:: (`+-( $n/($n;=d) ))`* + $z Ensure that there are no unexpanded brackets:: `! m_anywhere(?*(? + ?`+)) The sum of two positive integers:: positive:$n + positive:$n A product of at least two factors, where no factor is numerically equal to 1:: m_nogather( ?;factors*?`+;factors `where all(map(not numerical_compare(x,expression("1")),x,factors)) ) This is a fairly cheap way of checking that a number or expression has been decomposed into factors (assuming it's not already irreducible). Note that it doesn't check that the expression has been fully factorised: for example, ``4*6`` matches this pattern. Complete the square:: (x+$n)^2+$n`? A number of the form :math:`a \cdot e^{\theta i}`, where the coefficient :math:`a` is optional, and the power can be any multiple or fraction of :math:`i`:: ($n`? `: 1)*e^(((`*/ `+- $n)`*;x)*i) The following expressions all match this pattern: ``e^i``, ``2e^(pi*i)``, ``e^(i * 2/3 pi)``. A complex number in the form :math:`a + ib`, allowing for either the real or imaginary part to be omitted, and zero by default. The real part is captured as ``re`` and the imaginary part as ``im``:: ((`+-real:$n)`? `: 0);re + ((`+-i*real:$n`?)`? `: 0);im A polynomial with integer coefficients:: `+- ((`*/ $n)`* * ($v);=base^?`? `| $n/$n`?)`* + $z The base of the polynomial is captured as ``base``. A fraction with rational denominator: disallow square roots or non-integer powers in the denominator:: `+- ? / (`!m_anywhere(sqrt(?) `| ?^(`! `+-integer:$n))) A sum of fractions, where no denominator is numerically equivalent to 1 and no numerator is numerically equivalent to 0:: m_nogather(m_gather(`+- (?;tops/?;bottoms));fractions`* + $z) `where len(fractions)>1 and all(map(not numerical_compare(x,expression("1")),x,bottoms)) and all(map(not numerical_compare(x,expression("0")),x,tops)) This pattern could be used to establish that a student has decomposed an expression into partial fractions.