Theorem: contDiffGroupoid_le
File: Mathlib/Geometry/Manifold/SmoothManifoldWithCorners.lean

tactic: rw [contDiffGroupoid, contDiffGroupoid]
state_before: m n : ℕ∞
𝕜 : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
E : Type u_3
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
H : Type u_1
inst✝¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type ?u.100038
inst✝ : TopologicalSpace M
h : m ≤ n
⊢ contDiffGroupoid n I ≤ contDiffGroupoid m I

tactic: apply groupoid_of_pregroupoid_le
state_before: m n : ℕ∞
𝕜 : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
E : Type u_3
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
H : Type u_1
inst✝¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type ?u.100038
inst✝ : TopologicalSpace M
h : m ≤ n
⊢ Pregroupoid.groupoid
      {
        property := fun f s =>
          ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
        comp :=
          (_ :
            ∀ {f g : H → H} {u v : Set H},
              ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                ContDiffOn 𝕜 n (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                  IsOpen u →
                    IsOpen v →
                      IsOpen (u ∩ f ⁻¹' v) →
                        (fun f s =>
                            ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                              (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                          (g ∘ f) (u ∩ f ⁻¹' v)),
        id_mem :=
          (_ : ContDiffOn 𝕜 n (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
        locality :=
          (_ :
            ∀ {f : H → H} {u : Set H},
              IsOpen u →
                (∀ (x : H),
                    x ∈ u →
                      ∃ v,
                        IsOpen v ∧
                          x ∈ v ∧
                            (fun f s =>
                                ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                  (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                              f (u ∩ v)) →
                  ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
        congr :=
          (_ :
            ∀ {f g : H → H} {u : Set H},
              IsOpen u →
                (∀ (x : H), x ∈ u → g x = f x) →
                  ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                    ContDiffOn 𝕜 n (↑I ∘ g ∘ ↑(ModelWithCorners.symm I))
                      (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) } ≤
    Pregroupoid.groupoid
      {
        property := fun f s =>
          ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
        comp :=
          (_ :
            ∀ {f g : H → H} {u v : Set H},
              ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                ContDiffOn 𝕜 m (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                  IsOpen u →
                    IsOpen v →
                      IsOpen (u ∩ f ⁻¹' v) →
                        (fun f s =>
                            ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                              (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                          (g ∘ f) (u ∩ f ⁻¹' v)),
        id_mem :=
          (_ : ContDiffOn 𝕜 m (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
        locality :=
          (_ :
            ∀ {f : H → H} {u : Set H},
              IsOpen u →
                (∀ (x : H),
                    x ∈ u →
                      ∃ v,
                        IsOpen v ∧
                          x ∈ v ∧
                            (fun f s =>
                                ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                  (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                              f (u ∩ v)) →
                  ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
        congr :=
          (_ :
            ∀ {f g : H → H} {u : Set H},
              IsOpen u →
                (∀ (x : H), x ∈ u → g x = f x) →
                  ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                    ContDiffOn 𝕜 m (↑I ∘ g ∘ ↑(ModelWithCorners.symm I))
                      (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }

tactic: intro f s hfs
state_before: case h
m n : ℕ∞
𝕜 : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
E : Type u_3
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
H : Type u_1
inst✝¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type ?u.100038
inst✝ : TopologicalSpace M
h : m ≤ n
⊢ ∀ (f : H → H) (s : Set H),
    Pregroupoid.property
        {
          property := fun f s =>
            ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
          comp :=
            (_ :
              ∀ {f g : H → H} {u v : Set H},
                ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 n (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                    IsOpen u →
                      IsOpen v →
                        IsOpen (u ∩ f ⁻¹' v) →
                          (fun f s =>
                              ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            (g ∘ f) (u ∩ f ⁻¹' v)),
          id_mem :=
            (_ :
              ContDiffOn 𝕜 n (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
          locality :=
            (_ :
              ∀ {f : H → H} {u : Set H},
                IsOpen u →
                  (∀ (x : H),
                      x ∈ u →
                        ∃ v,
                          IsOpen v ∧
                            x ∈ v ∧
                              (fun f s =>
                                  ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                    (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                                f (u ∩ v)) →
                    ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
          congr :=
            (_ :
              ∀ {f g : H → H} {u : Set H},
                IsOpen u →
                  (∀ (x : H), x ∈ u → g x = f x) →
                    ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                      ContDiffOn 𝕜 n (↑I ∘ g ∘ ↑(ModelWithCorners.symm I))
                        (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
        f s →
      Pregroupoid.property
        {
          property := fun f s =>
            ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
          comp :=
            (_ :
              ∀ {f g : H → H} {u v : Set H},
                ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 m (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                    IsOpen u →
                      IsOpen v →
                        IsOpen (u ∩ f ⁻¹' v) →
                          (fun f s =>
                              ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            (g ∘ f) (u ∩ f ⁻¹' v)),
          id_mem :=
            (_ :
              ContDiffOn 𝕜 m (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
          locality :=
            (_ :
              ∀ {f : H → H} {u : Set H},
                IsOpen u →
                  (∀ (x : H),
                      x ∈ u →
                        ∃ v,
                          IsOpen v ∧
                            x ∈ v ∧
                              (fun f s =>
                                  ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                    (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                                f (u ∩ v)) →
                    ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
          congr :=
            (_ :
              ∀ {f g : H → H} {u : Set H},
                IsOpen u →
                  (∀ (x : H), x ∈ u → g x = f x) →
                    ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                      ContDiffOn 𝕜 m (↑I ∘ g ∘ ↑(ModelWithCorners.symm I))
                        (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
        f s

tactic: exact ContDiffOn.of_le hfs h
state_before: case h
m n : ℕ∞
𝕜 : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
E : Type u_3
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
H : Type u_1
inst✝¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type ?u.100038
inst✝ : TopologicalSpace M
h : m ≤ n
f : H → H
s : Set H
hfs :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 n (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 n (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 n (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 n (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    f s
⊢ Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 m (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 m (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 m (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 m (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    f s