data.set.pointwise.finiteMathlib.Data.Set.Pointwise.Finite

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

feat(data/set/finite): When s ×ˢ t is finite (#18674)

The one non-trivial result is infinite_image2, because it requires only injectivity of the f a and λ a, f a b rather than of the uncurrying of f.

Diff
@@ -6,10 +6,12 @@ Authors: Johan Commelin, Floris van Doorn
 import data.set.finite
 import data.set.pointwise.smul
 
-/-! # Finiteness lemmas for pointwise operations on sets 
+/-!
+# Finiteness lemmas for pointwise operations on sets
 
 > THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
-> Any changes to this file require a corresponding PR to mathlib4.-/
+> Any changes to this file require a corresponding PR to mathlib4.
+-/
 
 open_locale pointwise
 
@@ -74,6 +76,7 @@ section has_smul_set
 variables [has_smul α β] {s : set β} {a : α}
 
 @[to_additive] lemma finite.smul_set : s.finite → (a • s).finite := finite.image _
+@[to_additive] lemma infinite.of_smul_set : (a • s).infinite → s.infinite := infinite.of_image _
 
 end has_smul_set
 
@@ -85,6 +88,30 @@ lemma finite.vsub (hs : s.finite) (ht : t.finite) : set.finite (s -ᵥ t) := hs.
 
 end vsub
 
+section cancel
+variables [has_mul α] [is_left_cancel_mul α] [is_right_cancel_mul α] {s t : set α}
+
+@[to_additive] lemma infinite_mul :
+  (s * t).infinite ↔ s.infinite ∧ t.nonempty ∨ t.infinite ∧ s.nonempty :=
+infinite_image2 (λ _ _, (mul_left_injective _).inj_on _) (λ _ _, (mul_right_injective _).inj_on _)
+
+end cancel
+
+section group
+variables [group α] [mul_action α β] {a : α} {s : set β}
+
+@[simp, to_additive] lemma finite_smul_set : (a • s).finite ↔ s.finite :=
+finite_image_iff $ (mul_action.injective _).inj_on _
+
+@[simp, to_additive] lemma infinite_smul_set : (a • s).infinite ↔ s.infinite :=
+infinite_image_iff $ (mul_action.injective _).inj_on _
+
+alias finite_smul_set ↔ finite.of_smul_set _
+alias infinite_smul_set ↔ _ infinite.smul_set
+
+attribute [to_additive] finite.of_smul_set infinite.smul_set
+
+end group
 end set
 
 open set

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

feat(data/finset/pointwise): s ∩ t * s ∪ t ⊆ s * t (#17961)

and distributivity of set.to_finset/set.finite.to_finset over algebraic operations.

Diff
@@ -16,6 +16,12 @@ open_locale pointwise
 variables {F α β γ : Type*}
 
 namespace set
+section has_one
+variables [has_one α]
+
+@[simp, to_additive] lemma finite_one : (1 : set α).finite := finite_singleton _
+
+end has_one
 
 section has_involutive_inv
 variables [has_involutive_inv α] {s : set α}

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(first ported)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 -/
 import Data.Set.Finite
-import Data.Set.Pointwise.Smul
+import Data.Set.Pointwise.SMul
 
 #align_import data.set.pointwise.finite from "leanprover-community/mathlib"@"c941bb9426d62e266612b6d99e6c9fc93e7a1d07"
 
@@ -91,7 +91,7 @@ instance decidableMemPow [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)
     DecidablePred (· ∈ s ^ n) := by
   induction' n with n ih
   · simp_rw [pow_zero, mem_one]; infer_instance
-  · letI := ih; rw [pow_succ]; infer_instance
+  · letI := ih; rw [pow_succ']; infer_instance
 #align set.decidable_mem_pow Set.decidableMemPow
 #align set.decidable_mem_nsmul Set.decidableMemNSMul
 -/
@@ -225,7 +225,7 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
   · refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
     · exact mul_subset_mul (set.singleton_subset_iff.mpr ha) Set.Subset.rfl
     · convert key a (S ^ n) ({a} * S ^ n) fun b hb => Set.mul_mem_mul (Set.mem_singleton a) hb
-  rw [pow_succ', ← h, mul_assoc, ← pow_succ', h]
+  rw [pow_succ, ← h, mul_assoc, ← pow_succ, h]
   rintro _ ⟨b, c, hb, hc, rfl⟩
   rwa [set.mem_singleton_iff.mp hb, inv_mul_cancel_left]
 #align group.card_pow_eq_card_pow_card_univ Group.card_pow_eq_card_pow_card_univ
Diff
@@ -3,8 +3,8 @@ Copyright (c) 2019 Johan Commelin. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 -/
-import Mathbin.Data.Set.Finite
-import Mathbin.Data.Set.Pointwise.Smul
+import Data.Set.Finite
+import Data.Set.Pointwise.Smul
 
 #align_import data.set.pointwise.finite from "leanprover-community/mathlib"@"c941bb9426d62e266612b6d99e6c9fc93e7a1d07"
 
Diff
@@ -181,10 +181,10 @@ theorem infinite_smul_set : (a • s).Infinite ↔ s.Infinite :=
 #align set.infinite_vadd_set Set.infinite_vadd_set
 -/
 
-alias finite_smul_set ↔ finite.of_smul_set _
+alias ⟨finite.of_smul_set, _⟩ := finite_smul_set
 #align set.finite.of_smul_set Set.Finite.of_smul_set
 
-alias infinite_smul_set ↔ _ infinite.smul_set
+alias ⟨_, infinite.smul_set⟩ := infinite_smul_set
 #align set.infinite.smul_set Set.Infinite.smul_set
 
 attribute [to_additive] finite.of_smul_set infinite.smul_set
Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2019 Johan Commelin. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
-
-! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit c941bb9426d62e266612b6d99e6c9fc93e7a1d07
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Data.Set.Finite
 import Mathbin.Data.Set.Pointwise.Smul
 
+#align_import data.set.pointwise.finite from "leanprover-community/mathlib"@"c941bb9426d62e266612b6d99e6c9fc93e7a1d07"
+
 /-!
 # Finiteness lemmas for pointwise operations on sets
 
Diff
@@ -43,11 +43,13 @@ section InvolutiveInv
 
 variable [InvolutiveInv α] {s : Set α}
 
+#print Set.Finite.inv /-
 @[to_additive]
 theorem Finite.inv (hs : s.Finite) : s⁻¹.Finite :=
   hs.Preimage <| inv_injective.InjOn _
 #align set.finite.inv Set.Finite.inv
 #align set.finite.neg Set.Finite.neg
+-/
 
 end InvolutiveInv
 
@@ -78,12 +80,15 @@ section Monoid
 
 variable [Monoid α] {s t : Set α}
 
+#print Set.decidableMemMul /-
 @[to_additive]
 instance decidableMemMul [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)]
     [DecidablePred (· ∈ t)] : DecidablePred (· ∈ s * t) := fun _ => decidable_of_iff _ mem_mul.symm
 #align set.decidable_mem_mul Set.decidableMemMul
 #align set.decidable_mem_add Set.decidableMemAdd
+-/
 
+#print Set.decidableMemPow /-
 @[to_additive]
 instance decidableMemPow [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)] (n : ℕ) :
     DecidablePred (· ∈ s ^ n) := by
@@ -92,6 +97,7 @@ instance decidableMemPow [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)
   · letI := ih; rw [pow_succ]; infer_instance
 #align set.decidable_mem_pow Set.decidableMemPow
 #align set.decidable_mem_nsmul Set.decidableMemNSMul
+-/
 
 end Monoid
 
@@ -99,11 +105,13 @@ section SMul
 
 variable [SMul α β] {s : Set α} {t : Set β}
 
+#print Set.Finite.smul /-
 @[to_additive]
 theorem Finite.smul : s.Finite → t.Finite → (s • t).Finite :=
   Finite.image2 _
 #align set.finite.smul Set.Finite.smul
 #align set.finite.vadd Set.Finite.vadd
+-/
 
 end SMul
 
@@ -133,8 +141,6 @@ section Vsub
 
 variable [VSub α β] {s t : Set β}
 
-include α
-
 #print Set.Finite.vsub /-
 theorem Finite.vsub (hs : s.Finite) (ht : t.Finite) : Set.Finite (s -ᵥ t) :=
   hs.image2 _ ht
@@ -196,6 +202,7 @@ namespace Group
 
 variable {G : Type _} [Group G] [Fintype G] (S : Set G)
 
+#print Group.card_pow_eq_card_pow_card_univ /-
 @[to_additive]
 theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k)] :
     ∀ k, Fintype.card G ≤ k → Fintype.card ↥(S ^ k) = Fintype.card ↥(S ^ Fintype.card G) :=
@@ -226,6 +233,7 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
   rwa [set.mem_singleton_iff.mp hb, inv_mul_cancel_left]
 #align group.card_pow_eq_card_pow_card_univ Group.card_pow_eq_card_pow_card_univ
 #align add_group.card_nsmul_eq_card_nsmul_card_univ AddGroup.card_nsmul_eq_card_nsmul_card_univ
+-/
 
 end Group
 
Diff
@@ -213,8 +213,9 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     exact Subtype.ext (mul_left_cancel (subtype.ext_iff.mp hbc))
   have mono : Monotone (fun n => Fintype.card ↥(S ^ n) : ℕ → ℕ) :=
     monotone_nat_of_le_succ fun n => key a _ _ fun b hb => Set.mul_mem_mul ha hb
-  convert card_pow_eq_card_pow_card_univ_aux mono (fun n => set_fintype_card_le_univ (S ^ n))
-      fun n h => le_antisymm (mono (n + 1).le_succ) (key a⁻¹ _ _ _)
+  convert
+    card_pow_eq_card_pow_card_univ_aux mono (fun n => set_fintype_card_le_univ (S ^ n)) fun n h =>
+      le_antisymm (mono (n + 1).le_succ) (key a⁻¹ _ _ _)
   · simp only [Finset.filter_congr_decidable, Fintype.card_ofFinset]
   replace h : {a} * S ^ n = S ^ (n + 1)
   · refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
Diff
@@ -215,7 +215,7 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     monotone_nat_of_le_succ fun n => key a _ _ fun b hb => Set.mul_mem_mul ha hb
   convert card_pow_eq_card_pow_card_univ_aux mono (fun n => set_fintype_card_le_univ (S ^ n))
       fun n h => le_antisymm (mono (n + 1).le_succ) (key a⁻¹ _ _ _)
-  · simp only [[anonymous], Fintype.card_ofFinset]
+  · simp only [Finset.filter_congr_decidable, Fintype.card_ofFinset]
   replace h : {a} * S ^ n = S ^ (n + 1)
   · refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
     · exact mul_subset_mul (set.singleton_subset_iff.mpr ha) Set.Subset.rfl
Diff
@@ -19,7 +19,7 @@ import Mathbin.Data.Set.Pointwise.Smul
 -/
 
 
-open Pointwise
+open scoped Pointwise
 
 variable {F α β γ : Type _}
 
Diff
@@ -43,12 +43,6 @@ section InvolutiveInv
 
 variable [InvolutiveInv α] {s : Set α}
 
-/- warning: set.finite.inv -> Set.Finite.inv is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} [_inst_1 : InvolutiveInv.{u1} α] {s : Set.{u1} α}, (Set.Finite.{u1} α s) -> (Set.Finite.{u1} α (Inv.inv.{u1} (Set.{u1} α) (Set.inv.{u1} α (InvolutiveInv.toHasInv.{u1} α _inst_1)) s))
-but is expected to have type
-  forall {α : Type.{u1}} [_inst_1 : InvolutiveInv.{u1} α] {s : Set.{u1} α}, (Set.Finite.{u1} α s) -> (Set.Finite.{u1} α (Inv.inv.{u1} (Set.{u1} α) (Set.inv.{u1} α (InvolutiveInv.toInv.{u1} α _inst_1)) s))
-Case conversion may be inaccurate. Consider using '#align set.finite.inv Set.Finite.invₓ'. -/
 @[to_additive]
 theorem Finite.inv (hs : s.Finite) : s⁻¹.Finite :=
   hs.Preimage <| inv_injective.InjOn _
@@ -84,24 +78,12 @@ section Monoid
 
 variable [Monoid α] {s t : Set α}
 
-/- warning: set.decidable_mem_mul -> Set.decidableMemMul is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} [_inst_1 : Monoid.{u1} α] {s : Set.{u1} α} {t : Set.{u1} α} [_inst_2 : Fintype.{u1} α] [_inst_3 : DecidableEq.{succ u1} α] [_inst_4 : DecidablePred.{succ u1} α (fun (_x : α) => Membership.Mem.{u1, u1} α (Set.{u1} α) (Set.hasMem.{u1} α) _x s)] [_inst_5 : DecidablePred.{succ u1} α (fun (_x : α) => Membership.Mem.{u1, u1} α (Set.{u1} α) (Set.hasMem.{u1} α) _x t)], DecidablePred.{succ u1} α (fun (_x : α) => Membership.Mem.{u1, u1} α (Set.{u1} α) (Set.hasMem.{u1} α) _x (HMul.hMul.{u1, u1, u1} (Set.{u1} α) (Set.{u1} α) (Set.{u1} α) (instHMul.{u1} (Set.{u1} α) (Set.mul.{u1} α (MulOneClass.toHasMul.{u1} α (Monoid.toMulOneClass.{u1} α _inst_1)))) s t))
-but is expected to have type
-  forall {α : Type.{u1}} [_inst_1 : Monoid.{u1} α] {s : Set.{u1} α} {t : Set.{u1} α} [_inst_2 : Fintype.{u1} α] [_inst_3 : DecidableEq.{succ u1} α] [_inst_4 : DecidablePred.{succ u1} α (fun (_x : α) => Membership.mem.{u1, u1} α (Set.{u1} α) (Set.instMembershipSet.{u1} α) _x s)] [_inst_5 : DecidablePred.{succ u1} α (fun (_x : α) => Membership.mem.{u1, u1} α (Set.{u1} α) (Set.instMembershipSet.{u1} α) _x t)], DecidablePred.{succ u1} α (fun (_x : α) => Membership.mem.{u1, u1} α (Set.{u1} α) (Set.instMembershipSet.{u1} α) _x (HMul.hMul.{u1, u1, u1} (Set.{u1} α) (Set.{u1} α) (Set.{u1} α) (instHMul.{u1} (Set.{u1} α) (Set.mul.{u1} α (MulOneClass.toMul.{u1} α (Monoid.toMulOneClass.{u1} α _inst_1)))) s t))
-Case conversion may be inaccurate. Consider using '#align set.decidable_mem_mul Set.decidableMemMulₓ'. -/
 @[to_additive]
 instance decidableMemMul [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)]
     [DecidablePred (· ∈ t)] : DecidablePred (· ∈ s * t) := fun _ => decidable_of_iff _ mem_mul.symm
 #align set.decidable_mem_mul Set.decidableMemMul
 #align set.decidable_mem_add Set.decidableMemAdd
 
-/- warning: set.decidable_mem_pow -> Set.decidableMemPow is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} [_inst_1 : Monoid.{u1} α] {s : Set.{u1} α} [_inst_2 : Fintype.{u1} α] [_inst_3 : DecidableEq.{succ u1} α] [_inst_4 : DecidablePred.{succ u1} α (fun (_x : α) => Membership.Mem.{u1, u1} α (Set.{u1} α) (Set.hasMem.{u1} α) _x s)] (n : Nat), DecidablePred.{succ u1} α (fun (_x : α) => Membership.Mem.{u1, u1} α (Set.{u1} α) (Set.hasMem.{u1} α) _x (HPow.hPow.{u1, 0, u1} (Set.{u1} α) Nat (Set.{u1} α) (instHPow.{u1, 0} (Set.{u1} α) Nat (Set.NPow.{u1} α (MulOneClass.toHasOne.{u1} α (Monoid.toMulOneClass.{u1} α _inst_1)) (MulOneClass.toHasMul.{u1} α (Monoid.toMulOneClass.{u1} α _inst_1)))) s n))
-but is expected to have type
-  forall {α : Type.{u1}} [_inst_1 : Monoid.{u1} α] {s : Set.{u1} α} [_inst_2 : Fintype.{u1} α] [_inst_3 : DecidableEq.{succ u1} α] [_inst_4 : DecidablePred.{succ u1} α (fun (_x : α) => Membership.mem.{u1, u1} α (Set.{u1} α) (Set.instMembershipSet.{u1} α) _x s)] (n : Nat), DecidablePred.{succ u1} α (fun (_x : α) => Membership.mem.{u1, u1} α (Set.{u1} α) (Set.instMembershipSet.{u1} α) _x (HPow.hPow.{u1, 0, u1} (Set.{u1} α) Nat (Set.{u1} α) (instHPow.{u1, 0} (Set.{u1} α) Nat (Set.NPow.{u1} α (Monoid.toOne.{u1} α _inst_1) (MulOneClass.toMul.{u1} α (Monoid.toMulOneClass.{u1} α _inst_1)))) s n))
-Case conversion may be inaccurate. Consider using '#align set.decidable_mem_pow Set.decidableMemPowₓ'. -/
 @[to_additive]
 instance decidableMemPow [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)] (n : ℕ) :
     DecidablePred (· ∈ s ^ n) := by
@@ -117,12 +99,6 @@ section SMul
 
 variable [SMul α β] {s : Set α} {t : Set β}
 
-/- warning: set.finite.smul -> Set.Finite.smul is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : SMul.{u1, u2} α β] {s : Set.{u1} α} {t : Set.{u2} β}, (Set.Finite.{u1} α s) -> (Set.Finite.{u2} β t) -> (Set.Finite.{u2} β (SMul.smul.{u1, u2} (Set.{u1} α) (Set.{u2} β) (Set.smul.{u1, u2} α β _inst_1) s t))
-but is expected to have type
-  forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : SMul.{u2, u1} α β] {s : Set.{u2} α} {t : Set.{u1} β}, (Set.Finite.{u2} α s) -> (Set.Finite.{u1} β t) -> (Set.Finite.{u1} β (HSMul.hSMul.{u2, u1, u1} (Set.{u2} α) (Set.{u1} β) (Set.{u1} β) (instHSMul.{u2, u1} (Set.{u2} α) (Set.{u1} β) (Set.smul.{u2, u1} α β _inst_1)) s t))
-Case conversion may be inaccurate. Consider using '#align set.finite.smul Set.Finite.smulₓ'. -/
 @[to_additive]
 theorem Finite.smul : s.Finite → t.Finite → (s • t).Finite :=
   Finite.image2 _
@@ -220,12 +196,6 @@ namespace Group
 
 variable {G : Type _} [Group G] [Fintype G] (S : Set G)
 
-/- warning: group.card_pow_eq_card_pow_card_univ -> Group.card_pow_eq_card_pow_card_univ is a dubious translation:
-lean 3 declaration is
-  forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] (S : Set.{u1} G) [_inst_3 : forall (k : Nat), DecidablePred.{succ u1} G (fun (_x : G) => Membership.Mem.{u1, u1} G (Set.{u1} G) (Set.hasMem.{u1} G) _x (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (MulOneClass.toHasOne.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S k))] (k : Nat), (LE.le.{0} Nat Nat.hasLe (Fintype.card.{u1} G _inst_2) k) -> (Eq.{1} Nat (Fintype.card.{u1} (coeSort.{succ u1, succ (succ u1)} (Set.{u1} G) Type.{u1} (Set.hasCoeToSort.{u1} G) (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (MulOneClass.toHasOne.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S k)) (Subtype.fintype.{u1} G (fun (x : G) => Membership.Mem.{u1, u1} G (Set.{u1} G) (Set.hasMem.{u1} G) x (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (MulOneClass.toHasOne.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S k)) (fun (a : G) => _inst_3 k a) _inst_2)) (Fintype.card.{u1} (coeSort.{succ u1, succ (succ u1)} (Set.{u1} G) Type.{u1} (Set.hasCoeToSort.{u1} G) (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (MulOneClass.toHasOne.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S (Fintype.card.{u1} G _inst_2))) (Subtype.fintype.{u1} G (fun (x : G) => Membership.Mem.{u1, u1} G (Set.{u1} G) (Set.hasMem.{u1} G) x (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (MulOneClass.toHasOne.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S (Fintype.card.{u1} G _inst_2))) (fun (a : G) => _inst_3 (Fintype.card.{u1} G _inst_2) a) _inst_2)))
-but is expected to have type
-  forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] (S : Set.{u1} G) [_inst_3 : forall (k : Nat), DecidablePred.{succ u1} G (fun (_x : G) => Membership.mem.{u1, u1} G (Set.{u1} G) (Set.instMembershipSet.{u1} G) _x (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (InvOneClass.toOne.{u1} G (DivInvOneMonoid.toInvOneClass.{u1} G (DivisionMonoid.toDivInvOneMonoid.{u1} G (Group.toDivisionMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S k))] (k : Nat), (LE.le.{0} Nat instLENat (Fintype.card.{u1} G _inst_2) k) -> (Eq.{1} Nat (Fintype.card.{u1} (Set.Elem.{u1} G (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (InvOneClass.toOne.{u1} G (DivInvOneMonoid.toInvOneClass.{u1} G (DivisionMonoid.toDivInvOneMonoid.{u1} G (Group.toDivisionMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S k)) (Subtype.fintype.{u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Set.{u1} G) (Set.instMembershipSet.{u1} G) x (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (InvOneClass.toOne.{u1} G (DivInvOneMonoid.toInvOneClass.{u1} G (DivisionMonoid.toDivInvOneMonoid.{u1} G (Group.toDivisionMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S k)) (fun (a : G) => _inst_3 k a) _inst_2)) (Fintype.card.{u1} (Set.Elem.{u1} G (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (InvOneClass.toOne.{u1} G (DivInvOneMonoid.toInvOneClass.{u1} G (DivisionMonoid.toDivInvOneMonoid.{u1} G (Group.toDivisionMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S (Fintype.card.{u1} G _inst_2))) (Subtype.fintype.{u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Set.{u1} G) (Set.instMembershipSet.{u1} G) x (HPow.hPow.{u1, 0, u1} (Set.{u1} G) Nat (Set.{u1} G) (instHPow.{u1, 0} (Set.{u1} G) Nat (Set.NPow.{u1} G (InvOneClass.toOne.{u1} G (DivInvOneMonoid.toInvOneClass.{u1} G (DivisionMonoid.toDivInvOneMonoid.{u1} G (Group.toDivisionMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) S (Fintype.card.{u1} G _inst_2))) (fun (a : G) => _inst_3 (Fintype.card.{u1} G _inst_2) a) _inst_2)))
-Case conversion may be inaccurate. Consider using '#align group.card_pow_eq_card_pow_card_univ Group.card_pow_eq_card_pow_card_univₓ'. -/
 @[to_additive]
 theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k)] :
     ∀ k, Fintype.card G ≤ k → Fintype.card ↥(S ^ k) = Fintype.card ↥(S ^ Fintype.card G) :=
Diff
@@ -106,11 +106,8 @@ Case conversion may be inaccurate. Consider using '#align set.decidable_mem_pow
 instance decidableMemPow [Fintype α] [DecidableEq α] [DecidablePred (· ∈ s)] (n : ℕ) :
     DecidablePred (· ∈ s ^ n) := by
   induction' n with n ih
-  · simp_rw [pow_zero, mem_one]
-    infer_instance
-  · letI := ih
-    rw [pow_succ]
-    infer_instance
+  · simp_rw [pow_zero, mem_one]; infer_instance
+  · letI := ih; rw [pow_succ]; infer_instance
 #align set.decidable_mem_pow Set.decidableMemPow
 #align set.decidable_mem_nsmul Set.decidableMemNSMul
 
Diff
@@ -146,11 +146,13 @@ theorem Finite.smul_set : s.Finite → (a • s).Finite :=
 #align set.finite.vadd_set Set.Finite.vadd_set
 -/
 
+#print Set.Infinite.of_smul_set /-
 @[to_additive]
 theorem Infinite.of_smul_set : (a • s).Infinite → s.Infinite :=
   Infinite.of_image _
 #align set.infinite.of_smul_set Set.Infinite.of_smul_set
 #align set.infinite.of_vadd_set Set.Infinite.of_vadd_set
+-/
 
 end HasSmulSet
 
@@ -172,12 +174,14 @@ section Cancel
 
 variable [Mul α] [IsLeftCancelMul α] [IsRightCancelMul α] {s t : Set α}
 
+#print Set.infinite_mul /-
 @[to_additive]
 theorem infinite_mul : (s * t).Infinite ↔ s.Infinite ∧ t.Nonempty ∨ t.Infinite ∧ s.Nonempty :=
   infinite_image2 (fun _ _ => (mul_left_injective _).InjOn _) fun _ _ =>
     (mul_right_injective _).InjOn _
 #align set.infinite_mul Set.infinite_mul
 #align set.infinite_add Set.infinite_add
+-/
 
 end Cancel
 
@@ -185,17 +189,21 @@ section Group
 
 variable [Group α] [MulAction α β] {a : α} {s : Set β}
 
+#print Set.finite_smul_set /-
 @[simp, to_additive]
 theorem finite_smul_set : (a • s).Finite ↔ s.Finite :=
   finite_image_iff <| (MulAction.injective _).InjOn _
 #align set.finite_smul_set Set.finite_smul_set
 #align set.finite_vadd_set Set.finite_vadd_set
+-/
 
+#print Set.infinite_smul_set /-
 @[simp, to_additive]
 theorem infinite_smul_set : (a • s).Infinite ↔ s.Infinite :=
   infinite_image_iff <| (MulAction.injective _).InjOn _
 #align set.infinite_smul_set Set.infinite_smul_set
 #align set.infinite_vadd_set Set.infinite_vadd_set
+-/
 
 alias finite_smul_set ↔ finite.of_smul_set _
 #align set.finite.of_smul_set Set.Finite.of_smul_set
Diff
@@ -4,17 +4,19 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 
 ! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit 517cc149e0b515d2893baa376226ed10feb319c7
+! leanprover-community/mathlib commit c941bb9426d62e266612b6d99e6c9fc93e7a1d07
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
 import Mathbin.Data.Set.Finite
 import Mathbin.Data.Set.Pointwise.Smul
 
-/-! # Finiteness lemmas for pointwise operations on sets 
+/-!
+# Finiteness lemmas for pointwise operations on sets
 
 > THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
-> Any changes to this file require a corresponding PR to mathlib4.-/
+> Any changes to this file require a corresponding PR to mathlib4.
+-/
 
 
 open Pointwise
@@ -144,6 +146,12 @@ theorem Finite.smul_set : s.Finite → (a • s).Finite :=
 #align set.finite.vadd_set Set.Finite.vadd_set
 -/
 
+@[to_additive]
+theorem Infinite.of_smul_set : (a • s).Infinite → s.Infinite :=
+  Infinite.of_image _
+#align set.infinite.of_smul_set Set.Infinite.of_smul_set
+#align set.infinite.of_vadd_set Set.Infinite.of_vadd_set
+
 end HasSmulSet
 
 section Vsub
@@ -160,6 +168,45 @@ theorem Finite.vsub (hs : s.Finite) (ht : t.Finite) : Set.Finite (s -ᵥ t) :=
 
 end Vsub
 
+section Cancel
+
+variable [Mul α] [IsLeftCancelMul α] [IsRightCancelMul α] {s t : Set α}
+
+@[to_additive]
+theorem infinite_mul : (s * t).Infinite ↔ s.Infinite ∧ t.Nonempty ∨ t.Infinite ∧ s.Nonempty :=
+  infinite_image2 (fun _ _ => (mul_left_injective _).InjOn _) fun _ _ =>
+    (mul_right_injective _).InjOn _
+#align set.infinite_mul Set.infinite_mul
+#align set.infinite_add Set.infinite_add
+
+end Cancel
+
+section Group
+
+variable [Group α] [MulAction α β] {a : α} {s : Set β}
+
+@[simp, to_additive]
+theorem finite_smul_set : (a • s).Finite ↔ s.Finite :=
+  finite_image_iff <| (MulAction.injective _).InjOn _
+#align set.finite_smul_set Set.finite_smul_set
+#align set.finite_vadd_set Set.finite_vadd_set
+
+@[simp, to_additive]
+theorem infinite_smul_set : (a • s).Infinite ↔ s.Infinite :=
+  infinite_image_iff <| (MulAction.injective _).InjOn _
+#align set.infinite_smul_set Set.infinite_smul_set
+#align set.infinite_vadd_set Set.infinite_vadd_set
+
+alias finite_smul_set ↔ finite.of_smul_set _
+#align set.finite.of_smul_set Set.Finite.of_smul_set
+
+alias infinite_smul_set ↔ _ infinite.smul_set
+#align set.infinite.smul_set Set.Infinite.smul_set
+
+attribute [to_additive] finite.of_smul_set infinite.smul_set
+
+end Group
+
 end Set
 
 open Set
Diff
@@ -27,11 +27,13 @@ section One
 
 variable [One α]
 
+#print Set.finite_one /-
 @[simp, to_additive]
 theorem finite_one : (1 : Set α).Finite :=
   finite_singleton _
 #align set.finite_one Set.finite_one
 #align set.finite_zero Set.finite_zero
+-/
 
 end One
 
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 
 ! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit 68d1483e8a718ec63219f0e227ca3f0140361086
+! leanprover-community/mathlib commit 517cc149e0b515d2893baa376226ed10feb319c7
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -23,6 +23,18 @@ variable {F α β γ : Type _}
 
 namespace Set
 
+section One
+
+variable [One α]
+
+@[simp, to_additive]
+theorem finite_one : (1 : Set α).Finite :=
+  finite_singleton _
+#align set.finite_one Set.finite_one
+#align set.finite_zero Set.finite_zero
+
+end One
+
 section InvolutiveInv
 
 variable [InvolutiveInv α] {s : Set α}
Diff
@@ -177,9 +177,8 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     exact Subtype.ext (mul_left_cancel (subtype.ext_iff.mp hbc))
   have mono : Monotone (fun n => Fintype.card ↥(S ^ n) : ℕ → ℕ) :=
     monotone_nat_of_le_succ fun n => key a _ _ fun b hb => Set.mul_mem_mul ha hb
-  convert
-    card_pow_eq_card_pow_card_univ_aux mono (fun n => set_fintype_card_le_univ (S ^ n)) fun n h =>
-      le_antisymm (mono (n + 1).le_succ) (key a⁻¹ _ _ _)
+  convert card_pow_eq_card_pow_card_univ_aux mono (fun n => set_fintype_card_le_univ (S ^ n))
+      fun n h => le_antisymm (mono (n + 1).le_succ) (key a⁻¹ _ _ _)
   · simp only [[anonymous], Fintype.card_ofFinset]
   replace h : {a} * S ^ n = S ^ (n + 1)
   · refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)

Changes in mathlib4

mathlib3
mathlib4
chore: remove unnecessary classical! (#12255)

classical! appears to never actually be necessary, and is just being used out of habit, and we can get rid of it to reduce the number of ways to say the same thing.

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -194,7 +194,7 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     fun n h ↦ le_antisymm (mono (n + 1).le_succ) (key a⁻¹ (S ^ (n + 2)) (S ^ (n + 1)) _)
   replace h₂ : S ^ n * {a} = S ^ (n + 1) := by
     have : Fintype (S ^ n * Set.singleton a) := by
-      classical!
+      classical
       apply fintypeMul
     refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
     · exact mul_subset_mul Set.Subset.rfl (Set.singleton_subset_iff.mpr ha)
change the order of operation in zsmulRec and nsmulRec (#11451)

We change the following field in the definition of an additive commutative monoid:

 nsmul_succ : ∀ (n : ℕ) (x : G),
-  AddMonoid.nsmul (n + 1) x = x + AddMonoid.nsmul n x
+  AddMonoid.nsmul (n + 1) x = AddMonoid.nsmul n x + x

where the latter is more natural

We adjust the definitions of ^ in monoids, groups, etc. Originally there was a warning comment about why this natural order was preferred

use x * npowRec n x and not npowRec n x * x in the definition to make sure that definitional unfolding of npowRec is blocked, to avoid deep recursion issues.

but it seems to no longer apply.

Remarks on the PR :

  • pow_succ and pow_succ' have switched their meanings.
  • Most of the time, the proofs were adjusted by priming/unpriming one lemma, or exchanging left and right; a few proofs were more complicated to adjust.
  • In particular, [Mathlib/NumberTheory/RamificationInertia.lean] used Ideal.IsPrime.mul_mem_pow which is defined in [Mathlib/RingTheory/DedekindDomain/Ideal.lean]. Changing the order of operation forced me to add the symmetric lemma Ideal.IsPrime.mem_pow_mul.
  • the docstring for Cauchy condensation test in [Mathlib/Analysis/PSeries.lean] was mathematically incorrect, I added the mention that the function is antitone.
Diff
@@ -184,24 +184,24 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
   · refine' fun k hk ↦ Fintype.card_congr _
     rw [empty_pow (hG.trans_le hk).ne', empty_pow (ne_of_gt hG)]
   have key : ∀ (a) (s t : Set G) [Fintype s] [Fintype t],
-      (∀ b : G, b ∈ s → a * b ∈ t) → Fintype.card s ≤ Fintype.card t := by
-    refine' fun a s t _ _ h ↦ Fintype.card_le_of_injective (fun ⟨b, hb⟩ ↦ ⟨a * b, h b hb⟩) _
+      (∀ b : G, b ∈ s → b * a ∈ t) → Fintype.card s ≤ Fintype.card t := by
+    refine' fun a s t _ _ h ↦ Fintype.card_le_of_injective (fun ⟨b, hb⟩ ↦ ⟨b * a, h b hb⟩) _
     rintro ⟨b, hb⟩ ⟨c, hc⟩ hbc
-    exact Subtype.ext (mul_left_cancel (Subtype.ext_iff.mp hbc))
+    exact Subtype.ext (mul_right_cancel (Subtype.ext_iff.mp hbc))
   have mono : Monotone (fun n ↦ Fintype.card (↥(S ^ n)) : ℕ → ℕ) :=
-    monotone_nat_of_le_succ fun n ↦ key a _ _ fun b hb ↦ Set.mul_mem_mul ha hb
+    monotone_nat_of_le_succ fun n ↦ key a _ _ fun b hb ↦ Set.mul_mem_mul hb ha
   refine' card_pow_eq_card_pow_card_univ_aux mono (fun n ↦ set_fintype_card_le_univ (S ^ n))
     fun n h ↦ le_antisymm (mono (n + 1).le_succ) (key a⁻¹ (S ^ (n + 2)) (S ^ (n + 1)) _)
-  replace h₂ : {a} * S ^ n = S ^ (n + 1) := by
-    have : Fintype (Set.singleton a * S ^ n) := by
-      classical
+  replace h₂ : S ^ n * {a} = S ^ (n + 1) := by
+    have : Fintype (S ^ n * Set.singleton a) := by
+      classical!
       apply fintypeMul
     refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
-    · exact mul_subset_mul (Set.singleton_subset_iff.mpr ha) Set.Subset.rfl
-    · convert key a (S ^ n) ({a} * S ^ n) fun b hb ↦ Set.mul_mem_mul (Set.mem_singleton a) hb
-  rw [pow_succ', ← h₂, mul_assoc, ← pow_succ', h₂, singleton_mul, forall_mem_image]
+    · exact mul_subset_mul Set.Subset.rfl (Set.singleton_subset_iff.mpr ha)
+    · convert key a (S ^ n) (S ^ n * {a}) fun b hb ↦ Set.mul_mem_mul hb (Set.mem_singleton a)
+  rw [pow_succ', ← h₂, ← mul_assoc, ← pow_succ', h₂, mul_singleton, forall_mem_image]
   intro x hx
-  rwa [inv_mul_cancel_left]
+  rwa [mul_inv_cancel_right]
 #align group.card_pow_eq_card_pow_card_univ Group.card_pow_eq_card_pow_card_univ
 #align add_group.card_nsmul_eq_card_nsmul_card_univ AddGroup.card_nsmul_eq_card_nsmul_card_univ
 
chore: don't use classical! when classical suffices (#11681)

(In fact, this is every use of classical! in Mathlib.)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -194,7 +194,7 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     fun n h ↦ le_antisymm (mono (n + 1).le_succ) (key a⁻¹ (S ^ (n + 2)) (S ^ (n + 1)) _)
   replace h₂ : {a} * S ^ n = S ^ (n + 1) := by
     have : Fintype (Set.singleton a * S ^ n) := by
-      classical!
+      classical
       apply fintypeMul
     refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
     · exact mul_subset_mul (Set.singleton_subset_iff.mpr ha) Set.Subset.rfl
chore: Remove ball and bex from lemma names (#10816)

ball for "bounded forall" and bex for "bounded exists" are from experience very confusing abbreviations. This PR renames them to forall_mem and exists_mem in the few Set lemma names that mention them.

Also deprecate ball_image_of_ball, mem_image_elim, mem_image_elim_on since those lemmas are duplicates of the renamed lemmas (apart from argument order and implicitness, which I am also fixing by making the binder in the RHS of forall_mem_image semi-implicit), have obscure names and are completely unused.

Diff
@@ -199,7 +199,7 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
     · exact mul_subset_mul (Set.singleton_subset_iff.mpr ha) Set.Subset.rfl
     · convert key a (S ^ n) ({a} * S ^ n) fun b hb ↦ Set.mul_mem_mul (Set.mem_singleton a) hb
-  rw [pow_succ', ← h₂, mul_assoc, ← pow_succ', h₂, singleton_mul, ball_image_iff]
+  rw [pow_succ', ← h₂, mul_assoc, ← pow_succ', h₂, singleton_mul, forall_mem_image]
   intro x hx
   rwa [inv_mul_cancel_left]
 #align group.card_pow_eq_card_pow_card_univ Group.card_pow_eq_card_pow_card_univ
chore: remove stream-of-consciousness uses of have, replace and suffices (#10640)

No changes to tactic file, it's just boring fixes throughout the library.

This follows on from #6964.

Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>

Diff
@@ -192,8 +192,8 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     monotone_nat_of_le_succ fun n ↦ key a _ _ fun b hb ↦ Set.mul_mem_mul ha hb
   refine' card_pow_eq_card_pow_card_univ_aux mono (fun n ↦ set_fintype_card_le_univ (S ^ n))
     fun n h ↦ le_antisymm (mono (n + 1).le_succ) (key a⁻¹ (S ^ (n + 2)) (S ^ (n + 1)) _)
-  replace h₂ : {a} * S ^ n = S ^ (n + 1)
-  · have : Fintype (Set.singleton a * S ^ n) := by
+  replace h₂ : {a} * S ^ n = S ^ (n + 1) := by
+    have : Fintype (Set.singleton a * S ^ n) := by
       classical!
       apply fintypeMul
     refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
chore(Set/Pointwise/Finite): golf (#9214)
Diff
@@ -179,11 +179,10 @@ variable {G : Type*} [Group G] [Fintype G] (S : Set G)
 @[to_additive]
 theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k)] :
     ∀ k, Fintype.card G ≤ k → Fintype.card (↥(S ^ k)) = Fintype.card (↥(S ^ Fintype.card G)) := by
-  have hG : 0 < Fintype.card G := Fintype.card_pos_iff.mpr ⟨1⟩
-  by_cases hS : S = ∅
+  have hG : 0 < Fintype.card G := Fintype.card_pos
+  rcases S.eq_empty_or_nonempty with (rfl | ⟨a, ha⟩)
   · refine' fun k hk ↦ Fintype.card_congr _
-    rw [hS, empty_pow (ne_of_gt (lt_of_lt_of_le hG hk)), empty_pow (ne_of_gt hG)]
-  obtain ⟨a, ha⟩ := Set.nonempty_iff_ne_empty.2 hS
+    rw [empty_pow (hG.trans_le hk).ne', empty_pow (ne_of_gt hG)]
   have key : ∀ (a) (s t : Set G) [Fintype s] [Fintype t],
       (∀ b : G, b ∈ s → a * b ∈ t) → Fintype.card s ≤ Fintype.card t := by
     refine' fun a s t _ _ h ↦ Fintype.card_le_of_injective (fun ⟨b, hb⟩ ↦ ⟨a * b, h b hb⟩) _
@@ -200,9 +199,9 @@ theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k
     refine' Set.eq_of_subset_of_card_le _ (le_trans (ge_of_eq h) _)
     · exact mul_subset_mul (Set.singleton_subset_iff.mpr ha) Set.Subset.rfl
     · convert key a (S ^ n) ({a} * S ^ n) fun b hb ↦ Set.mul_mem_mul (Set.mem_singleton a) hb
-  rw [pow_succ', ← h₂, mul_assoc, ← pow_succ', h₂]
-  rintro _ ⟨b, c, hb, hc, rfl⟩
-  rwa [Set.mem_singleton_iff.mp hb, inv_mul_cancel_left]
+  rw [pow_succ', ← h₂, mul_assoc, ← pow_succ', h₂, singleton_mul, ball_image_iff]
+  intro x hx
+  rwa [inv_mul_cancel_left]
 #align group.card_pow_eq_card_pow_card_univ Group.card_pow_eq_card_pow_card_univ
 #align add_group.card_nsmul_eq_card_nsmul_card_univ AddGroup.card_nsmul_eq_card_nsmul_card_univ
 
feat: Preimage of pointwise multiplication (#8956)

From PFR

Co-authored-by: Patrick Massot <patrickmassot@free.fr>

Diff
@@ -135,6 +135,11 @@ theorem infinite_mul : (s * t).Infinite ↔ s.Infinite ∧ t.Nonempty ∨ t.Infi
 #align set.infinite_mul Set.infinite_mul
 #align set.infinite_add Set.infinite_add
 
+@[to_additive]
+lemma finite_mul : (s * t).Finite ↔ s.Finite ∧ t.Finite ∨ s = ∅ ∨ t = ∅ :=
+  finite_image2  (fun _ _ ↦ (mul_left_injective _).injOn _)
+    fun _ _ ↦ (mul_right_injective _).injOn _
+
 end Cancel
 
 section Group
chore: Nsmul -> NSMul, Zpow -> ZPow, etc (#9067)

Normalising to naming convention rule number 6.

Diff
@@ -96,7 +96,7 @@ theorem Finite.smul : s.Finite → t.Finite → (s • t).Finite :=
 
 end SMul
 
-section HasSmulSet
+section HasSMulSet
 
 variable [SMul α β] {s : Set β} {a : α}
 
@@ -112,7 +112,7 @@ theorem Infinite.of_smul_set : (a • s).Infinite → s.Infinite :=
 #align set.infinite.of_smul_set Set.Infinite.of_smul_set
 #align set.infinite.of_vadd_set Set.Infinite.of_vadd_set
 
-end HasSmulSet
+end HasSMulSet
 
 section Vsub
 
feat: patch for new alias command (#6172)
Diff
@@ -153,10 +153,10 @@ theorem infinite_smul_set : (a • s).Infinite ↔ s.Infinite :=
 #align set.infinite_smul_set Set.infinite_smul_set
 #align set.infinite_vadd_set Set.infinite_vadd_set
 
-alias finite_smul_set ↔ Finite.of_smul_set _
+alias ⟨Finite.of_smul_set, _⟩ := finite_smul_set
 #align set.finite.of_smul_set Set.Finite.of_smul_set
 
-alias infinite_smul_set ↔ _ Infinite.smul_set
+alias ⟨_, Infinite.smul_set⟩ := infinite_smul_set
 #align set.infinite.smul_set Set.Infinite.smul_set
 
 attribute [to_additive] Finite.of_smul_set Infinite.smul_set
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -13,7 +13,7 @@ import Mathlib.Data.Set.Pointwise.SMul
 
 open Pointwise
 
-variable {F α β γ : Type _}
+variable {F α β γ : Type*}
 
 namespace Set
 
@@ -169,7 +169,7 @@ open Set
 
 namespace Group
 
-variable {G : Type _} [Group G] [Fintype G] (S : Set G)
+variable {G : Type*} [Group G] [Fintype G] (S : Set G)
 
 @[to_additive]
 theorem card_pow_eq_card_pow_card_univ [∀ k : ℕ, DecidablePred (· ∈ S ^ k)] :
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2019 Johan Commelin. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
-
-! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit c941bb9426d62e266612b6d99e6c9fc93e7a1d07
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Data.Set.Finite
 import Mathlib.Data.Set.Pointwise.SMul
 
+#align_import data.set.pointwise.finite from "leanprover-community/mathlib"@"c941bb9426d62e266612b6d99e6c9fc93e7a1d07"
+
 /-! # Finiteness lemmas for pointwise operations on sets -/
 
 
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 
 ! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit 517cc149e0b515d2893baa376226ed10feb319c7
+! leanprover-community/mathlib commit c941bb9426d62e266612b6d99e6c9fc93e7a1d07
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -109,6 +109,12 @@ theorem Finite.smul_set : s.Finite → (a • s).Finite :=
 #align set.finite.smul_set Set.Finite.smul_set
 #align set.finite.vadd_set Set.Finite.vadd_set
 
+@[to_additive]
+theorem Infinite.of_smul_set : (a • s).Infinite → s.Infinite :=
+  Infinite.of_image _
+#align set.infinite.of_smul_set Set.Infinite.of_smul_set
+#align set.infinite.of_vadd_set Set.Infinite.of_vadd_set
+
 end HasSmulSet
 
 section Vsub
@@ -121,6 +127,45 @@ theorem Finite.vsub (hs : s.Finite) (ht : t.Finite) : Set.Finite (s -ᵥ t) :=
 
 end Vsub
 
+section Cancel
+
+variable [Mul α] [IsLeftCancelMul α] [IsRightCancelMul α] {s t : Set α}
+
+@[to_additive]
+theorem infinite_mul : (s * t).Infinite ↔ s.Infinite ∧ t.Nonempty ∨ t.Infinite ∧ s.Nonempty :=
+  infinite_image2 (fun _ _ => (mul_left_injective _).injOn _) fun _ _ =>
+    (mul_right_injective _).injOn _
+#align set.infinite_mul Set.infinite_mul
+#align set.infinite_add Set.infinite_add
+
+end Cancel
+
+section Group
+
+variable [Group α] [MulAction α β] {a : α} {s : Set β}
+
+@[to_additive (attr := simp)]
+theorem finite_smul_set : (a • s).Finite ↔ s.Finite :=
+  finite_image_iff <| (MulAction.injective _).injOn _
+#align set.finite_smul_set Set.finite_smul_set
+#align set.finite_vadd_set Set.finite_vadd_set
+
+@[to_additive (attr := simp)]
+theorem infinite_smul_set : (a • s).Infinite ↔ s.Infinite :=
+  infinite_image_iff <| (MulAction.injective _).injOn _
+#align set.infinite_smul_set Set.infinite_smul_set
+#align set.infinite_vadd_set Set.infinite_vadd_set
+
+alias finite_smul_set ↔ Finite.of_smul_set _
+#align set.finite.of_smul_set Set.Finite.of_smul_set
+
+alias infinite_smul_set ↔ _ Infinite.smul_set
+#align set.infinite.smul_set Set.Infinite.smul_set
+
+attribute [to_additive] Finite.of_smul_set Infinite.smul_set
+
+end Group
+
 end Set
 
 open Set
feat: s ∩ t * s ∪ t ⊆ s * t (#1619)

Match https://github.com/leanprover-community/mathlib/pull/17961

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>

Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 
 ! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit 0a0ec35061ed9960bf0e7ffb0335f44447b58977
+! leanprover-community/mathlib commit 517cc149e0b515d2893baa376226ed10feb319c7
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -20,6 +20,18 @@ variable {F α β γ : Type _}
 
 namespace Set
 
+section One
+
+variable [One α]
+
+@[to_additive (attr := simp)]
+theorem finite_one : (1 : Set α).Finite :=
+  finite_singleton _
+#align set.finite_one Set.finite_one
+#align set.finite_zero Set.finite_zero
+
+end One
+
 section InvolutiveInv
 
 variable [InvolutiveInv α] {s : Set α}
chore: resync ported files (#2135)

This PR resyncs the first 28 entries of https://leanprover-community.github.io/mathlib-port-status/out-of-sync.html after sorting by diff size.

  • resync Mathlib/Data/Bool/Count
  • resync Mathlib/Order/Max
  • resync Mathlib/Algebra/EuclideanDomain/Instances
  • resync Mathlib/Data/List/Duplicate
  • resync Mathlib/Data/Multiset/Nodup
  • resync Mathlib/Data/Set/Pointwise/ListOfFn
  • resync Mathlib/Dynamics/FixedPoints/Basic
  • resync Mathlib/Order/OmegaCompletePartialOrder
  • resync Mathlib/Order/PropInstances
  • resync Mathlib/Topology/LocallyFinite
  • resync Mathlib/Data/Bool/Set
  • resync Mathlib/Data/Fintype/Card
  • resync Mathlib/Data/Multiset/Bind
  • resync Mathlib/Data/Rat/Floor
  • resync Mathlib/Algebra/Order/Floor
  • resync Mathlib/Data/Int/Basic
  • resync Mathlib/Data/Int/Dvd/Basic
  • resync Mathlib/Data/List/Sort
  • resync Mathlib/Data/Nat/GCD/Basic
  • resync Mathlib/Data/Set/Enumerate
  • resync Mathlib/Data/Set/Intervals/OrdConnectedComponent
  • resync Mathlib/GroupTheory/Subsemigroup/Basic
  • resync Mathlib/Topology/Connected
  • resync Mathlib/Topology/NhdsSet
  • resync Mathlib/Algebra/BigOperators/Multiset/Lemmas
  • resync Mathlib/Algebra/CharZero/Infinite
  • resync Mathlib/Data/Multiset/Range
  • resync Mathlib/Data/Set/Pointwise/Finite
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Johan Commelin, Floris van Doorn
 
 ! This file was ported from Lean 3 source module data.set.pointwise.finite
-! leanprover-community/mathlib commit f93c11933efbc3c2f0299e47b8ff83e9b539cbf6
+! leanprover-community/mathlib commit 0a0ec35061ed9960bf0e7ffb0335f44447b58977
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
feat: port Data.Set.Pointwise.Finite (#1844)

Dependencies 7 + 230

231 files ported (97.1%)
100477 lines ported (97.1%)
Show graph

The unported dependencies are