Set Implicit Arguments.
Global Set Asymmetric Patterns.
Require Export Basics.
Arguments eq {A}.
Arguments fst {A B}.
Hint Unfold compose.
Definition proj1_conj (A B: Prop) (c: A /\ B): A :=
match c with conj x _ => x end.
Definition proj2_conj (A B: Prop) (c: A /\ B): B :=
match c with conj _ x => x end.

(* Specifications: *)
Lemma eq_trans (X: Set) (a b c: X): a = b -> b = c -> a = c.
Definition map_snd (A B: Set) (f: A -> B) (C: Set) (p: C * A): C * B := (fst p, f (snd p)).
Lemma fst_map_snd (A B: Set) (f: A -> B) (C: Set) (p: C * A): fst (map_snd f p) = fst p.
Definition uncurry A B C (f: A -> B -> C) (ab: A * B): C := f (fst ab) (snd ab).