Zulip Chat Archive
Stream: general
Topic: permutations of finsets
Johan Commelin (Apr 04 2020 at 10:10):
What is the canonical way to solve
import data.finset example (X : Type) (x y : X) : ({x, y} : finset X) = {y, x} := sorry
Chris Hughes (Apr 04 2020 at 10:43):
by finish
probably works.
Chris Hughes (Apr 04 2020 at 10:43):
Or finish [finset.ext]
Johan Commelin (Apr 04 2020 at 10:56):
Thanks @Chris Hughes
Mario Carneiro (Apr 04 2020 at 11:00):
isn't there an insert_comm
theorem for this?
Johan Commelin (Apr 04 2020 at 11:03):
Mario, my next question would be how to prove {a,b,c,d,e} = {d,a,c,e,b}
.
Mario Carneiro (Apr 04 2020 at 11:10):
I feel like simp
should be able to use insert_comm
to do general AC simplifications just as it does with addition currently (when you give it add_left_comm
)
Mario Carneiro (Apr 04 2020 at 11:11):
In this case finset.ext
should be enough since simp definitely knows how to play the game with permuting disjuncts
Chris Hughes (Apr 04 2020 at 11:39):
You can do simp [finset.ext, or_comm]
Kevin Buzzard (Apr 04 2020 at 11:58):
How come no or_assoc?
Chris Hughes (Apr 04 2020 at 12:31):
Because there is only one or
on each side.
Johan Commelin (Apr 04 2020 at 19:12):
How about this one
import data.finset example (X : Type*) (a b c d : X) (h : ({a, b} : finset X) = {c, d}) : (a = c ∧ b = d) ∨ (a = d ∧ b = c) := sorry
Johan Commelin (Apr 04 2020 at 19:13):
This are the kind of trivialities that I don't want to think about...
Kevin Buzzard (Apr 04 2020 at 19:15):
That doesn't even typecheck for me
Kevin Buzzard (Apr 04 2020 at 19:15):
failed to synthesize type class instance for X : Type ?, a b c d : X ⊢ has_insert ?m_1 (finset X)
Kevin Buzzard (Apr 04 2020 at 19:19):
I'd knock off a proof for you but I can't get anything to work
Johan Commelin (Apr 04 2020 at 19:21):
Hmm, does import data.finset
solve it?
Kevin Buzzard (Apr 04 2020 at 19:21):
no
Johan Commelin (Apr 04 2020 at 19:21):
I copy pasted this out of a file where it does typecheck
Johan Commelin (Apr 04 2020 at 19:21):
Crazy
Kevin Buzzard (Apr 04 2020 at 19:22):
What mathlib are you using?
Kevin Buzzard (Apr 04 2020 at 19:23):
The first example doesn't work for me either. What have I done? I've tried in two projects.
Kevin Buzzard (Apr 04 2020 at 19:24):
Both mathlibs from April
Mario Carneiro (Apr 04 2020 at 19:24):
I don't see any reason why that wouldn't work
Mario Carneiro (Apr 04 2020 at 19:25):
Oh, does @eq (finset X) {a, b} {c, d}
work?
Reid Barton (Apr 04 2020 at 19:25):
decidable equality issue?
Johan Commelin (Apr 04 2020 at 19:29):
Ha, that might be it. I do have open_locale classical
at the top of the file
Johan Commelin (Apr 04 2020 at 19:29):
import data.finset import tactic /-! Test -/ open_locale classical example (X : Type*) (a b c d : X) (h : ({a, b} : finset X) = {c, d}) : (a = c ∧ b = d) ∨ (a = d ∧ b = c) := sorry
Johan Commelin (Apr 04 2020 at 19:30):
Of course this result is classical, in every sense of the word...
Johan Commelin (Apr 04 2020 at 19:35):
Is this something that existing automation should be able to do? finish
doesn't...
Chris Hughes (Apr 04 2020 at 19:43):
This is the best I could do. I think it is something that there should be an algorithm that does it, at least after simp [finset.ext] at h
, because it's a first order in the language with no relation or functions other than equality which must be decidable.
example (X : Type*) (a b c d : X) (h : ({a, b} : finset X) = {c, d}) : (a = c ∧ b = d) ∨ (a = d ∧ b = c) := begin simp [finset.ext] at h, have := h a, have := h b, have := h c, have := h d, by_cases a = c; by_cases a = d; simp [*, eq_comm] at *; cc end
Kevin Buzzard (Apr 04 2020 at 20:15):
More generally one could ask
example (X : Type*) (a b c d : X) : (a = c ∧ b = d) ∨ (a = d ∧ b = c) ↔ ∀ x : X, (x = a ∨ x = b) ↔ (x = c ∨ x = d) := sorry
Jesse Michael Han (Apr 04 2020 at 21:55):
with finish using
we can make it even shorter, but it must still be spoon-fed the instantiations:
example (X : Type*) (a b c d : X) (h : ({a, b} : finset X) = {c, d}) : (a = c ∧ b = d) ∨ (a = d ∧ b = c) := begin finish [finset.ext] using [h a, h b, h c, h d] end
Kevin Buzzard (Apr 04 2020 at 22:23):
This is a bit surprising to me because h a
doesn't make sense until after finset.ext
has been applied to h
Kevin Buzzard (Apr 04 2020 at 22:24):
Aah I see, it applies simp [finset.ext]
to all the hypotheses, presumably before reading what happens after using
Michael R Douglas (Apr 05 2020 at 13:20):
Suppose I wanted to generalize this example to a pair of N-element sets. Is there any way to do it with N a parameter ?
Kevin Buzzard (Apr 05 2020 at 13:22):
You're in danger of formalising the assertion that if L is a list and P is a permutation, then P L and L give the same multiset, which will be true by definition because multiset is defined as a quotient of list by permutations.
Reid Barton (Apr 05 2020 at 13:35):
It's also not true that {a, b, c} = {d, e, f}
implies (a = d and b = e and c = f) or [5 other permutations]
.
Kevin Buzzard (Apr 05 2020 at 13:45):
because {1,1,2}={1,2,2}
if they're finsets
Last updated: Dec 20 2023 at 11:08 UTC