(* Taken from coq-bigO / Armaël Guéneau *)
Local Set Universe Polymorphism.
Fixpoint Rarrow (domain : list Type) (range : Type) : Type :=
match domain with
| nil => range
| d :: ds => Rarrow ds (d -> range)
end.
Fixpoint Rtuple (domain : list Type) : Type :=
match domain with
| nil => unit
| d :: nil => d
| d :: ds => prod (Rtuple ds) d
end.
Fixpoint Const {A : Type} (domain : list Type) (c : A) : Rarrow domain A :=
match domain with
| nil => c
| d :: ds => Const ds (fun _ => c)
end.

Lemma Const_eqn_1 : forall A (c : A),
Const [] c = c.