The `conv` tactic tries to close “trivial” goals after itself. As of now, it uses `try rfl`, which means it can close goals that are only trivial after reducing with default transparency. This is suboptimal * this can require a fair amount of unfolding, and possibly slow down the proof a lot. And the user cannot even prevent it. * it does not match what `rw` does, and a user might expect the two to behave the same. So this PR changes it to `with_reducible rfl`, matching `rw`’s behavior. I considered `with_reducible eq_refl` to only solve trivial goals that involve equality, but not other relations (e.g. `Perm xs xs`), but a discussion on mathlib pointed out that it’s expected and desirable to solve more general reflexive goals: https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/Closing.20after.20.60rw.60.2C.20.60conv.60.3A.20.60eq_refl.60.20instead.20of.20.60rfl.60/near/429851605
26 lines
486 B
Text
26 lines
486 B
Text
def twice : Nat → Nat := λ n => 2*n
|
|
|
|
def foo1 : (λ x : Nat => id (twice (id x))) = twice := by
|
|
conv in (id _) =>
|
|
trace_state
|
|
conv =>
|
|
enter [1,1]
|
|
trace_state
|
|
simp
|
|
trace_state
|
|
trace_state -- `id (twice x)`
|
|
rfl
|
|
|
|
|
|
theorem foo2 (y : Nat) : (fun x => x + y = 0) = (fun x => False) := by
|
|
conv =>
|
|
trace_state
|
|
conv =>
|
|
lhs
|
|
trace_state
|
|
intro x
|
|
rw [Nat.add_comm]
|
|
trace_state
|
|
trace_state
|
|
trace_state
|
|
sorry
|