Skip to content

Commit 9036ce5

Browse files
committed
feat(AlgebraicTopology/SimplicialSet/AnodyneExtensions): the opposite of a pairing (#38061)
1 parent ff51775 commit 9036ce5

File tree

9 files changed

+158
-0
lines changed

9 files changed

+158
-0
lines changed

Mathlib.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,7 @@ public import Mathlib.AlgebraicTopology.SimplicialObject.II
15111511
public import Mathlib.AlgebraicTopology.SimplicialObject.Op
15121512
public import Mathlib.AlgebraicTopology.SimplicialObject.Split
15131513
public import Mathlib.AlgebraicTopology.SimplicialSet.AnodyneExtensions.IsUniquelyCodimOneFace
1514+
public import Mathlib.AlgebraicTopology.SimplicialSet.AnodyneExtensions.Op
15141515
public import Mathlib.AlgebraicTopology.SimplicialSet.AnodyneExtensions.Pairing
15151516
public import Mathlib.AlgebraicTopology.SimplicialSet.AnodyneExtensions.PairingCore
15161517
public import Mathlib.AlgebraicTopology.SimplicialSet.AnodyneExtensions.Rank
@@ -1561,6 +1562,7 @@ public import Mathlib.AlgebraicTopology.SimplicialSet.StrictSegal
15611562
public import Mathlib.AlgebraicTopology.SimplicialSet.Subcomplex
15621563
public import Mathlib.AlgebraicTopology.SimplicialSet.SubcomplexColimits
15631564
public import Mathlib.AlgebraicTopology.SimplicialSet.SubcomplexEvaluation
1565+
public import Mathlib.AlgebraicTopology.SimplicialSet.SubcomplexOp
15641566
public import Mathlib.AlgebraicTopology.SimplicialSet.TopAdj
15651567
public import Mathlib.AlgebraicTopology.SingularHomology.Basic
15661568
public import Mathlib.AlgebraicTopology.SingularHomology.HomotopyInvariance

Mathlib/AlgebraicTopology/SimplexCategory/Rev.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,6 @@ def revEquivalence : SimplexCategory ≌ SimplexCategory where
8181
unitIso := revCompRevIso.symm
8282
counitIso := revCompRevIso
8383

84+
instance : rev.IsEquivalence := revEquivalence.isEquivalence_functor
85+
8486
end SimplexCategory

Mathlib/AlgebraicTopology/SimplicialSet/AnodyneExtensions/IsUniquelyCodimOneFace.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ lemma unique (f : ⦋d⦌ ⟶ ⦋d + 1⦌) [Mono f]
104104

105105
end
106106

107+
include hxy in
108+
lemma op : (S.opEquiv.symm x).IsUniquelyCodimOneFace (S.opEquiv.symm y) := by
109+
obtain ⟨d, x, rfl⟩ := x.mk_surjective
110+
obtain ⟨d', y, rfl⟩ := y.mk_surjective
111+
obtain rfl : d' = d + 1 := hxy.dim_eq
112+
simp only [opEquiv_symm_apply, iff]
113+
refine ⟨(hxy.index rfl).rev, by simpa using hxy.δ_index rfl, fun i hi ↦ ?_⟩
114+
obtain ⟨i, rfl⟩ := i.rev_surjective
115+
simpa [← hxy.δ_eq_iff rfl] using hi
116+
107117
include hxy in
108118
lemma of_iso {Y : SSet.{u}} (e : X ≅ Y) :
109119
(S.mk (e.hom.app _ x.simplex)).IsUniquelyCodimOneFace (S.mk (e.hom.app _ y.simplex)) := by
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/-
2+
Copyright (c) 2026 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.AlgebraicTopology.SimplicialSet.SubcomplexOp
9+
public import Mathlib.AlgebraicTopology.SimplicialSet.AnodyneExtensions.Pairing
10+
11+
/-!
12+
# The opposite of a pairing
13+
14+
Let `A` be a subcomplex of a simplicial set `X`. If `P` is a pairing of `A`,
15+
we construct a pairing `P.op` for the subcomplex `A.op` of `X.op`.
16+
17+
-/
18+
19+
@[expose] public section
20+
21+
universe u
22+
23+
namespace SSet.Subcomplex.Pairing
24+
25+
variable {X : SSet.{u}} {A : X.Subcomplex} (P : A.Pairing)
26+
27+
/-- If `P` is a pairing for a subcomplex `A` of a simplicial set `X`,
28+
this is the corresponding pairing of `A.op`. -/
29+
@[simps I II]
30+
def op : A.op.Pairing where
31+
I := Subcomplex.N.opEquiv ⁻¹' P.I
32+
II := Subcomplex.N.opEquiv ⁻¹' P.II
33+
inter := by simp [← Set.preimage_inter, P.inter]
34+
union := by simp [← Set.preimage_union, P.union]
35+
p := (N.opEquiv.subtypeEquiv (by simp)).trans
36+
(P.p.trans (N.opEquiv.symm.subtypeEquiv (by simp)))
37+
38+
@[simp]
39+
lemma op_p (x : P.II) :
40+
dsimp% P.op.p ⟨Subcomplex.N.opEquiv.symm x.1, x.2⟩ =
41+
⟨Subcomplex.N.opEquiv.symm (P.p x), by simp⟩ := rfl
42+
43+
lemma op_ancestralRel_iff (x y : P.II) :
44+
P.op.AncestralRel ⟨Subcomplex.N.opEquiv.symm x.1, x.2
45+
⟨Subcomplex.N.opEquiv.symm y.1, y.2⟩ ↔ P.AncestralRel x y :=
46+
and_congr (not_congr (by aesop)) (by simp)
47+
48+
instance [P.IsProper] : P.op.IsProper where
49+
isUniquelyCodimOneFace x := (P.isUniquelyCodimOneFace ⟨_, x.2⟩).op
50+
51+
instance [P.IsRegular] : P.op.IsRegular where
52+
wf := by
53+
have hP := P.wf
54+
rw [wellFounded_iff_isEmpty_descending_chain] at hP ⊢
55+
by_contra!
56+
obtain ⟨f, hf⟩ := this
57+
refine hP.falsefun n ↦ ⟨_, (f n).2⟩, fun n ↦ ?_⟩
58+
simpa [← P.op_ancestralRel_iff] using hf n
59+
60+
end SSet.Subcomplex.Pairing

Mathlib/AlgebraicTopology/SimplicialSet/Degenerate.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Joël Riou
55
-/
66
module
77

8+
public import Mathlib.AlgebraicTopology.SimplicialSet.Op
89
public import Mathlib.AlgebraicTopology.SimplicialSet.Subcomplex
910

1011
/-!
@@ -75,6 +76,23 @@ lemma mem_degenerate_iff (x : X _⦋n⦌) :
7576
· rintro ⟨m, hm, f, hf, hx⟩
7677
exact ⟨m, hm, f, hx⟩
7778

79+
set_option backward.isDefEq.respectTransparency false in
80+
lemma opObjEquiv_mem_degenerate_iff (x : X.op _⦋n⦌) :
81+
opObjEquiv x ∈ X.degenerate n ↔ x ∈ X.op.degenerate n := by
82+
simp only [mem_degenerate_iff]
83+
refine exists_congr (fun m ↦ exists_congr (fun _ ↦ ?_))
84+
constructor
85+
· obtain ⟨x, rfl⟩ := opObjEquiv.symm.surjective x
86+
rintro ⟨f, _, y, rfl⟩
87+
exact ⟨SimplexCategory.rev.map f, inferInstance, opObjEquiv.symm y, by simp [op_map]⟩
88+
· rintro ⟨f, _, y, rfl⟩
89+
exact ⟨SimplexCategory.rev.map f, inferInstance, opObjEquiv y, by simp [op_map]⟩
90+
91+
lemma opObjEquiv_mem_nonDegenerate_iff (x : X.op _⦋n⦌) :
92+
opObjEquiv x ∈ X.nonDegenerate n ↔ x ∈ X.op.nonDegenerate n := by
93+
simp only [mem_nonDegenerate_iff_notMem_degenerate,
94+
opObjEquiv_mem_degenerate_iff]
95+
7896
lemma degenerate_eq_iUnion_range_σ :
7997
X.degenerate (n + 1) = ⋃ (i : Fin (n + 1)), Set.range (X.σ i) := by
8098
ext x

Mathlib/AlgebraicTopology/SimplicialSet/NonDegenerateSimplices.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module
77

88
public import Mathlib.AlgebraicTopology.SimplicialSet.Degenerate
99
public import Mathlib.AlgebraicTopology.SimplicialSet.Simplices
10+
public import Mathlib.AlgebraicTopology.SimplicialSet.SubcomplexOp
1011

1112
/-!
1213
# The partially ordered type of non degenerate simplices of a simplicial set
@@ -163,6 +164,23 @@ lemma subcomplex_le_iff {A B : X.Subcomplex} :
163164
exact h _ _ hx
164165
· simpa using h (N.mk _ x.prop) (by simpa)
165166

167+
set_option backward.isDefEq.respectTransparency false in
168+
/-- The bijection `X.op.N ≃ X.N`. -/
169+
@[simps -isSimp apply symm_apply]
170+
def opEquiv : X.op.N ≃o X.N where
171+
toFun x := N.mk (opObjEquiv x.simplex)
172+
(by simpa only [opObjEquiv_mem_nonDegenerate_iff] using x.nonDegenerate)
173+
invFun y := N.mk (opObjEquiv.symm y.simplex)
174+
(by simpa [← opObjEquiv_mem_nonDegenerate_iff] using y.nonDegenerate)
175+
map_rel_iff' {x y} := by
176+
dsimp
177+
simp only [le_iff, Subcomplex.ofSimplex_le_iff, Subcomplex.mem_ofSimplex_obj_iff]
178+
constructor
179+
· rintro ⟨f, hf⟩
180+
exact ⟨SimplexCategory.rev.map f, by simp [op_map, dsimp% hf]⟩
181+
· rintro ⟨f, hf⟩
182+
exact ⟨SimplexCategory.rev.map f, by simp [op_map, ← hf]⟩
183+
166184
set_option backward.isDefEq.respectTransparency false in
167185
/-- The bijection `X.N ≃ Y.N` on nondegenerate simplices of simplicial sets
168186
that is induced by an isomorphism `X ≅ Y`. -/

Mathlib/AlgebraicTopology/SimplicialSet/NonDegenerateSimplicesSubcomplex.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ lemma cast_eq_self : s.cast hd = s := by
9898

9999
end
100100

101+
/-- The bijection `A.op.N ≃ A.N` for a subcomplex `A` of a simplicial set.. -/
102+
@[simps -isSimp apply symm_apply]
103+
def opEquiv : A.op.N ≃o A.N where
104+
toFun x := N.mk' (SSet.N.opEquiv x.toN) x.notMem
105+
invFun y := N.mk' (SSet.N.opEquiv.symm y.toN) y.notMem
106+
left_inv _ := rfl
107+
right_inv _ := rfl
108+
map_rel_iff' := SSet.N.opEquiv.map_rel_iff
109+
101110
/-- The bijection `A.N ≃ B.N` on nondegenerate simplices not belonging
102111
to a certain subcomplex that is induced by an isomorphism `X ≅ Y` of
103112
simplicial sets which maps `A : X.Subcomplex` to `B : Y.Subcomplex`. -/

Mathlib/AlgebraicTopology/SimplicialSet/Simplices.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Joël Riou
66
module
77

88
public import Mathlib.CategoryTheory.Elements
9+
public import Mathlib.AlgebraicTopology.SimplicialSet.Op
910
public import Mathlib.AlgebraicTopology.SimplicialSet.Subcomplex
1011

1112
/-!
@@ -164,6 +165,12 @@ lemma le_iff_nonempty_hom (x y : X.S) :
164165
· rintro ⟨f, hf⟩
165166
exact ⟨f.unop, hf⟩
166167

168+
/-- The bijection `X.op.S ≃ X.S`. -/
169+
@[simps -isSimp apply symm_apply]
170+
def opEquiv : X.op.S ≃ X.S where
171+
toFun x := S.mk (opObjEquiv x.simplex)
172+
invFun y := S.mk (opObjEquiv.symm y.simplex)
173+
167174
/-- The bijection `X.S ≃ Y.S` on simplices of simplicial sets that
168175
is induced by an isomorphism `X ≅ Y`. -/
169176
@[simps -isSimp apply symm_apply]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/-
2+
Copyright (c) 2026 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.AlgebraicTopology.SimplicialSet.Op
9+
public import Mathlib.AlgebraicTopology.SimplicialSet.Subcomplex
10+
11+
/-!
12+
# The opposite of a subcomplex
13+
14+
-/
15+
16+
@[expose] public section
17+
18+
universe u
19+
20+
namespace SSet.Subcomplex
21+
22+
variable {X : SSet.{u}} (A : X.Subcomplex)
23+
24+
/-- The opposite of subcomplex, as a subcomplex of the opposite simplicial set. -/
25+
protected def op : X.op.Subcomplex where
26+
obj := A.obj
27+
map _ := A.map _
28+
29+
lemma mem_op_obj_iff {d : SimplexCategoryᵒᵖ} (x : X.op.obj d) :
30+
x ∈ A.op.obj d ↔ X.opObjEquiv x ∈ A.obj d := Iff.rfl
31+
32+
end SSet.Subcomplex

0 commit comments

Comments
 (0)