fix(library/unifier): postpone class-instance constraints whose type could not be inferred
This commit is contained in:
parent
19d14678ef
commit
06f436840f
4 changed files with 41 additions and 3 deletions
|
@ -349,7 +349,9 @@ begin
|
||||||
apply equiv_path_sigma,
|
apply equiv_path_sigma,
|
||||||
apply IH,
|
apply IH,
|
||||||
apply succ_is_trunc,
|
apply succ_is_trunc,
|
||||||
intro aa, apply (succ_is_trunc (aa ▹ u.2) (v.2)),
|
intro aa,
|
||||||
|
show is_trunc n (aa ▹ u .2 ≈ v .2), from
|
||||||
|
succ_is_trunc (aa ▹ u.2) (v.2),
|
||||||
end
|
end
|
||||||
|
|
||||||
end sigma
|
end sigma
|
||||||
|
|
|
@ -1960,9 +1960,13 @@ struct unifier_fn {
|
||||||
return process_flex_rigid(rhs, lhs, c.get_justification(), relax);
|
return process_flex_rigid(rhs, lhs, c.get_justification(), relax);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void postpone(constraint const & c) {
|
||||||
|
m_postponed = cons(c, m_postponed);
|
||||||
|
}
|
||||||
|
|
||||||
void discard(constraint const & c) {
|
void discard(constraint const & c) {
|
||||||
if (!m_config.m_discard)
|
if (!m_config.m_discard)
|
||||||
m_postponed = cons(c, m_postponed);
|
postpone(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool process_flex_flex(constraint const & c) {
|
bool process_flex_flex(constraint const & c) {
|
||||||
|
@ -2184,10 +2188,18 @@ struct unifier_fn {
|
||||||
bool process_next() {
|
bool process_next() {
|
||||||
lean_assert(!m_cnstrs.empty());
|
lean_assert(!m_cnstrs.empty());
|
||||||
auto const * p = m_cnstrs.min();
|
auto const * p = m_cnstrs.min();
|
||||||
|
constraint c = p->first;
|
||||||
unsigned cidx = p->second;
|
unsigned cidx = p->second;
|
||||||
|
if (cidx >= get_group_first_index(cnstr_group::ClassInstance) &&
|
||||||
|
!m_config.m_discard && cnstr_on_demand(c)) {
|
||||||
|
// we postpone class-instance constraints whose type still contains metavariables
|
||||||
|
m_cnstrs.erase_min();
|
||||||
|
postpone(c);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// The following condition is "dead-code"
|
||||||
if (!m_config.m_expensive_classes && cidx >= get_group_first_index(cnstr_group::ClassInstance))
|
if (!m_config.m_expensive_classes && cidx >= get_group_first_index(cnstr_group::ClassInstance))
|
||||||
m_pattern = true; // use only higher-order (pattern) matching after we start processing class-instance constraints
|
m_pattern = true; // use only higher-order (pattern) matching after we start processing class-instance constraints
|
||||||
constraint c = p->first;
|
|
||||||
// std::cout << "process_next: " << c << "\n";
|
// std::cout << "process_next: " << c << "\n";
|
||||||
m_cnstrs.erase_min();
|
m_cnstrs.erase_min();
|
||||||
if (is_choice_cnstr(c)) {
|
if (is_choice_cnstr(c)) {
|
||||||
|
|
18
tests/lean/run/apply_class_issue.lean
Normal file
18
tests/lean/run/apply_class_issue.lean
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import hott.trunc
|
||||||
|
open truncation
|
||||||
|
--structure is_contr [class] (A : Type) : Type
|
||||||
|
|
||||||
|
context
|
||||||
|
parameters {P : Π(A : Type), A → Prop}
|
||||||
|
|
||||||
|
definition my_contr {A : Type} [H : is_contr A] (a : A) : P A a := sorry
|
||||||
|
|
||||||
|
definition foo2
|
||||||
|
(A : Type)
|
||||||
|
(B : A → Type)
|
||||||
|
(a : A)
|
||||||
|
(x : B a)
|
||||||
|
(H : Π (a : A), is_contr (B a)) --(H : is_contr (B a))
|
||||||
|
: P (B a) x :=
|
||||||
|
by apply (@my_contr _ _)
|
||||||
|
end
|
6
tests/lean/run/apply_class_issue0.lean
Normal file
6
tests/lean/run/apply_class_issue0.lean
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
structure is_trunc [class] (A : Type) : Type
|
||||||
|
|
||||||
|
theorem foo (A : Type) [H : is_trunc A] (B : Type) : B := sorry
|
||||||
|
|
||||||
|
theorem bar [H : is_trunc false] : false :=
|
||||||
|
by apply (@foo false _)
|
Loading…
Reference in a new issue