# Zulip Chat Archive

## Stream: general

### Topic: proof by induction on Z

#### Johan Commelin (Dec 09 2018 at 19:01):

Why is a thing like this not possible?

import algebra.group_power theorem map_gsmul {A B} [add_group A] [add_group B] (f : A → B) [is_add_group_hom f] (a : A) : ∀ (n : ℤ), f (gsmul n a) = gsmul n (f a) | (int.of_nat 0) := by simp [gsmul_of_nat, is_add_group_hom.zero f] | (int.of_nat (n+1)) := by simp [gsmul_of_nat, succ_smul, is_add_group_hom.add f]; exact map_gsmul (int.of_nat n) | -[1+n] := begin simp [gsmul_neg, is_add_group_hom.neg f], exact map_gsmul (int.of_nat (n+1)) end

#### Chris Hughes (Dec 09 2018 at 19:05):

That's a funny well founded relation.

#### Johan Commelin (Dec 09 2018 at 19:06):

I wouldn't say it's funny. I think it's very natural.

#### Johan Commelin (Dec 09 2018 at 19:06):

I'm just nesting the inductive property of `int`

and `nat`

.

#### Chris Hughes (Dec 09 2018 at 19:06):

But you haven't told lean what it is. I would just prove `map_smul`

first for naturals

#### Mario Carneiro (Dec 09 2018 at 19:07):

I think you need to be more explicit about the well founded relation

#### Mario Carneiro (Dec 09 2018 at 19:07):

or use lemmas like chris says

#### Chris Hughes (Dec 09 2018 at 19:07):

You could do `using_well_founded`

but proving `map_smul`

first is more sensible

#### Johan Commelin (Dec 09 2018 at 19:07):

But why can't I just nest inductive properties?

#### Mario Carneiro (Dec 09 2018 at 19:07):

because that's not what you did

#### Johan Commelin (Dec 09 2018 at 19:08):

Hmm, so what did I do?

#### Mario Carneiro (Dec 09 2018 at 19:08):

you call `(n+1)`

case from `-[1+n]`

case

#### Mario Carneiro (Dec 09 2018 at 19:08):

that's not structurally well founded

#### Johan Commelin (Dec 09 2018 at 19:08):

Sure, but `n+1`

is an `of_nat`

, and I had proven those already.

#### Mario Carneiro (Dec 09 2018 at 19:08):

that's called a lemma

#### Johan Commelin (Dec 09 2018 at 19:09):

/me sighs...

#### Mario Carneiro (Dec 09 2018 at 19:09):

when you write it all in one big induction lean has no choice but to assume everything depends on everything else

#### Johan Commelin (Dec 09 2018 at 19:10):

But don't you think this is a typical strategy for proving things about Z? Does this deserve special support?

#### Johan Commelin (Dec 09 2018 at 19:11):

Or should I prove `map_smul`

for add_monoid homs? (Btw, I think there is no instance from `add_group_hom`

s to `add_monoid_hom`

s).

#### Kenny Lau (Dec 09 2018 at 19:12):

But don't you think this is a typical strategy for proving things about Z? Does this deserve special support?

I think the typical strategy is to use `int.induction_on`

#### Chris Hughes (Dec 09 2018 at 19:21):

Here's a horrible proof using `using_well_founded`

theorem map_gsmul {A B} [add_group A] [add_group B] (f : A → B) [is_add_group_hom f] (a : A) : ∀ (n : ℤ), f (gsmul n a) = gsmul n (f a) | (int.of_nat 0) := by simp [gsmul_of_nat, is_add_group_hom.zero f] | (int.of_nat (n+1)) := have (n : with_top ℕ) < (n + 1 : ℕ), from with_top.coe_lt_coe.2 (nat.lt_succ_self _), by simp [gsmul_of_nat, succ_smul, is_add_group_hom.add f]; exact map_gsmul (int.of_nat n) | -[1+n] := have ((n + 1 : ℕ) : with_top ℕ) < ⊤, from dec_trivial, begin simp [gsmul_neg, is_add_group_hom.neg f], exact map_gsmul (int.of_nat (n+1)) end using_well_founded {rel_tac := λ _ _, `[exact ⟨_, @inv_image.wf ℤ (with_top ℕ) _ (λ i : ℤ, int.rec_on i coe (λ _, ⊤) : ℤ → with_top ℕ) (with_top.well_founded_lt nat.lt_wf)⟩], dec_tac := tactic.assumption }

#### Johan Commelin (Dec 09 2018 at 19:24):

I understand why you suggest the other strategy...

Last updated: Dec 20 2023 at 11:08 UTC