Are you a maintainer with just a short amount of time? The following kinds of pull requests could be relevant for you.
| Number |
Author |
Title |
Description |
Labels |
+/- |
Modified files (first 100) |
📝 |
💬 |
All users who commented or reviewed |
Assignee(s) |
Updated |
Last status change |
total time in review |
| 30047 |
ooovi author:ooovi |
feat(Combinatorics/SimpleGraph): edge labellings |
Add edge labellings for `SimpleGraph` as well as some basic lemmata.
---
This is mostly a cleaned up part of @b-mehta's lean4 port of their [formalisation of an exponentially better upper bound on Ramsey numbers ](https://github.com/b-mehta/ExponentialRamsey/). I need these definitions for another project on Ramsey theory.
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-combinatorics
awaiting-author
|
234/3 |
Mathlib.lean,Mathlib/Combinatorics/SimpleGraph/Basic.lean,Mathlib/Combinatorics/SimpleGraph/EdgeLabelling.lean,Mathlib/Combinatorics/SimpleGraph/Regularity/Increment.lean,Mathlib/Combinatorics/SimpleGraph/Triangle/Counting.lean |
5 |
52 |
['YaelDillies', 'b-mehta', 'github-actions', 'ooovi', 'vlad902'] |
b-mehta assignee:b-mehta |
6-4257 6 days ago |
9-83378 9 days ago |
34-69915 34 days |
| 31201 |
euprunin author:euprunin |
chore(RingTheory): golf `isPrimary_decomposition_pairwise_ne_radical` using `grind` |
---
Show trace profiling of isPrimary_decomposition_pairwise_ne_radical: 89 ms before, 156 ms after
### Trace profiling of `isPrimary_decomposition_pairwise_ne_radical` before PR 31201
```diff
diff --git a/Mathlib/RingTheory/Lasker.lean b/Mathlib/RingTheory/Lasker.lean
index 8f522d48f8..21bf4d68b6 100644
--- a/Mathlib/RingTheory/Lasker.lean
+++ b/Mathlib/RingTheory/Lasker.lean
@@ -57,6 +57,7 @@ lemma decomposition_erase_inf [DecidableEq (Ideal R)] {I : Ideal R}
open scoped Function -- required for scoped `on` notation
+set_option trace.profiler true in
lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R}
{s : Finset (Ideal R)} (hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R), t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧
```
```
ℹ [1261/1261] Built Mathlib.RingTheory.Lasker (1.3s)
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.013044] theorem isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq, Function.comp_apply,
Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.definition.header] [0.010071] Ideal.isPrimary_decomposition_pairwise_ne_radical
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.016459] lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq, Function.comp_apply,
Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.async] [0.091697] elaborating proof of Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.definition.value] [0.089099] Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.step] [0.086924] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq, Function.comp_apply,
Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.086918] classical
[… 154 lines omitted …]
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq,
Function.comp_apply, Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
[Elab.step] [0.020717]
rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq,
Function.comp_apply, Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
[Elab.step] [0.010102] ·
simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
[Elab.step] [0.010064]
simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf,
Function.comp_apply, Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
[Elab.step] [0.010060]
simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf,
Function.comp_apply, Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
[Elab.step] [0.015365] ·
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.015273]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.015268]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.027960] ·
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.027947]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.027944]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.014324] ·
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.014317]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.014310]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
Build completed successfully (1261 jobs).
```
### Trace profiling of `isPrimary_decomposition_pairwise_ne_radical` after PR 31201
```diff
diff --git a/Mathlib/RingTheory/Lasker.lean b/Mathlib/RingTheory/Lasker.lean
index 8f522d48f8..6f1c39f8a7 100644
--- a/Mathlib/RingTheory/Lasker.lean
+++ b/Mathlib/RingTheory/Lasker.lean
@@ -57,6 +57,7 @@ lemma decomposition_erase_inf [DecidableEq (Ideal R)] {I : Ideal R}
open scoped Function -- required for scoped `on` notation
+set_option trace.profiler true in
lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R}
{s : Finset (Ideal R)} (hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R), t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧
@@ -64,16 +65,8 @@ lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R}
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id,
?_, ?_, ?_⟩
- · rw [← hs]
- refine le_antisymm ?_ ?_ <;> intro x hx
- · simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf,
- Function.comp_apply, Finset.mem_filter, id_eq, and_imp] at hx ⊢
- intro J hJ
- exact hx J hJ J hJ rfl
- · simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq,
- Function.comp_apply, Finset.mem_filter, and_imp] at hx ⊢
- intro J _ K hK _
- exact hx K hK
+ · ext
+ grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
```
```
ℹ [1261/1261] Built Mathlib.RingTheory.Lasker (1.2s)
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.011121] theorem isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.012898] lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.async] [0.157957] elaborating proof of Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.definition.value] [0.156050] Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.step] [0.154194] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.154189] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.154184] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
[… 59 lines omitted …]
⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
[Elab.step] [0.017062] expected type: ∃ t,
t.inf id = I ∧
(∀ ⦃J : Ideal R⦄, J ∈ t → J.IsPrimary) ∧ (↑t).Pairwise ((fun x1 x2 ↦ x1 ≠ x2) on radical), term
⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
[Elab.step] [0.017043] expected type: ∃ t,
t.inf id = I ∧
(∀ ⦃J : Ideal R⦄, J ∈ t → J.IsPrimary) ∧
(↑t).Pairwise ((fun x1 x2 ↦ x1 ≠ x2) on radical), term
Exists.intro✝ ((s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id)
⟨?_, ?_, ?_⟩
[Elab.step] [0.016253] expected type: Finset (Ideal R), term
(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id
[Elab.step] [0.013756] expected type: , term
(s.image (fun J ↦ {I ∈ s | I.radical = J.radical}))
[Elab.step] [0.013751] expected type: , term
s.image (fun J ↦ {I ∈ s | I.radical = J.radical})
[Elab.step] [0.011627] expected type: ?m.44 → Finset (Ideal R), term
(fun J ↦ {I ∈ s | I.radical = J.radical})
[Elab.step] [0.011622] expected type: ?m.44 → Finset (Ideal R), term
fun J ↦ {I ∈ s | I.radical = J.radical}
[Elab.step] [0.011555] expected type: Finset (Ideal R), term
{I ∈ s | I.radical = J.radical}
[Elab.step] [0.090158] ·
ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.090093]
ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.090089]
ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.089120] grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.014619] ·
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.014610]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.014605]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.026753] ·
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.026740]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.026737]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.013805] ·
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.013799]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.013796]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
Build completed successfully (1261 jobs).
```
---
[](https://gitpod.io/from-referrer/)
|
t-ring-theory
maintainer-merge
|
2/10 |
Mathlib/RingTheory/Lasker.lean |
1 |
2 |
['erdOne', 'github-actions'] |
nobody |
5-67928 5 days ago |
5-67928 5 days ago |
11-40100 11 days |
| 31055 |
jsm28 author:jsm28 |
feat(Geometry/Euclidean/Projection): `orthogonalProjectionSpan_congr` |
Add a congruence lemma for `orthogonalProjectionSpan` applied to two simplices with the same set of vertices, analogous to and proved using `orthogonalProjection_congr`, and a variant
`orthogonalProjectionSpan_reindex`.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-euclidean-geometry
|
10/0 |
Mathlib/Geometry/Euclidean/Projection.lean |
1 |
3 |
['JovanGerb', 'github-actions'] |
JovanGerb assignee:JovanGerb |
4-61165 4 days ago |
4-61165 4 days ago |
15-68951 15 days |
| 30348 |
RemyDegenne author:RemyDegenne |
feat: convergence in probability implies convergence in distribution |
Prove that convergence in probability implies convergence in distribution, as well as Slutsky's theorem on the convergence of a product of random variables (since those two facts follow from the same lemma).
---
- [x] depends on: #30346
- [x] depends on: #30385
- [x] depends on: #30402
- [x] depends on: #30540
- [x] depends on: #30585
- [x] depends on: #30742
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
256/2 |
Mathlib/MeasureTheory/Function/ConvergenceInDistribution.lean,Mathlib/MeasureTheory/Function/ConvergenceInMeasure.lean,Mathlib/Topology/EMetricSpace/Lipschitz.lean,Mathlib/Topology/Instances/ENNReal/Lemmas.lean,docs/1000.yaml |
5 |
21 |
['EtienneC30', 'github-actions', 'mathlib4-dependent-issues-bot', 'mathlib4-merge-conflict-bot'] |
EtienneC30 assignee:EtienneC30 |
3-73950 3 days ago |
5-39657 5 days ago |
13-8259 13 days |
| 31506 |
FLDutchmann author:FLDutchmann |
feat: Qq version of getLevel |
These were helpful for writing the `algebra` tactic for adding Qq annotations in cases where I know that an expression is a type.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-meta
|
11/2 |
Mathlib/Util/Qq.lean |
1 |
6 |
['FLDutchmann', 'github-actions', 'grunweg'] |
nobody |
2-53757 2 days ago |
2-53757 2 days ago |
2-61095 2 days |
| 31227 |
YaelDillies author:YaelDillies |
feat(Algebra/Homology): sandwich a comm group between two finite comm groups |
From ClassFieldTheory
---
[](https://gitpod.io/from-referrer/)
|
CFT
maintainer-merge
t-algebra
label:t-algebra$ |
64/39 |
Mathlib/Algebra/Homology/ShortComplex/Ab.lean,Mathlib/Data/Finite/Prod.lean,Mathlib/Data/Set/Finite/Basic.lean,Mathlib/GroupTheory/QuotientGroup/Finite.lean,Mathlib/RingTheory/Ideal/Quotient/Basic.lean,Mathlib/Topology/Algebra/Valued/LocallyCompact.lean |
6 |
10 |
['YaelDillies', 'erdOne', 'github-actions', 'jcommelin'] |
erdOne assignee:erdOne |
2-49270 2 days ago |
2-68471 2 days ago |
10-44949 10 days |
| 31250 |
joelriou author:joelriou |
feat(AlgebraicTopology): inductive construction of StrictSegal structures |
We obtain a computable `StrictSegal (nerve C)` structure by using an inductive construction based on a new `StrictSegalCore` structure which provides a way to construct a `n + 1`-simplex by from a `1`-simplex and a `n`-simplex satisfying a compatibility.
---
- [x] depends on: #31248
[](https://gitpod.io/from-referrer/)
|
t-algebraic-topology
maintainer-merge
|
177/29 |
Mathlib/AlgebraicTopology/SimplicialSet/Coskeletal.lean,Mathlib/AlgebraicTopology/SimplicialSet/Path.lean,Mathlib/AlgebraicTopology/SimplicialSet/StrictSegal.lean,Mathlib/CategoryTheory/ComposableArrows.lean |
4 |
20 |
['emilyriehl', 'github-actions', 'joelriou', 'mathlib4-dependent-issues-bot', 'robin-carlier'] |
dagurtomas assignee:dagurtomas |
2-21689 2 days ago |
9-52267 9 days ago |
9-62564 9 days |
| 31537 |
RemyDegenne author:RemyDegenne |
feat: totally bounded sets have finite covers |
New result: a totally bounded set has finite `ε`-covers for all `ε > 0`.
I then use it to golf and generalize `exists_finite_isCover_of_isCompact_closure` and `exists_finite_isCover_of_isCompact` to extended pseudo-metric spaces.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-topology
|
36/17 |
Mathlib/Data/Rel/Cover.lean,Mathlib/Topology/MetricSpace/Cover.lean |
2 |
7 |
['YaelDillies', 'github-actions'] |
nobody |
1-71856 1 day ago |
1-71856 1 day ago |
1-73558 1 day |
| 31540 |
themathqueen author:themathqueen |
chore: move `LinearAlgebra/Matrix/HermitianFunctionalCalculus` to `Analysis/Matrix` |
`Analysis/Matrix` is a more appropriate location for this as these are analysis results and depends on `Analysis/Matrix/Spectrum`.
---
[](https://gitpod.io/from-referrer/)
|
file-removed
maintainer-merge
t-analysis
|
2/2 |
Mathlib.lean,Mathlib/Analysis/Matrix/HermitianFunctionalCalculus.lean,Mathlib/Analysis/Matrix/Order.lean |
3 |
6 |
['Vierkantor', 'github-actions', 'grunweg'] |
nobody |
1-65884 1 day ago |
1-71958 1 day ago |
1-73460 1 day |
| 30201 |
luigi-massacci author:luigi-massacci |
feat: add differentiation for ContDiffMapSupportedIn |
Add a wrapper for `iteratedFDeriv` on `ContDiffMapSupportedIn` and related API.
---
- [x] depends on: #30199
- [x] depends on: #30198
- [x] depends on: #30197
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-analysis
|
180/11 |
Mathlib/Analysis/Distribution/ContDiffMapSupportedIn.lean,Mathlib/Topology/ContinuousMap/Bounded/Basic.lean |
2 |
44 |
['ADedecker', 'github-actions', 'grunweg', 'luigi-massacci', 'mathlib4-dependent-issues-bot', 'mathlib4-merge-conflict-bot'] |
nobody |
1-53606 1 day ago |
1-59433 1 day ago |
5-50320 5 days |
| 31497 |
staroperator author:staroperator |
feat(Algebra/Group): semigroup ideals |
This PR defines semigroup ideals; they are different from (in fact, a weaker form of) ring ideals. We prove that in a monoid whose algebraic order is well-quasi-order, all semigroup ideals are finitely generated, and the semigroup ideals satisfy the ascending chain condition. These definitions and results are useful in #27414.
Note: Following `Ideal` with `Submodule`, `SemigroupIdeal M` is an `abbrev` of `SubMulAction M M`. Also, `Ideal.closure` is a re-definition of `SubMulAction.closure` and `Ideal.FG` is defeq to `SubMulAction.FG` but unfolds more nicely.
---
- [x] depends on: #31517
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-algebra
label:t-algebra$ |
194/0 |
Mathlib.lean,Mathlib/Algebra/Group/Ideal.lean,Mathlib/Algebra/Order/Group/Ideal.lean |
3 |
24 |
['YaelDillies', 'github-actions', 'mathlib4-dependent-issues-bot', 'staroperator'] |
nobody |
1-38982 1 day ago |
1-53437 1 day ago |
2-74295 2 days |
| 31273 |
euprunin author:euprunin |
chore(MeasureTheory/MeasurableSpace): golf `measurableSet_generateFrom_singleton_iff` using `grind` |
---
Show trace profiling of measurableSet_generateFrom_singleton_iff: 70 ms before, 91 ms after
### Trace profiling of `measurableSet_generateFrom_singleton_iff` before PR 31273
```diff
diff --git a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
index baf5299a16..fb8e3fc16d 100644
--- a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
+++ b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
@@ -42,6 +42,7 @@ end MeasurableSpace
namespace MeasureTheory
+set_option trace.profiler true in
theorem measurableSet_generateFrom_singleton_iff {s t : Set α} :
MeasurableSet[MeasurableSpace.generateFrom {s}] t ↔ t = ∅ ∨ t = s ∨ t = sᶜ ∨ t = univ := by
simp_rw [MeasurableSpace.generateFrom_singleton]
```
```
ℹ [880/880] Built Mathlib.MeasureTheory.MeasurableSpace.MeasurablyGenerated (1.2s)
info: Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean:46:0: [Elab.async] [0.071352] elaborating proof of MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.definition.value] [0.069878] MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.step] [0.068734]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
· by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.068727]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
· by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.012541] simp_rw [MeasurableSpace.generateFrom_singleton]
[Elab.step] [0.041180] ·
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
[… 112 lines omitted …]
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.028797]
by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.025079] ·
have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.025059]
have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.025057]
have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.015096] simp [hx]
[Meta.synthInstance] [0.011997] ❌️ Nontrivial (Set α)
[Elab.step] [0.011467] ·
by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
[Elab.step] [0.011367]
by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
[Elab.step] [0.011363]
by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
Build completed successfully (880 jobs).
```
### Trace profiling of `measurableSet_generateFrom_singleton_iff` after PR 31273
```diff
diff --git a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
index baf5299a16..b67f37d372 100644
--- a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
+++ b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
@@ -42,6 +42,7 @@ end MeasurableSpace
namespace MeasureTheory
+set_option trace.profiler true in
theorem measurableSet_generateFrom_singleton_iff {s t : Set α} :
MeasurableSet[MeasurableSpace.generateFrom {s}] t ↔ t = ∅ ∨ t = s ∨ t = sᶜ ∨ t = univ := by
simp_rw [MeasurableSpace.generateFrom_singleton]
@@ -51,35 +52,14 @@ theorem measurableSet_generateFrom_singleton_iff {s t : Set α} :
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
- · refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
- suffices x = univ by simp only [this, preimage_univ, subset_refl]
- refine subset_antisymm (subset_univ _) ?_
- rw [univ_eq_true_false]
- rintro - (rfl | rfl)
- · assumption
- · assumption
- · have hx : x = {True} := by
- ext p
- refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
- by_contra hpneg
- rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
- exact hF (by convert hp)
- simp [hx]
+ · suffices x = univ by grind
+ grind [univ_eq_true_false]
+ · grind
· by_cases hF : False ∈ x
- · have hx : x = {False} := by
- ext p
- refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
- grind
- refine Or.inr <| Or.inr <| Or.inl <| ?_
- simp [hx, compl_def]
- · refine Or.inl <| subset_antisymm ?_ <| empty_subset _
- suffices x ⊆ ∅ by
- rw [subset_empty_iff] at this
- simp only [this, preimage_empty, subset_refl]
+ · grind
+ · suffices x ⊆ ∅ by grind
intro p hp
- fin_cases p
- · contradiction
- · contradiction
+ fin_cases p <;> contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use {True}
```
```
ℹ [880/880] Built Mathlib.MeasureTheory.MeasurableSpace.MeasurablyGenerated (1.2s)
info: Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean:46:0: [Elab.async] [0.092756] elaborating proof of MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.definition.value] [0.091377] MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.step] [0.090497]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.090489]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.012749] simp_rw [MeasurableSpace.generateFrom_singleton]
[Elab.step] [0.062153] ·
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.062134]
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.062131]
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.031421] ·
by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
[Elab.step] [0.031410]
by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
[Elab.step] [0.031407]
by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
[Elab.step] [0.019456] ·
suffices x = univ by grind
grind [univ_eq_true_false]
[Elab.step] [0.019448]
suffices x = univ by grind
grind [univ_eq_true_false]
[Elab.step] [0.019444]
suffices x = univ by grind
grind [univ_eq_true_false]
[Elab.step] [0.010344] grind [univ_eq_true_false]
[Elab.step] [0.011419] · grind
[Elab.step] [0.011411] grind
[Elab.step] [0.011407] grind
[Elab.step] [0.011402] grind
[Elab.step] [0.029820] ·
by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.029812]
by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.029808]
by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.011217] · grind
[Elab.step] [0.011211] grind
[Elab.step] [0.011208] grind
[Elab.step] [0.011203] grind
[Elab.step] [0.017927] ·
suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.017920]
suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.017914]
suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.014460] suffices x ⊆ ∅ by grind
[Elab.step] [0.014455] refine_lift
suffices x ⊆ ∅ by grind;
?_
[Elab.step] [0.014451] focus
(refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014447] (refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014445] (refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014442] (refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014440] refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right
[Elab.step] [0.014438] refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right
[Elab.step] [0.014428] refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_)
[Elab.step] [0.013889] grind
[Elab.step] [0.013885] grind
[Elab.step] [0.013879] grind
Build completed successfully (880 jobs).
```
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
6/27 |
Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean |
1 |
3 |
['EtienneC30', 'github-actions'] |
EtienneC30 assignee:EtienneC30 |
1-37550 1 day ago |
1-37550 1 day ago |
8-78992 8 days |
| 31398 |
YaelDillies author:YaelDillies |
feat(MeasureTheory/Measure): `comap_apply` version for measurable equivs |
This one is stated in terms of the preimage of the inverse, which is sometimes (but not always!) more useful than the image of the forward map.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
13/0 |
Mathlib/MeasureTheory/Measure/Restrict.lean |
1 |
4 |
['EtienneC30', 'YaelDillies', 'github-actions'] |
EtienneC30 assignee:EtienneC30 |
1-36395 1 day ago |
1-36420 1 day ago |
5-29604 5 days |
| 31278 |
ADedecker author:ADedecker |
feat: approximate continuous functions by smooth functions |
This is motivated by #31079, and adapted from [this lemma](https://github.com/leanprover-community/sphere-eversion/blob/master/SphereEversion/ToMathlib/ExistsOfConvex.lean#L213) in the Sphere Eversion project.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-analysis
t-differential-geometry
|
157/0 |
Mathlib.lean,Mathlib/Analysis/Calculus/ContDiff/Basic.lean,Mathlib/Analysis/Calculus/FDeriv/Const.lean,Mathlib/Analysis/Convex/Basic.lean,Mathlib/Geometry/Manifold/ContMDiff/Basic.lean,Mathlib/Geometry/Manifold/MFDeriv/SpecificFunctions.lean,Mathlib/Geometry/Manifold/SmoothApprox.lean |
7 |
36 |
['ADedecker', 'github-actions', 'grunweg', 'mcdoll', 'sgouezel'] |
grunweg assignee:grunweg |
1-31056 1 day ago |
7-55644 7 days ago |
8-44606 8 days |
| 30650 |
JovanGerb author:JovanGerb |
perf(reassoc, to_app, elementwise): don't pass the same proof to the kernel again |
In `reassoc`, `to_app`, `elementwise`, the proof of the original lemma was being used to prove the modified lemma. This is silly, because the modified lemma can be proved using the original lemma directly. Hence, this PR modifies `addRelatedDecl` to include this optimization.
Previously, `addRelatedDecl` would pass around both the type and the value of the original declaration. This was necessary, because the inferred type of the value might not be identical to the type it is given. Now this is not necessary anymore, because the type of the constant is exactly the type that it is given, so the type can always be obtained with `inferType`.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-meta
|
19/21 |
Mathlib/Tactic/CategoryTheory/Elementwise.lean,Mathlib/Tactic/CategoryTheory/Reassoc.lean,Mathlib/Tactic/CategoryTheory/ToApp.lean,Mathlib/Util/AddRelatedDecl.lean |
4 |
13 |
['JovanGerb', 'dwrensha', 'github-actions', 'grunweg', 'leanprover-bot', 'leanprover-community-mathlib4-bot', 'plp127'] |
dwrensha assignee:dwrensha |
1-23351 1 day ago |
1-64867 1 day ago |
26-54166 26 days |
| 31535 |
ADedecker author:ADedecker |
feat: small tweaks to `PointwiseConvergenceCLM` |
These are small suggestions I would have made about #11496:
- add a `IsUniformEmbedding` variant of `isEmbedding_coeFn`
- add a `ContinuousEvalConst` instance using [UniformConvergenceCLM.continuousEvalConst](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Topology/Algebra/Module/StrongTopology.html#UniformConvergenceCLM.continuousEvalConst)
- use said instance to golf continuity in `evalCLM`
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-topology
|
16/11 |
Mathlib/Topology/Algebra/Module/PointwiseConvergence.lean |
1 |
3 |
['github-actions', 'mcdoll'] |
nobody |
1-20952 1 day ago |
1-20952 1 day ago |
1-76209 1 day |
| Number |
Author |
Title |
Description |
Labels |
+/- |
Modified files (first 100) |
📝 |
💬 |
All users who commented or reviewed |
Assignee(s) |
Updated |
Last status change |
total time in review |
| 30047 |
ooovi author:ooovi |
feat(Combinatorics/SimpleGraph): edge labellings |
Add edge labellings for `SimpleGraph` as well as some basic lemmata.
---
This is mostly a cleaned up part of @b-mehta's lean4 port of their [formalisation of an exponentially better upper bound on Ramsey numbers ](https://github.com/b-mehta/ExponentialRamsey/). I need these definitions for another project on Ramsey theory.
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-combinatorics
awaiting-author
|
234/3 |
Mathlib.lean,Mathlib/Combinatorics/SimpleGraph/Basic.lean,Mathlib/Combinatorics/SimpleGraph/EdgeLabelling.lean,Mathlib/Combinatorics/SimpleGraph/Regularity/Increment.lean,Mathlib/Combinatorics/SimpleGraph/Triangle/Counting.lean |
5 |
52 |
['YaelDillies', 'b-mehta', 'github-actions', 'ooovi', 'vlad902'] |
b-mehta assignee:b-mehta |
6-4257 6 days ago |
9-83378 9 days ago |
34-69915 34 days |
| 31201 |
euprunin author:euprunin |
chore(RingTheory): golf `isPrimary_decomposition_pairwise_ne_radical` using `grind` |
---
Show trace profiling of isPrimary_decomposition_pairwise_ne_radical: 89 ms before, 156 ms after
### Trace profiling of `isPrimary_decomposition_pairwise_ne_radical` before PR 31201
```diff
diff --git a/Mathlib/RingTheory/Lasker.lean b/Mathlib/RingTheory/Lasker.lean
index 8f522d48f8..21bf4d68b6 100644
--- a/Mathlib/RingTheory/Lasker.lean
+++ b/Mathlib/RingTheory/Lasker.lean
@@ -57,6 +57,7 @@ lemma decomposition_erase_inf [DecidableEq (Ideal R)] {I : Ideal R}
open scoped Function -- required for scoped `on` notation
+set_option trace.profiler true in
lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R}
{s : Finset (Ideal R)} (hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R), t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧
```
```
ℹ [1261/1261] Built Mathlib.RingTheory.Lasker (1.3s)
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.013044] theorem isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq, Function.comp_apply,
Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.definition.header] [0.010071] Ideal.isPrimary_decomposition_pairwise_ne_radical
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.016459] lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq, Function.comp_apply,
Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.async] [0.091697] elaborating proof of Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.definition.value] [0.089099] Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.step] [0.086924] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq, Function.comp_apply,
Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.086918] classical
[… 154 lines omitted …]
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq,
Function.comp_apply, Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
[Elab.step] [0.020717]
rw [← hs]
refine le_antisymm ?_ ?_ <;> intro x hx
· simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
· simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq,
Function.comp_apply, Finset.mem_filter, and_imp] at hx ⊢
intro J _ K hK _
exact hx K hK
[Elab.step] [0.010102] ·
simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf, Function.comp_apply,
Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
[Elab.step] [0.010064]
simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf,
Function.comp_apply, Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
[Elab.step] [0.010060]
simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf,
Function.comp_apply, Finset.mem_filter, id_eq, and_imp] at hx ⊢
intro J hJ
exact hx J hJ J hJ rfl
[Elab.step] [0.015365] ·
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.015273]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.015268]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.027960] ·
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.027947]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.027944]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.014324] ·
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.014317]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.014310]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
Build completed successfully (1261 jobs).
```
### Trace profiling of `isPrimary_decomposition_pairwise_ne_radical` after PR 31201
```diff
diff --git a/Mathlib/RingTheory/Lasker.lean b/Mathlib/RingTheory/Lasker.lean
index 8f522d48f8..6f1c39f8a7 100644
--- a/Mathlib/RingTheory/Lasker.lean
+++ b/Mathlib/RingTheory/Lasker.lean
@@ -57,6 +57,7 @@ lemma decomposition_erase_inf [DecidableEq (Ideal R)] {I : Ideal R}
open scoped Function -- required for scoped `on` notation
+set_option trace.profiler true in
lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R}
{s : Finset (Ideal R)} (hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R), t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧
@@ -64,16 +65,8 @@ lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R}
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id,
?_, ?_, ?_⟩
- · rw [← hs]
- refine le_antisymm ?_ ?_ <;> intro x hx
- · simp only [Finset.inf_image, CompTriple.comp_eq, Submodule.mem_finsetInf,
- Function.comp_apply, Finset.mem_filter, id_eq, and_imp] at hx ⊢
- intro J hJ
- exact hx J hJ J hJ rfl
- · simp only [Submodule.mem_finsetInf, id_eq, Finset.inf_image, CompTriple.comp_eq,
- Function.comp_apply, Finset.mem_filter, and_imp] at hx ⊢
- intro J _ K hK _
- exact hx K hK
+ · ext
+ grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
```
```
ℹ [1261/1261] Built Mathlib.RingTheory.Lasker (1.2s)
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.011121] theorem isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.command] [0.012898] lemma isPrimary_decomposition_pairwise_ne_radical {I : Ideal R} {s : Finset (Ideal R)}
(hs : s.inf id = I) (hs' : ∀ ⦃J⦄, J ∈ s → J.IsPrimary) :
∃ t : Finset (Ideal R),
t.inf id = I ∧ (∀ ⦃J⦄, J ∈ t → J.IsPrimary) ∧ (t : Set (Ideal R)).Pairwise ((· ≠ ·) on radical) :=
by
classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
info: Mathlib/RingTheory/Lasker.lean:61:0: [Elab.async] [0.157957] elaborating proof of Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.definition.value] [0.156050] Ideal.isPrimary_decomposition_pairwise_ne_radical
[Elab.step] [0.154194] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.154189] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
· intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.154184] classical
refine ⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
· ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
· simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
[… 59 lines omitted …]
⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
[Elab.step] [0.017062] expected type: ∃ t,
t.inf id = I ∧
(∀ ⦃J : Ideal R⦄, J ∈ t → J.IsPrimary) ∧ (↑t).Pairwise ((fun x1 x2 ↦ x1 ≠ x2) on radical), term
⟨(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id, ?_, ?_, ?_⟩
[Elab.step] [0.017043] expected type: ∃ t,
t.inf id = I ∧
(∀ ⦃J : Ideal R⦄, J ∈ t → J.IsPrimary) ∧
(↑t).Pairwise ((fun x1 x2 ↦ x1 ≠ x2) on radical), term
Exists.intro✝ ((s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id)
⟨?_, ?_, ?_⟩
[Elab.step] [0.016253] expected type: Finset (Ideal R), term
(s.image (fun J ↦ {I ∈ s | I.radical = J.radical})).image fun t ↦ t.inf id
[Elab.step] [0.013756] expected type: , term
(s.image (fun J ↦ {I ∈ s | I.radical = J.radical}))
[Elab.step] [0.013751] expected type: , term
s.image (fun J ↦ {I ∈ s | I.radical = J.radical})
[Elab.step] [0.011627] expected type: ?m.44 → Finset (Ideal R), term
(fun J ↦ {I ∈ s | I.radical = J.radical})
[Elab.step] [0.011622] expected type: ?m.44 → Finset (Ideal R), term
fun J ↦ {I ∈ s | I.radical = J.radical}
[Elab.step] [0.011555] expected type: Finset (Ideal R), term
{I ∈ s | I.radical = J.radical}
[Elab.step] [0.090158] ·
ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.090093]
ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.090089]
ext
grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.089120] grind [Finset.inf_image, Submodule.mem_finsetInf]
[Elab.step] [0.014619] ·
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.014610]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.014605]
simp only [Finset.mem_image, exists_exists_and_eq_and, forall_exists_index, and_imp,
forall_apply_eq_imp_iff₂]
intro J hJ
refine isPrimary_finset_inf (i := J) ?_ ?_ (by simp)
· simp [hJ]
· simp only [Finset.mem_filter, id_eq, and_imp]
intro y hy
simp [hs' hy]
[Elab.step] [0.026753] ·
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.026740]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.026737]
intro I hI J hJ hIJ
simp only [Finset.coe_image, Set.mem_image, Finset.mem_coe, exists_exists_and_eq_and] at hI hJ
obtain ⟨I', hI', hI⟩ := hI
obtain ⟨J', hJ', hJ⟩ := hJ
simp only [Function.onFun, ne_eq]
contrapose! hIJ
suffices I'.radical = J'.radical by rw [← hI, ← hJ, this]
· rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.013805] ·
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.013799]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
[Elab.step] [0.013796]
rw [← hI, radical_finset_inf (i := I') (by simp [hI']) (by simp), id_eq] at hIJ
rw [hIJ, ← hJ, radical_finset_inf (i := J') (by simp [hJ']) (by simp), id_eq]
Build completed successfully (1261 jobs).
```
---
[](https://gitpod.io/from-referrer/)
|
t-ring-theory
maintainer-merge
|
2/10 |
Mathlib/RingTheory/Lasker.lean |
1 |
2 |
['erdOne', 'github-actions'] |
nobody |
5-67928 5 days ago |
5-67928 5 days ago |
11-40100 11 days |
| 31055 |
jsm28 author:jsm28 |
feat(Geometry/Euclidean/Projection): `orthogonalProjectionSpan_congr` |
Add a congruence lemma for `orthogonalProjectionSpan` applied to two simplices with the same set of vertices, analogous to and proved using `orthogonalProjection_congr`, and a variant
`orthogonalProjectionSpan_reindex`.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-euclidean-geometry
|
10/0 |
Mathlib/Geometry/Euclidean/Projection.lean |
1 |
3 |
['JovanGerb', 'github-actions'] |
JovanGerb assignee:JovanGerb |
4-61165 4 days ago |
4-61165 4 days ago |
15-68951 15 days |
| 30348 |
RemyDegenne author:RemyDegenne |
feat: convergence in probability implies convergence in distribution |
Prove that convergence in probability implies convergence in distribution, as well as Slutsky's theorem on the convergence of a product of random variables (since those two facts follow from the same lemma).
---
- [x] depends on: #30346
- [x] depends on: #30385
- [x] depends on: #30402
- [x] depends on: #30540
- [x] depends on: #30585
- [x] depends on: #30742
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
256/2 |
Mathlib/MeasureTheory/Function/ConvergenceInDistribution.lean,Mathlib/MeasureTheory/Function/ConvergenceInMeasure.lean,Mathlib/Topology/EMetricSpace/Lipschitz.lean,Mathlib/Topology/Instances/ENNReal/Lemmas.lean,docs/1000.yaml |
5 |
21 |
['EtienneC30', 'github-actions', 'mathlib4-dependent-issues-bot', 'mathlib4-merge-conflict-bot'] |
EtienneC30 assignee:EtienneC30 |
3-73950 3 days ago |
5-39657 5 days ago |
13-8259 13 days |
| 31506 |
FLDutchmann author:FLDutchmann |
feat: Qq version of getLevel |
These were helpful for writing the `algebra` tactic for adding Qq annotations in cases where I know that an expression is a type.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-meta
|
11/2 |
Mathlib/Util/Qq.lean |
1 |
6 |
['FLDutchmann', 'github-actions', 'grunweg'] |
nobody |
2-53757 2 days ago |
2-53757 2 days ago |
2-61095 2 days |
| 31227 |
YaelDillies author:YaelDillies |
feat(Algebra/Homology): sandwich a comm group between two finite comm groups |
From ClassFieldTheory
---
[](https://gitpod.io/from-referrer/)
|
CFT
maintainer-merge
t-algebra
label:t-algebra$ |
64/39 |
Mathlib/Algebra/Homology/ShortComplex/Ab.lean,Mathlib/Data/Finite/Prod.lean,Mathlib/Data/Set/Finite/Basic.lean,Mathlib/GroupTheory/QuotientGroup/Finite.lean,Mathlib/RingTheory/Ideal/Quotient/Basic.lean,Mathlib/Topology/Algebra/Valued/LocallyCompact.lean |
6 |
10 |
['YaelDillies', 'erdOne', 'github-actions', 'jcommelin'] |
erdOne assignee:erdOne |
2-49270 2 days ago |
2-68471 2 days ago |
10-44949 10 days |
| 31250 |
joelriou author:joelriou |
feat(AlgebraicTopology): inductive construction of StrictSegal structures |
We obtain a computable `StrictSegal (nerve C)` structure by using an inductive construction based on a new `StrictSegalCore` structure which provides a way to construct a `n + 1`-simplex by from a `1`-simplex and a `n`-simplex satisfying a compatibility.
---
- [x] depends on: #31248
[](https://gitpod.io/from-referrer/)
|
t-algebraic-topology
maintainer-merge
|
177/29 |
Mathlib/AlgebraicTopology/SimplicialSet/Coskeletal.lean,Mathlib/AlgebraicTopology/SimplicialSet/Path.lean,Mathlib/AlgebraicTopology/SimplicialSet/StrictSegal.lean,Mathlib/CategoryTheory/ComposableArrows.lean |
4 |
20 |
['emilyriehl', 'github-actions', 'joelriou', 'mathlib4-dependent-issues-bot', 'robin-carlier'] |
dagurtomas assignee:dagurtomas |
2-21689 2 days ago |
9-52267 9 days ago |
9-62564 9 days |
| 31537 |
RemyDegenne author:RemyDegenne |
feat: totally bounded sets have finite covers |
New result: a totally bounded set has finite `ε`-covers for all `ε > 0`.
I then use it to golf and generalize `exists_finite_isCover_of_isCompact_closure` and `exists_finite_isCover_of_isCompact` to extended pseudo-metric spaces.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-topology
|
36/17 |
Mathlib/Data/Rel/Cover.lean,Mathlib/Topology/MetricSpace/Cover.lean |
2 |
7 |
['YaelDillies', 'github-actions'] |
nobody |
1-71856 1 day ago |
1-71856 1 day ago |
1-73558 1 day |
| 31540 |
themathqueen author:themathqueen |
chore: move `LinearAlgebra/Matrix/HermitianFunctionalCalculus` to `Analysis/Matrix` |
`Analysis/Matrix` is a more appropriate location for this as these are analysis results and depends on `Analysis/Matrix/Spectrum`.
---
[](https://gitpod.io/from-referrer/)
|
file-removed
maintainer-merge
t-analysis
|
2/2 |
Mathlib.lean,Mathlib/Analysis/Matrix/HermitianFunctionalCalculus.lean,Mathlib/Analysis/Matrix/Order.lean |
3 |
6 |
['Vierkantor', 'github-actions', 'grunweg'] |
nobody |
1-65884 1 day ago |
1-71958 1 day ago |
1-73460 1 day |
| 30201 |
luigi-massacci author:luigi-massacci |
feat: add differentiation for ContDiffMapSupportedIn |
Add a wrapper for `iteratedFDeriv` on `ContDiffMapSupportedIn` and related API.
---
- [x] depends on: #30199
- [x] depends on: #30198
- [x] depends on: #30197
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-analysis
|
180/11 |
Mathlib/Analysis/Distribution/ContDiffMapSupportedIn.lean,Mathlib/Topology/ContinuousMap/Bounded/Basic.lean |
2 |
44 |
['ADedecker', 'github-actions', 'grunweg', 'luigi-massacci', 'mathlib4-dependent-issues-bot', 'mathlib4-merge-conflict-bot'] |
nobody |
1-53606 1 day ago |
1-59433 1 day ago |
5-50320 5 days |
| 31497 |
staroperator author:staroperator |
feat(Algebra/Group): semigroup ideals |
This PR defines semigroup ideals; they are different from (in fact, a weaker form of) ring ideals. We prove that in a monoid whose algebraic order is well-quasi-order, all semigroup ideals are finitely generated, and the semigroup ideals satisfy the ascending chain condition. These definitions and results are useful in #27414.
Note: Following `Ideal` with `Submodule`, `SemigroupIdeal M` is an `abbrev` of `SubMulAction M M`. Also, `Ideal.closure` is a re-definition of `SubMulAction.closure` and `Ideal.FG` is defeq to `SubMulAction.FG` but unfolds more nicely.
---
- [x] depends on: #31517
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-algebra
label:t-algebra$ |
194/0 |
Mathlib.lean,Mathlib/Algebra/Group/Ideal.lean,Mathlib/Algebra/Order/Group/Ideal.lean |
3 |
24 |
['YaelDillies', 'github-actions', 'mathlib4-dependent-issues-bot', 'staroperator'] |
nobody |
1-38982 1 day ago |
1-53437 1 day ago |
2-74295 2 days |
| 31273 |
euprunin author:euprunin |
chore(MeasureTheory/MeasurableSpace): golf `measurableSet_generateFrom_singleton_iff` using `grind` |
---
Show trace profiling of measurableSet_generateFrom_singleton_iff: 70 ms before, 91 ms after
### Trace profiling of `measurableSet_generateFrom_singleton_iff` before PR 31273
```diff
diff --git a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
index baf5299a16..fb8e3fc16d 100644
--- a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
+++ b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
@@ -42,6 +42,7 @@ end MeasurableSpace
namespace MeasureTheory
+set_option trace.profiler true in
theorem measurableSet_generateFrom_singleton_iff {s t : Set α} :
MeasurableSet[MeasurableSpace.generateFrom {s}] t ↔ t = ∅ ∨ t = s ∨ t = sᶜ ∨ t = univ := by
simp_rw [MeasurableSpace.generateFrom_singleton]
```
```
ℹ [880/880] Built Mathlib.MeasureTheory.MeasurableSpace.MeasurablyGenerated (1.2s)
info: Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean:46:0: [Elab.async] [0.071352] elaborating proof of MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.definition.value] [0.069878] MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.step] [0.068734]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
· by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.068727]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
· by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.012541] simp_rw [MeasurableSpace.generateFrom_singleton]
[Elab.step] [0.041180] ·
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
[… 112 lines omitted …]
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.028797]
by_cases hF : False ∈ x
· refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
suffices x = univ by simp only [this, preimage_univ, subset_refl]
refine subset_antisymm (subset_univ _) ?_
rw [univ_eq_true_false]
rintro - (rfl | rfl)
· assumption
· assumption
· have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.025079] ·
have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.025059]
have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.025057]
have hx : x = { True } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
by_contra hpneg
rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
exact hF (by convert hp)
simp [hx]
[Elab.step] [0.015096] simp [hx]
[Meta.synthInstance] [0.011997] ❌️ Nontrivial (Set α)
[Elab.step] [0.011467] ·
by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
[Elab.step] [0.011367]
by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
[Elab.step] [0.011363]
by_cases hF : False ∈ x
· have hx : x = { False } := by
ext p
refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
grind
refine Or.inr <| Or.inr <| Or.inl <| ?_
simp [hx, compl_def]
· refine Or.inl <| subset_antisymm ?_ <| empty_subset _
suffices x ⊆ ∅ by
rw [subset_empty_iff] at this
simp only [this, preimage_empty, subset_refl]
intro p hp
fin_cases p
· contradiction
· contradiction
Build completed successfully (880 jobs).
```
### Trace profiling of `measurableSet_generateFrom_singleton_iff` after PR 31273
```diff
diff --git a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
index baf5299a16..b67f37d372 100644
--- a/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
+++ b/Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean
@@ -42,6 +42,7 @@ end MeasurableSpace
namespace MeasureTheory
+set_option trace.profiler true in
theorem measurableSet_generateFrom_singleton_iff {s t : Set α} :
MeasurableSet[MeasurableSpace.generateFrom {s}] t ↔ t = ∅ ∨ t = s ∨ t = sᶜ ∨ t = univ := by
simp_rw [MeasurableSpace.generateFrom_singleton]
@@ -51,35 +52,14 @@ theorem measurableSet_generateFrom_singleton_iff {s t : Set α} :
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
- · refine Or.inr <| Or.inr <| Or.inr <| subset_antisymm (subset_univ _) ?_
- suffices x = univ by simp only [this, preimage_univ, subset_refl]
- refine subset_antisymm (subset_univ _) ?_
- rw [univ_eq_true_false]
- rintro - (rfl | rfl)
- · assumption
- · assumption
- · have hx : x = {True} := by
- ext p
- refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hT⟩
- by_contra hpneg
- rw [eq_iff_iff, iff_true, ← false_iff] at hpneg
- exact hF (by convert hp)
- simp [hx]
+ · suffices x = univ by grind
+ grind [univ_eq_true_false]
+ · grind
· by_cases hF : False ∈ x
- · have hx : x = {False} := by
- ext p
- refine ⟨fun hp ↦ mem_singleton_iff.2 ?_, fun hp ↦ hp ▸ hF⟩
- grind
- refine Or.inr <| Or.inr <| Or.inl <| ?_
- simp [hx, compl_def]
- · refine Or.inl <| subset_antisymm ?_ <| empty_subset _
- suffices x ⊆ ∅ by
- rw [subset_empty_iff] at this
- simp only [this, preimage_empty, subset_refl]
+ · grind
+ · suffices x ⊆ ∅ by grind
intro p hp
- fin_cases p
- · contradiction
- · contradiction
+ fin_cases p <;> contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use {True}
```
```
ℹ [880/880] Built Mathlib.MeasureTheory.MeasurableSpace.MeasurablyGenerated (1.2s)
info: Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean:46:0: [Elab.async] [0.092756] elaborating proof of MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.definition.value] [0.091377] MeasureTheory.measurableSet_generateFrom_singleton_iff
[Elab.step] [0.090497]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.090489]
simp_rw [MeasurableSpace.generateFrom_singleton]
unfold MeasurableSet MeasurableSpace.MeasurableSet' MeasurableSpace.comap
simp_rw [MeasurableSpace.measurableSet_top, true_and]
constructor
· rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
· rintro (rfl | rfl | rfl | rfl)
on_goal 1 => use ∅
on_goal 2 => use { True }
on_goal 3 => use { False }
on_goal 4 => use Set.univ
all_goals simp [compl_def]
[Elab.step] [0.012749] simp_rw [MeasurableSpace.generateFrom_singleton]
[Elab.step] [0.062153] ·
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.062134]
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.062131]
rintro ⟨x, rfl⟩
by_cases hT : True ∈ x
· by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
· by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.031421] ·
by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
[Elab.step] [0.031410]
by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
[Elab.step] [0.031407]
by_cases hF : False ∈ x
· suffices x = univ by grind
grind [univ_eq_true_false]
· grind
[Elab.step] [0.019456] ·
suffices x = univ by grind
grind [univ_eq_true_false]
[Elab.step] [0.019448]
suffices x = univ by grind
grind [univ_eq_true_false]
[Elab.step] [0.019444]
suffices x = univ by grind
grind [univ_eq_true_false]
[Elab.step] [0.010344] grind [univ_eq_true_false]
[Elab.step] [0.011419] · grind
[Elab.step] [0.011411] grind
[Elab.step] [0.011407] grind
[Elab.step] [0.011402] grind
[Elab.step] [0.029820] ·
by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.029812]
by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.029808]
by_cases hF : False ∈ x
· grind
· suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.011217] · grind
[Elab.step] [0.011211] grind
[Elab.step] [0.011208] grind
[Elab.step] [0.011203] grind
[Elab.step] [0.017927] ·
suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.017920]
suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.017914]
suffices x ⊆ ∅ by grind
intro p hp
fin_cases p <;> contradiction
[Elab.step] [0.014460] suffices x ⊆ ∅ by grind
[Elab.step] [0.014455] refine_lift
suffices x ⊆ ∅ by grind;
?_
[Elab.step] [0.014451] focus
(refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014447] (refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014445] (refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014442] (refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right)
[Elab.step] [0.014440] refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right
[Elab.step] [0.014438] refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_);
rotate_right
[Elab.step] [0.014428] refine
no_implicit_lambda%
(suffices x ⊆ ∅ by grind;
?_)
[Elab.step] [0.013889] grind
[Elab.step] [0.013885] grind
[Elab.step] [0.013879] grind
Build completed successfully (880 jobs).
```
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
6/27 |
Mathlib/MeasureTheory/MeasurableSpace/MeasurablyGenerated.lean |
1 |
3 |
['EtienneC30', 'github-actions'] |
EtienneC30 assignee:EtienneC30 |
1-37550 1 day ago |
1-37550 1 day ago |
8-78992 8 days |
| 31398 |
YaelDillies author:YaelDillies |
feat(MeasureTheory/Measure): `comap_apply` version for measurable equivs |
This one is stated in terms of the preimage of the inverse, which is sometimes (but not always!) more useful than the image of the forward map.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
13/0 |
Mathlib/MeasureTheory/Measure/Restrict.lean |
1 |
4 |
['EtienneC30', 'YaelDillies', 'github-actions'] |
EtienneC30 assignee:EtienneC30 |
1-36395 1 day ago |
1-36420 1 day ago |
5-29604 5 days |
| 31278 |
ADedecker author:ADedecker |
feat: approximate continuous functions by smooth functions |
This is motivated by #31079, and adapted from [this lemma](https://github.com/leanprover-community/sphere-eversion/blob/master/SphereEversion/ToMathlib/ExistsOfConvex.lean#L213) in the Sphere Eversion project.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-analysis
t-differential-geometry
|
157/0 |
Mathlib.lean,Mathlib/Analysis/Calculus/ContDiff/Basic.lean,Mathlib/Analysis/Calculus/FDeriv/Const.lean,Mathlib/Analysis/Convex/Basic.lean,Mathlib/Geometry/Manifold/ContMDiff/Basic.lean,Mathlib/Geometry/Manifold/MFDeriv/SpecificFunctions.lean,Mathlib/Geometry/Manifold/SmoothApprox.lean |
7 |
36 |
['ADedecker', 'github-actions', 'grunweg', 'mcdoll', 'sgouezel'] |
grunweg assignee:grunweg |
1-31056 1 day ago |
7-55644 7 days ago |
8-44606 8 days |
| 30650 |
JovanGerb author:JovanGerb |
perf(reassoc, to_app, elementwise): don't pass the same proof to the kernel again |
In `reassoc`, `to_app`, `elementwise`, the proof of the original lemma was being used to prove the modified lemma. This is silly, because the modified lemma can be proved using the original lemma directly. Hence, this PR modifies `addRelatedDecl` to include this optimization.
Previously, `addRelatedDecl` would pass around both the type and the value of the original declaration. This was necessary, because the inferred type of the value might not be identical to the type it is given. Now this is not necessary anymore, because the type of the constant is exactly the type that it is given, so the type can always be obtained with `inferType`.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-meta
|
19/21 |
Mathlib/Tactic/CategoryTheory/Elementwise.lean,Mathlib/Tactic/CategoryTheory/Reassoc.lean,Mathlib/Tactic/CategoryTheory/ToApp.lean,Mathlib/Util/AddRelatedDecl.lean |
4 |
13 |
['JovanGerb', 'dwrensha', 'github-actions', 'grunweg', 'leanprover-bot', 'leanprover-community-mathlib4-bot', 'plp127'] |
dwrensha assignee:dwrensha |
1-23351 1 day ago |
1-64867 1 day ago |
26-54166 26 days |
| 31535 |
ADedecker author:ADedecker |
feat: small tweaks to `PointwiseConvergenceCLM` |
These are small suggestions I would have made about #11496:
- add a `IsUniformEmbedding` variant of `isEmbedding_coeFn`
- add a `ContinuousEvalConst` instance using [UniformConvergenceCLM.continuousEvalConst](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Topology/Algebra/Module/StrongTopology.html#UniformConvergenceCLM.continuousEvalConst)
- use said instance to golf continuity in `evalCLM`
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-topology
|
16/11 |
Mathlib/Topology/Algebra/Module/PointwiseConvergence.lean |
1 |
3 |
['github-actions', 'mcdoll'] |
nobody |
1-20952 1 day ago |
1-20952 1 day ago |
1-76209 1 day |
| 31546 |
RemyDegenne author:RemyDegenne |
feat: MeasurableSet.iff |
Add two lemmas:
`MeasurableSet.imp (hs : MeasurableSet {x | p x}) (ht : MeasurableSet {x | q x}) : MeasurableSet {x | p x → q x}`
`MeasurableSet.iff (hs : MeasurableSet {x | p x}) (ht : MeasurableSet {x | q x}) : MeasurableSet {x | p x ↔ q x}`
From the LeanBandits project.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
14/0 |
Mathlib/MeasureTheory/MeasurableSpace/Defs.lean |
1 |
3 |
['EtienneC30', 'github-actions'] |
nobody |
0-72200 20 hours ago |
0-72200 20 hours ago |
1-66139 1 day |
| 31544 |
RemyDegenne author:RemyDegenne |
feat: add `MeasureTheory.Measure.integrable_comp_iff` |
Necessary and sufficient condition for `Integrable f (κ ∘ₘ μ)`, integrability with respect to the composition of a kernel and a measure. Special case of `ProbabilityTheory.integrable_comp_iff`, which is about composition of two kernels.
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-measure-probability
|
8/0 |
Mathlib/Probability/Kernel/Composition/IntegralCompProd.lean |
1 |
2 |
['EtienneC30', 'github-actions'] |
nobody |
0-68424 19 hours ago |
0-68424 18 hours ago |
1-67821 1 day |
| 31451 |
jsm28 author:jsm28 |
feat(Analysis/Convex/Combination): `centerMass_const`, `centerMass_congr` |
Add the lemma:
```lean
lemma Finset.centerMass_const (hw : ∑ j ∈ t, w j ≠ 0) (c : E) :
t.centerMass w (Function.const _ c) = c := by
```
along with various congruence lemmas that help with applying this in cases where the points are constant for the nonzero weights in `t`, but not necessarily everywhere.
---
[](https://gitpod.io/from-referrer/)
|
t-convex-geometry
maintainer-merge
t-analysis
|
28/0 |
Mathlib/Analysis/Convex/Combination.lean |
1 |
4 |
['Ruben-VandeVelde', 'github-actions', 'j-loreaux', 'jsm28'] |
nobody |
0-67831 18 hours ago |
0-67831 18 hours ago |
3-83397 3 days |
| 31493 |
jsm28 author:jsm28 |
feat(Geometry/Euclidean/Incenter): `incenter_mem_interior` |
Add a direct statement that the incenter of a simplex lies in its interior (along with factoring out a lemma `excenterWeights_empty_pos` that turns out to be useful several times in its proof).
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-euclidean-geometry
|
21/2 |
Mathlib/Geometry/Euclidean/Incenter.lean |
1 |
3 |
['Ruben-VandeVelde', 'github-actions'] |
nobody |
0-66742 18 hours ago |
0-67589 18 hours ago |
3-17595 3 days |
| 30913 |
eric-wieser author:eric-wieser |
feat(Computability/Language): add subtraction notation |
Defining `-` as set difference seems like a natural thing to do when `+` is set union.
The fact that this definition satisfies `OrderedSub` seems to be a good signal that it is a good idea.
---
- [x] depends on: #30912
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-computability
|
22/0 |
Mathlib/Computability/Language.lean |
1 |
9 |
['YaelDillies', 'chenson2018', 'ctchou', 'eric-wieser', 'github-actions', 'jessealama', 'mathlib4-dependent-issues-bot'] |
nobody |
0-31202 8 hours ago |
7-64152 7 days ago |
14-26182 14 days |
| 31510 |
JovanGerb author:JovanGerb |
feat(contrapose): cancel negations, and support `↔` |
This PR introduces two features for `contrapose`:
- `contrapose` applied to a goal `p ↔ q` creates the goal `¬p ↔ ¬q`.
- Instead of creating double negations, contrapose will try to cancel out double negations that it creates.
This will allow for replacing some occurrences of `contrapose!` with `contrapose` (TODO: write a linter for this?). It also allows avoiding classical logic in some cases.
[Zulip discussion](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/RFC.3A.20contrapose.20for.20.60a.20.E2.86.94.20b.60/with/554945103)
---
[](https://gitpod.io/from-referrer/)
|
maintainer-merge
t-meta
|
172/18 |
Mathlib/LinearAlgebra/LinearIndependent/Lemmas.lean,Mathlib/LinearAlgebra/RootSystem/GeckConstruction/Semisimple.lean,Mathlib/RingTheory/Localization/Integral.lean,Mathlib/RingTheory/Valuation/ValuationRing.lean,Mathlib/Tactic/Contrapose.lean,MathlibTest/Contrapose.lean |
6 |
21 |
['JovanGerb', 'github-actions', 'grunweg', 'leanprover-bot'] |
nobody |
0-29087 8 hours ago |
1-65246 1 day ago |
1-78029 1 day |
| 31149 |
riccardobrasca author:riccardobrasca |
feat: power series over a noetherian ring is noetherian |
We add that the power series ring over a noetherian ring is noetherian.
---
[](https://gitpod.io/from-referrer/)
|
t-ring-theory
maintainer-merge
|
287/3 |
Mathlib.lean,Mathlib/Algebra/Module/SpanRank.lean,Mathlib/RingTheory/PowerSeries/Ideal.lean,Mathlib/RingTheory/PowerSeries/Trunc.lean,docs/references.bib |
5 |
40 |
['copilot-pull-request-reviewer', 'erdOne', 'github-actions', 'riccardobrasca', 'yapudpill'] |
erdOne assignee:erdOne |
0-21703 6 hours ago |
4-31644 4 days ago |
10-81556 10 days |
| 31384 |
harahu author:harahu |
doc(Archive): ensure only a single H1 header per file |
This PR ensures we only have a single H1 header per lean file in the Archive subdirectory. We do this for the following reasons:
- Having more than one H1 header per file is likely to hamper both assistive technologies and SEO, since it introduces ambiguity about what the title of the resulting webpage actually is.
- The [documentation style guide](https://leanprover-community.github.io/contribute/doc.html) asks for the title of the file to be H1, any other header in the file-level docstring to be H2, and sectioning headers to be H3.
---
[](https://gitpod.io/from-referrer/)
|
IMO
maintainer-merge
|
16/16 |
Archive/Imo/Imo1975Q1.lean,Archive/Imo/Imo1985Q2.lean,Archive/Imo/Imo1994Q1.lean,Archive/Imo/Imo1997Q3.lean,Archive/Imo/Imo2001Q3.lean,Archive/Imo/Imo2001Q4.lean,Archive/Imo/Imo2001Q5.lean,Archive/Imo/Imo2005Q3.lean,Archive/Imo/Imo2008Q2.lean,Archive/Imo/Imo2008Q3.lean,Archive/Imo/Imo2008Q4.lean,Archive/Imo/Imo2011Q3.lean,Archive/Imo/Imo2013Q1.lean,Archive/Imo/Imo2013Q5.lean,Archive/Imo/Imo2015Q6.lean,Archive/Imo/Imo2021Q1.lean |
16 |
3 |
['github-actions', 'jsm28'] |
jsm28 assignee:jsm28 |
0-21434 5 hours ago |
0-21434 5 hours ago |
5-49999 5 days |
| Number |
Author |
Title |
Description |
Labels |
+/- |
Modified files (first 100) |
📝 |
💬 |
All users who commented or reviewed |
Assignee(s) |
Updated |
Last status change |
total time in review |
| 15649 |
TpmKranz author:TpmKranz |
feat(Computability): introduce Generalised NFA as bridge to Regular Expression |
Lays the groundwork for a proof of equivalence of NFA and RE, w.r.t. described language. Actual connection to NFA comes later, after the groundwork for the opposite direction has been laid.
Second chunk of #12648
---
- [x] depends on: #15647 [Data.FinEnum.Option unchanged since then]
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
awaiting-author
|
298/0 |
Mathlib.lean,Mathlib/Computability/GNFA.lean,Mathlib/Computability/Language.lean,Mathlib/Computability/RegularExpressions.lean,docs/references.bib |
5 |
6 |
['github-actions', 'mathlib4-dependent-issues-bot', 'meithecatte', 'trivial1711'] |
nobody |
192-30873 6 months ago |
192-30882 6 months ago |
23-54870 23 days |
| 20648 |
anthonyde author:anthonyde |
feat: formalize regular expression -> εNFA |
The file `Computability/RegularExpressionsToEpsilonNFA.lean` contains a formal definition of Thompson's method for constructing an `εNFA` from a `RegularExpression` and a proof of its correctness.
---
- [x] depends on: #20644
- [x] depends on: #20645
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
|
490/0 |
Mathlib.lean,Mathlib/Computability/RegularExpressionsToEpsilonNFA.lean,docs/references.bib |
3 |
5 |
['github-actions', 'mathlib4-dependent-issues-bot', 'meithecatte', 'qawbecrdtey'] |
nobody |
192-30184 6 months ago |
192-30819 6 months ago |
75-77754 75 days |
| 20238 |
maemre author:maemre |
feat(Computability/DFA): Closure of regular languages under some set operations |
This shows that regular languages are closed under complement and intersection by constructing DFAs for them.
---
Closure under all other operations will be proved when someone adds the proof for DFA<->regular expression equivalence, so they are not part of this PR.
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
awaiting-author
|
159/0 |
Mathlib/Computability/DFA.lean,Mathlib/Computability/Language.lean |
2 |
59 |
['EtienneC30', 'YaelDillies', 'github-actions', 'maemre', 'meithecatte', 'urkud'] |
EtienneC30 assignee:EtienneC30 |
162-83044 5 months ago |
192-30783 6 months ago |
48-67492 48 days |
| 23929 |
meithecatte author:meithecatte |
feat(Computability/NFA): improve bound on pumping lemma |
---
- [x] depends on: #25321
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
|
101/10 |
Mathlib/Computability/EpsilonNFA.lean,Mathlib/Computability/NFA.lean |
2 |
41 |
['YaelDillies', 'github-actions', 'leanprover-community-bot-assistant', 'mathlib4-dependent-issues-bot', 'meithecatte'] |
nobody |
159-40435 5 months ago |
159-40436 5 months ago |
34-10595 34 days |
| 30526 |
SnirBroshi author:SnirBroshi |
chore(Logic/Relation): use `Subrelation` to state theorems |
chore(Logic/Relation): replace every `∀ x y, r x y → r' x y` with `Subrelation r r'`
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip |
79/73 |
Mathlib/CategoryTheory/IsConnected.lean,Mathlib/CategoryTheory/Limits/Types/Filtered.lean,Mathlib/CategoryTheory/Limits/Types/Shapes.lean,Mathlib/Data/Setoid/Basic.lean,Mathlib/GroupTheory/FreeGroup/Basic.lean,Mathlib/Logic/Relation.lean,Mathlib/Order/Interval/Finset/Basic.lean |
7 |
4 |
['SnirBroshi', 'github-actions', 'thorimur', 'vihdzp'] |
thorimur assignee:thorimur |
22-22221 22 days ago |
22-22254 22 days ago |
8-76821 8 days |
| 30668 |
astrainfinita author:astrainfinita |
feat: `QuotLike` |
This typeclass is primarily for use by type synonyms of `Quot` and `Quotient`. Using `QuotLike` API for type synonyms of `Quot` and `Quotient` will avoid defeq abuse caused by directly using `Quot` and `Quotient` APIs.
This PR also adds some typeclasses to support different ways to find the quotient map that should be used. See the documentation comments of these typeclasses for examples of usage.
---
It's not a typical design to use these auxiliary typeclasses and term elaborators, but I haven't found a better way to support these notations.
Some of the naming may need to be discussed. For example:
- `⟦·⟧` is currently called `mkQ` in names. This distinguishes it from other `.mk`s and makes it possible to write the quotient map as `mkQ` `mkQ'` `mkQ_ h`. But this will also require changing the old lemma names.
- It would be helpful if the names of new type classes explained their functionality better.
- Maybe `QuotLike` isn't the appropriate name. It may suggest that this typeclass is similar to `FunLike` and `SetLike`, but it is not.
[Zulip](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/migrate.20to.20.60QuotLike.60.20API)
This PR continues the work from #16421.
Original PR: https://github.com/leanprover-community/mathlib4/pull/16421 |
t-data
awaiting-zulip
RFC
awaiting-author
|
743/0 |
Mathlib.lean,Mathlib/Data/QuotLike.lean,MathlibTest/QuotLike.lean |
3 |
14 |
['YaelDillies', 'astrainfinita', 'github-actions', 'vihdzp'] |
nobody |
19-83057 19 days ago |
19-83057 19 days ago |
0-81 1 minute |
| 30902 |
adomani author:adomani |
chore: longLine warnings happen starting at the 101st character |
Right now, the longLine linter warning spans the whole line. This PR changes the behaviour and the warning only covers the characters exceeding the 100 character limit.
Previous discussion:
[#general > error lens in lean4 @ 💬](https://leanprover.zulipchat.com/#narrow/channel/113488-general/topic/error.20lens.20in.20lean4/near/547074537)
Specific thread:
[#mathlib4 > Restrict longLine warning to exceeding characters @ 💬](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/Restrict.20longLine.20warning.20to.20exceeding.20characters/near/547081669)
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-linter
|
1/1 |
Mathlib/Tactic/Linter/Style.lean |
1 |
1 |
['github-actions'] |
nobody |
19-36999 19 days ago |
19-37256 19 days ago |
0-132 2 minutes |
| 11800 |
JADekker author:JADekker |
feat : Define KappaLindelöf spaces |
Define KappaLindelöf spaces by following the first one-third of the API for Lindelöf spaces. The remainder will be added in a future PR.
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-topology
merge-conflict
please-adopt
|
301/2 |
Mathlib.lean,Mathlib/Topology/Compactness/KappaLindelof.lean,Mathlib/Topology/Compactness/Lindelof.lean |
3 |
38 |
['ADedecker', 'JADekker', 'PatrickMassot', 'StevenClontz', 'adomani', 'github-actions', 'grunweg', 'kim-em', 'urkud'] |
nobody |
424-7906 1 year ago |
424-29881 1 year ago |
119-10687 119 days |
| 17623 |
FR-vdash-bot author:FR-vdash-bot |
feat(Algebra/Order/GroupWithZero/Unbundled): add some lemmas |
Some lemmas in `Algebra.Order.GroupWithZero.Unbundled` have incorrect or unsatisfactory names, or assumptions that can be omitted using `ZeroLEOneClass`. The lemmas added in this PR are versions of existing lemmas that use the correct or better name or `ZeroLEOneClass` to omit an assumption. The original lemmas will be deprecated in #17593.
| New name | Old name |
|-------------------------|-------------------------|
| `mul_le_one_left₀` | `Left.mul_le_one_of_le_of_le` |
| `mul_lt_one_of_le_of_lt_left₀` (`0 ≤ ·` version) / `mul_lt_one_of_le_of_lt_of_pos_left` | `Left.mul_lt_of_le_of_lt_one_of_pos` |
| `mul_lt_one_of_lt_of_le_left₀` | `Left.mul_lt_of_lt_of_le_one_of_nonneg` |
| `mul_le_one_right₀` | `Right.mul_le_one_of_le_of_le` |
| `mul_lt_one_of_lt_of_le_right₀` (`0 ≤ ·` version) / `mul_lt_one_of_lt_of_le_of_pos_right` | `Right.mul_lt_one_of_lt_of_le_of_pos` |
| `mul_lt_one_of_le_of_lt_right₀` | `Right.mul_lt_one_of_le_of_lt_of_nonneg` |
The following lemmas use `ZeroLEOneClass`.
| New name | Old name |
|-------------------------|-------------------------|
| `(Left.)one_le_mul₀` | `Left.one_le_mul_of_le_of_le` |
| `Left.one_lt_mul_of_le_of_lt₀` | `Left.one_lt_mul_of_le_of_lt_of_pos` |
| `Left.one_lt_mul_of_lt_of_le₀` | `Left.lt_mul_of_lt_of_one_le_of_nonneg` / `one_lt_mul_of_lt_of_le` (still there) |
| `(Left.)one_lt_mul₀` | |
| `Right.one_le_mul₀` | `Right.one_le_mul_of_le_of_le` |
| `Right.one_lt_mul_of_lt_of_le₀` | `Right.one_lt_mul_of_lt_of_le_of_pos` |
| `Right.one_lt_mul_of_le_of_lt₀` | `Right.one_lt_mul_of_le_of_lt_of_nonneg` / `one_lt_mul_of_le_of_lt` (still there) / `one_lt_mul` (still there) |
| `Right.one_lt_mul₀` | `Right.one_lt_mul_of_lt_of_lt` |
---
Split from #17593.
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-order
t-algebra
merge-conflict
label:t-algebra$ |
146/44 |
Mathlib/Algebra/Order/GroupWithZero/Canonical.lean,Mathlib/Algebra/Order/GroupWithZero/Unbundled.lean |
2 |
11 |
['FR-vdash-bot', 'YaelDillies', 'github-actions', 'j-loreaux'] |
nobody |
358-67556 11 months ago |
358-67556 11 months ago |
33-64877 33 days |
| 8370 |
eric-wieser author:eric-wieser |
refactor(Analysis/NormedSpace/Exponential): remove the `𝕂` argument from `exp` |
This argument is still needed for almost all the lemmas, which means it can longer be found by unification.
We keep around `expSeries 𝕂 A`, as it's needed for talking about the radius of convergence over different base fields.
This is a prerequisite for #8372, as we can't merge the functions until they have the same interface.\
Zulip thread: [#mathlib4 > Real.exp @ 💬](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/Real.2Eexp/near/401602245)
---
[](https://gitpod.io/from-referrer/)
This is started from the mathport output on https://github.com/leanprover-community/mathlib/pull/19244 |
awaiting-zulip
t-analysis
merge-conflict
|
432/387 |
Mathlib/Analysis/CStarAlgebra/Exponential.lean,Mathlib/Analysis/CStarAlgebra/Spectrum.lean,Mathlib/Analysis/Normed/Algebra/Exponential.lean,Mathlib/Analysis/Normed/Algebra/MatrixExponential.lean,Mathlib/Analysis/Normed/Algebra/QuaternionExponential.lean,Mathlib/Analysis/Normed/Algebra/Spectrum.lean,Mathlib/Analysis/Normed/Algebra/TrivSqZeroExt.lean,Mathlib/Analysis/NormedSpace/DualNumber.lean,Mathlib/Analysis/SpecialFunctions/ContinuousFunctionalCalculus/ExpLog.lean,Mathlib/Analysis/SpecialFunctions/Exponential.lean,Mathlib/Analysis/SpecialFunctions/Trigonometric/Series.lean |
11 |
29 |
['YaelDillies', 'eric-wieser', 'girving', 'github-actions', 'j-loreaux', 'kbuzzard', 'leanprover-community-bot-assistant', 'urkud'] |
nobody |
203-22933 6 months ago |
214-51563 7 months ago |
29-60989 29 days |
| 17458 |
urkud author:urkud |
refactor(Algebra/Group): make `IsUnit` a typeclass |
Also change some lemmas to assume `[IsUnit _]` instead of `[Invertible _]`.
Motivated by potential non-defeq diamonds in #14986, see also [Zulip](https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Invertible.20and.20data)
I no longer plan to merge this PR, but I'm going to cherry-pick some changes to a new PR before closing this one.
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-algebra
merge-conflict
label:t-algebra$ |
82/72 |
Mathlib/Algebra/CharP/Invertible.lean,Mathlib/Algebra/Group/Invertible/Basic.lean,Mathlib/Algebra/Group/Units/Defs.lean,Mathlib/Algebra/GroupWithZero/Invertible.lean,Mathlib/Algebra/GroupWithZero/Units/Basic.lean,Mathlib/Algebra/Polynomial/Degree/Units.lean,Mathlib/Algebra/Polynomial/Splits.lean,Mathlib/Analysis/Convex/Segment.lean,Mathlib/Analysis/Normed/Affine/Isometry.lean,Mathlib/Analysis/Normed/Ring/Units.lean,Mathlib/CategoryTheory/Linear/Basic.lean,Mathlib/FieldTheory/Finite/Basic.lean,Mathlib/FieldTheory/Separable.lean,Mathlib/FieldTheory/SeparableDegree.lean,Mathlib/GroupTheory/Submonoid/Inverses.lean,Mathlib/LinearAlgebra/AffineSpace/AffineEquiv.lean,Mathlib/LinearAlgebra/AffineSpace/Combination.lean,Mathlib/LinearAlgebra/CliffordAlgebra/Contraction.lean,Mathlib/LinearAlgebra/CliffordAlgebra/Inversion.lean,Mathlib/LinearAlgebra/CliffordAlgebra/SpinGroup.lean,Mathlib/LinearAlgebra/Eigenspace/Minpoly.lean,Mathlib/NumberTheory/MulChar/Basic.lean,Mathlib/RingTheory/Localization/NumDen.lean,Mathlib/RingTheory/Polynomial/Content.lean,Mathlib/RingTheory/Polynomial/GaussLemma.lean,Mathlib/RingTheory/Valuation/Basic.lean |
26 |
12 |
['MichaelStollBayreuth', 'acmepjz', 'eric-wieser', 'github-actions', 'leanprover-bot', 'leanprover-community-bot-assistant', 'urkud'] |
nobody |
132-11182 4 months ago |
132-11182 4 months ago |
0-66650 18 hours |
| 25218 |
kckennylau author:kckennylau |
feat(AlgebraicGeometry): Tate normal form of elliptic curves |
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
new-contributor
t-algebraic-geometry
merge-conflict
|
291/26 |
Mathlib.lean,Mathlib/AlgebraicGeometry/EllipticCurve/IsomOfJ.lean,Mathlib/AlgebraicGeometry/EllipticCurve/Modular/TateNormalForm.lean,Mathlib/AlgebraicGeometry/EllipticCurve/NormalForms.lean,Mathlib/AlgebraicGeometry/EllipticCurve/VariableChange.lean |
5 |
31 |
['MichaelStollBayreuth', 'Multramate', 'acmepjz', 'github-actions', 'grunweg', 'kckennylau', 'leanprover-community-bot-assistant'] |
nobody |
132-10020 4 months ago |
132-10021 4 months ago |
6-51040 6 days |
| 28803 |
astrainfinita author:astrainfinita |
refactor: unbundle algebra from `ENormed*` |
Further speed up the search in the algebraic typeclass hierarchy by avoiding searching for `TopologicalSpace`.
This PR continues the work from #23961.
- Change `ESeminormed(Add)Monoid` and `ENormed(Add)Monoid` so they no longer carry algebraic data.
- Deprecate `ESeminormed(Add)CommMonoid` and `ENormed(Add)CommMonoid` in favor of `ESeminormed(Add)Monoid` and `ENormed(Add)Monoid` with a commutative algebraic typeclass.
|Old|New|
|---|---|
| `[ESeminormed(Add)(Comm)Monoid E]` | `[(Add)(Comm)Monoid E] [ESeminormed(Add)Monoid E]` |
| `[ENormed(Add)(Comm)Monoid]` | `[(Add)(Comm)Monoid E] [ENormed(Add)Monoid]` |
See [Zulip discussion](https://leanprover.zulipchat.com/#narrow/channel/144837-PR-reviews/topic/.2328803.20refactor.3A.20unbundle.20algebra.20from.20.60ENormed*.60/with/536024350)
------------
- [x] depends on: #28813 |
awaiting-zulip
slow-typeclass-synthesis
t-algebra
t-analysis
merge-conflict
label:t-algebra$ |
80/63 |
Mathlib/Analysis/CStarAlgebra/CStarMatrix.lean,Mathlib/Analysis/Normed/Group/Basic.lean,Mathlib/Analysis/Normed/Group/Continuity.lean,Mathlib/Analysis/Normed/Group/InfiniteSum.lean,Mathlib/Analysis/NormedSpace/IndicatorFunction.lean,Mathlib/MeasureTheory/Function/L1Space/AEEqFun.lean,Mathlib/MeasureTheory/Function/L1Space/HasFiniteIntegral.lean,Mathlib/MeasureTheory/Function/L1Space/Integrable.lean,Mathlib/MeasureTheory/Function/LocallyIntegrable.lean,Mathlib/MeasureTheory/Function/LpSeminorm/Basic.lean,Mathlib/MeasureTheory/Function/LpSeminorm/CompareExp.lean,Mathlib/MeasureTheory/Function/LpSeminorm/TriangleInequality.lean,Mathlib/MeasureTheory/Integral/IntegrableOn.lean,Mathlib/MeasureTheory/Integral/IntervalIntegral/Basic.lean |
14 |
28 |
['astrainfinita', 'bryangingechen', 'github-actions', 'grunweg', 'kbuzzard', 'leanprover-bot', 'leanprover-community-mathlib4-bot', 'mathlib-bors', 'mathlib4-dependent-issues-bot', 'mathlib4-merge-conflict-bot', 'sgouezel'] |
grunweg assignee:grunweg |
72-25665 2 months ago |
72-25666 2 months ago |
0-20585 5 hours |
| 28925 |
grunweg author:grunweg |
chore: remove `linear_combination'` tactic |
When `linear_combination` was refactored in #15899, the old code was kept as the `linear_combination'` tactic, for easier migration. The consensus of the zulip discussion ([#mathlib4 > Narrowing the scope of `linear_combination` @ 💬](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/Narrowing.20the.20scope.20of.20.60linear_combination.60/near/470237816)) was to wait, and "revisit this once people have experienced the various tactics in practice".
One year later, the old tactic has almost no uses: it is unused in mathlib; [searching on github](https://github.com/search?q=linear_combination%27%20path%3A*.lean&type=code) yields 37 hits --- all of which are in various forks of mathlib. Thus, removing this tactic seems appropriate.
---
Do not merge before the zulip discussion has concluded!
[](https://gitpod.io/from-referrer/)
|
file-removed
awaiting-zulip
merge-conflict
|
0/564 |
Mathlib.lean,Mathlib/Tactic.lean,Mathlib/Tactic/LinearCombination'.lean,Mathlib/Tactic/Linter/UnusedTactic.lean,MathlibTest/linear_combination'.lean |
5 |
4 |
['euprunin', 'github-actions', 'grunweg', 'mathlib4-merge-conflict-bot'] |
nobody |
29-2875 29 days ago |
29-2876 29 days ago |
0-1 1 second |
| 22361 |
rudynicolop author:rudynicolop |
feat(Computability/NFA): nfa closure properties |
Add the closure properties union, intersection and reversal for NFA.
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
merge-conflict
awaiting-author
|
218/2 |
Mathlib/Computability/Language.lean,Mathlib/Computability/NFA.lean |
2 |
91 |
['EtienneC30', 'b-mehta', 'ctchou', 'github-actions', 'leanprover-community-bot-assistant', 'meithecatte', 'rudynicolop'] |
EtienneC30 assignee:EtienneC30 |
10-12565 10 days ago |
178-52515 5 months ago |
39-67601 39 days |
| 30150 |
imbrem author:imbrem |
feat(CategoryTheory/Monoidal): to_additive for MonoidalCategory |
Add `AddMonoidalCategory`, the additive version of `MonoidalCategory`.
To get this to work, I needed to _remove_ the `to_additive` attributes in `Discrete.lean`, since existing code relies on the `AddMonoid M → MonoidalCategory M` instance. For now, we simply implement the additive variants by hand instead.
---
As discussed in #28718; I added an `AddMonoidalCategory` struct and tagged `MonoidalCategory` with `to_additive`, along with the lemmas in `Category.lean`.
I think this is the right approach, since under this framework the "correct" additive version of `Discrete.lean` would be mapping an `AddMonoid` to an `AddMonoidalCategory`.
Next steps would be to:
- Make `monoidal_coherence` and `coherence` support `AddMonoidalCategory`
- Add `CocartesianMonoidalCategory` extending `AddMonoidalCategory`
[](https://gitpod.io/from-referrer/)
|
large-import
awaiting-zulip
new-contributor
t-category-theory
t-meta
merge-conflict
|
444/125 |
Mathlib/CategoryTheory/Monoidal/Category.lean,Mathlib/CategoryTheory/Monoidal/Discrete.lean,Mathlib/Tactic/ToAdditive/GuessName.lean |
3 |
22 |
['JovanGerb', 'YaelDillies', 'github-actions', 'imbrem', 'mathlib4-merge-conflict-bot'] |
nobody |
1-13749 1 day ago |
1-13749 1 day ago |
1-18384 1 day |
| 15651 |
TpmKranz author:TpmKranz |
feat(Computability/NFA): operations for Thompson's construction |
Lays the groundwork for a proof of equivalence of RE and NFA, w.r.t. described language. Actual connection to REs comes later, after the groundwork for the opposite direction has been laid.
Third chunk of #12648
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
merge-conflict
awaiting-author
|
307/5 |
Mathlib/Computability/NFA.lean |
1 |
15 |
['TpmKranz', 'YaelDillies', 'dupuisf', 'github-actions', 'leanprover-community-bot-assistant', 'meithecatte'] |
nobody |
0-23482 6 hours ago |
178-53440 5 months ago |
45-84611 45 days |
| 24614 |
JovanGerb author:JovanGerb |
chore: rename field `inf` to `min` in `Lattice` |
As suggested by @eric-wieser, this PR renames the `sup` and `inf` fields in `Lattice` to `max` and `min`. This means that we now can extend `Lattice` and `LinearOrder` simultaneously without ending up with duplicate fields. This should be implemented in a future PR for existing classes like `CompleteLinearOrder`.
[Zulip discussion](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/.60sup.60.2F.60inf.60.20or.20.60max.60.2F.60min.60.20for.20set.20interval.20lemmas.3F)
---
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-order
merge-conflict
|
181/187 |
Mathlib/Algebra/Field/Subfield/Basic.lean,Mathlib/Algebra/Group/Subgroup/Lattice.lean,Mathlib/Algebra/Group/Submonoid/Basic.lean,Mathlib/Algebra/Group/Subsemigroup/Basic.lean,Mathlib/Algebra/Lie/Subalgebra.lean,Mathlib/Algebra/Module/Submodule/Lattice.lean,Mathlib/Algebra/Order/GroupWithZero/Canonical.lean,Mathlib/Algebra/Order/Kleene.lean,Mathlib/Algebra/Order/Ring/Idempotent.lean,Mathlib/Algebra/Ring/Subring/Basic.lean,Mathlib/Algebra/Ring/Subsemiring/Basic.lean,Mathlib/Algebra/Tropical/Lattice.lean,Mathlib/AlgebraicGeometry/IdealSheaf/Basic.lean,Mathlib/Analysis/BoxIntegral/Box/Basic.lean,Mathlib/Analysis/BoxIntegral/Partition/Basic.lean,Mathlib/Analysis/Convex/SimplicialComplex/Basic.lean,Mathlib/Analysis/Normed/Group/Seminorm.lean,Mathlib/Analysis/NormedSpace/ENormedSpace.lean,Mathlib/Analysis/NormedSpace/MStructure.lean,Mathlib/Analysis/Seminorm.lean,Mathlib/CategoryTheory/Groupoid/Subgroupoid.lean,Mathlib/CategoryTheory/Sites/Coverage.lean,Mathlib/CategoryTheory/Sites/Grothendieck.lean,Mathlib/CategoryTheory/Sites/Pretopology.lean,Mathlib/CategoryTheory/Sites/Sieves.lean,Mathlib/CategoryTheory/Subobject/Lattice.lean,Mathlib/CategoryTheory/Subpresheaf/Basic.lean,Mathlib/Combinatorics/Digraph/Basic.lean,Mathlib/Combinatorics/SimpleGraph/Basic.lean,Mathlib/Combinatorics/SimpleGraph/Subgraph.lean,Mathlib/Computability/Reduce.lean,Mathlib/Data/DFinsupp/Order.lean,Mathlib/Data/Finset/Lattice/Basic.lean,Mathlib/Data/Multiset/UnionInter.lean,Mathlib/Data/Nat/PartENat.lean,Mathlib/Data/PEquiv.lean,Mathlib/Data/Real/Basic.lean,Mathlib/Data/Semiquot.lean,Mathlib/Data/Set/Basic.lean,Mathlib/Data/Setoid/Basic.lean,Mathlib/Data/Sum/Lattice.lean,Mathlib/Dynamics/Circle/RotationNumber/TranslationNumber.lean,Mathlib/Geometry/Manifold/ChartedSpace.lean,Mathlib/GroupTheory/Congruence/Defs.lean,Mathlib/LinearAlgebra/AffineSpace/AffineSubspace/Defs.lean,Mathlib/LinearAlgebra/LinearPMap.lean,Mathlib/MeasureTheory/Function/AEEqFun.lean,Mathlib/MeasureTheory/Function/SimpleFunc.lean,Mathlib/ModelTheory/Substructures.lean,Mathlib/Order/BooleanSubalgebra.lean,Mathlib/Order/Booleanisation.lean,Mathlib/Order/CompleteLattice/Defs.lean,Mathlib/Order/Concept.lean,Mathlib/Order/ConditionallyCompleteLattice/Defs.lean,Mathlib/Order/Copy.lean,Mathlib/Order/Filter/Basic.lean,Mathlib/Order/Filter/Germ/Basic.lean,Mathlib/Order/FixedPoints.lean,Mathlib/Order/GaloisConnection/Basic.lean,Mathlib/Order/Heyting/Basic.lean,Mathlib/Order/Hom/Order.lean,Mathlib/Order/Ideal.lean,Mathlib/Order/Interval/Basic.lean,Mathlib/Order/Lattice.lean,Mathlib/Order/Partition/Finpartition.lean,Mathlib/Order/Preorder/Finsupp.lean,Mathlib/Order/PropInstances.lean,Mathlib/Order/Sublattice.lean,Mathlib/Order/WithBot.lean,Mathlib/Probability/Process/Filtration.lean,Mathlib/RingTheory/Congruence/Basic.lean,Mathlib/RingTheory/Finiteness/Basic.lean,Mathlib/RingTheory/Finiteness/Small.lean,Mathlib/RingTheory/NonUnitalSubring/Basic.lean,Mathlib/RingTheory/NonUnitalSubsemiring/Basic.lean,Mathlib/RingTheory/TwoSidedIdeal/Lattice.lean,Mathlib/RingTheory/UniqueFactorizationDomain/FactorSet.lean,Mathlib/RingTheory/Valuation/ValuationSubring.lean,Mathlib/Topology/Algebra/Group/GroupTopology.lean,Mathlib/Topology/Algebra/Module/ClosedSubmodule.lean,Mathlib/Topology/Category/TopCat/OpenNhds.lean,Mathlib/Topology/LocallyFinsupp.lean,Mathlib/Topology/MetricSpace/BundledFun.lean,Mathlib/Topology/UniformSpace/Basic.lean |
84 |
15 |
['JovanGerb', 'bryangingechen', 'eric-wieser', 'github-actions', 'j-loreaux', 'leanprover-bot', 'leanprover-community-bot-assistant', 'leanprover-community-mathlib4-bot'] |
Vierkantor assignee:Vierkantor |
0-13531 3 hours ago |
2-31932 2 days ago |
24-8021 24 days |
| 17518 |
grunweg author:grunweg |
feat: lint on declarations mentioning `Invertible` or `Unique` |
Using the same infrastructure as for #10235. Depends on that PR to land first, and also (for the first lint) a zulip discussion if that change is desired/about the best way to enact it.
---
- [ ] depends on: #10235 |
awaiting-zulip
t-linter
merge-conflict
blocked-by-other-PR
|
149/7 |
Mathlib.lean,Mathlib/Algebra/MvPolynomial/PDeriv.lean,Mathlib/Computability/Halting.lean,Mathlib/Computability/TuringMachine.lean,Mathlib/Data/Fintype/Card.lean,Mathlib/GroupTheory/Perm/DomMulAct.lean,Mathlib/Logic/Basic.lean,Mathlib/Logic/Encodable/Basic.lean,Mathlib/NumberTheory/JacobiSum/Basic.lean,Mathlib/Order/Heyting/Regular.lean,Mathlib/RingTheory/MvPolynomial/Symmetric/FundamentalTheorem.lean,Mathlib/Tactic.lean,Mathlib/Tactic/Linter/UnusedAssumptionInType.lean |
13 |
3 |
['github-actions', 'mathlib4-dependent-issues-bot', 'mergify'] |
nobody |
376-48025 1 year ago |
402-36547 1 year ago* |
0-0 0 seconds* |
| 15654 |
TpmKranz author:TpmKranz |
feat(Computability): language-preserving maps between NFA and RE |
Map REs to NFAs via Thompson's construction and NFAs to REs using GNFAs
Last chunk of #12648
---
- [ ] depends on: #15651
- [ ] depends on: #15649
[](https://gitpod.io/from-referrer/)
|
awaiting-zulip
t-computability
new-contributor
merge-conflict
blocked-by-other-PR
|
985/2 |
Mathlib.lean,Mathlib/Computability/GNFA.lean,Mathlib/Computability/Language.lean,Mathlib/Computability/NFA.lean,Mathlib/Computability/RegularExpressions.lean,Mathlib/Data/FinEnum/Option.lean,docs/references.bib |
7 |
3 |
['github-actions', 'leanprover-community-mathlib4-bot', 'meithecatte'] |
nobody |
192-30833 6 months ago |
192-30838 6 months ago |
0-179 2 minutes |