set_option pp.coercions false -- Show `OfNat.ofNat` when present for clarity

/--
trace: x : Nat
⊢ OfNat.ofNat 2 = x
---
warning: declaration uses 'sorry'
-/
#guard_msgs in
example : nat_lit 2 = x := by
  simp only
  trace_state
  sorry

/--
trace: x : Nat
⊢ OfNat.ofNat 2 = x
---
warning: declaration uses 'sorry'
-/
#guard_msgs in
example : nat_lit 2 = x := by
  dsimp only -- dsimp made no progress
  trace_state
  sorry

/--
trace: α : Nat → Type
f : (n : Nat) → α n
x : α (OfNat.ofNat 2)
⊢ f (OfNat.ofNat 2) = x
---
warning: declaration uses 'sorry'
-/
#guard_msgs in
example (α : Nat → Type) (f : (n : Nat) → α n) (x : α 2) : f (nat_lit 2) = x := by
  simp only
  trace_state
  sorry

/--
trace: x : Nat
f : Nat → Nat
h : f (OfNat.ofNat 2) = x
⊢ f (OfNat.ofNat 2) = x
---
trace: x : Nat
f : Nat → Nat
h : f (OfNat.ofNat 2) = x
⊢ f 2 = x
-/
#guard_msgs in
example (f : Nat → Nat) (h : f 2 = x) : f 2 = x := by
  trace_state
  simp [OfNat.ofNat]
  trace_state
  assumption

/--
trace: α : Nat → Type
f : (n : Nat) → α n
x : α (OfNat.ofNat 2)
⊢ f (OfNat.ofNat 2) = x
---
trace: α : Nat → Type
f : (n : Nat) → α n
x : α (OfNat.ofNat 2)
⊢ f 2 = x
---
warning: declaration uses 'sorry'
-/
#guard_msgs in
example (α : Nat → Type) (f : (n : Nat) → α n) (x : α 2) : f 2 = x := by
  trace_state
  simp [OfNat.ofNat]
  trace_state
  sorry
