Inductive tree : Set :=
  | leaf : Dom -> tree
  | cons : tree -> tree -> tree.Inductive tree : Set :=
  | leaf : Dom -> tree
  | cons : tree -> tree -> tree.Inductive tree : Set :=
  | leaf : Dom -> tree
  | cons : tree -> tree -> tree.(* Binary trees labeled by natural numbers
*)

Definition nat_tree := tree nat.Definition nat_cons := cons nat.Definition nat_leaf := leaf nat.(* Product of all the leaves of some nat_tree 
*)

Fixpoint leavemult (t : nat_tree) : nat :=
  match t return nat with
  | leaf n1 => 
      (* (nat_leaf n1) *)  n1
      (* (nat_cons t1 t2) *) 
  | cons t1 t2 => leavemult t1 * leavemult t2
  end.(* the specification  of our problem:
*)

Definition SPECIF (t : nat_tree) := {n : nat | n = leavemult t}.

(* Specifications: *)
Theorem trivialalgo : forall t : nat_tree, SPECIF t.