Zulip Chat Archive
Stream: new members
Topic: Case analysis on match in assumptions
Thalia Archibald (Mar 25 2024 at 22:57):
I'm writing a verified Brainfuck compiler as an exercise in learning Lean. As a small lemma, I want to prove that Token.ofChar
and Token.toChar
are inverses of each other; however, the fallthrough case of Token.ofChar
is tripping me up. It should just be a simple proof by contradiction with some t = none
, but matching in the proof does not come with a proof that c
is not equal to the values of the other cases.
In a Coq-style tactic-oriented approach, I'd destruct on decideable equality of the Char
for each of the cases, which would introduce hypotheses for the equalities. The match
would then need to somehow be desugared into disjunctions and implications and I could pull it apart according to the equalities.
I think it's likely I'm approaching this wrong. Any suggestions?
inductive Token
| right
| left
| inc
| dec
| output
| input
| head
| tail
deriving Repr
def Token.ofChar : Char → Option Token
| '>' => Token.right
| '<' => Token.left
| '+' => Token.inc
| '-' => Token.dec
| '.' => Token.output
| ',' => Token.input
| '[' => Token.head
| ']' => Token.tail
| _ => none
def Token.toChar : Token → Char
| Token.right => '>'
| Token.left => '<'
| Token.inc => '+'
| Token.dec => '-'
| Token.output => '.'
| Token.input => ','
| Token.head => '['
| Token.tail => ']'
theorem Token.toChar_ofChar t :
Token.ofChar (t.toChar) = some t :=
by cases t <;> rfl
theorem Token.ofChar_toChar c t :
some t = Token.ofChar c → c = t.toChar :=
by
simp [Token.ofChar, Token.toChar]
match c with
| '>' | '<' | '+' | '-' | '.' | ',' | '[' | ']' =>
simp; intro H; subst H; rfl
| c' => admit
As an aside, if I replace theorem
with lemma
, it reports unexpected identifier; expected command
for the lemma
keyword. I thought they would be interchangeable. Is this a bug? I'm using Lean v4.7.0-rc2.
Kyle Miller (Mar 25 2024 at 23:03):
lemma
is a mathlib-only command — you just need to be sure to import pretty much any module of mathlib to get it.
Kyle Miller (Mar 25 2024 at 23:03):
To get a hypothesis for c
, you can use match h : c with
syntax, but that doesn't give you the fact that it's not any of the preceding cases unfortunately.
Thalia Archibald (Mar 25 2024 at 23:04):
Strange that lemma
isn't in the stdlib
Thalia Archibald (Mar 25 2024 at 23:04):
match h : c with
Is it Lean convention to lowercase hypotheses?
Kyle Miller (Mar 25 2024 at 23:05):
Here:
theorem Token.ofChar_toChar c t :
some t = Token.ofChar c → c = t.toChar :=
by
simp [Token.ofChar, Token.toChar]
split <;> intro h <;> cases h <;> rfl
Thalia Archibald (Mar 25 2024 at 23:08):
split
looks like it does a lot of heavy lifting. Very nice!
Last updated: May 02 2025 at 03:31 UTC