Zulip Chat Archive

Stream: Is there code for X?

Topic: Basic cardinality calculation


Bjørn Kjos-Hanssen (Oct 10 2020 at 21:38):

How would I prove that {n:ℕ | n=5}.to_finset.card = 1 ? From the mathlib docs it didn't seem obvious what the definition of .card is

Pedro Minicz (Oct 10 2020 at 21:42):

simp does the job:

example : {n :  | n = 5}.to_finset.card = 1 :=
begin
  simp
end

Heather Macbeth (Oct 10 2020 at 21:43):

By the way, did you know you can do {5} rather than {n : ℕ | n = 5}?

Pedro Minicz (Oct 10 2020 at 21:43):

By the way, you can use squeeze_simp to see what lemmas simp used to solve the goal:

example : {n :  | n = 5}.to_finset.card = 1 :=
begin
  --squeeze_simp,
  simp only [set.card_singleton, set.set_of_eq_eq_singleton, set.to_finset_card]
end

Pedro Minicz (Oct 10 2020 at 21:45):

Heather Macbeth said:

By the way, did you know you can do {5} rather than {n : ℕ | n = 5}?

Indeed, simp was using set_of_eq_eq_singleton {a : α} : {n | n = a} = {a} to turn {n : ℕ | n = 5} into {5}, as lemmas about singleton sets are defined using that notation.

Bjørn Kjos-Hanssen (Oct 10 2020 at 21:45):

OK thanks... simp does that but how about {n:ℕ | n=5 ∨ n=6}.to_finset.card = 2

Heather Macbeth (Oct 10 2020 at 21:50):

Maybe docs#finset.card_eq_succ? (Not a library I know well, though.)

Pedro Minicz (Oct 10 2020 at 21:50):

{n : ℕ | n = 5 ∨ n = 6}.to_finset won't work. If you see the definition of set.to_finset the issue becomes clear:

#check set.to_finset -- set.to_finset : Π (s : set ?M_1) [_inst_1 : fintype ↥s], finset ?M_1

set.to_finset needs an instance of fintype ↥s which cannot be inferred in this case.

Pedro Minicz (Oct 10 2020 at 21:51):

In the first case the instance could be inferred because {n : ℕ | n = 5} = {5} and there is an instance for fintype ↥{x}.

Pedro Minicz (Oct 10 2020 at 21:55):

You could provide the instance:

instance : fintype {n :  | n = 5  n = 6} :=
sorry

but using a different notation is better (because Lean can then infer things):

example : ({5, 6} : set ).to_finset.card = 2 :=
sorry

Pedro Minicz (Oct 10 2020 at 21:55):

{5, 6} = {n : ℕ | n = 5 ∨ n = 6 ∨ false} = {n : ℕ | n = 5 ∨ n = 6}

Pedro Minicz (Oct 10 2020 at 21:57):

example : ({5, 6} : set ).to_finset.card = 2 :=
begin
  simp,
  refl
end

Pedro Minicz (Oct 10 2020 at 21:58):

Again, I'd recommend using squeeze_simp and see which lemmas where used. In VSCode you can press F12 to jump to the definition.

Bjørn Kjos-Hanssen (Oct 10 2020 at 21:59):

That reduced the goal to {6}.to_finset.val.card + 1 = 2 it seems... so now if I prove {6]}.to_finset.val.card = 1 we may be getting somewhere

Pedro Minicz (Oct 10 2020 at 21:59):

This is true by reflexivity. {6}.to_finset.val.card reduces to 1.

Pedro Minicz (Oct 10 2020 at 22:00):

I removed change _ = 1 + 1, as it wasn't necessary. Then the goal becomes {6}.to_finset.val.card + 1 = 2 and again, {6}.to_finset.val.card + 1 reduces to 2. They are literally the same term!

Bjørn Kjos-Hanssen (Oct 10 2020 at 22:05):

Ah okay, this worked... example : ({5, 6} : set ℕ).to_finset.card = 2 :=begin refl end Thanks @Pedro Minicz and @Heather Macbeth

Heather Macbeth (Oct 10 2020 at 22:10):

Also -- example : ({5, 6} : set ℕ).to_finset.card = 2 := rfl :smiley:

Bjørn Kjos-Hanssen (Oct 10 2020 at 22:38):

I'd been wondering about the difference between refl and rfl... Also, this is a bit shorter: example : ({5, 6} : finset ℕ).card = 2 := rfl

Heather Macbeth (Oct 10 2020 at 22:38):

refl is a tactic and rfl is a lemma, if you are in the mood for this kind of abstract nonsense.

Heather Macbeth (Oct 10 2020 at 22:39):

So exact rfl is the same as refl

Heather Macbeth (Oct 10 2020 at 22:39):

and by refl or begin refl end are the same as rfl

Heather Macbeth (Oct 10 2020 at 22:40):

(modulo some subtleties that other people will probably jump in to explain!)

Kevin Buzzard (Oct 10 2020 at 22:47):

refl (the tactic) is slightly stronger than rfl (the term) because rfl will only prove goals of the form A = A, whereas refl will close any goal of the form R A A if R is a binary relation such that there's a proof of "for all x, R x x" which has been tagged with the refl tag (tactics can look through the library for lemmas and tags, term mode proofs can't). In practice most of the time refl is used to prove A = A (at least for me) but occasionally I use it to prove x <= x or P <-> P

Kevin Buzzard (Oct 10 2020 at 22:50):

def R (a b : ) : Prop := true

@[refl] lemma R.refl :  a, R a a := λ a, trivial

example : R 37 37 :=
begin
  refl
end

Kevin Buzzard (Oct 10 2020 at 22:52):

or even

def R (a b : ) : Prop := sorry

@[refl] lemma R.refl :  a, R a a := sorry

example : R 37 37 :=
begin
  refl
end

Kyle Miller (Oct 10 2020 at 23:18):

Are the following instances already in mathlib?

instance emptyc.fintype (α : Type*) : fintype ({} : set α) :=
, by simp

instance insert.fintype (α : Type*) [decidable_eq α] (x : α) (s : set α) [fintype s] : fintype (insert x s) :=
begin
  fsplit,
  let emb : s  (insert x s) :=
  { to_fun := λ a, h⟩, a, set.mem_insert_of_mem x h⟩,
    inj' := λ a,ha b,hb h, by simpa [insert.fintype._match_1] using h },
  have h : x  insert x s := set.mem_insert x s,
  exact {⟨x, h⟩}  finset.map emb finset.univ,
  rintro y, hy⟩,
  simp only [set.mem_insert_iff] at hy,
  rcases hy with rfl, _⟩,
  simp,
  simp [insert.fintype._match_1, hy_1],
end

Kyle Miller (Oct 10 2020 at 23:24):

This makes it so the following can find a fintype instance:

example : ({1,2,3} : set ).to_finset.card = 3 :=
begin
  sorry,
end

Bryan Gin-ge Chen (Oct 11 2020 at 00:25):

Yeah, they're both in data.set.finite as src#set.fintype_empty and src#set.fintype_insert:

import data.set.finite
example : ({1,2,3} : set ).to_finset.card = 3 := rfl

(I found them by going to docs#fintype, expanding the "Instances" and scrolling down to set.*.)

Bjørn Kjos-Hanssen (Oct 11 2020 at 02:16):

It seems that rfl (and begin refl end) can do some arithmetic too! For instance:

example : 2+2=4 :=
rfl

Kenny Lau (Oct 11 2020 at 04:27):

I might be wrong, but rfl is a special term, as in it is specially interpreted by the parser / elaborator.

Kenny Lau (Oct 11 2020 at 04:28):

as seen from the fact that if you write rfl for something that are not defeq, you get a special error message.

Mario Carneiro (Oct 11 2020 at 05:30):

For the most part it's just a term, but theorems of the form theorem foo : A = B := rfl (where the rhs can only be the literal token rfl) are used to mark definitional simp lemmas. It's a little restrictive but I think the idea is to substitute for some computation foo : A ~> B that doesn't otherwise have syntax in lean

Bjørn Kjos-Hanssen (Oct 16 2020 at 20:14):

(deleted)


Last updated: Dec 20 2023 at 11:08 UTC