Zulip Chat Archive
Stream: general
Topic: Having to unfold abbrev for simp to work
Daniel Weber (Aug 29 2024 at 02:18):
From what I understand, simp
is supposed to be able to see through the definition of abbrev
s. However, in the following example, the unfold
line is necessary, and without it simp
doesn't work. What am I missing?
import Mathlib.SetTheory.Ordinal.Arithmetic
universe u
def Nimber : Type (u+1) := Ordinal.{u}
def toOrdinal (x : Nimber.{u}) : Ordinal.{u} := x
def toNimber (x : Ordinal.{u}) : Nimber.{u} := x
abbrev ordinalPow (a : Nimber) (b : ℕ) : Nimber := toNimber (toOrdinal a ^ b)
instance : One Nimber where one := toNimber 1
@[simp]
lemma toNimber_one : toNimber 1 = 1 := rfl
lemma ordinalPow_zero (a : Nimber) : ordinalPow a 0 = 1 := by
unfold ordinalPow -- HERE
simp only [pow_zero, toNimber_one]
Chris Bailey (Aug 29 2024 at 02:26):
Simp seems to work if I open this in the playground:
import Mathlib.SetTheory.Ordinal.Arithmetic
universe u
def Nimber : Type (u+1) := Ordinal.{u}
def toOrdinal (x : Nimber.{u}) : Ordinal.{u} := x
def toNimber (x : Ordinal.{u}) : Nimber.{u} := x
abbrev ordinalPow (a : Nimber) (b : ℕ) : Nimber := toNimber (toOrdinal a ^ b)
instance : One Nimber where one := toNimber 1
@[simp]
lemma toNimber_one : toNimber 1 = 1 := rfl
lemma ordinalPow_zero (a : Nimber) : ordinalPow a 0 = 1 := by
simp only [ordinalPow, pow_zero, toNimber_one]
Daniel Weber (Aug 29 2024 at 02:27):
Yes, if you give it ordinalPow
, but I made it an abbrev
exactly to avoid having to tell simp
to unfold it
Chris Bailey (Aug 29 2024 at 02:31):
I see what you mean now. I wasn't under the impression that abbrev
automatically added something to the simp set, did you read that somewhere?
Daniel Weber (Aug 29 2024 at 02:35):
I don't want it to unfold it, just to see through it when applying lemmas
Last updated: May 02 2025 at 03:31 UTC