@[reducible]
def isLeapYear (y : Nat) : Prop :=  (y % 400 = 0) ∨ (y % 4 = 0 ∧ y % 100 ≠ 0)

def daysInMonth (year : Nat) (month : Nat) : Nat :=
  match month with
  | 2  => if isLeapYear year then 29 else 28
  | 4  => 30
  | 6  => 30
  | 9  => 30
  | 11 => 30
  | _  => 31

/-
Stuck at:
year : Nat
⊢ (match 4 with
  | 2 => if isLeapYear year then 29 else 28
  | 4 => 30
  | 6 => 30
  | 9 => 30
  | 11 => 30
  | x => 31) =
  30
-/
example (year : Nat) : daysInMonth year 4 = 30 := by
  simp [daysInMonth]

example (year : Nat) : daysInMonth year 12 = 31 := by
  delta daysInMonth
  simp

example (year : Nat) : daysInMonth year 2 = (if isLeapYear year then 29 else 28) := by
  simp [daysInMonth]

def f : Char → Nat → Nat
 | 'a', _ => 1
 | 'b', _ => 2
 | _, _   => 3

example : f 'a' n = 1 := by
  simp[f]

example : f 'b' n = 2 := by
  simp[f]

example : f 'c' n = 3 := by
  simp[f]

def g : String → Nat → Nat
 | "hello", _ => 1
 | "world", _ => 2
 | _, _       => 3

example : g "hello" n = 1 := by
  simp[g]

example : g "world" n = 2 := by
  simp[g]

example : g "abc" n = 3 := by
  simp[g]

def fn : Fin 8 → Nat → Nat
 | 2, _ => 1
 | 3, _ => 2
 | _, _ => 3

example : fn 2 n = 1 := by
  simp [fn]

example : fn 4 n = 3 := by
  simp [fn]

def f8 : UInt8 → Nat → Nat
 | 10, _ => 1
 | 20, _ => 2
 | _, _  => 3

example : f8 10 n = 1 := by
  simp [f8]

example : f8 30 n = 3 := by
  simp [f8]

def f16 : UInt16 → Nat → Nat
 | 10, _ => 1
 | 20, _ => 2
 | _, _  => 3

example : f16 10 n = 1 := by
  simp [f16]

example : f16 30 n = 3 := by
  simp [f16]

def f32 : UInt32 → Nat → Nat
 | 10, _ => 1
 | 20, _ => 2
 | _, _  => 3

example : f32 10 n = 1 := by
  simp [f32]

example : f32 30 n = 3 := by
  simp [f32]

def f64 : UInt64 → Nat → Nat
 | 10, _ => 1
 | 20, _ => 2
 | _, _  => 3

example : f64 10 n = 1 := by
  simp [f64]

example : f64 30 n = 3 := by
  simp [f64]
