(* Specifications: *)
Lemma Zero_correct n l: length (Sem (Zero_e n) l) = 0.
Lemma One_correct n l: length (Sem (One_e n) l) = 1.
Lemma arity_Succ : arity Succ_e = ok_arity 1.
Lemma rec_bounded_Succ : rec_bounded Succ_e.
Lemma Succ_correct l : length (Sem Succ_e l) = S (length (Sem (Proj 1 0) l)).
Lemma arity_Nat n : arity (Nat_e n) = ok_arity 0.
Lemma rec_bounded_Nat n : rec_bounded (Nat_e n).
Lemma Nat_correct : forall n l, length (Sem (Nat_e n) l) = n.
Lemma bs2nat_smash' : forall u v n, bs2nat v = power 2 n -> bs2nat (smash' u v) = power 2 (length u + n).
Lemma bs2nat_smash_bs : forall u v, bs2nat (smash_bs u v) = power 2 (length u * length v).
Lemma Smash_correct : forall l, bs2nat (Sem Smash l) = power 2 (length (hd nil l) * length (hd nil (tl l))).
Lemma Zero_correct_bs n l: Sem (Zero_e n) l = nil.
Lemma Zero_correct n l: bs2nat (Sem (Zero_e n) l) = 0.
Lemma arity_False: forall n : nat, arity (False_e n) = ok_arity n.
Lemma rec_bounded_False: forall n : nat, rec_bounded (False_e n).
Lemma False_correct: forall (n : nat) (l : list bs), bs2nat (Sem (False_e n) l) = 0.
Lemma One_correct n l: bs2nat (Sem (One_e n) l) = 1.
Lemma arity_Normalize : arity Normalize_e = ok_arity 1.
Lemma rec_bounded_Normalize : rec_bounded Normalize_e.
Lemma Normalize_correct : forall l, bs2nat (Sem Normalize_e l) = bs2nat (Sem (Proj 1 0) l).
Lemma Normalize_normal : forall l, Sem Normalize_e l = nil \/ bs2nat (Sem Normalize_e l) <> 0.
Lemma arity_Succ : arity Succ_e = ok_arity 1.
Lemma Succ_length v : length (Sem Succ_e v) <= S (length (hd nil v)).
Lemma rec_bounded_Succ : rec_bounded Succ_e.
Lemma Succ_correct : forall l, bs2nat (Sem Succ_e l) = 1 + bs2nat (hd nil l).
Lemma arity_Pred' : arity Pred'_e = ok_arity 1.
Lemma rec_bounded_Pred' : rec_bounded Pred'_e.
Lemma Pred'_correct : forall l, hd nil l = nil \/ bs2nat (hd nil l) <> 0 -> bs2nat (Sem Pred'_e l) = bs2nat (hd nil l) - 1.
Lemma arity_Pred : arity Pred_e = ok_arity 1.
Lemma rec_bounded_Pred : rec_bounded Pred_e.
Lemma Pred_correct : forall l, bs2nat (Sem Pred_e l) = bs2nat (hd nil l) - 1.