Class CCCviaNatDed (A: Type) (prod expo: A -> A -> A) {ND: NatDed A}: Prop :=
isCCC: CartesianClosedCat.CCC A derives eq prod expo.

(* Specifications: *)
Lemma CCC_expo_derives: forall A prod expo {ND: NatDed A} {CCC: CCCviaNatDed A prod expo},
forall P P' Q Q', P' |-- P -> Q |-- Q' -> expo P Q |-- expo P' Q'.
Lemma CCC_exp_prod1:
forall A prod expo {ND : NatDed A} {CCC: CCCviaNatDed A prod expo} B (P: B -> A) Q,
prod (exp P) Q = exp (fun x => prod (P x) Q).
Lemma CCC_exp_prod2:
forall A prod expo {ND : NatDed A} {CCC: CCCviaNatDed A prod expo} B P (Q: B -> A),
prod P (exp Q) = exp (fun x => prod P (Q x)).
Lemma CCC_distrib_orp_prod:
forall A prod expo {ND : NatDed A} {CCC: CCCviaNatDed A prod expo} P Q R,
prod (orp P Q) R = orp (prod P R) (prod Q R).
Lemma CCC_FF_prod:
forall A prod expo {ND : NatDed A} {CCC: CCCviaNatDed A prod expo} P,
prod FF P = FF.
Lemma CCC_prod_FF:
forall A prod expo {ND : NatDed A} {CCC: CCCviaNatDed A prod expo} P,
prod P FF = FF.