feat(hott): add recursor attribute to hits

recursor attribute is added to both the dependent and nondependent elimination, is such a way that the dependent elimination is used by default
This commit is contained in:
Floris van Doorn 2015-05-20 23:37:43 -04:00 committed by Leonardo de Moura
parent 8056f326d7
commit 50290fb81c
13 changed files with 32 additions and 29 deletions

View file

@ -23,7 +23,7 @@ namespace cubical
notation b `=[`:50 p:0 `]`:0 b₂:50 := pathover _ b p b₂ notation b `=[`:50 p:0 `]`:0 b₂:50 := pathover _ b p b₂
definition idpo [reducible] {b : B a} : b =[refl a] b := definition idpo [reducible] [constructor] {b : B a} : b =[refl a] b :=
pathover.idpatho b pathover.idpatho b
/- equivalences with equality using transport -/ /- equivalences with equality using transport -/
@ -121,7 +121,7 @@ namespace cubical
definition pathover_idp_of_eq {b' : B a} (q : b = b') : b =[idpath a] b' := definition pathover_idp_of_eq {b' : B a} (q : b = b') : b =[idpath a] b' :=
pathover_of_transport_eq q pathover_of_transport_eq q
definition idp_rec_on {P : Π⦃b₂ : B a⦄, b =[idpath a] b₂ → Type} definition idp_rec_on [recursor] {P : Π⦃b₂ : B a⦄, b =[idpath a] b₂ → Type}
{b₂ : B a} (r : b =[idpath a] b₂) (H : P idpo) : P r := {b₂ : B a} (r : b =[idpath a] b₂) (H : P idpo) : P r :=
have H2 : P (pathover_idp_of_eq (eq_of_pathover_idp r)), have H2 : P (pathover_idp_of_eq (eq_of_pathover_idp r)),
from eq.rec_on (eq_of_pathover_idp r) H, from eq.rec_on (eq_of_pathover_idp r) H,

View file

@ -26,13 +26,13 @@ namespace cubical
variables {s₁₁ : square p₁₀ p₁₂ p₀₁ p₂₁} {s₃₁ : square p₃₀ p₃₂ p₂₁ p₄₁} variables {s₁₁ : square p₁₀ p₁₂ p₀₁ p₂₁} {s₃₁ : square p₃₀ p₃₂ p₂₁ p₄₁}
{s₁₃ : square p₁₂ p₁₄ p₀₃ p₂₃} {s₃₃ : square p₃₂ p₃₄ p₂₃ p₄₃} {s₁₃ : square p₁₂ p₁₄ p₀₃ p₂₃} {s₃₃ : square p₃₂ p₃₄ p₂₃ p₄₃}
definition ids [reducible] := @square.ids definition ids [reducible] [constructor] := @square.ids
definition idsquare [reducible] (a : A) := @square.ids A a definition idsquare [reducible] [constructor] (a : A) := @square.ids A a
definition hrefl (p : a = a') : square idp idp p p := definition hrefl [unfold-c 4] (p : a = a') : square idp idp p p :=
by cases p; exact ids by cases p; exact ids
definition vrefl (p : a = a') : square p p idp idp := definition vrefl [unfold-c 4] (p : a = a') : square p p idp idp :=
by cases p; exact ids by cases p; exact ids
definition hconcat (s₁₁ : square p₁₀ p₁₂ p₀₁ p₂₁) (s₃₁ : square p₃₀ p₃₂ p₂₁ p₄₁) definition hconcat (s₁₁ : square p₁₀ p₁₂ p₀₁ p₂₁) (s₃₁ : square p₃₀ p₃₂ p₂₁ p₄₁)
@ -74,7 +74,7 @@ namespace cubical
{ intro s, cases s, apply idp}, { intro s, cases s, apply idp},
end end
definition rec_on_b {a₀₀ : A} definition rec_on_b [recursor] {a₀₀ : A}
{P : Π{a₂₀ a₁₂ : A} {t : a₀₀ = a₂₀} {l : a₀₀ = a₁₂} {r : a₂₀ = a₁₂}, square t idp l r → Type} {P : Π{a₂₀ a₁₂ : A} {t : a₀₀ = a₂₀} {l : a₀₀ = a₁₂} {r : a₂₀ = a₁₂}, square t idp l r → Type}
{a₂₀ a₁₂ : A} {t : a₀₀ = a₂₀} {l : a₀₀ = a₁₂} {r : a₂₀ = a₁₂} {a₂₀ a₁₂ : A} {t : a₀₀ = a₂₀} {l : a₀₀ = a₁₂} {r : a₂₀ = a₁₂}
(s : square t idp l r) (H : P ids) : P s := (s : square t idp l r) (H : P ids) : P s :=
@ -82,7 +82,7 @@ namespace cubical
from eq.rec_on (eq_of_square s : t ⬝ r = l) (by cases r; cases t; exact H), from eq.rec_on (eq_of_square s : t ⬝ r = l) (by cases r; cases t; exact H),
left_inv (to_fun !square_equiv_eq) s ▸ H2 left_inv (to_fun !square_equiv_eq) s ▸ H2
definition rec_on_r {a₀₀ : A} definition rec_on_r [recursor] {a₀₀ : A}
{P : Π{a₀₂ a₂₁ : A} {t : a₀₀ = a₂₁} {b : a₀₂ = a₂₁} {l : a₀₀ = a₀₂}, square t b l idp → Type} {P : Π{a₀₂ a₂₁ : A} {t : a₀₀ = a₂₁} {b : a₀₂ = a₂₁} {l : a₀₀ = a₀₂}, square t b l idp → Type}
{a₀₂ a₂₁ : A} {t : a₀₀ = a₂₁} {b : a₀₂ = a₂₁} {l : a₀₀ = a₀₂} {a₀₂ a₂₁ : A} {t : a₀₀ = a₂₁} {b : a₀₂ = a₂₁} {l : a₀₀ = a₀₂}
(s : square t b l idp) (H : P ids) : P s := (s : square t b l idp) (H : P ids) : P s :=
@ -91,7 +91,7 @@ namespace cubical
from @eq.rec_on _ _ (λx p, P (square_of_eq p⁻¹)) _ p (by cases b; cases l; exact H), from @eq.rec_on _ _ (λx p, P (square_of_eq p⁻¹)) _ p (by cases b; cases l; exact H),
left_inv (to_fun !square_equiv_eq) s ▸ !inv_inv ▸ H2 left_inv (to_fun !square_equiv_eq) s ▸ !inv_inv ▸ H2
definition rec_on_l {a₀₁ : A} definition rec_on_l [recursor] {a₀₁ : A}
{P : Π {a₂₀ a₂₂ : A} {t : a₀₁ = a₂₀} {b : a₀₁ = a₂₂} {r : a₂₀ = a₂₂}, {P : Π {a₂₀ a₂₂ : A} {t : a₀₁ = a₂₀} {b : a₀₁ = a₂₂} {r : a₂₀ = a₂₂},
square t b idp r → Type} square t b idp r → Type}
{a₂₀ a₂₂ : A} {t : a₀₁ = a₂₀} {b : a₀₁ = a₂₂} {r : a₂₀ = a₂₂} {a₂₀ a₂₂ : A} {t : a₀₁ = a₂₀} {b : a₀₁ = a₂₂} {r : a₂₀ = a₂₂}
@ -101,7 +101,7 @@ namespace cubical
from eq.rec_on p (by cases r; cases t; exact H), from eq.rec_on p (by cases r; cases t; exact H),
left_inv (to_fun !square_equiv_eq) s ▸ !con_inv_cancel_right ▸ H2 left_inv (to_fun !square_equiv_eq) s ▸ !con_inv_cancel_right ▸ H2
definition rec_on_t {a₁₀ : A} definition rec_on_t [recursor] {a₁₀ : A}
{P : Π {a₀₂ a₂₂ : A} {b : a₀₂ = a₂₂} {l : a₁₀ = a₀₂} {r : a₁₀ = a₂₂}, square idp b l r → Type} {P : Π {a₀₂ a₂₂ : A} {b : a₀₂ = a₂₂} {l : a₁₀ = a₀₂} {r : a₁₀ = a₂₂}, square idp b l r → Type}
{a₀₂ a₂₂ : A} {b : a₀₂ = a₂₂} {l : a₁₀ = a₀₂} {r : a₁₀ = a₂₂} {a₀₂ a₂₂ : A} {b : a₀₂ = a₂₂} {l : a₁₀ = a₀₂} {r : a₁₀ = a₂₂}
(s : square idp b l r) (H : P ids) : P s := (s : square idp b l r) (H : P ids) : P s :=
@ -116,7 +116,7 @@ namespace cubical
left_inv (to_fun !square_equiv_eq) s ▸ H4 left_inv (to_fun !square_equiv_eq) s ▸ H4
qed qed
definition rec_on_tb {a : A} definition rec_on_tb [recursor] {a : A}
{P : Π{b : A} {l : a = b} {r : a = b}, square idp idp l r → Type} {P : Π{b : A} {l : a = b} {r : a = b}, square idp idp l r → Type}
{b : A} {l : a = b} {r : a = b} {b : A} {l : a = b} {r : a = b}
(s : square idp idp l r) (H : P ids) : P s := (s : square idp idp l r) (H : P ids) : P s :=

View file

@ -148,15 +148,15 @@ namespace circle
by rewrite [tr_inv_fn,↑to_inv]; apply inv_eq_inv; apply elim_type_loop by rewrite [tr_inv_fn,↑to_inv]; apply inv_eq_inv; apply elim_type_loop
end circle end circle
attribute circle.base circle.base1 circle.base2 [constructor] attribute circle.base1 circle.base2 circle.base [constructor]
attribute circle.rec circle.elim [unfold-c 4] attribute circle.rec2 circle.elim2 [unfold-c 6] [recursor 6]
attribute circle.elim_type [unfold-c 3]
attribute circle.rec_on circle.elim_on [unfold-c 2]
attribute circle.elim_type_on [unfold-c 1]
attribute circle.rec2 circle.elim2 [unfold-c 6]
attribute circle.elim2_type [unfold-c 5] attribute circle.elim2_type [unfold-c 5]
attribute circle.rec2_on circle.elim2_on [unfold-c 2] attribute circle.rec2_on circle.elim2_on [unfold-c 2]
attribute circle.elim2_type [unfold-c 1] attribute circle.elim2_type [unfold-c 1]
attribute circle.elim circle.rec [unfold-c 4] [recursor 4]
attribute circle.elim_type [unfold-c 3]
attribute circle.rec_on circle.elim_on [unfold-c 2]
attribute circle.elim_type_on [unfold-c 1]
namespace circle namespace circle
definition pointed_circle [instance] [constructor] : pointed circle := definition pointed_circle [instance] [constructor] : pointed circle :=

View file

@ -79,7 +79,7 @@ end
end coeq end coeq
attribute coeq.coeq_i [constructor] attribute coeq.coeq_i [constructor]
attribute coeq.rec coeq.elim [unfold-c 8] attribute coeq.elim coeq.rec [unfold-c 8] [recursor 8]
attribute coeq.elim_type [unfold-c 7] attribute coeq.elim_type [unfold-c 7]
attribute coeq.rec_on coeq.elim_on [unfold-c 6] attribute coeq.rec_on coeq.elim_on [unfold-c 6]
attribute coeq.elim_type_on [unfold-c 5] attribute coeq.elim_type_on [unfold-c 5]

View file

@ -171,11 +171,11 @@ end
end seq_colim end seq_colim
attribute colimit.incl seq_colim.inclusion [constructor] attribute colimit.incl seq_colim.inclusion [constructor]
attribute colimit.rec colimit.elim [unfold-c 10] attribute colimit.elim colimit.rec [unfold-c 10] [recursor 10]
attribute colimit.elim_type [unfold-c 9] attribute colimit.elim_type [unfold-c 9]
attribute colimit.rec_on colimit.elim_on [unfold-c 8] attribute colimit.rec_on colimit.elim_on [unfold-c 8]
attribute colimit.elim_type_on [unfold-c 7] attribute colimit.elim_type_on [unfold-c 7]
attribute seq_colim.rec seq_colim.elim [unfold-c 6] attribute seq_colim.elim seq_colim.rec [unfold-c 6] [recursor 6]
attribute seq_colim.elim_type [unfold-c 5] attribute seq_colim.elim_type [unfold-c 5]
attribute seq_colim.rec_on seq_colim.elim_on [unfold-c 4] attribute seq_colim.rec_on seq_colim.elim_on [unfold-c 4]
attribute seq_colim.elim_type_on [unfold-c 3] attribute seq_colim.elim_type_on [unfold-c 3]

View file

@ -89,7 +89,7 @@ end
end cylinder end cylinder
attribute cylinder.base cylinder.top [constructor] attribute cylinder.base cylinder.top [constructor]
attribute cylinder.rec cylinder.elim [unfold-c 8] attribute cylinder.elim cylinder.rec [unfold-c 8] [recursor 8]
attribute cylinder.elim_type [unfold-c 7] attribute cylinder.elim_type [unfold-c 7]
attribute cylinder.rec_on cylinder.elim_on [unfold-c 5] attribute cylinder.rec_on cylinder.elim_on [unfold-c 5]
attribute cylinder.elim_type_on [unfold-c 4] attribute cylinder.elim_type_on [unfold-c 4]

View file

@ -111,7 +111,7 @@ end
end pushout end pushout
attribute pushout.inl pushout.inr [constructor] attribute pushout.inl pushout.inr [constructor]
attribute pushout.rec pushout.elim [unfold-c 10] attribute pushout.elim pushout.rec [unfold-c 10] [recursor 10]
attribute pushout.elim_type [unfold-c 9] attribute pushout.elim_type [unfold-c 9]
attribute pushout.rec_on pushout.elim_on [unfold-c 7] attribute pushout.rec_on pushout.elim_on [unfold-c 7]
attribute pushout.elim_type_on [unfold-c 6] attribute pushout.elim_type_on [unfold-c 6]

View file

@ -72,5 +72,5 @@ end
end quotient end quotient
attribute quotient.class_of [constructor] attribute quotient.class_of [constructor]
attribute quotient.rec quotient.elim [unfold-c 7] attribute quotient.elim quotient.rec [unfold-c 7] [recursor]
attribute quotient.rec_on quotient.elim_on [unfold-c 4] attribute quotient.rec_on quotient.elim_on [unfold-c 4]

View file

@ -72,7 +72,7 @@ namespace suspension
end suspension end suspension
attribute suspension.north suspension.south [constructor] attribute suspension.north suspension.south [constructor]
attribute suspension.rec suspension.elim [unfold-c 6] attribute suspension.elim suspension.rec [unfold-c 6] [recursor 6]
attribute suspension.elim_type [unfold-c 5] attribute suspension.elim_type [unfold-c 5]
attribute suspension.rec_on suspension.elim_on [unfold-c 3] attribute suspension.rec_on suspension.elim_on [unfold-c 3]
attribute suspension.elim_type_on [unfold-c 2] attribute suspension.elim_type_on [unfold-c 2]

View file

@ -16,7 +16,7 @@ open is_trunc eq equiv is_equiv function prod sum sigma
namespace trunc namespace trunc
protected definition elim {n : trunc_index} {A : Type} {P : Type} protected definition elim [recursor 6] {n : trunc_index} {A : Type} {P : Type}
[Pt : is_trunc n P] (H : A → P) : trunc n A → P := [Pt : is_trunc n P] (H : A → P) : trunc n A → P :=
trunc.rec H trunc.rec H
@ -132,3 +132,4 @@ end trunc
attribute trunc.elim [unfold-c 6] attribute trunc.elim [unfold-c 6]
attribute trunc.elim_on [unfold-c 4] attribute trunc.elim_on [unfold-c 4]
attribute trunc.rec [recursor]

View file

@ -48,7 +48,8 @@ namespace type_quotient
type_quotient.elim_type H.1 H.2 type_quotient.elim_type H.1 H.2
end type_quotient end type_quotient
attribute type_quotient.elim [unfold-c 6] attribute type_quotient.elim [unfold-c 6] [recursor 6]
attribute type_quotient.elim_type [unfold-c 5] attribute type_quotient.elim_type [unfold-c 5]
attribute type_quotient.elim_on [unfold-c 4] attribute type_quotient.elim_on [unfold-c 4]
attribute type_quotient.elim_type_on [unfold-c 3] attribute type_quotient.elim_type_on [unfold-c 3]
attribute type_quotient.rec [recursor]

View file

@ -253,6 +253,6 @@ is_equiv.left_inv apd10 idp
definition naive_funext_of_ua : naive_funext := definition naive_funext_of_ua : naive_funext :=
λ A P f g h, eq_of_homotopy h λ A P f g h, eq_of_homotopy h
protected definition homotopy.rec_on {Q : (f g) → Type} (p : f g) protected definition homotopy.rec_on [recursor] {Q : (f g) → Type} (p : f g)
(H : Π(q : f = g), Q (apd10 q)) : Q p := (H : Π(q : f = g), Q (apd10 q)) : Q p :=
right_inv apd10 p ▸ H (eq_of_homotopy p) right_inv apd10 p ▸ H (eq_of_homotopy p)

View file

@ -39,8 +39,9 @@ namespace trunc
protected constant rec {n : trunc_index} {A : Type} {P : trunc n A → Type} protected constant rec {n : trunc_index} {A : Type} {P : trunc n A → Type}
[Pt : Πaa, is_trunc n (P aa)] (H : Πa, P (tr a)) : Πaa, P aa [Pt : Πaa, is_trunc n (P aa)] (H : Πa, P (tr a)) : Πaa, P aa
protected definition rec_on [reducible] {n : trunc_index} {A : Type} {P : trunc n A → Type} protected definition rec_on [reducible] {n : trunc_index} {A : Type}
(aa : trunc n A) [Pt : Πaa, is_trunc n (P aa)] (H : Πa, P (tr a)) : P aa := {P : trunc n A → Type} (aa : trunc n A) [Pt : Πaa, is_trunc n (P aa)] (H : Πa, P (tr a))
: P aa :=
trunc.rec H aa trunc.rec H aa
end trunc end trunc