feat(library/unifier): solve constraints of the form '(max l1 l2) =?= 0' and '(imax l1 l2) =?= 0'
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
fd0deb4555
commit
48b902dc37
1 changed files with 36 additions and 0 deletions
|
@ -1353,6 +1353,39 @@ struct unifier_fn {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Process the following constraints
|
||||||
|
1. (max l1 l2) =?= 0 OR
|
||||||
|
solution: l1 =?= 0, l2 =?= 0
|
||||||
|
2. (imax l1 l2) =?= 0
|
||||||
|
solution: l2 =?= 0
|
||||||
|
*/
|
||||||
|
status try_level_eq_zero(level const & lhs, level const & rhs, justification const & j) {
|
||||||
|
if (!is_zero(rhs))
|
||||||
|
return Continue;
|
||||||
|
if (is_max(lhs)) {
|
||||||
|
if (process_constraint(mk_level_eq_cnstr(max_lhs(lhs), rhs, j)) &&
|
||||||
|
process_constraint(mk_level_eq_cnstr(max_rhs(lhs), rhs, j)))
|
||||||
|
return Solved;
|
||||||
|
else
|
||||||
|
return Failed;
|
||||||
|
} else if (is_imax(lhs)) {
|
||||||
|
return process_constraint(mk_level_eq_cnstr(imax_rhs(lhs), rhs, j)) ? Solved : Failed;
|
||||||
|
} else {
|
||||||
|
return Continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status try_level_eq_zero(constraint const & c) {
|
||||||
|
lean_assert(is_level_eq_cnstr(c));
|
||||||
|
level const & lhs = cnstr_lhs_level(c);
|
||||||
|
level const & rhs = cnstr_rhs_level(c);
|
||||||
|
justification const & j = c.get_justification();
|
||||||
|
status st = try_level_eq_zero(lhs, rhs, j);
|
||||||
|
if (st != Continue) return st;
|
||||||
|
return try_level_eq_zero(rhs, lhs, j);
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Process the next constraint in the constraint queue m_cnstrs */
|
/** \brief Process the next constraint in the constraint queue m_cnstrs */
|
||||||
bool process_next() {
|
bool process_next() {
|
||||||
lean_assert(!m_cnstrs.empty());
|
lean_assert(!m_cnstrs.empty());
|
||||||
|
@ -1368,6 +1401,9 @@ struct unifier_fn {
|
||||||
if (is_level_eq_cnstr(c)) {
|
if (is_level_eq_cnstr(c)) {
|
||||||
if (modified)
|
if (modified)
|
||||||
return process_constraint(c);
|
return process_constraint(c);
|
||||||
|
status st = try_level_eq_zero(c);
|
||||||
|
if (st != Continue)
|
||||||
|
return st == Solved;
|
||||||
else
|
else
|
||||||
return process_plugin_constraint(c);
|
return process_plugin_constraint(c);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue