Module NatList.
Inductive natprod : Type :=
| pair : nat -> nat -> natprod.
Instance dec_natprod (p q : natprod) : Dec (p = q).
Admitted. (* QuickChick surjective_pairing. *)
Admitted. (* QuickChick snd_fst_is_swap. *)
Admitted. (* QuickChick fst_swap_is_snd. *)
Inductive natlist : Type :=
| nil  : natlist
| cons : nat -> natlist -> natlist.
Instance dec_natlist (p q : natlist) : Dec (p = q).
Admitted. (* QuickChick tl_length_pred. *)
Admitted. (* QuickChick app_assoc. *)
Fixpoint rev (l:natlist) : natlist :=
match l with
| nil    => nil
| h :: t => rev t ++ [h]
end.
(* rev_length_firsttry *)
Admitted. (* QuickChick app_length. *)
Admitted. (* QuickChick rev_length. *)
Admitted. (* QuickChick app_nil_r. *)

Theorem rev_app_distr: forall l1 l2 : natlist,
rev (l1 ++ l2) = rev l2 ++ rev l1.