Zulip Chat Archive
Stream: new members
Topic: unfold through instance of Type Class
LB (Dec 29 2023 at 23:38):
Sorry if I post in the wrong stream...
I try to unfold an instance of Add
to be able to use an hypothesis in an if then else
. When I unfold the immediate add
, it works; but when I unfold the implicit add
, it doesn't work. This is an MWE:
inductive FooNat where
| bar : Nat → FooNat
| bor : Nat → FooNat
namespace FooNat
def add (m n: FooNat) : FooNat :=
match m , n with
| bar _ , bar _ => bar 0
| bar _ , bor _ => bar 1
| bor _ , bar _ => bar 2
| bor a , bor b => if a < b then bar 3 else bar 4
instance : Add FooNat where
add := add
example (m n: Nat) : m < n → add (bor m) (bor n) = bar 3 := by
intro h
unfold add -- this works
simp [h]
example (m n: Nat) : m < n → bor m + bor n = bar 3 := by
intro h
unfold add -- this doesn't work
simp [h]
What should I do to reduce bor m + bor n
using hypothesis h : m < n
?
Toolchain is leanprover/lean4:stable
(Lean 4.4.0).
Eric Wieser (Dec 30 2023 at 00:08):
You need to unfold HAdd.hAdd
and Add.add
too
LB (Dec 30 2023 at 00:21):
@Eric Wieser Thank you for your answer.
unfold HAdd.hAdd
does something and morphs my goal to instHAdd.1 (bor m) (bor n) = bar 3
Chaining this with unfold Add.add
does nothing more: tactic 'unfold' failed to unfold 'Add.add' at instHAdd.1 (bor m) (bor n) = bar 3
Newell Jensen (Dec 30 2023 at 00:22):
you can replace the line with your comment like this:
simp [Add.add, HAdd.hAdd, add] -- this doesn't work --> now it does
LB (Dec 30 2023 at 00:24):
@Newell Jensen Thank you. That worked!
Ruben Van de Velde (Dec 30 2023 at 06:51):
You can make life easier for yourself by adding a lemma a+b = add a b
with proof rfl
Last updated: May 02 2025 at 03:31 UTC