Zulip Chat Archive
Stream: general
Topic: irreducible
Sebastien Gouezel (Nov 18 2020 at 12:27):
On my way to #5035 (making continuous
irreducible), I was surprised that irreducible
is not as irreducible as I thought it was (so in the end I made it a structure, to avoid this kind of issues). Exercise: in the next lemmas, guess which proof(s?) succeed, if any, and which fail:
def n : nat := 37
attribute [irreducible] n
lemma foo0 : n = 37 := by refl
lemma foo1 : n = 37 := by rw n
lemma foo2 : n = 37 := by simp [n]
lemma foo3 : n = 37 := by unfold n
lemma foo4 : n = 37 := by { delta n, refl }
Gabriel Ebner (Nov 18 2020 at 12:47):
Since people are apparently surprised by this behavior: irreducible
only affects definitional equality, i.e. the unification when Lean figures out if two types are the same. (And it doesn't affect the kernel either: you can still write a tactic that produces a rfl
proof; check out docs#tactic.unsafe_change.)
:octopus:
Sebastien Gouezel (Nov 18 2020 at 13:10):
I thought one of unfold
or delta
wasn't relying on the equation lemmas, but instead used the bare definition (and so should have been stuck by the irreducible attribute). Clearly, I was wrong! All proofs work fine, except for the rfl
one.
Kevin Buzzard (Nov 18 2020 at 13:15):
I thought unfold was basically simp only [equation lemmas]
and delta was "replace this name by its definition". I "knew" that irreducible
would stop at least one from working though ;-)
Gabriel Ebner (Nov 18 2020 at 13:16):
unfold
is implemented using simp
.
dunfold
is implemented using dsimp
.
delta
is implemented "by hand".
Mario Carneiro (Nov 18 2020 at 13:49):
for completeness:
lemma foo5 : n = 37 := by { tactic.unsafe_change `(37 = 37), refl }
Mario Carneiro (Nov 18 2020 at 13:51):
is there unsafe_exact
?
Mario Carneiro (Nov 18 2020 at 13:51):
the unsafe_change
proof still sticks an id
in the term
Last updated: Dec 20 2023 at 11:08 UTC