Hint Resolve @join_comparable @join_comparable'  @join_comparable'' @join_comparable'''
@join_comparable2 @join_comparable2'  @list_join_comparable @list_join_comparable'
@joins_comparable  @joins_comparable2  @join_sub_comparable  @join_sub_comparable2
@eq_comparable  @eq_comparable2
: comparable.
Hint Immediate @comparable_refl  @comparable_sym  : comparable.
Ltac Comp1 phi1 phi2 :=
solve [ eauto 3 with comparable typeclass_instances |
match goal with
| H: comparable phi1 ?phi |- _ => Comp2 H phi1 phi phi2
| H: comparable ?phi phi1 |- _ => Comp2 H phi1 phi phi2
| H: join phi1 ?phia ?phib |- _ =>  Comp3 H phi1 phia phib phi2
| H: join ?phia phi1 ?phib |- _ =>   Comp3 H phi1 phia phib phi2
| H: join ?phia ?phib phi1 |- _ =>   Comp3 H phi1 phia phib phi2
| H: joins phi1 ?phi |- _ =>  Comp2 H phi1 phi phi2
| H: joins ?phi phi1 |- _ =>  Comp2 H phi1 phi phi2
| H: join_sub phi1 ?phi |- _ => Comp2 H phi1 phi phi2
| H: join_sub ?phi phi1 |- _ => Comp2 H phi1 phi phi2
| H: list_join phi1 _ ?phi |- _ =>  Comp2 H phi1 phi phi2
| H: list_join ?phi _ phi1 |- _ =>  Comp2 H phi1 phi phi2
| H: phi1 = ?phi  |- _ => Comp2 H phi1 phi phi2
| H: ?phi = phi1  |- _ => Comp2 H phi1 phi phi2
end]
with Comp2 H phi1 phi phi2 :=
solve [apply comparable_trans with phi;
[eauto 3 with comparable  typeclass_instances |clear H; Comp1 phi phi2]
| clear H; Comp1 phi1 phi2]
with Comp3 H phi1 phia phib phi2 :=
solve [apply comparable_trans with phia;
[eauto 3 with comparable typeclass_instances |clear H; Comp1 phia phi2]
|apply comparable_trans with phib;
[eauto 3 with comparable  typeclass_instances | clear H; Comp1 phib phi2]
| clear H; Comp1 phi1 phi2].
Ltac Comp := match goal with
| |- comparable ?phi1 ?phi2 => Comp1 phi1 phi2
| |-  level ?phi1 = level ?phi2 => apply comparable_fashionR; Comp1 phi1 phi2
(*                | |- level _ = level _ => rewrite comparable_level; Comp *)
end.
Definition not_any_younger {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A} (phi phi': A)  : Prop :=
exists phi1, necR phi phi1 /\ comparable phi1 phi'.

(* Specifications: *)
Lemma comparable_not_any_younger {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A} :
forall phi phi' : A , comparable phi phi' -> not_any_younger phi phi'.
Lemma necR_not_any_younger {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall phi phi' : A, necR phi phi' -> not_any_younger phi phi'.
Lemma not_any_younger_None {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}:
forall phi phi', age1 phi = None -> not_any_younger phi phi' -> age1 phi' = None.
Lemma nec_join3 {A} {JA: Join A}{PA: Perm_alg A}{SA: Sep_alg A}{agA: ageable A}{AgeA: Age_alg A}: forall {x x' y' z' : A},
join x' y' z' ->
necR x x' ->
exists y,
exists z,
join x y z /\ necR y y' /\ necR z z'.