Zulip Chat Archive
Stream: Is there code for X?
Topic: Pairs of distinct elements
Vasily Ilin (Nov 18 2023 at 07:58):
Is there a type similar to Sym2 except [a,a] is not allowed? The cardinality of this type would be n(n-1)/2 instead of n(n+1)/2 like for Sym2. I am defining a random graph and I want to say that for every unordered pair of vertices [v,w] with v not equal to w, I can have an edge.
Eric Wieser (Nov 18 2023 at 09:25):
(x : Sym2 α// ¬x.IsDiag}
Kyle Miller (Nov 18 2023 at 18:16):
For example, the cardinality result exists as docs#html#Sym2.card_subtype_not_diag
Kyle Miller (Nov 18 2023 at 18:18):
Sometimes I've thought about introducing UConf2 α := {x : Sym2 α // ¬x.IsDiag} as an abbreviation for this (it's the unordered configuration space of two points). This might be a bit of an obscure name though.
Kevin Buzzard (Nov 18 2023 at 18:25):
"alpha choose 2" would be a cool name :-)
Kyle Miller (Nov 18 2023 at 18:27):
Oh, Choose2 α would be a lot better than UConf2 α. Then there could also be Choose α 2. This would mirror Sym2 α and Sym α 2.
Kyle Miller (Nov 18 2023 at 18:32):
Imagine if we had uniform symbols for everything in the 12-fold way. This one could be α q↪ Fin 2 for "injective functions, quotiented by permutations of the domain"
Kyle Miller (Nov 18 2023 at 18:37):
Fin n ↠q Fin m (surjective maps, quotiented by permutations of the codomain) could be for Stirling numbers of the second kind
Antoine Chambert-Loir (Nov 19 2023 at 13:06):
In my work on the simplicity of the alternating group, I made use of
/-- The type of combinations of `n` elements of a type `α` -/
def Nat.Combination (n : ℕ) := {s : Finset α | s.card = n}
Antoine Chambert-Loir (Nov 19 2023 at 13:07):
(and then, I study the action of Equiv.Perm α on the corresponding subtype).
Notification Bot (Nov 19 2023 at 22:42):
Vasily Ilin has marked this topic as resolved.
Notification Bot (Nov 20 2023 at 19:59):
Vasily Ilin has marked this topic as unresolved.
Vasily Ilin (Nov 20 2023 at 20:00):
Why does docs#SimpleGraph.edgeSet not use {x : Sym2 α // ¬x.IsDiag} but instead uses Sym2? A simple graph does not have self-edges so there won't be any diagonal elements.
Ruben Van de Velde (Nov 20 2023 at 20:05):
Probably because it's easier this way
Kyle Miller (Nov 20 2023 at 20:08):
Rather than working with subtypes, it can be easier working with types themselves and then using accompanying theorems (like docs#SimpleGraph.not_isDiag_of_mem_edgeSet). If you need the subtype, then you can package it up yourself.
It's similar to questions like, for Nat, why doesn't n + 1 land in {m : Nat // 0 < m} rather than Nat.
Vasily Ilin (Nov 20 2023 at 20:14):
In https://github.com/Vilin97/random_graphs/blob/experimental/RandomGraphs/erdos_renyi.lean#L51 I proved a false theorem -- that an Erdos-Renyi simple graph has pn(n+1)/2 edges in expectation. Instead I need it to be pn(n-1)/2. The problem is that I defined edges to be in Sym2 V, thinking that that's the type of edges. But Sym2 V has the wrong cardinality. Now I am trying to switch to using {x : Sym2 V // ¬x.IsDiag} but I am struggling to convert from this type to Sym2 V.
variable [Fintype V] [DecidableEq V]
def EdgeType (V : Type) := {x : Sym2 V // ¬x.IsDiag}
lemma edge_type_subtype_of_sym2 (e : EdgeType V) : (e : Sym2 V) := sorry
Kyle Miller (Nov 20 2023 at 21:01):
If you switch def EdgeType to abbrev EdgeType, then if you have e : EdgeType V you should be able to use e wherever a Sym2 V is expected.
Antoine Chambert-Loir (Nov 21 2023 at 18:07):
If you want it for graphs, I strongly wish that mathlib implements the definition of Serre / Bourbaki that will allow correct automorphisms groups, relation with orientations etc
Vasily Ilin (Dec 04 2023 at 20:14):
Kyle Miller said:
If you switch
def EdgeTypetoabbrev EdgeType, then if you havee : EdgeType Vyou should be able to useewherever aSym2 Vis expected.
That does not work for me. I get the same error with def and abbrev.
Kyle Miller (Dec 04 2023 at 20:16):
What's the error? This works for me:
import Mathlib
variable {V : Type*} [Fintype V] [DecidableEq V]
abbrev EdgeType (V : Type*) := {x : Sym2 V // ¬x.IsDiag}
lemma edge_type_subtype_of_sym2 (e : EdgeType V) : Sym2 V := e
Vasily Ilin (Dec 04 2023 at 20:21):
import Mathlib.Combinatorics.SimpleGraph.Basic
variable {V : Type*} [Fintype V] [DecidableEq V]
abbrev EdgeType (V : Type*) := {x : Sym2 V // ¬x.IsDiag}
def Edge (G : SimpleGraph V) (e : EdgeType V) : Prop := e ∈ G.edgeSet -- failed to synthesize instance Membership (EdgeType V) (Set (Sym2 V))
Vasily Ilin (Dec 04 2023 at 20:21):
Failed to synthesize membership
Yaël Dillies (Dec 04 2023 at 20:23):
I believe this is because abbrev (very surprisingly) doesn't make the definition reducible.
Vasily Ilin (Dec 04 2023 at 20:23):
I don't know what reducible means :(
Kyle Miller (Dec 04 2023 at 20:27):
@Yaël Dillies That's not the case, abbrev does make definitions reducible.
I think the problem is that this isn't a place where Lean will insert a coercion. This works:
def Edge (G : SimpleGraph V) (e : EdgeType V) : Prop := e.1 ∈ G.edgeSet
Kyle Miller (Dec 04 2023 at 20:29):
When I said "wherever a Sym2 V is expected" I'm technically correct (it does work if Lean is expecting a Sym2 in the sense it will insert a coercion as needed), but I'm practically incorrect because you can't use it wherever a Sym2 would have worked before.
Kyle Miller (Dec 04 2023 at 20:31):
(I'm not really sure why it shouldn't work here though. One could imagine that because the first argument is an outParam that Lean could insert a coercion, but the fact is that it doesn't.)
Vasily Ilin (Dec 04 2023 at 22:50):
Thank you!
Last updated: May 02 2025 at 03:31 UTC