open nat

inductive tree (A : Type) :=
leaf : A → tree A,
node : tree_list A → tree A
with tree_list :=
nil  : tree_list A,
cons : tree A → tree_list A → tree_list A

namespace tree_list

definition len {A : Type} : tree_list A → nat,
len (nil A)    := 0,
len (cons t l) := len l + 1

theorem len_nil {A : Type} : len (nil A) = 0 :=
rfl

theorem len_cons {A : Type} (t : tree A) (l : tree_list A) : len (cons t l) = len l + 1 :=
rfl

variables (A : Type) (t1 t2 t3 : tree A)

example : len (cons t1 (cons t2 (cons t3 (nil A)))) = 3 :=
rfl

print definition len

end tree_list
