internal void Refine(PRED psi) { if (left == null && right == null) { #region leaf var phi_and_psi = solver.MkAnd(phi, psi); if (solver.IsSatisfiable(phi_and_psi)) { var phi_min_psi = solver.MkAnd(phi, solver.MkNot(psi)); if (solver.IsSatisfiable(phi_min_psi)) { left = new PartitonTree <PRED>(solver, nr + 1, this, phi_and_psi, null, null); right = new PartitonTree <PRED>(solver, nr + 1, this, phi_min_psi, null, null); } else // [[phi]] subset of [[psi]] { left = new PartitonTree <PRED>(solver, nr + 1, this, phi, null, null); //psi must true } } else // [[phi]] subset of [[not(psi)]] { right = new PartitonTree <PRED>(solver, nr + 1, this, phi, null, null); //psi must be false } #endregion } else if (left == null) { right.Refine(psi); } else if (right == null) { left.Refine(psi); } else { #region nonleaf var phi_and_psi = solver.MkAnd(phi, psi); if (solver.IsSatisfiable(phi_and_psi)) { var phi_min_psi = solver.MkAnd(phi, solver.MkNot(psi)); if (solver.IsSatisfiable(phi_min_psi)) { left.Refine(psi); right.Refine(psi); } else // [[phi]] subset of [[psi]] { left.ExtendLeft(); //psi is true right.ExtendLeft(); } } else // [[phi]] subset of [[not(psi)]] { left.ExtendRight(); right.ExtendRight(); //psi is false } #endregion } }