namespace Ex1

mutual
def h (c : Nat) (x : Nat) := match g c x c c with
  | 0 => 1
  | r => r + 2
def g (c : Nat) (t : Nat) (a b : Nat) : Nat := match t with
  | (n+1) => match g c n a b with
    | 0 => 0
    | m => match g c (n - m) a b with
      | 0 => 0
      | m + 1 => g c m a b
  | 0 => f c 0
def f (c : Nat) (x : Nat) := match h c x with
  | 0 => 1
  | r => f c r
end
termination_by
  g x a b => 0
  f c x => 0
  h c x => 0
decreasing_by sorry

attribute [simp] g
attribute [simp] h
attribute [simp] f

#check g._eq_1
#check g._eq_2
#check g._eq_3
#check g._eq_4

#check h._eq_1

#check f._eq_1
#check f._eq_2

end Ex1

namespace Ex2

def g (t : Nat) : Nat := match t with
  | (n+1) => match g n with
    | 0 => 0
    | m + 1 => match g (n - m) with
      | 0 => 0
      | m + 1 => g n
  | 0 => 0
termination_by' sorry
decreasing_by sorry

theorem ex1 : g 0 = 0 := by
  rw [g]

#check g._eq_1
#check g._eq_2
#check g._eq_3

theorem ex2 : g 0 = 0 := by
  unfold g
  simp

#check g._unfold


end Ex2
