Section PROD'.
Variable A : Type.
Variable J_A: Join A.
Variable saA : Perm_alg A.
Variable B: Type.
Variable J_B: Join B.
Variable saB : Perm_alg B.
Variable agB : ageable B.
Variable asb : Age_alg B.

(* Specifications: *)
Theorem asa_prod' : @Age_alg (prod A B) _ (ag_prod' A B agB).
End PROD'.
Lemma joins_fashionR {A}  {JA: Join A}{PA: Perm_alg A}{agA: ageable A}{XA: Age_alg A} : forall x y,
joins x y -> fashionR x y.
Lemma comparable_fashionR {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A} {agA: ageable A} {XA: Age_alg A} : forall x y,
comparable x y -> fashionR x y.
Lemma age_identity {A} `{asaA: Age_alg A}: forall phi phi', age phi phi'->
identity phi -> identity phi'.
Lemma age_comparable {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A} {agA: ageable A}{asaA: Age_alg A}:
forall phi1 phi2 phi1' phi2', age phi1 phi1' -> age phi2 phi2' ->
comparable phi1 phi2 -> comparable phi1' phi2'.
Lemma asa_nat : @Age_alg nat (Join_equiv nat) ag_nat.
Lemma nec_identity {A} `{asaA: Age_alg A}: forall phi phi', necR phi phi'->
identity phi -> identity phi'.
Lemma nec_join2 {A} `{asaA : Age_alg A}: forall {x y z z' : A},
join x y z ->
necR z z' ->
exists x',
exists y',
join x' y' z' /\ necR x x' /\ necR y y'.
Lemma nec_join {A} `{asaA : Age_alg A}: forall {x y z x' : A},
join x y z ->
necR x x' ->
exists y' ,
exists z' ,
join x' y' z' /\ necR y y' /\ necR z z'.
Lemma nec_join4 {A} `{asaA : Age_alg A}: forall z x' y' z' : A,
join x' y' z' ->
necR z z' ->
exists x,
exists y,
join x y z /\ necR x x' /\ necR y y'.
Lemma join_level {A}{JA: Join A}{PA: Perm_alg A}{AG: ageable A}{AgeA: Age_alg A}:
forall x y z, join x y z -> level x = level z /\ level y = level z.
Lemma level_core {A}{JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall m:A, level (core m) = level m.
Lemma age_core_eq {A}{JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall x y x' y', age x x' -> age y y' -> core x = core y -> core x' = core y'.
Lemma age_twin {A}  {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{AG: ageable A}{XA: Age_alg A}:
forall phi1 phi2 n phi1',
level phi1 = level phi2 ->
ageN n phi1 = Some phi1' ->
exists phi2', ageN n phi2 = Some phi2' /\ level phi1' = level phi2'.
Lemma age1_join_eq {A}  {JA: Join A}{PA: Perm_alg A}{agA: ageable A}{AgeA: Age_alg A} : forall phi1 phi2 phi3,
join phi1 phi2 phi3 ->
forall phi1', age1 phi1 = Some phi1' ->
forall phi2', age1 phi2 = Some phi2' ->
forall phi3', age1 phi3 = Some phi3' ->
join phi1' phi2' phi3'.
Lemma strong_nat_ind (P : nat -> Prop) (IH : forall n, (forall i, lt i n -> P i) -> P n) n : P n.
Lemma age_core {A}{JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall x y : A, age x y -> age (core x) (core y).
Lemma necR_core {A}{JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall x y : A, necR x y -> necR (core x) (core y).