.. _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.