diff --git a/src/constraint_solver/expr_cst.cc b/src/constraint_solver/expr_cst.cc index 87d7066b7d..24bf905fa1 100644 --- a/src/constraint_solver/expr_cst.cc +++ b/src/constraint_solver/expr_cst.cc @@ -379,6 +379,15 @@ IntVar* Solver::MakeIsEqualCstVar(IntVar* const var, int64 value) { if (value == 0 && IsADifference(var, &left, &right)) { return MakeIsEqualVar(left, right); } + if (var->Max() - var->Min() == 1) { + if (value == var->Min()) { + return MakeDifference(value + 1, var)->Var(); + } else if (value == var->Max()) { + return MakeSum(var, -value + 1)->Var(); + } else { + return MakeIntConst(0); + } + } return var->IsEqual(value); } diff --git a/src/flatzinc/parser.cc b/src/flatzinc/parser.cc index cff164d820..2a3764dc67 100644 --- a/src/flatzinc/parser.cc +++ b/src/flatzinc/parser.cc @@ -129,7 +129,7 @@ void ParserState::ComputeViableTarget( id == "array_bool_element" || id == "int_lin_eq_reif" || id == "int_eq_reif" || - id == "int_ne_reif", + id == "int_ne_reif" || id == "bool_eq_reif" || id == "bool_ne_reif") { // Defines a bool var.