feat(library/unifier): generalize method process_succ_eq_max_core

This commit is contained in:
Leonardo de Moura 2014-11-14 14:22:01 -08:00
parent ffffabad95
commit 00df34a1c4
2 changed files with 31 additions and 13 deletions

View file

@ -2065,17 +2065,21 @@ struct unifier_fn {
status process_succ_eq_max_core(level const & lhs, level const & rhs, justification const & jst) { status process_succ_eq_max_core(level const & lhs, level const & rhs, justification const & jst) {
if (!is_succ(lhs) || !is_max(rhs)) if (!is_succ(lhs) || !is_max(rhs))
return Continue; return Continue;
level rhs_l = max_lhs(rhs); level m = rhs;
level rhs_r = max_rhs(rhs); while (is_max(m)) {
if (is_meta(rhs_l)) level m1 = max_lhs(m);
std::swap(rhs_l, rhs_r); level m2 = max_rhs(m);
if (!is_meta(rhs_r) || !is_explicit(rhs_l)) if (is_geq(lhs, m1)) {
m = m2;
} else if (is_geq(lhs, m2)) {
m = m1;
} else {
return Continue;
}
}
if (!is_meta(m))
return Continue; return Continue;
unsigned k_2 = to_explicit(rhs_l); if (assign(m, lhs, jst)) {
pair<level, unsigned> lhs_k = to_offset(lhs);
if (lhs_k.second < k_2)
return Continue;
if (assign(rhs_r, lhs, jst)) {
return Solved; return Solved;
} else { } else {
set_conflict(jst); set_conflict(jst);
@ -2084,9 +2088,10 @@ struct unifier_fn {
} }
/** \brief Return Solved iff \c c is a constraint of the form /** \brief Return Solved iff \c c is a constraint of the form
succ^k_1 a =?= max(k_2, ?m) succ^k_1 a =?= max(succ^k_2 b, ?m)
where k_1 >= k_2 where k_1 >= k_2 and a == b or b == zero
and is successfully solved
and is successfully solved by assigning ?m := succ^k_1 a
*/ */
status process_succ_eq_max(constraint const & c) { status process_succ_eq_max(constraint const & c) {
lean_assert(is_level_eq_cnstr(c)); lean_assert(is_level_eq_cnstr(c));

13
tests/lean/run/lift2.lean Normal file
View file

@ -0,0 +1,13 @@
import logic
inductive lift.{l₁ l₂} (A : Type.{l₁}) : Type.{(max 1 l₁ l₂)} :=
inj : A → lift A
set_option pp.universes true
variables (A : Type.{3}) (B : Type.{1})
check A = lift B
universe u
variables (C : Type.{u+2}) (D : Type.{u})
check C = lift D