Zulip Chat Archive

Stream: mathlib4

Topic: gcongr for biUnion


Yaël Dillies (Mar 07 2025 at 15:26):

I am trying to make gcongr handle goals of the form ⋃ i ≤ m, f i ⊆ ⋃ i ≤ n, f i (shows up in the proof of Prokhorov's theorem). I thought I could get it to work using something like

import Mathlib.Data.Set.Lattice

@[gcongr]
lemma Set.iUnion_prop_mono {α : Type*} {p q : Prop} {s t : Set α} (hpq : p → q) (hst : s ⊆ t) :
    ⋃ _ : p, s ≤ ⋃ _ : q, t :=
  iUnion_subset fun hp ↦ hst.trans <| subset_iUnion (fun _ ↦ t) <| hpq hp

but it fails with

@[gcongr] attribute only applies to lemmas proving f x₁ ... xₙ ∼ f x₁' ... xₙ'.
 Not all arguments are free variables in the conclusion of ∀ {α : Type u_1} {p q : Prop} {s t : Set α},
  (p → q) → s ⊆ t → ⋃ (_ : p), s ≤ ⋃ (_ : q), t

Yaël Dillies (Mar 07 2025 at 15:26):

What am I doing wrong?

Floris van Doorn (Mar 07 2025 at 15:30):

I expect that it doesn't like -> as a binary relation...?

Aaron Liu (Mar 07 2025 at 15:31):

This works

import Mathlib.Data.Set.Lattice

@[gcongr]
lemma Set.iUnion_prop_mono {α : Type*} {p q : Prop} {s : p → Set α} {t : q → Set α} (hpq : p → q)
    (hst : ∀ hp hq, s hp ⊆ t hq) : iUnion s ≤ iUnion t :=
  iUnion_subset fun hp ↦ (hst hp (hpq hp)).trans <| subset_iUnion t <| hpq hp

Aaron Liu (Mar 07 2025 at 15:32):

The issue was that fun (_ : p) => s is not a free variable

Yaël Dillies (Mar 07 2025 at 15:34):

Aah, yeah. I wasn't thinking of the lambda

Yaël Dillies (Mar 07 2025 at 15:43):

@Heather Macbeth, any chance we can make this gcongr error message print which arguments are not free variables?

Bhavik Mehta (Mar 07 2025 at 17:55):

This is the part which checks that: https://github.com/leanprover-community/mathlib4/blob/b406f8ce738a4ff26f4acd63c269c9b71ff15bd7/Mathlib/Tactic/GCongr/Core.lean#L187


Last updated: Feb 28 2026 at 14:05 UTC