Zulip Chat Archive

Stream: mathlib4

Topic: exact? gives incorrect line-wrapping


Nick_adfor (Oct 19 2025 at 17:04):

I can never think of the reason is exact? gives

Try this:
  (expose_names;
        exact Subgroup.Normal.conj_mem' inst_1 h₁ hh₁ g')

But in fact it should be

Try this:
  (expose_names; exact Subgroup.Normal.conj_mem' inst_1 h₁ hh₁ g')

It's because of a line break issue, exact?gives a line break.

Nick_adfor (Oct 19 2025 at 17:09):

It's another disaster that lean will recommend me to gives a line break as

This line exceeds the 100 character limit, please shorten it!

Note: This linter can be disabled with `set_option linter.style.longLine false`

But (expose_names; exact Subgroup.Normal.conj_mem' inst_1 h₁ hh₁ g') cannot have any line break...

Eric Wieser (Oct 19 2025 at 17:16):

@Nick_adfor, can you move the issue about exact? to a new thread? edit your first post to give some context, now that I've moved this?

Notification Bot (Oct 19 2025 at 17:18):

3 messages were moved here from #mathlib4 > Define Quotient Group by Eric Wieser.

Eric Wieser (Oct 19 2025 at 17:19):

I think ultimately the problem is that "try this" doesn't know the difference between

have := by exact?

and

have := by
  exact?

since your substitution only works in the second case

Nick_adfor (Oct 19 2025 at 17:26):

Since it is a new definition about Quotient Group, the code might be long.

import Mathlib

suppress_compilation -- This makes some noncomputable def work.

variable {G : Type} [Group G] (H : Subgroup G) [H.Normal]

open Pointwise

structure QGroup : Type where
  carrier : Set G
  isCoset :  g : G, carrier = g  H

namespace QGroup

variable {H}

instance : SetLike (QGroup H) G where
  coe C := C.carrier
  coe_injective' := by
    intro C D; cases C; cases D; simp

@[ext]
lemma ext {C D : QGroup H} (h : (C : Set G) = D) : C = D := by
  cases C; cases D; simp at h; simp [h]

def out (C : QGroup H) : G := Classical.choose C.isCoset

@[simp]
lemma out_spec (C : QGroup H) : C.out  H = (C : Set G) :=
  Classical.choose_spec C.isCoset |>.symm

lemma mem_iff_out (C : QGroup H) (g : G) : g  C   h  H, g = C.out  h := by
  rw [ SetLike.mem_coe,  C.out_spec, Set.mem_smul_set]
  tauto

variable (H) in
def gen (g : G) : QGroup H :=
  g  H, g, rfl⟩⟩


lemma gen_def (g : G) : (gen H g : Set G) = g  H := rfl

@[simp]
lemma mem_gen_iff (g : G) {x : G} : x  gen H g   h  H, x = g * h := by
  rw [ SetLike.mem_coe, gen_def, Set.mem_smul_set]
  tauto

@[simp]
lemma gen_out (C : QGroup H) : gen H C.out = C := by
  ext g
  simp only [SetLike.mem_coe, mem_gen_iff]
  rw [C.mem_iff_out]
  rfl

@[simp]
lemma mem_out_gen (g : G) {x : G} : x  ((gen H g).out  H : Set G)  x  (g  H : Set G) := by
  simp [Set.mem_smul_set, eq_comm]

@[elab_as_elim]
theorem gen_induction {P : QGroup H  Prop}
    (h :  g : G, P (gen H g)) :
     C : QGroup H, P C := by
  intro C
  rw [ C.gen_out]
  tauto

@[simp]
theorem gen_eq_iff (g : G) (C : QGroup H) : gen H g = C  g  C := by
  constructor
  · rintro rfl
    simp
  · intro h
    rw [C.mem_iff_out] at h
    obtain x, hx, rfl := h
    ext y
    simp only [smul_eq_mul, SetLike.mem_coe, mem_gen_iff]
    constructor
    · rintro y, hy, rfl
      rw [C.mem_iff_out]
      use x * y, mul_mem hx hy
      simp [mul_assoc]
    · rw [C.mem_iff_out]
      rintro y, hy, rfl
      use x⁻¹ * y, mul_mem (H.inv_mem hx) hy
      simp [mul_assoc]

instance : One (QGroup H) where
  one := H, 1, by simp⟩⟩

lemma one_def : ((1 : QGroup H) : Set G) = H := rfl

@[simp]
lemma mem_one_iff {g : G} : g  (1 : QGroup H)  g  H := Iff.rfl

@[simp]
lemma gen_one : gen H 1 = 1 := by
  ext g
  simp

instance : Mul (QGroup H) where
  mul C D := C.out  D.out  H, C.out * D.out, by simp [mul_smul, out_spec]⟩⟩

lemma mul_def (C D : QGroup H) :
    ((C * D : QGroup H) : Set G) = C.out  D.out  H := rfl

@[simp]
lemma gen_mul_gen (g g' : G) : gen H g * gen H g' = gen H (g * g') := by
  ext x
  simp only [SetLike.mem_coe, mul_def, gen_def, Set.mem_smul_set]
  constructor
  · rintro w, hw, rfl
    obtain h₂, hh₂, rfl := hw
    have mem1 : (gen H g).out  (gen H g).out  (H : Set G) := by
      use 1, H.one_mem
      simp
    rw [mem_out_gen] at mem1
    rw [Set.mem_smul_set] at mem1
    obtain h₁, hh₁, h_eq1 := mem1
    have mem2 : (gen H g').out  (gen H g').out  (H : Set G) := by
      use 1, H.one_mem
      simp
    rw [mem_out_gen] at mem2
    rw [Set.mem_smul_set] at mem2
    obtain k, hk, h_eq2 := mem2
    rw [<-h_eq1, <-h_eq2]
    use (g'⁻¹ * h₁ * g') * (k * h₂)
    constructor
    · have hh₁' : h₁  H := hh₁
      have hk' : k  H := hk
      have conj_mem : g'⁻¹ * h₁ * g'  H := by exact?
      have mul_mem1 : k * h₂  H := by exact (Subgroup.mul_mem_cancel_right H hh₂).mpr hk
      exact mul_mem conj_mem mul_mem1
    · simp [mul_assoc]
  · sorry

Eric Wieser (Oct 19 2025 at 17:26):

I think this is lean4#10150

Nick_adfor (Oct 19 2025 at 17:28):

Eric Wieser said:

I think ultimately the problem is that "try this" doesn't know the difference between

have := by exact?

and

have := by
  exact?

since your substitution only works in the second case

Yes, if I write by and exact? in two lines, it will work.

      have conj_mem : g'⁻¹ * h₁ * g'  H := by
        exact?

Jovan Gerbscheid (Oct 19 2025 at 18:26):

@Eric Wieser, isn't that issue about tacticSeq specifically? exact? suggests a tactic as far as I can see.

Eric Wieser (Oct 19 2025 at 18:26):

Indeed, but the last message before mine is actually about tactic

Nick_adfor (Nov 08 2025 at 16:18):

I'll give another example here.

import Mathlib
/--
There does not exist an infinite σ-algebra that contains only countably many members.

This theorem states that it is impossible to have a σ-algebra that is both infinite
and countable. The proof proceeds by contradiction, showing that any infinite σ-algebra
must contain at least continuum many sets.
-/
theorem not_exists_infinite_countable_sigma_algebra :
    ¬  (α : Type) (i : MeasurableSpace α),
      Set.Countable {s : Set α | @MeasurableSet α i s} 
      Set.Infinite {s : Set α | @MeasurableSet α i s} := by
  -- Assume by contradiction that such a σ-algebra exists
  by_contra h_contra
  obtain α, i, h_countable, h_infinite := h_contra

  -- Define an equivalence relation: x ~ y if they belong to the same measurable sets
  set eqv : α  α  Prop := fun x y =>  s : Set α, MeasurableSet s  (x  s  y  s)

  -- Each equivalence class is measurable (can be expressed as countable intersections)
  have h_partition :  x : α, MeasurableSet {y : α | eqv x y} := by
    intro x
    -- Express the equivalence class as an intersection over measurable sets containing x
    -- and complements of measurable sets not containing x
    have h_eqv_class : {y : α | eqv x y} =  s  {s : Set α | MeasurableSet s  x  s}, s   s  {s : Set α | MeasurableSet s  xs}, s := by
      ext y; aesop (config := {warnOnNonterminal := false})
      specialize a sᶜ; aesop (config := {warnOnNonterminal := false})
    rw [h_eqv_class]
    -- The intersection is measurable since it's over countably many measurable sets
    refine' MeasurableSet.biInter _ _ <;> aesop (config := {warnOnNonterminal := false})
    exact h_countable.mono fun s hs => hs.1
    -- Countability of the indexing set for complements
    have h_countable_inter : Set.Countable {s : Set α | MeasurableSet s  xs} := by
      exact h_countable.mono fun s hs => hs.1
    exact MeasurableSet.inter left (MeasurableSet.biInter h_countable_inter fun s hs => MeasurableSet.compl hs.1)

  -- The σ-algebra is generated by the equivalence classes
  have h_sigma_gen :  s : Set α, MeasurableSet s   t : Set (Set α), t  { {y : α | eqv x y} | x : α }  s = ⋃₀ t := by
    aesop (config := {warnOnNonterminal := false})
    · -- Forward direction: every measurable set is a union of equivalence classes
      use { { y : α | eqv x y } | x  s }
      aesop (config := {warnOnNonterminal := false})
    · -- Reverse direction: any union of equivalence classes is measurable
      have h_measurable_w :  s  w, MeasurableSet s := by
        intro s hs
        specialize left hs
        aesop (config := {warnOnNonterminal := false})
      -- Countability of the indexing set
      have h_countable_w : w.Countable := by
        exact h_countable.mono h_measurable_w
      exact MeasurableSet.sUnion h_countable_w h_measurable_w

  -- The set of equivalence classes must be finite
  have h_eq_classes_finite : Set.Finite { {y : α | eqv x y} | x : α } := by
    by_cases h_eq_classes_infinite : Set.Infinite { {y : α | eqv x y} | x : α }
    · -- If equivalence classes were infinite, the power set would be uncountable
      have h_power_set_uncountable : ¬Set.Countable (Set.powerset { {y : α | eqv x y} | x : α }) := by
        intro h_power_set_countable
        -- Show that the power set has cardinality at least continuum
        have h_power_set_card : Cardinal.mk (Set.powerset { {y : α | eqv x y} | x : α })  Cardinal.aleph0 := by
          exact Cardinal.mk_le_aleph0_iff.mpr h_power_set_countable.to_subtype
        simp [*] at *
        -- Cantor's theorem gives contradiction with countability
        have h_card_ge_aleph0 : Cardinal.mk { {y : α | eqv x y} | x : α }  Cardinal.aleph0 := by
          exact Cardinal.aleph0_le_mk_iff.mpr (h_eq_classes_infinite.to_subtype)
        exact h_power_set_card.not_gt (lt_of_lt_of_le (Cardinal.cantor _) (Cardinal.power_le_power_left two_ne_zero h_card_ge_aleph0))
      -- But the power set injects into our σ-algebra, contradicting countability
      apply_mod_cast False.elim <| h_power_set_uncountable <| Set.Countable.mono _ <| h_countable.image _
      use fun s => { t |  x  s, { y | eqv x y } = t }
      intro t ht
      use ⋃₀ t
      simp_all [Set.ext_iff]
      refine' ⟨⟨t, ht, fun x => Iff.rfl, fun x => fun hx => _, fun hx => _⟩⟩
      · -- Show x is in the appropriate equivalence class
        obtain y, z, hz, hyz, hy := hx
        convert hz
        obtain x_1, hx_1 :  x_1 : α, z = {y | eqv x_1 y} := by
          obtain x_1, hx_1 := ht hz
          exact x_1, by ext; simp [hx_1]
        ext
        simp [hx_1]
        -- Calculation
        have h_eqv_x1_y : eqv x_1 y := by
          exact hx_1.subset hyz

        constructor
        · intro hx_mem s hs_meas
          constructor
          · intro hx1_in_s
            -- y in s
            have h_y_in_s : y  s := by
              -- Since $x_1$ and $y$ are equivalent, by definition of $eqv$, we have $x_1 \in s \leftrightarrow y \in s$.
              have hy_in_s : x_1  s  y  s := by
                apply h_eqv_x1_y s hs_meas;
              -- Apply the equivalence from hy_in_s to hx1_in_s to conclude y is in s.
              apply hy_in_s.mp hx1_in_s
            -- Since eqv y x✝ holds, for any measurable set s, y ∈ s ↔ x✝ ∈ s. Given that y ∈ s, it follows that x✝ ∈ s.
            have h_eqv_y_x :  s : Set α, MeasurableSet s  (y  s  α  s) := by
              -- Since y and x✝ are in the same equivalence class under eqv, by definition of eqv, this equivalence holds for all measurable sets s.
              intros s hs_meas; exact (hy ‹_›).mpr hx_mem s hs_meas;
            exact h_eqv_y_x s hs_meas |>.1 h_y_in_s
          · intro hx_in_s
            -- y in s
            have h_y_in_s : y  s := by
              have h_x1_in_s : x_1  s := by
                rw [Set.subset_def] at ht
                apply ?_
                have h_y_eq_xstar :  (u : Set α), MeasurableSet u  (y  u  x_1  u) := by exact?
                have h_x1_iff_y :  (u : Set α), MeasurableSet u  (x_1  u  y  u) := by exact?
                grind?
              have h_x1_iff_y : x_1  s  y  s := h_eqv_x1_y s hs_meas
              exact h_x1_iff_y.1 h_x1_in_s
            apply (h_eqv_x1_y s hs_meas).mpr h_y_in_s
        · intro h_eqv_x1_x
          -- calculation
          have h_eqv_y_x1 : eqv y x_1 := by
            -- Since eqv is symmetric, if eqv x_1 y holds, then eqv y x_1 must also hold.
            have h_symm :  x y, eqv x y  eqv y x := by
              -- Since eqv is symmetric, if eqv x y holds, then eqv y x must also hold. This follows directly from the definition of eqv.
              intros x y h_eqv_xy
              intro s hs
              rw [h_eqv_xy s hs];
            exact h_symm _ _ h_eqv_x1_y
          -- calculation
          have h_trans :  a b c, eqv a b  eqv b c  eqv a c := by
            intro a b c hab hbc s hs_meas
            constructor
            · intro ha_in
              exact (hbc s hs_meas).1 ((hab s hs_meas).1 ha_in)
            · intro hc_in
              exact (hab s hs_meas).2 ((hbc s hs_meas).2 hc_in)
          show_term grind

      · -- Show the reverse inclusion
        obtain y, hy := ht hx
        simp +zetaDelta at *;
        exact  y,  x, hx, by simpa using hy y , fun z => by simpa [ eq_comm ] using hy z ⟩;
    · -- Case when equivalence classes are finite
      exact Classical.not_not.mp h_eq_classes_infinite

  -- The subsets of equivalence classes are also finite
  have h_subsets_finite : Set.Finite {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }} := by
    exact Set.Finite.subset (Set.Finite.powerset h_eq_classes_finite) fun t ht => ht

  -- Therefore the σ-algebra (unions of subsets) is finite
  have h_measurable_finite : Set.Finite (Set.image (fun t : Set (Set α) => ⋃₀ t) {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }}) := by
    exact h_subsets_finite.image _

  -- This contradicts the assumption that the σ-algebra is infinite
  exact h_infinite (h_measurable_finite.subset fun s hs => by
    obtain t, ht, rfl := h_sigma_gen s |>.1 hs
    exact Set.mem_image_of_mem _ ht)

  #print not_exists_infinite_countable_sigma_algebra._proof_1_9

Jovan Gerbscheid (Nov 08 2025 at 23:25):

To be clear, the posted example is equivalent to the following:

example (aaaaaaaaaaaaaaaaa b : Rat) : aaaaaaaaaaaaaaaaa + b = b + aaaaaaaaaaaaaaaaa := by exact?

which then produced this invalid proof:

example (aaaaaaaaaaaaaaaaa b : Rat) : aaaaaaaaaaaaaaaaa + b = b + aaaaaaaaaaaaaaaaa := by exact
  Rat.add_comm aaaaaaaaaaaaaaaaa b

Nick_adfor (Nov 09 2025 at 05:23):

Jovan Gerbscheid said:

To be clear, the posted example is equivalent to the following:

example (aaaaaaaaaaaaaaaaa b : Rat) : aaaaaaaaaaaaaaaaa + b = b + aaaaaaaaaaaaaaaaa := by exact?

which then produced this invalid proof:

example (aaaaaaaaaaaaaaaaa b : Rat) : aaaaaaaaaaaaaaaaa + b = b + aaaaaaaaaaaaaaaaa := by exact
  Rat.add_comm aaaaaaaaaaaaaaaaa b

So what happened to

have h_y_eq_xstar :  (u : Set α), MeasurableSet u  (y  u  x_1  u) := by exact
                  fun u a => (fun {a b} => iff_comm.mp) (h_eqv_x1_y u a)

Jovan Gerbscheid (Nov 09 2025 at 09:27):

The issue is that we'd like exact? to realize that it should put the exact on the next line. I don't know how to fix this, but I don't think it is a big problem.

Nick_adfor (Nov 09 2025 at 09:46):

This is still about the line-breaking issue... exact? doesn’t generate content with automatic line breaks — I have to manually split by and exact onto two separate lines.

Nick_adfor (Nov 09 2025 at 09:46):

have h_y_eq_xstar :  (u : Set α), MeasurableSet u  (y  u  x_1  u) := by exact
                  fun u a => (fun {a b} => iff_comm.mp) (h_eqv_x1_y u a)

should be

have h_y_eq_xstar :  (u : Set α), MeasurableSet u  (y  u  x_1  u) := by
   exact fun u a => (fun {a b} => iff_comm.mp) (h_eqv_x1_y u a)

Jovan Gerbscheid (Nov 09 2025 at 10:02):

Another related item on the exact? TODO list is to remove the by and the exact if possible.

Nick_adfor (Nov 09 2025 at 10:41):

One more exact? problem here.

import Mathlib

/--
There does not exist an infinite σ-algebra that contains only countably many members.

This theorem states that it is impossible to have a σ-algebra that is both infinite
and countable. The proof proceeds by contradiction, showing that any infinite σ-algebra
must contain at least continuum many sets.
-/
theorem not_exists_infinite_countable_sigma_algebra :
    ¬  (α : Type) (i : MeasurableSpace α),
      Set.Countable {s : Set α | @MeasurableSet α i s} 
      Set.Infinite {s : Set α | @MeasurableSet α i s} := by
  -- Assume by contradiction that such a σ-algebra exists
  by_contra h_contra
  obtain α, i, h_countable, h_infinite := h_contra

  -- Define an equivalence relation: x ~ y if they belong to the same measurable sets
  set eqv : α  α  Prop := fun x y =>  s : Set α, MeasurableSet s  (x  s  y  s)

  -- Each equivalence class is measurable (can be expressed as countable intersections)
  have h_partition :  x : α, MeasurableSet {y : α | eqv x y} := by
    intro x
    -- Express the equivalence class as an intersection over measurable sets containing x
    -- and complements of measurable sets not containing x
    have h_eqv_class : {y : α | eqv x y} =  s  {s : Set α | MeasurableSet s  x  s}, s   s  {s : Set α | MeasurableSet s  xs}, s := by
      ext y; aesop (config := {warnOnNonterminal := false})
      specialize a sᶜ; aesop (config := {warnOnNonterminal := false})
    rw [h_eqv_class]
    -- The intersection is measurable since it's over countably many measurable sets
    refine' MeasurableSet.biInter _ _ <;> aesop (config := {warnOnNonterminal := false})
    exact h_countable.mono fun s hs => hs.1
    -- Countability of the indexing set for complements
    have h_countable_inter : Set.Countable {s : Set α | MeasurableSet s  xs} := by
      exact h_countable.mono fun s hs => hs.1
    exact MeasurableSet.inter left (MeasurableSet.biInter h_countable_inter fun s hs => MeasurableSet.compl hs.1)

  -- The σ-algebra is generated by the equivalence classes
  have h_sigma_gen :  s : Set α, MeasurableSet s   t : Set (Set α), t  { {y : α | eqv x y} | x : α }  s = ⋃₀ t := by
    aesop (config := {warnOnNonterminal := false})
    · -- Forward direction: every measurable set is a union of equivalence classes
      use { { y : α | eqv x y } | x  s }
      aesop (config := {warnOnNonterminal := false})
    · -- Reverse direction: any union of equivalence classes is measurable
      have h_measurable_w :  s  w, MeasurableSet s := by
        intro s hs
        specialize left hs
        aesop (config := {warnOnNonterminal := false})
      -- Countability of the indexing set
      have h_countable_w : w.Countable := by
        exact h_countable.mono h_measurable_w
      exact MeasurableSet.sUnion h_countable_w h_measurable_w

  -- The set of equivalence classes must be finite
  have h_eq_classes_finite : Set.Finite { {y : α | eqv x y} | x : α } := by
    by_cases h_eq_classes_infinite : Set.Infinite { {y : α | eqv x y} | x : α }
    · -- If equivalence classes were infinite, the power set would be uncountable
      have h_power_set_uncountable : ¬Set.Countable (Set.powerset { {y : α | eqv x y} | x : α }) := by
        intro h_power_set_countable
        -- Show that the power set has cardinality at least continuum
        have h_power_set_card : Cardinal.mk (Set.powerset { {y : α | eqv x y} | x : α })  Cardinal.aleph0 := by
          exact Cardinal.mk_le_aleph0_iff.mpr h_power_set_countable.to_subtype
        simp [*] at *
        -- Cantor's theorem gives contradiction with countability
        have h_card_ge_aleph0 : Cardinal.mk { {y : α | eqv x y} | x : α }  Cardinal.aleph0 := by
          exact Cardinal.aleph0_le_mk_iff.mpr (h_eq_classes_infinite.to_subtype)
        exact h_power_set_card.not_gt (lt_of_lt_of_le (Cardinal.cantor _) (Cardinal.power_le_power_left two_ne_zero h_card_ge_aleph0))
      -- But the power set injects into our σ-algebra, contradicting countability
      apply_mod_cast False.elim <| h_power_set_uncountable <| Set.Countable.mono _ <| h_countable.image _
      use fun s => { t |  x  s, { y | eqv x y } = t }
      intro t ht
      use ⋃₀ t
      simp_all [Set.ext_iff]
      refine' ⟨⟨t, ht, fun x => Iff.rfl, fun x => fun hx => _, fun hx => _⟩⟩
      · -- Show x is in the appropriate equivalence class
        obtain y, z, hz, hyz, hy := hx
        convert hz
        obtain x_1, hx_1 :  x_1 : α, z = {y | eqv x_1 y} := by
          obtain x_1, hx_1 := ht hz
          exact x_1, by ext; simp [hx_1]
        -- The root of all evil is `ext`. `ext` generates an implicit variable `x✝`, and implicit variables like `x✝` cannot be included in the statement — expressions such as `eqv y x✝` are invalid. Therefore, it should be replaced with an explicit variable: `apply Set.ext; intro w`.
        apply Set.ext
        intro w
        simp [hx_1]
        -- Calculation
        have h_eqv_x1_y : eqv x_1 y := by
          exact hx_1.subset hyz
        constructor
        · intro hx_mem s hs_meas
          constructor
          · intro hx1_in_s
            -- y in s
            have h_y_in_s : y  s := by
              -- Since $x_1$ and $y$ are equivalent, by definition of $eqv$, we have $x_1 \in s \leftrightarrow y \in s$.
              have hy_in_s : x_1  s  y  s := by
                apply h_eqv_x1_y s hs_meas;
              -- Apply the equivalence from hy_in_s to hx1_in_s to conclude y is in s.
              apply hy_in_s.mp hx1_in_s
            -- Since eqv y w holds, for any measurable set s, y ∈ s ↔ w ∈ s. Given that y ∈ s, it follows that w ∈ s.
            have h_eqv_y_x :  s : Set α, MeasurableSet s  (y  s  α  s) := by
              -- Since y and w are in the same equivalence class under eqv, by definition of eqv, this equivalence holds for all measurable sets s.
              intros s hs_meas; exact (hy ‹_›).mpr hx_mem s hs_meas;
            exact h_eqv_y_x s hs_meas |>.1 h_y_in_s
          · intro hx_in_s
            -- y in s
            have h_y_in_s : y  s := by
              -- Since eqv x_1 y holds, for any measurable set s, x_1 ∈ s ↔ y ∈ s. Given that x_1 ∈ s, it follows that y ∈ s.
              have h_eqv_y_w : eqv y w := (hy w).2 hx_mem
              -- Calculation
              have h_eqv_x1_w : eqv x_1 w := by
                intro s' hs'
                -- Calculation
                have h1 := h_eqv_x1_y s' hs'
                -- Calculation
                have h2 := h_eqv_y_w s' hs'
                constructor
                · intro hx1; exact h2.1 (h1.1 hx1)
                · intro hw; exact h1.2 (h2.2 hw)
              -- Calculation
              have h_x1_in_s : x_1  s := (h_eqv_x1_w s hs_meas).2 hx_in_s
              exact (h_eqv_x1_y s hs_meas).1 h_x1_in_s
            apply (h_eqv_x1_y s hs_meas).mpr h_y_in_s
        · intro h_eqv_x1_w
          -- Calculation
          have h_eqv_y_x1 : eqv y x_1 := by
            -- Since eqv is symmetric, if eqv x_1 y holds, then eqv y x_1 must also hold.
            have h_symm :  x y, eqv x y  eqv y x := by
              -- Since eqv is symmetric, if eqv x y holds, then eqv y x must also hold. This follows directly from the definition of eqv.
              intros x y h_eqv_xy
              intro s hs
              rw [h_eqv_xy s hs];
            exact h_symm x_1 y h_eqv_x1_y
          -- Calculation
          have h_trans :  a b c, eqv a b  eqv b c  eqv a c := by
            intro a b c hab hbc s hs_meas
            constructor
            · intro ha_in
              exact (hbc s hs_meas).1 ((hab s hs_meas).1 ha_in)
            · intro hc_in
              exact (hab s hs_meas).2 ((hbc s hs_meas).2 hc_in)
          -- Calculation
          have h_eqv_y_w : eqv y w := h_trans y x_1 w h_eqv_y_x1 h_eqv_x1_w
          exact ((hy w).1 h_eqv_y_w)
      · -- Show the reverse inclusion
        obtain y, hy := ht hx
        simp +zetaDelta at *;
        exact  y,  x, hx, by simpa using hy y , fun z => by simpa [ eq_comm ] using hy z ⟩;
    · -- Case when equivalence classes are finite
      exact Classical.not_not.mp h_eq_classes_infinite

  -- The subsets of equivalence classes are also finite
  have h_subsets_finite : Set.Finite {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }} := by
    exact Set.Finite.subset (Set.Finite.powerset h_eq_classes_finite) fun t ht => ht

  -- Therefore the σ-algebra (unions of subsets) is finite
  have h_measurable_finite : Set.Finite (Set.image (fun t : Set (Set α) => ⋃₀ t) {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }}) := by
    exact?

  -- This contradicts the assumption that the σ-algebra is infinite
  exact h_infinite (h_measurable_finite.subset fun s hs => by
    obtain t, ht, rfl := h_sigma_gen s |>.1 hs
    exact Set.mem_image_of_mem _ ht)

Nick_adfor (Nov 09 2025 at 10:43):

The following can work. Maybe exact? do not generate any implicit argument

  -- Therefore the σ-algebra (unions of subsets) is finite
  have h_measurable_finite : Set.Finite (Set.image (fun t : Set (Set α) => ⋃₀ t) {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }}) := by
    exact h_subsets_finite.image _

Jovan Gerbscheid (Nov 09 2025 at 10:50):

Instead of pasting a large amount of code and expecting others to find which part to look at, could you post a small #mwe? This is what I did for your previous message.

Nick_adfor (Nov 09 2025 at 10:54):

Jovan Gerbscheid said:

Instead of pasting a large amount of code and expecting others to find which part to look at, could you post a small #mwe? This is what I did for your previous message.

It really cannot. Because this part is in the ending part of the proof of this theorem. So the mwe is nearly itself.

Nick_adfor (Nov 09 2025 at 10:55):

But if you can accept, I can admit one

import Mathlib

/--
There does not exist an infinite σ-algebra that contains only countably many members.

This theorem states that it is impossible to have a σ-algebra that is both infinite
and countable. The proof proceeds by contradiction, showing that any infinite σ-algebra
must contain at least continuum many sets.
-/
theorem not_exists_infinite_countable_sigma_algebra :
    ¬  (α : Type) (i : MeasurableSpace α),
      Set.Countable {s : Set α | @MeasurableSet α i s} 
      Set.Infinite {s : Set α | @MeasurableSet α i s} := by
  -- Assume by contradiction that such a σ-algebra exists
  by_contra h_contra
  obtain α, i, h_countable, h_infinite := h_contra

  -- Define an equivalence relation: x ~ y if they belong to the same measurable sets
  set eqv : α  α  Prop := fun x y =>  s : Set α, MeasurableSet s  (x  s  y  s)

  -- The subsets of equivalence classes are also finite
  have h_subsets_finite : Set.Finite {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }} := by admit

  -- Therefore the σ-algebra (unions of subsets) is finite
  have h_measurable_finite : Set.Finite (Set.image (fun t : Set (Set α) => ⋃₀ t) {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }}) := by
    exact?

Jovan Gerbscheid (Nov 09 2025 at 10:57):

It would also be helpful if you described in your message what the current behaviour is, in addition to what you want it to be. I'm on mobile right now so I can't paste the code into the web editor.

Nick_adfor (Nov 09 2025 at 11:07):

exact? shows an ambiguous ⋃₀

import Mathlib

/--
There does not exist an infinite σ-algebra that contains only countably many members.

This theorem states that it is impossible to have a σ-algebra that is both infinite
and countable. The proof proceeds by contradiction, showing that any infinite σ-algebra
must contain at least continuum many sets.
-/
theorem not_exists_infinite_countable_sigma_algebra :
    ¬  (α : Type) (i : MeasurableSpace α),
      Set.Countable {s : Set α | @MeasurableSet α i s} 
      Set.Infinite {s : Set α | @MeasurableSet α i s} := by
  -- Assume by contradiction that such a σ-algebra exists
  by_contra h_contra
  obtain α, i, h_countable, h_infinite := h_contra

  -- Define an equivalence relation: x ~ y if they belong to the same measurable sets
  set eqv : α  α  Prop := fun x y =>  s : Set α, MeasurableSet s  (x  s  y  s)

  -- The subsets of equivalence classes are also finite
  have h_subsets_finite : Set.Finite {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }} := by admit

  -- Therefore the σ-algebra (unions of subsets) is finite
  have h_measurable_finite : Set.Finite (Set.image (fun t : Set (Set α) => ⋃₀ t) {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }}) := by
    exact Set.Finite.image (fun t => ⋃₀ t) h_subsets_finite

Aaron Liu (Nov 09 2025 at 13:20):

what's the error?

Nick_adfor (Nov 09 2025 at 15:33):

Nick_adfor said:

But if you can accept, I can admit one

import Mathlib

/--
There does not exist an infinite σ-algebra that contains only countably many members.

This theorem states that it is impossible to have a σ-algebra that is both infinite
and countable. The proof proceeds by contradiction, showing that any infinite σ-algebra
must contain at least continuum many sets.
-/
theorem not_exists_infinite_countable_sigma_algebra :
    ¬  (α : Type) (i : MeasurableSpace α),
      Set.Countable {s : Set α | @MeasurableSet α i s} 
      Set.Infinite {s : Set α | @MeasurableSet α i s} := by
  -- Assume by contradiction that such a σ-algebra exists
  by_contra h_contra
  obtain α, i, h_countable, h_infinite := h_contra

  -- Define an equivalence relation: x ~ y if they belong to the same measurable sets
  set eqv : α  α  Prop := fun x y =>  s : Set α, MeasurableSet s  (x  s  y  s)

  -- The subsets of equivalence classes are also finite
  have h_subsets_finite : Set.Finite {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }} := by admit

  -- Therefore the σ-algebra (unions of subsets) is finite
  have h_measurable_finite : Set.Finite (Set.image (fun t : Set (Set α) => ⋃₀ t) {t : Set (Set α) | t  { {y : α | eqv x y} | x : α }}) := by
    exact?

As one can see, this part exact? generate something cannot work.

Aaron Liu (Nov 09 2025 at 18:26):

what error do you get

Aaron Liu (Nov 09 2025 at 18:27):

what's the error message

Kim Morrison (Nov 09 2025 at 20:37):

You mean "cannot work, except if the user fixes some whitespace", I think? If that is the case, then this essentially has nothing to do with exact? itself, and is just known deficiencies in the pretty-printer that exact? relies on. The pretty-printer is currently being actively worked on, so we'll see if things get better with that.


Last updated: Dec 20 2025 at 21:32 UTC