Notation Plus_e := App_e.Notation arity_Plus := arity_App.Notation rec_bounded_Plus := rec_bounded_App.

(* Specifications: *)
Lemma Plus_correct : forall l, length (Sem Plus_e l) = length (hd nil l) + length (hd nil (tl l)).
Lemma arity_Plusl ar el : andl (fun e => arity e = ok_arity ar) el -> arity (Plusl_e ar el) = ok_arity ar.
Lemma rec_bounded_Plusl ar el : andl rec_bounded el -> rec_bounded (Plusl_e ar el).
Lemma Plusl_correct : forall ar el l, length (Sem (Plusl_e ar el) l) = plusl (map (fun e => length (Sem e l)) el).
Lemma arity_Mult : arity Mult_e = ok_arity 2.
Lemma rec_bounded_Mult : rec_bounded Mult_e.
Lemma Mult_correct : forall l, length (Sem Mult_e l) = length (hd nil l) * length (hd nil (tl l)).
Lemma arity_Multl ar el : andl (fun e => arity e = ok_arity ar) el -> arity (Multl_e ar el) = ok_arity ar.
Lemma rec_bounded_Multl ar el : andl rec_bounded el -> rec_bounded (Multl_e ar el).
Lemma Multl_correct : forall ar el l, length (Sem (Multl_e ar el) l) = multl (map (fun e => length (Sem e l)) el).
Lemma arity_Power n : arity (Power_e n) = ok_arity 1.
Lemma rec_bounded_Power n : rec_bounded (Power_e n).
Lemma Power_correct : forall n l, length (Sem (Power_e n) l) = power (length (hd nil l)) n.
Lemma arity_Poly_pow : forall ar xn, pWF_pow ar xn -> arity (Poly_pow ar xn) = ok_arity ar.
Lemma rec_bounded_Poly_pow : forall ar xn, rec_bounded (Poly_pow ar xn).
Lemma Poly_pow_correct : forall ar xn l, length (Sem (Poly_pow ar xn) l) = peval_pow xn (map (@length _) l).
Lemma arity_Poly_mon : forall ar m, pWF_mon ar m -> arity (Poly_mon ar m) = ok_arity ar.
Lemma rec_bounded_Poly_mon : forall ar m, rec_bounded (Poly_mon ar m).
Lemma Poly_mon_correct : forall ar m l, length (Sem (Poly_mon ar m) l) = peval_mon m (map (@length _) l).