set_option pp.mvars false

structure Note where
  pitch : UInt64
  start : Nat

def Note.containsNote (n1 n2 : Note) : Prop :=
  n1.start ≤ n2.start

def Note.lowerSemitone (n : Note) : Note :=
  { n with pitch := n.pitch - 1 }

theorem Note.self_containsNote_lowerSemitone_self (n : Note) :
    n.containsNote (Note.lowerSemitone n) := by
  simp [Note.containsNote, Note.lowerSemitone]

/--
error: Type mismatch
  rfl
has type
  ?_ = ?_
but is expected to have type
  n = n - 1
-/
#guard_msgs in
set_option maxRecDepth 100 in
set_option maxHeartbeats 200 in
example (n : UInt64) : n = n - 1 :=
  rfl

namespace Ex2

def lowerSemitone := fun (n : Note) => Note.mk (n.1 - 0) n.2

set_option maxRecDepth 100 in
theorem Note.self_containsNote_lowerSemitone_self (n : Note) :
    0 ≤ (lowerSemitone n).start :=
  (Nat.zero_le (Note.start n))

end Ex2

namespace Ex3

def lowerSemitone := fun (n : Note) => Note.mk (n.1 + 100) n.2

set_option maxRecDepth 200 in
theorem Note.self_containsNote_lowerSemitone_self (n : Note) :
    0 ≤ (lowerSemitone n).start :=
  (Nat.zero_le (Note.start n))

end Ex3
