Zulip Chat Archive
Stream: new members
Topic: maximal finset in finset of finsets
Bryan Gin-ge Chen (Sep 13 2018 at 18:36):
Excuse the weird title. I'm trying to prove that a finset of subsets of a finset must contain an element of largest size, without relying on classical choice:
lemma not_empty_has_max_size {E : finset α} {F : finset (finset α)} : F ⊆ powerset E → F ≠ ∅ → ∃ x ∈ F, ∀ g ∈ F, card g ≤ card x := sorry
Here's my attempt so far, which seems to have taken me down a strange path:
import data.finset variable α:Type* variable [decidable_eq α] open finset lemma finset.card_one_eq {E : finset α} : card E = 1 ↔ ∃ a, E = finset.singleton a := begin have h : _ := @multiset.card_eq_one α E.val, unfold card, rw [iff_congr h, exists_congr], intro a, rw [←singleton_val, val_inj], refl end lemma powerset_empty : powerset (∅ : finset α) = finset.singleton ∅ := rfl lemma subset_singleton {F : finset (finset α)} : F ⊆ finset.singleton (∅:finset α) ↔ F = ∅ ∨ F = finset.singleton ∅ := begin split, intro h, by_cases h1 : F = ∅, exact or.inl h1, have : F = finset.singleton ∅ := begin sorry end, sorry, intro h, exact or.elim h (begin intro h1, rw h1, simp end) (begin intro h1, rw h1, simp end) end lemma not_empty_has_max_size {E : finset α} {F : finset (finset α)} : F ⊆ powerset E → F ≠ ∅ → ∃ x ∈ F, ∀ g ∈ F, card g ≤ card x := begin intros FPE Fne, induction E using finset.induction with a E ha hE, rw [powerset_empty, subset_singleton] at FPE, exact or.elim FPE (by contradiction) begin intro h, exact exists.intro ∅ begin rw h, exact exists.intro (mem_singleton_self ∅) (begin intros g hg, rw mem_singleton at hg, rw hg end) end end, by_cases hh1 : F ⊆ powerset E, exact hE hh1, sorry end
I'm hoping someone can point me in a smarter direction. Thanks as always!
Reid Barton (Sep 13 2018 at 18:39):
Doesn't every finset of finsets contain an element of largest size, regardless of E
and the associated condition?
Bryan Gin-ge Chen (Sep 13 2018 at 18:41):
Maybe, I got worried that without having some kind of bound on the size of the finsets I wouldn't be able to prove it without choice.
Kevin Buzzard (Sep 13 2018 at 18:44):
just use finset.map (I'm assuming this exists!) on finset.card to get a finset of nats and then take the max and work your way back?
Reid Barton (Sep 13 2018 at 18:45):
A finset is basically a list, and you could write a program that takes a list of lists and returns one of the maximum length, so there should be no trouble proving it constructively.
Reid Barton (Sep 13 2018 at 18:47):
Yeah, I was looking for a function on finset which is max after applying a function, but I guess since nat has decidable equality you can use finset.map
in this case.
Reid Barton (Sep 13 2018 at 18:47):
Sorry, not finset.map
but finset.image
.
Chris Hughes (Sep 13 2018 at 18:48):
lemma not_empty_has_max_size {E : finset α} {F : finset (finset α)} : F ⊆ powerset E → F ≠ ∅ → ∃ x ∈ F, ∀ g ∈ F, card g ≤ card x := λ _ h, let ⟨n, hn⟩ := (max_of_ne_empty (mt image_eq_empty.1 h) : ∃ a, a ∈ finset.max (F.image card)) in let ⟨x, hx₁, hx₂⟩ := mem_image.1 (mem_of_max hn) in ⟨x, hx₁, hx₂.symm ▸ λ g hg, le_max_of_mem (mem_image.2 ⟨g, hg, rfl⟩) hn⟩
Bryan Gin-ge Chen (Sep 13 2018 at 18:48):
Wow, thanks!
Mario Carneiro (Sep 13 2018 at 18:49):
That uses decidable_eq, doesn't it?
Kevin Buzzard (Sep 13 2018 at 18:50):
rofl
Mario Carneiro (Sep 13 2018 at 18:50):
My suggestion:
import data.finset section variables {α : Type*} (r : α → α → Prop) [is_preorder α r] local infix ` ≼ `:50 := r theorem list_zorn : ∀ l : list α, l ≠ [] → ∃ a ∈ l, ∀ b, a ≼ b → b ≼ a := sorry theorem finset_zorn : ∀ s : finset α, s ≠ ∅ → ∃ a ∈ s, ∀ b, a ≼ b → b ≼ a := sorry end
Bryan Gin-ge Chen (Sep 13 2018 at 18:50):
I would have never thought of using finset.image. And yes, decidable_eq is allowed.
Mario Carneiro (Sep 13 2018 at 18:50):
here the relation is card s <= card t
on finsets
Kenny Lau (Sep 13 2018 at 18:51):
lemma not_empty_has_max_size {E : finset α} {F : finset (finset α)} : F ⊆ powerset E → F ≠ ∅ → ∃ x ∈ F, ∀ g ∈ F, card g ≤ card x := λ _ h, let ⟨n, hn⟩ := (max_of_ne_empty (mt image_eq_empty.1 h) : ∃ a, a ∈ finset.max (F.image card)) in let ⟨x, hx₁, hx₂⟩ := mem_image.1 (mem_of_max hn) in ⟨x, hx₁, hx₂.symm ▸ λ g hg, le_max_of_mem (mem_image.2 ⟨g, hg, rfl⟩) hn⟩
what is the role of E in your theorem?
Kevin Buzzard (Sep 13 2018 at 18:51):
you can just prove this using the zorn in mathlib
Mario Carneiro (Sep 13 2018 at 18:51):
of course, but this (1) doesn't use nonconstructive axioms and (2) doesn't need the chain condition
Bryan Gin-ge Chen (Sep 13 2018 at 18:52):
If E is unnecessary here all the better. In the "application", it's the ground set of a matroid.
Reid Barton (Sep 13 2018 at 18:52):
decidable_eq nat
doesn't use axioms either
Mario Carneiro (Sep 13 2018 at 18:53):
yes, but the theorem can be proven constructively without that assumption
Reid Barton (Sep 13 2018 at 18:53):
Yeah, the max/min stuff should be on multisets.
Mario Carneiro (Sep 13 2018 at 18:54):
Unfortunately, here max/min don't work directly since it's not a poset
Kenny Lau (Sep 13 2018 at 18:54):
you can have zorn on a set (i.e. type) S as long as you have a choice function on P(P(S))\{{}}, right
Mario Carneiro (Sep 13 2018 at 18:54):
yes, but we don't have that here and I claim it's still provable
Kenny Lau (Sep 13 2018 at 18:55):
sure
Reid Barton (Sep 13 2018 at 18:55):
I mean we should just define max
for a set in the same style as prod
, in terms of max
on multiset, and nat is already a decidable linear whatever so there would be no problem there.
protected def prod [comm_monoid β] (s : finset α) (f : α → β) : β := (s.1.map f).prod
Mario Carneiro (Sep 13 2018 at 18:56):
what is this about nat
? I don't see it in the question
Reid Barton (Sep 13 2018 at 18:56):
nat
is the codomain of finset.card
(I assume)
Mario Carneiro (Sep 13 2018 at 18:57):
sure but that doesn't really matter; we are doing the choosing on finset A
which is not decidable (unless you assume so)
Mario Carneiro (Sep 13 2018 at 18:58):
all that decidability of nat gives you is decidability of the relation ≼
given by s ≼ t ↔ card s ≤ card t
Kenny Lau (Sep 13 2018 at 18:58):
I guess Kevin ran away from all this decidable nonsense :P
Reid Barton (Sep 13 2018 at 18:59):
I'm a bit confused.
All I am saying is that the original thing should be a direct conclusion of some lemma about max
of a multiset nat
, applied to F.1.map finset.card
.
Reid Barton (Sep 13 2018 at 19:00):
That lemma being the analogue for multisets of finset.max_of_ne_empty
and finset.le_max_of_mem
Reid Barton (Sep 13 2018 at 19:03):
But I guess maybe decidable_linear_order
is stronger than decidable_eq
anyways, so it doesn't really matter.
Mario Carneiro (Sep 13 2018 at 19:07):
the point is this isn't a question about decidable linear orders, but decidable preorders. Lack of uniqueness of the maximum makes it hard to define a function like max
directly
Reid Barton (Sep 13 2018 at 19:08):
You mean something like a "pre-total order"?
Mario Carneiro (Sep 13 2018 at 19:13):
is_total_preorder
exists in core btw
Mario Carneiro (Sep 13 2018 at 19:13):
but totality is not needed
Reid Barton (Sep 13 2018 at 19:14):
Finding the maximum value of a function on a finite set is a pretty standard thing to do. Of course there might not be a unique element of the set which maximizes the function, but the maximum value of the function is still well-defined. And often you only need some statement about the existence of a maximizing element.
It's not very obvious how you're supposed to get this from only the ability to take the maximum element of a finite set (in a totally ordered type).
Mario Carneiro (Sep 13 2018 at 19:15):
like kenny and chris have shown, you can take the image of the finset and get the maximum
Mario Carneiro (Sep 13 2018 at 19:16):
unless you care about constructivity and then you have to prove it from scratch
Mario Carneiro (Sep 13 2018 at 19:17):
that works in any total preorder
Mario Carneiro (Sep 13 2018 at 19:17):
in a partial order, I don't see any easy way to get it except zorn's lemma
Kenny Lau (Sep 13 2018 at 19:22):
like kenny and chris have shown, you can take the image of the finset and get the maximum
I don't think I did anything
Bryan Gin-ge Chen (Sep 13 2018 at 19:23):
I care a little bit about constructivity, but maybe I'll see how far I can get with Chris's solution first.
Mario Carneiro (Sep 13 2018 at 19:56):
oops, I didn't see that you just quoted chris's solution
Last updated: Dec 20 2023 at 11:08 UTC