Generic and Non-Generic Cases

This gives a result for the integral of (x^n) that is valid for almost all values of n:

Integrate[x^n,x]

For the special case of (x^(-1)), however, the correct result is different:

Integrate[x^-1,x]

The overall goal of symbolic computation is typically to get formulas that are valid for many possible values of the variables that appear in them. It is however often not practical to try to get formulas that are valid for absolutely every possible value of each variable.

The Wolfram Language always replaces 0/x by 0:

0/x

If x is equal to 0, however, then the true result is not 0:

0/0

This construct treats both cases, but would be quite unwieldy to use:

If[x!=0,0,Indeterminate]

If the Wolfram Language did not automatically replace 0/x by 0, then few symbolic computations would get very far. But you should realize that the practical necessity of making such replacements can cause misleading results to be obtained when exceptional values of parameters are used.

The basic operations of the Wolfram Language are nevertheless carefully set up so that whenever possible the results obtained will be valid for almost all values of each variable.

(Sqrt[(x^2)]) is not automatically replaced by x:

Sqrt[x^2]

If it were, then the result here would be -2, which is incorrect:

%/.x->-2

This makes the assumption that x is a positive real variable, and does the replacement:

Simplify[Sqrt[x^2],x>0]