Tactics simplifyonly perform "local simplifications." For each member, twe have that simplify(t)is a new member, equivalent t. Moreover, the result simplify(t)does not depend on the context in which it occurs t. In the context, I meant the statement F, where tall the other statements occur. Since it simplifyis local, it is very effective. The implementation is mainly based on the application of bottom-up simplification rules. Moreover, since the result simplify(t)does not depend on contextual information, we can cache it. Thus, even if it ttakes place Nonce in the formula F, we only need to simplify it. All embedded solvers in Z3 use this kind of simplification. So tactics likesimplifyhas been thoroughly tested.
Tactics ctx-solver-simplifyuse context where they are tused for simplification. The basic idea is to simplify the formula Fby going through it with a solver S. The solver Sessentially contains a "context." Whenever S.check()returns unsat, we know that the current context is incompatible, then we can replace the current formula with false. ctx-solver-simplifymuch more expensive. Firstly, it carries out many challenges S.check(). Each of these challenges is potentially very expensive. It is also much harder to cache intermediate results. Z3 may have to simplify the subformula tmany times because it occurs in different contexts.
, . ( 4.1). , Z3 4.1