# Order of evaluation of FunctionDomain, Reduce, Solve, etc

For the input (mine is much more complicated, this is a toy example):

x/x /. x -> 0


the output of 1 (as opposed to Indeterminate) is understood (although I cannot say I am happy about it), when looking at the Trace, which shows that the x/x is simplified to 1, before the ReplaceAll.

One way around this problem, is to define the function:

f[x_]:=x/x


then, f[0] indeed produces Indeterminate.

However, if I then invoke FunctionDomain[f[x],x], I get True. Apparently FunctionDomain also receives a simplified form of the function, prior to calculating the domain.

The workaround for this was suggested to me by @Szabolcs, and originally from @ChipHurst, as can be seen here, by wrapping the first argument of FunctionDomain in a Hold.

However, this continues to bite, when solving equations. E.g., with the following definition:

g[x] := x/Sqrt[x^2]


I am okay with:

Solve[g[x] == 0, x, Reals]


producing {}, and:

Reduce[g[x] == 0, x]


gives me False. But if I give Reduce a bit more info, it simplifies g[x] to x, and for:

Reduce[g[x] == 0, x, Reals]


I get x == 0.

@Szabolcs pointed out that similar results are obtained if the right hand side of the equation is 1, the former form of Reduce producing a correct answer, and the latter, an incorrect one.

One possible (ugly) workaround, would be to "remind" Reduce of the possible values of x:

Reduce[g[x] == 0 \[And] FunctionDomain[g[x], x], x, Reals]