I suspect that one problem with these simplification corrections is that
sqrt(1/z) --> 1/sqrt(z) unless z is real and negative
can be very expensive when z is not a literal symbol.
If z is a complicated expression, do you still try to determine if z<0 ?
(If z = 0, is it equally valid to say sqrt(1/z) or 1/sqrt(z) ?? )
While these improvements may make some answers come out right,
I think that CAS will not be correct as long as they try to model the
"one square root value" idea that humans seem to use, even when
that model is inadequate.
There is a second problem.
When is the one square root model OK?
the TWO solutions to the quadratic equation ( -b +-sqrt(b^2-4ac))/2a,
because whatever sign you choose for the sqrt, the sqrt with the OTHER
sign has also been produced. That is, you are explicitly presented with
the 2 values of the sqrt. Or more generally, the result from solve(),
which is a set.
I am NOT convinced that assume(z>0) means that sqrt(z) is positive.
sqrt(z) has 2 values. That is, sqrt(3) is a root of x^2=3, and has 2
possible values, 1.732.. and -.1732... . In some numerical calculation
software, sqrt(3) might be a shorthand for abs( sqrt(3)), but this
is not the mathematical solution, as is pretty clear if you try to apply
the elementary-school simplification to items that occur later on in
mathematical education. Say (1)^(1/8), which might be 1, or i, or
(0.9238795 + 0.38268343 i) or 5 other values. Saying that 1 is positive
does not tell you much.
Another way of saying this...
Contrast the two situations:
assume x is real and positive. solve (x^2=3.0,x). there is one
solution x=1.732....
assume z is real and positive. solve(x^2=z^2,x). Why choose x=z? x=-z
is a solution also.
So sqrt(z^2) is +-z, regardless of assume(z>0) or not.
If we want to find an expression for just one solution for
sqrt(expression),
perhaps what we should say is abs(sqrt(z^2)). This indicates the user's
preference.