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. *)
Admitted. (* QuickChick rev_app_distr. *)
Admitted. (* QuickChick rev_involutive. *)

Theorem app_assoc4 : forall l1 l2 l3 l4 : natlist,
l1 ++ (l2 ++ (l3 ++ l4)) = ((l1 ++ l2) ++ l3) ++ l4.