Zulip Chat Archive

Stream: new members

Topic: Elimination of product of fintypes in proof


Yakov Pechersky (Jun 22 2020 at 05:12):

I'm testing out notation for n-dim "matrices" by reworking data.matrix.notation. I had a wrong defn for vec_cons before. Now that I've fixed it, I'm trying to prove the amended lemmas, but I don't know the right tactic invocation to reduce the indexing. mwe with sorry'd lemma below:

import data.matrix.notation

universe u
variables {α : Type u}

open_locale matrix

variables {ι : Type} [fintype ι]

def vec_empty : (fin 0 × ι)  α :=
λ n, i, fin_zero_elim n

def vec_cons {n : } (h : ι  α) (t : (fin n × ι)  α) : (fin n.succ × ι)  α :=
λ ⟨⟨ni, hni, mi, (nat.cases_on ni
  (λ _, h mi) (λ k hk, t (k, nat.lt_of_succ_lt_succ hk, mi))) hni

notation `![` l:(foldr `, ` (h t, vec_cons h t) vec_empty `]`) := l

def vec_head {n : } (v : (fin n.succ × ι)  α) : ι -> α :=
λ i, v ⟨⟨0, nat.succ_pos', i

def vec_tail {n : } (v : (fin n.succ × ι)  α) : (fin n × ι)  α :=
λ ⟨⟨k, hn, i, v ⟨⟨k.succ, nat.succ_lt_succ hn, i

lemma empty_eq (v : (fin 0 × ι)  α) : v = ![] :=
by { ext i, fin_cases i }

variables {m : }

@[simp] lemma cons_val_zero (x : ι  α) (u : (fin m × ι)  α) : (λ i, vec_cons x u 0, i) = x :=
begin
  ext i,
  sorry
end

Yakov Pechersky (Jun 22 2020 at 05:18):

Doing cases m doesn't seem productive since the defn of vec_cons just relies on passing 0 to access the h mi case, which is just the element we just vec_cons'd in.

Johan Commelin (Jun 22 2020 at 05:45):

not helpful for your sorry, I guess, but starting definitions with

λ n, i,

is unfortunately not a good idea, because a pair p is not defeq to ⟨p.1,p.2⟩. (Of course they are provably equal.)
Hence it's better to write

λ p, blabla p.1 foobar p.2

Yakov Pechersky (Jun 22 2020 at 14:36):

Your suggested syntax throws an error:

import data.matrix.notation

universe u
variables {α : Type u}

open_locale matrix

variables {ι : Type} [fintype ι]

def vec_empty : (fin 0 × ι)  α :=
-- λ ⟨n, i⟩, fin_zero_elim n
λ p, fin_zero_elim p.1
--type mismatch, term
--  λ (p : fin 0 × ι), fin_zero_elim p.fst
--has type
--  Π (p : fin 0 × ι), ?m_1[p] p.fst : Sort (imax 1 ?)
--but is expected to have type
--  fin 0 × ι → α : Type u

Is there some pi.instance I should be employing?

Johan Commelin (Jun 22 2020 at 14:38):

Does it help to write @fin_zero_elim explicitly?

Yakov Pechersky (Jun 22 2020 at 14:39):

type mismatch at application
  fin_zero_elim
term
  p.fst
has type
  fin 0 : Type
but is expected to have type
  fin 0  Sort ? : Type ?

Yakov Pechersky (Jun 22 2020 at 14:39):

That's using @fin_zero_elim

Reid Barton (Jun 22 2020 at 14:42):

You will have to write some other stuff too.

Yakov Pechersky (Jun 22 2020 at 14:42):

Right, sorry

Reid Barton (Jun 22 2020 at 14:50):

I think eta expanding is likely better.

Reid Barton (Jun 22 2020 at 14:50):

Something like λ p x, fin_zero_elim p.1 x

Yakov Pechersky (Jun 22 2020 at 14:55):

I don't understand what would be the term of fin 0 -> Sort u that would be required for the implicit argument of fin_zero_elim. I have the following working using composition, but earlier posts in the channel suggested staying away from composition.

import data.matrix.notation

universe u
variables {α : Type u}

open_locale matrix

variables {ι : Type} [fintype ι]

def vec_empty : fin 0 -> α :=
fin_zero_elim

def vec_empty' : (fin 0 × ι)  α :=
λ p, fin_zero_elim (prod.fst p)

def vec_empty'' : (fin 0 × ι)  α :=
fin_zero_elim  prod.fst
--type mismatch, term
--  λ (p : fin 0 × ι), fin_zero_elim p.fst
--has type
--  Π (p : fin 0 × ι), ?m_1[p] p.fst : Sort (imax 1 ?)
--but is expected to have type
--  fin 0 × ι → α : Type u

#print vec_empty
#check @vec_empty''

Reid Barton (Jun 22 2020 at 15:02):

It's the motive for the elimination, namely \lam _, α.

Yakov Pechersky (Jun 22 2020 at 15:05):

Thanks for the insight. I didn't think that I could just supply the type \a as the term, but that makes total sense, since it's asking for a term of type Sort. Still getting in the mindset of dependent type theory.

Yakov Pechersky (Jun 23 2020 at 00:04):

Thanks for the guidance on removing the inductive pair elimination in the defn. Now the proof is easy:

import data.matrix.notation

universe u
variables {α : Type u}

open_locale matrix

variables {ι : Type} [fintype ι]

def vec_empty : (fin 0 × ι)  α :=
λ p, @fin_zero_elim (λ _, α) p.1

def vec_cons {n : } (h : ι  α) (t : (fin n × ι)  α) : (fin n.succ × ι)  α :=
λ p, (nat.cases_on p.1.1
  (λ _, h p.2) (λ k hk, t (k, nat.lt_of_succ_lt_succ hk, p.2))) p.1.2

variables {m : }

@[simp] lemma cons_val_zero (x : ι  α) (u : (fin m × ι)  α) : (λ i, vec_cons x u 0, i) = x := rfl

Last updated: Dec 20 2023 at 11:08 UTC