Zulip Chat Archive
Stream: new members
Topic: Simplifying equal types
Devon Richards (Jan 13 2021 at 04:55):
I'm writing a function def concat {m n : ℕ} (s : fin m → α) (t : fin n → α) : fin (m + n) → α
and I start by splitting on the case that m = 0
. Is there a good way for me to get it to accept t
as the result? Ultimately what I'm trying to do is make it simpler to work with the definition when trying to prove things about it. Currently when I do split_ifs
I get a value of _.mpr t ⟨i, _⟩
which I'm not sure how to deal with.
Hanting Zhang (Jan 13 2021 at 05:16):
You can do cases n
, which does induction by splitting into a base case m = 0
and the inductive step.
Devon Richards (Jan 13 2021 at 05:35):
I ended up being able to refactor concat so that I only have to check if m is zero since I can usually get a contradiction there, and instead of checking if n=0 I introduce an element of ⟨i, hi⟩ : fin (m + n)
and have an if/else on whether h : i < m
in which case it case it can just return s ⟨i, h⟩
which simplified much more usefully.
Devon Richards (Jan 13 2021 at 05:43):
And I could actually go further and completely remove the equal to zero checks for both variables so the only if expression is on i < m
. Guess this makes a good lesson on making sure my definitions are correct.
Eric Wieser (Jan 13 2021 at 08:24):
There's a docs#sum_fin_sum_equiv or similar that mostly implements your concat
Eric Wieser (Jan 13 2021 at 08:26):
sum.cases s t \comp sum_fin_sum_equiv.symm
is your function I think
Last updated: Dec 20 2023 at 11:08 UTC