Definition same_constructive_silhouette {A} {JOIN: Join A} (a b: A) :=
    forall c, (constructive_joins c a -> constructive_joins c b) *
                 (constructive_joins c b -> constructive_joins c a).Definition sub_constructive_silhouette {A} {JOIN: Join A}  (a b: A) :=
    forall c, constructive_joins c b -> constructive_joins c a.

(* Specifications: *)
Lemma sub_constructive_silhouette_refl {A} {JOIN: Join A} : forall a, sub_constructive_silhouette a a.
Lemma sub_constructive_silhouette_trans {A} {JOIN: Join A} : forall a b c, sub_constructive_silhouette a b -> sub_constructive_silhouette b c -> sub_constructive_silhouette a c.
Lemma same_constructive_silhouette_refl {A} {JOIN: Join A} : forall a, same_constructive_silhouette a a.
Lemma same_constructive_silhouette_sym {A} {JOIN: Join A}: forall a b, same_constructive_silhouette a b -> same_constructive_silhouette b a.
Lemma same_constructive_silhouette_trans {A} {JOIN: Join A}: forall a b c, same_constructive_silhouette a b -> same_constructive_silhouette b c -> same_constructive_silhouette a c.
Lemma same_constructive_silhouette_sub1{A} {JOIN: Join A}: forall a b, same_constructive_silhouette a b -> sub_constructive_silhouette a b.
Lemma same_constructive_silhouette_sub2 {A} {JOIN: Join A}: forall a b, same_constructive_silhouette a b -> sub_constructive_silhouette b a.
Lemma sub_same_constructive_silhouette {A} {JOIN: Join A}: forall a b, sub_constructive_silhouette a b -> sub_constructive_silhouette b a -> same_constructive_silhouette a b.
Lemma same_constructive_silhouette_join {A} `{HA: Perm_alg A}: forall phi phi' phiy phiz phiz', same_constructive_silhouette phi phi' -> join phi phiy phiz -> join phi' phiy phiz' -> same_constructive_silhouette phiz phiz'.
Lemma constructive_join_sub_joins_trans {A} {JA: Join A}{PA: Perm_alg A}: forall {a b c}, constructive_join_sub a c -> constructive_joins c b -> constructive_joins a b.
Lemma join_constructive_join_sub1 {A} {JA: Join A}{PA: Perm_alg A}: forall {a b c}, join a b c -> constructive_join_sub a c.
Lemma join_constructive_join_sub2 {A} {JA: Join A}{PA: Perm_alg A}: forall {a b c}, join a b c -> constructive_join_sub b c.
Lemma join_constructive_joins {A} {JA: Join A}{PA: Perm_alg A}: forall {a b c}, join a b c -> constructive_joins a b.