feat(library/tactic/class_instance_synth): create class instance synthesis subproblems only for arguments marked with the []
binder annotation
This commit is contained in:
parent
3ede8e9150
commit
42289d4334
6 changed files with 20 additions and 14 deletions
|
@ -236,9 +236,15 @@ struct class_instance_elaborator : public choice_iterator {
|
||||||
type = tc.whnf(type).first;
|
type = tc.whnf(type).first;
|
||||||
if (!is_pi(type))
|
if (!is_pi(type))
|
||||||
break;
|
break;
|
||||||
pair<expr, constraint> ac = mk_class_instance_elaborator(m_C, m_ctx, some_expr(binding_domain(type)), g, m_depth+1);
|
expr arg;
|
||||||
expr arg = ac.first;
|
if (binding_info(type).is_inst_implicit()) {
|
||||||
cs.push_back(ac.second);
|
pair<expr, constraint> ac = mk_class_instance_elaborator(m_C, m_ctx, some_expr(binding_domain(type)),
|
||||||
|
g, m_depth+1);
|
||||||
|
arg = ac.first;
|
||||||
|
cs.push_back(ac.second);
|
||||||
|
} else {
|
||||||
|
arg = m_ctx.mk_meta(m_C->m_ngen, some_expr(binding_domain(type)), g);
|
||||||
|
}
|
||||||
r = mk_app(r, arg, g);
|
r = mk_app(r, arg, g);
|
||||||
type = instantiate(binding_body(type), arg);
|
type = instantiate(binding_body(type), arg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ namespace semigroup
|
||||||
definition assoc {A : Type} (s : semigroup_struct A) : is_assoc (mul s)
|
definition assoc {A : Type} (s : semigroup_struct A) : is_assoc (mul s)
|
||||||
:= semigroup_struct.rec (fun f h, h) s
|
:= semigroup_struct.rec (fun f h, h) s
|
||||||
|
|
||||||
definition is_mul_struct [instance] (A : Type) (s : semigroup_struct A) : mul_struct A
|
definition is_mul_struct [instance] (A : Type) [s : semigroup_struct A] : mul_struct A
|
||||||
:= mul_struct.mk (mul s)
|
:= mul_struct.mk (mul s)
|
||||||
|
|
||||||
inductive semigroup : Type :=
|
inductive semigroup : Type :=
|
||||||
|
@ -74,7 +74,7 @@ namespace semigroup
|
||||||
definition carrier [coercion] (g : semigroup)
|
definition carrier [coercion] (g : semigroup)
|
||||||
:= semigroup.rec (fun c s, c) g
|
:= semigroup.rec (fun c s, c) g
|
||||||
|
|
||||||
definition is_semigroup [instance] (g : semigroup) : semigroup_struct (carrier g)
|
definition is_semigroup [instance] [g : semigroup] : semigroup_struct (carrier g)
|
||||||
:= semigroup.rec (fun c s, s) g
|
:= semigroup.rec (fun c s, s) g
|
||||||
end semigroup
|
end semigroup
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ namespace monoid
|
||||||
:= monoid_struct.rec (fun mul id a i, a) s
|
:= monoid_struct.rec (fun mul id a i, a) s
|
||||||
|
|
||||||
open semigroup
|
open semigroup
|
||||||
definition is_semigroup_struct [instance] (A : Type) (s : monoid_struct A) : semigroup_struct A
|
definition is_semigroup_struct [instance] (A : Type) [s : monoid_struct A] : semigroup_struct A
|
||||||
:= semigroup_struct.mk (mul s) (assoc s)
|
:= semigroup_struct.mk (mul s) (assoc s)
|
||||||
|
|
||||||
inductive monoid : Type :=
|
inductive monoid : Type :=
|
||||||
|
|
|
@ -9,7 +9,7 @@ theorem inh_bool [instance] : inh Prop
|
||||||
|
|
||||||
set_option class.trace_instances true
|
set_option class.trace_instances true
|
||||||
|
|
||||||
theorem inh_fun [instance] {A B : Type} (H : inh B) : inh (A → B)
|
theorem inh_fun [instance] {A B : Type} [H : inh B] : inh (A → B)
|
||||||
:= inh.rec (λ b, inh.intro (λ a : A, b)) H
|
:= inh.rec (λ b, inh.intro (λ a : A, b)) H
|
||||||
|
|
||||||
theorem tst {A B : Type} (H : inh B) : inh (A → B → B)
|
theorem tst {A B : Type} (H : inh B) : inh (A → B → B)
|
||||||
|
|
|
@ -15,10 +15,10 @@ theorem inh_exists {A : Type} {P : A → Prop} (H : ∃x, P x) : inh A
|
||||||
theorem inh_bool [instance] : inh Prop
|
theorem inh_bool [instance] : inh Prop
|
||||||
:= inh.intro true
|
:= inh.intro true
|
||||||
|
|
||||||
theorem inh_fun [instance] {A B : Type} (H : inh B) : inh (A → B)
|
theorem inh_fun [instance] {A B : Type} [H : inh B] : inh (A → B)
|
||||||
:= inh.rec (λb, inh.intro (λa : A, b)) H
|
:= inh.rec (λb, inh.intro (λa : A, b)) H
|
||||||
|
|
||||||
theorem pair_inh [instance] {A : Type} {B : Type} (H1 : inh A) (H2 : inh B) : inh (prod A B)
|
theorem pair_inh [instance] {A : Type} {B : Type} [H1 : inh A] [H2 : inh B] : inh (prod A B)
|
||||||
:= inh_elim H1 (λa, inh_elim H2 (λb, inh.intro (pair a b)))
|
:= inh_elim H1 (λa, inh_elim H2 (λb, inh.intro (pair a b)))
|
||||||
|
|
||||||
definition assump := eassumption
|
definition assump := eassumption
|
||||||
|
|
|
@ -42,19 +42,19 @@ theorem congr_const_iff [instance] (T1 : Type) (R1 : T1 → T1 → Prop) (c : Pr
|
||||||
congruence R1 iff (const T1 c) := congr_const iff iff.refl T1 R1 c
|
congruence R1 iff (const T1 c) := congr_const iff iff.refl T1 R1 c
|
||||||
|
|
||||||
theorem congr_or [instance] (T : Type) (R : T → T → Prop) (f1 f2 : T → Prop)
|
theorem congr_or [instance] (T : Type) (R : T → T → Prop) (f1 f2 : T → Prop)
|
||||||
(H1 : congruence R iff f1) (H2 : congruence R iff f2) :
|
[H1 : congruence R iff f1] [H2 : congruence R iff f2] :
|
||||||
congruence R iff (λx, f1 x ∨ f2 x) := sorry
|
congruence R iff (λx, f1 x ∨ f2 x) := sorry
|
||||||
|
|
||||||
theorem congr_implies [instance] (T : Type) (R : T → T → Prop) (f1 f2 : T → Prop)
|
theorem congr_implies [instance] (T : Type) (R : T → T → Prop) (f1 f2 : T → Prop)
|
||||||
(H1 : congruence R iff f1) (H2 : congruence R iff f2) :
|
[H1 : congruence R iff f1] [H2 : congruence R iff f2] :
|
||||||
congruence R iff (λx, f1 x → f2 x) := sorry
|
congruence R iff (λx, f1 x → f2 x) := sorry
|
||||||
|
|
||||||
theorem congr_iff [instance] (T : Type) (R : T → T → Prop) (f1 f2 : T → Prop)
|
theorem congr_iff [instance] (T : Type) (R : T → T → Prop) (f1 f2 : T → Prop)
|
||||||
(H1 : congruence R iff f1) (H2 : congruence R iff f2) :
|
[H1 : congruence R iff f1] [H2 : congruence R iff f2] :
|
||||||
congruence R iff (λx, f1 x ↔ f2 x) := sorry
|
congruence R iff (λx, f1 x ↔ f2 x) := sorry
|
||||||
|
|
||||||
theorem congr_not [instance] (T : Type) (R : T → T → Prop) (f : T → Prop)
|
theorem congr_not [instance] (T : Type) (R : T → T → Prop) (f : T → Prop)
|
||||||
(H : congruence R iff f) :
|
[H : congruence R iff f] :
|
||||||
congruence R iff (λx, ¬ f x) := sorry
|
congruence R iff (λx, ¬ f x) := sorry
|
||||||
|
|
||||||
theorem subst_iff {T : Type} {R : T → T → Prop} {P : T → Prop} [C : congruence R iff P]
|
theorem subst_iff {T : Type} {R : T → T → Prop} {P : T → Prop} [C : congruence R iff P]
|
||||||
|
|
|
@ -20,7 +20,7 @@ theorem infer_eq {T : Type} (t1 t2 : T) [C : simplifies_to t1 t2] : t1 = t2 :=
|
||||||
simplifies_to.rec (λx, x) C
|
simplifies_to.rec (λx, x) C
|
||||||
|
|
||||||
theorem simp_app [instance] (S : Type) (T : Type) (f1 f2 : S → T) (s1 s2 : S)
|
theorem simp_app [instance] (S : Type) (T : Type) (f1 f2 : S → T) (s1 s2 : S)
|
||||||
(C1 : simplifies_to f1 f2) (C2 : simplifies_to s1 s2) : simplifies_to (f1 s1) (f2 s2) :=
|
[C1 : simplifies_to f1 f2] [C2 : simplifies_to s1 s2] : simplifies_to (f1 s1) (f2 s2) :=
|
||||||
mk (congr (get_eq C1) (get_eq C2))
|
mk (congr (get_eq C1) (get_eq C2))
|
||||||
|
|
||||||
theorem test1 (S : Type) (T : Type) (f1 f2 : S → T) (s1 s2 : S) (Hf : f1 = f2) (Hs : s1 = s2) :
|
theorem test1 (S : Type) (T : Type) (f1 f2 : S → T) (s1 s2 : S) (Hf : f1 = f2) (Hs : s1 = s2) :
|
||||||
|
|
Loading…
Reference in a new issue