The Wolfram Language has a flexible system for specifying arbitrary symbolic assumptions about variables. It uses a wide range of sophisticated algorithms to infer the consequences of assumptions—often in the process automatically proving a sequence of necessary mathematical theorems.
Refine — evaluate an expression using assumptions
FunctionExpand — expand in terms of simpler functions, using assumptions
Assuming — set up assumptions to be used by functions inside
FunctionDomain — find the domain of a function
FunctionRange — find the range of a function