Zulip Chat Archive
Stream: Is there code for X?
Topic: Get single element from `finset`
Marcus Rossel (Jan 29 2021 at 14:43):
Is there a way to (a) state that a finset
contains exactly one element, and (b) extract that element if (a) is true?
Johan Commelin (Jan 29 2021 at 14:43):
Computably?
Johan Commelin (Jan 29 2021 at 14:43):
Otherwise, s.card = 1
Johan Commelin (Jan 29 2021 at 14:44):
And there must be some lemma that gives s.nonempty
from 0 < s.card
Johan Commelin (Jan 29 2021 at 14:45):
If you want to do this computably, you'll have to look at the def'n of finset
, and notice that it's basically a list
under the hood.
Marcus Rossel (Jan 29 2021 at 14:46):
(deleted)
Marcus Rossel (Jan 29 2021 at 14:51):
For the classical path finset.card_eq_one
works.
Mario Carneiro (Jan 29 2021 at 14:57):
import data.finset
def multiset.extract_singleton {α} (s : multiset α) : s.card = 1 → α :=
quotient.rec_on s (λ l, match l with [a], _ := a end) $ λ a b h,
funext $ λ H₂, begin
have H₁ := by rw ← quotient.sound h at H₂; exact H₂,
exact match a, b, H₁, H₂, h :
∀ a b (H₁ : a.length = 1) (H : b.length = 1) (h : list.perm a b), _ with
| [a], [b], _, _, h := begin
rcases h.mem_iff.1 (or.inl rfl) with rfl | ⟨⟨⟩⟩,
refl,
end
end
end
theorem multiset.eq_extract_singleton {α} (s : multiset α) (h) : s = s.extract_singleton h ::ₘ 0 :=
quotient.induction_on s (λ l, match l with [a], _ := rfl end) h
def finset.extract_singleton {α} (s : finset α) (h : s.card = 1) : α :=
s.1.extract_singleton h
theorem finset.eq_extract_singleton {α} (s : finset α) (h) : s = singleton (s.extract_singleton h) :=
finset.eq_of_veq $ s.1.eq_extract_singleton h
Eric Wieser (Jan 29 2021 at 15:06):
Can docs#finset.choose help here?
Eric Wieser (Jan 29 2021 at 15:14):
def finset.extract_singleton {α} (s : finset α) (h : s.card = 1) : α :=
s.choose (set.univ) $ begin
obtain ⟨a, rfl⟩ := finset.card_eq_one.mp h,
refine ⟨a, ⟨finset.mem_singleton_self a, trivial⟩, λ i h, finset.mem_singleton.mp h.1⟩,
end
Last updated: Dec 20 2023 at 11:08 UTC