Zulip Chat Archive

Stream: general

Topic: match with equation


Yury G. Kudryashov (Sep 30 2022 at 07:45):

I have the following definition:

import data.fin.basic

inductive generator
| a : generator
| bcd : fin 3  generator

def cancel : list generator  list generator
| [] := []
| [a] := [a]
| (a :: a :: l) := cancel l
| (a :: bcd n :: l) := a :: cancel (bcd n :: l)
| (bcd n :: l) :=
  match cancel l with
  | [] := [bcd n]
  | (a :: l) := bcd n :: a :: l
  | (bcd m :: l) := bcd (-n - m) :: l
  end

Then I want to prove that length (cancel l) ≤ length l (and a few other properties). How do I deal with match? If I write

lemma length_cancel_le :  l : free_monoid generator, length (cancel l)  length l
| [] := le_rfl
| [a] := le_rfl
| (a :: a :: l) := nat.le_succ_of_le $ nat.le_succ_of_le $ length_cancel_le l
| (a :: bcd n :: l) := nat.succ_le_succ $ length_cancel_le _
| (bcd n :: l) :=
  match cancel l with
  | [] := _
  | (a :: l') := _
  | (bcd m :: l') := _
  end

then Lean doesn't know that bcd m :: l' = cancel l.

Yury G. Kudryashov (Sep 30 2022 at 07:49):

Should I move this match to an explicit auxiliary definition?

Yakov Pechersky (Sep 30 2022 at 11:13):

Will it work if you have helper definitional lemmas about what "cancel (bcd n :: [])" is equal to,

Floris van Doorn (Sep 30 2022 at 11:40):

I assume you want to use the term-mode match notation? In tactics you can do induction h : cancel l, to record a hypothesis h that cancel l = [] and cancel l = _ :: _.

Floris van Doorn (Sep 30 2022 at 11:46):

Here is a workaround using the match notation that should work:

  let c := cancel l in
  let h : c = cancel l := rfl in
  match cancel l, h with
  | [], h := _
  | (a :: l'), h := _
  | (bcd m :: l'), h := _
  end

Yury G. Kudryashov (Sep 30 2022 at 11:57):

I decided to move this case to an explicit auxiliary definition.

Eric Wieser (Sep 30 2022 at 22:49):

https://proofassistants.stackexchange.com/a/529/347 is perhaps relevant


Last updated: Dec 20 2023 at 11:08 UTC