Documentation

CompPoly.Data.Classes.DCast

Dependent casts #

This file contains type classes for dependent or custom cast operations

This allows us to state theorems with more refined casts, without which we cannot make progress in proving them

theorem cast_eq_cast_iff {α β γ : Sort u} {h : α = γ} {h' : β = γ} {a : α} {b : β} :
cast h a = cast h' b a = cast b
theorem cast_symm {α β : Sort u} {h : α = β} {a : α} {b : β} :
cast h a = b a = cast b
theorem congrArg₃ {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} {f : αβγδ} {a a' : α} {b b' : β} {c c' : γ} (h : a = a') (h' : b = b') (h'' : c = c') :
f a b c = f a' b' c'
theorem congrArg₄ {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} {ε : Sort u_5} {f : αβγδε} {a a' : α} {b b' : β} {c c' : γ} {d d' : δ} (h : a = a') (h' : b = b') (h'' : c = c') (h''' : d = d') :
f a b c d = f a' b' c' d'
class DCast (α : Sort u_1) (β : αSort u_2) :
Sort (max (max 1 u_1) u_2)

DCast is a type class for custom cast operations on an indexed type family β a

We require the cast operation dcast, along with the property that dcast reduces to id under reflexivity.

  • dcast {a a' : α} : a = a'β aβ a'
  • dcast_id {a : α} : dcast = id
Instances
    @[instance 100]
    instance instDCast {α : Sort u_1} {β : αSort u_2} :
    DCast α β

    The default instance for DCast

    Equations
      @[simp]
      theorem dcast_eq {α : Sort u_1} {β : αSort u_2} [DCast α β] {a : α} {b : β a} :
      dcast b = b
      theorem dcast_symm {α : Sort u_1} {β : αSort u_2} [DCast α β] {a a' : α} {b : β a} {b' : β a'} (ha : a = a') (hb : dcast ha b = b') :
      dcast b' = b
      @[simp]
      theorem dcast_trans {α : Sort u_1} {β : αSort u_2} [DCast α β] {a a' a'' : α} {b : β a} (h : a = a') (h' : a' = a'') :
      dcast h' (dcast h b) = dcast b
      theorem dcast_eq_dcast_iff {α : Sort u_1} {β : αSort u_2} [DCast α β] {a a' a'' : α} {b : β a} {b' : β a'} (h : a = a'') (h' : a' = a'') :
      dcast h b = dcast h' b' b = dcast b'
      theorem heq_of_dcast {α : Sort u_1} {β : αSort u_2} [DCast α β] {a a' : α} {b : β a} {b' : β a'} (ha : a = a') (hb : dcast ha b = b') :
      b b'
      theorem dcast_fun {α : Sort u_1} {β : αSort u_2} [DCast α β] {a : α} {b : β a} {γ : (a : α) → β aSort u_3} {f : (b : β a) → γ a b} :
      f (dcast b) = dcast (f b)
      theorem dcast_fun₂ {α : Sort u_1} {β : αSort u_2} [DCast α β] {a₁ a₂ a₁' a₂' : α} {h₁ : a₁ = a₁'} {h₂ : a₂ = a₂'} {f : ααα} {g : (a₁ a₂ : α) → β a₁β a₂β (f a₁ a₂)} {b₁ : β a₁} {b₂ : β a₂} :
      dcast (g a₁ a₂ b₁ b₂) = g a₁' a₂' (dcast h₁ b₁) (dcast h₂ b₂)
      theorem dcast_eq_root_cast {α : Sort u_1} {β : αSort u_2} [DCast α β] {a a' : α} {b : β a} (h : a = a') :
      dcast h b = cast b
      class DCast₂ (α : Sort u_1) (β : αSort u_2) (γ : (a : α) → β aSort u_3) [DCast α β] :
      Sort (max (max (max 1 u_1) u_2) u_3)

      DCast₂ is a type class for custom cast operations on a doubly-indexed type family γ a b, given an underlying dependent cast DCast α β

      We require the cast operation dcast₂, along with the property that dcast₂ reduces to id under reflexivity.

      • dcast₂ {a a' : α} {b : β a} {b' : β a'} (ha : a = a') : dcast ha b = b'γ a bγ a' b'
      • dcast₂_id {a : α} {b : β a} : dcast₂ = id
      Instances
        @[instance 100]
        instance instDCast₂ {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] :
        DCast₂ α β γ

        Default instance for DCast₂

        Equations
          @[simp]
          theorem dcast₂_eq {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a : α} {b : β a} {c : γ a b} :
          dcast₂ c = c
          @[simp]
          theorem dcast₂_eq' {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a : α} {b : β a} {c : γ a b} (h : a = a) (h' : dcast h b = b) :
          dcast₂ h h' c = c
          theorem dcast₂_symm {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a a' : α} {b : β a} {b' : β a'} {c : γ a b} {c' : γ a' b'} (ha : a = a') (hb : dcast ha b = b') (hc : dcast₂ ha hb c = c') :
          dcast₂ c' = c
          @[simp]
          theorem dcast₂_trans {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a a' a'' : α} {b : β a} {b' : β a'} {b'' : β a''} {c : γ a b} (ha : a = a') (ha' : a' = a'') (hb : dcast ha b = b') (hb' : dcast ha' b' = b'') :
          dcast₂ ha' hb' (dcast₂ ha hb c) = dcast₂ c
          theorem dcast₂_eq_dcast₂_iff {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a a' a'' : α} {b : β a} {b' : β a'} {b'' : β a''} {c : γ a b} {c' : γ a' b'} (ha : a = a'') (ha' : a' = a'') (hb : dcast ha b = b'') (hb' : dcast ha' b' = b'') :
          dcast₂ ha hb c = dcast₂ ha' hb' c' c = dcast₂ c'
          theorem dcast₂_dcast {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a : α} {b : β a} {c : γ a b} :
          dcast₂ c = dcast c
          instance instDCast₁₂ {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] {a : α} :
          DCast (β a) (γ a)
          Equations
            instance instDCastPSigma {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] :
            DCast ((a : α) ×' β a) fun (a : (a : α) ×' β a) => γ a.fst a.snd
            Equations
              instance instDCastSigma {α : Type u_4} {β : αType u_5} {γ : (a : α) → β aType u_6} [DCast α β] [DCast₂ α β γ] :
              DCast ((a : α) × β a) fun (a : (a : α) × β a) => γ a.fst a.snd
              Equations
                instance instDCastForall {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} [DCast α β] [DCast₂ α β γ] :
                DCast α fun (a : α) => (b : β a) → γ a b
                Equations
                  class DCast₃ (α : Sort u_1) (β : αSort u_2) (γ : (a : α) → β aSort u_3) (δ : (a : α) → (b : β a) → γ a bSort u_4) [DCast α β] [DCast₂ α β γ] :
                  Sort (max (max (max (max 1 u_1) u_2) u_3) u_4)

                  DCast₃ is a type class for custom cast operations on a triply-indexed type family δ a b c, given underlying dependent casts DCast α β and DCast₂ α β γ

                  We require the cast operation dcast₃, along with the property that dcast₃ reduces to id under reflexivity.

                  • dcast₃ {a a' : α} {b : β a} {b' : β a'} {c : γ a b} {c' : γ a' b'} (ha : a = a') (hb : dcast ha b = b') (hc : dcast₂ ha hb c = c') : δ a b cδ a' b' c'
                  • dcast₃_id {a : α} {b : β a} {c : γ a b} : dcast₃ = id
                  Instances
                    @[instance 100]
                    instance instDCast₃ {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] :
                    DCast₃ α β γ δ

                    Default instance for DCast₃

                    Equations
                      @[simp]
                      theorem dcast₃_eq {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a : α} {b : β a} {c : γ a b} {d : δ a b c} :
                      dcast₃ d = d
                      theorem dcast₃_symm {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a a' : α} {b : β a} {b' : β a'} {c : γ a b} {c' : γ a' b'} {d : δ a b c} {d' : δ a' b' c'} (ha : a = a') (hb : dcast ha b = b') (hc : dcast₂ ha hb c = c') (hd : dcast₃ ha hb hc d = d') :
                      dcast₃ d' = d
                      @[simp]
                      theorem dcast₃_trans {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a a' a'' : α} {b : β a} {b' : β a'} {b'' : β a''} {c : γ a b} {c' : γ a' b'} {c'' : γ a'' b''} {d : δ a b c} (ha : a = a') (ha' : a' = a'') (hb : dcast ha b = b') (hb' : dcast ha' b' = b'') (hc : dcast₂ ha hb c = c') (hc' : dcast₂ ha' hb' c' = c'') :
                      dcast₃ ha' hb' hc' (dcast₃ ha hb hc d) = dcast₃ d
                      theorem dcast₃_eq_dcast₃_iff {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a a' : α} {b : β a} {b' : β a'} {c : γ a b} {c' : γ a' b'} {d : δ a b c} {d' : δ a' b' c'} (ha : a = a') (hb : dcast ha b = b') (hc : dcast₂ ha hb c = c') :
                      dcast₃ ha hb hc d = d' d = dcast₃ d'
                      theorem dcast₃_dcast₂ {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a : α} {b : β a} {c : γ a b} {d : δ a b c} :
                      dcast₃ d = dcast₂ d
                      instance instDCast₂₃ {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a : α} :
                      DCast₂ (β a) (γ a) (δ a)
                      Equations
                        instance instDCast₁₃ {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] {a : α} {b : β a} :
                        DCast (γ a b) (δ a b)
                        Equations
                          instance instDCast₂PSigma {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                          DCast₂ ((a : α) ×' β a) (fun (a : (a : α) ×' β a) => γ a.fst a.snd) fun (a : (a : α) ×' β a) => δ a.fst a.snd
                          Equations
                            instance instDCast₂Sigma {α : Type u_5} {β : αType u_6} {γ : (a : α) → β aType u_7} {δ : (a : α) → (b : β a) → γ a bType u_8} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                            DCast₂ ((a : α) × β a) (fun (a : (a : α) × β a) => γ a.fst a.snd) fun (a : (a : α) × β a) => δ a.fst a.snd
                            Equations
                              instance instDCast₂Forall {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                              DCast₂ α (fun (a : α) => (b : β a) → γ a b) fun (a : α) (f : (b : β a) → γ a b) => (b : β a) → δ a b (f b)
                              Equations
                                instance instDCastPSigmaPSigma {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                                DCast ((a : α) ×' (b : β a) ×' γ a b) fun (a : (a : α) ×' (b : β a) ×' γ a b) => δ a.fst a.snd.fst a.snd.snd
                                Equations
                                  instance instDCastSigmaSigma {α : Type u_5} {β : αType u_6} {γ : (a : α) → β aType u_7} {δ : (a : α) → (b : β a) → γ a bType u_8} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                                  DCast ((a : α) × (b : β a) × γ a b) fun (a : (a : α) × (b : β a) × γ a b) => δ a.fst a.snd.fst a.snd.snd
                                  Equations
                                    instance instDCastForallForall {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                                    DCast α fun (a : α) => (b : β a) → (c : γ a b) → δ a b c
                                    Equations
                                      instance instDCastPSigmaForall {α : Sort u_1} {β : αSort u_2} {γ : (a : α) → β aSort u_3} {δ : (a : α) → (b : β a) → γ a bSort u_4} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                                      DCast ((a : α) ×' β a) fun (ab : (a : α) ×' β a) => (c : γ ab.fst ab.snd) → δ ab.fst ab.snd c
                                      Equations
                                        instance instDCastSigmaForallForall {α : Type u_5} {β : αType u_6} {γ : (a : α) → β aType u_7} {δ : (a : α) → (b : β a) → γ a bType u_8} [DCast α β] [DCast₂ α β γ] [DCast₃ α β γ δ] :
                                        DCast ((a : α) × β a) fun (ab : (a : α) × β a) => (c : γ ab.fst ab.snd) → δ ab.fst ab.snd c
                                        Equations

                                          Fin.cast as a DCast (which should override the default instance).

                                          Equations
                                            theorem Fin.cast_eq_dcast {m n : } (h : m = n) (a : Fin m) :
                                            Fin.cast h a = dcast h a