Generally speaking, symbolic expressions consist of symbols and
operation between them. To create symbolic expressions using
SympyCore, one can either create symbol objects and perform operations
between them:

The most obvious manipulation task applied to symbolic expressions, is
substitution -- replacing a sub-expression of a given expression with a
new expression. For example,

>>> expr = x + y
>>> print expr.subs(y, sin(x))
x + sin(x)

Other tasks include accessing parts of symbolic expressions:

>>> sorted(expr.args)
[Calculus('x'), Calculus('y')]

and constructing new expressions:

>>> print Mul(*expr.args)
x*y

An important presumption for implementing various algorithms is pattern
matching. Pattern matching means that given a pattern expression, the
pattern match method should first decide whether an expression can be
expressed in a form that the pattern defines, and second. it should
return information what sub-expression parts correspond to the pattern
sub-expressions. For example, given a pattern

>>> w = Symbol('w')
>>> pattern = x * w ** 3

where symbol w is assumed to match any sub-expression, then expressions