Library Ch12_parallel_inter_dec

Require Export Ch12_parallel.

Section T13.

Context `{MT:Tarski_2D_euclidean}.
Context `{EqDec:EqDecidability Tpoint}.
Context `{InterDec:InterDecidability Tpoint Col}.

Lemma two_sides_dec :
  A B C D,
     two_sides A B C D ¬ two_sides A B C D.
Proof.
intros.
elim (Col_dec C A B); intro HCol1.
right;unfold two_sides;intuition.
elim (Col_dec D A B); intro HCol2.
right;unfold two_sides;intuition.
elim (eq_dec_points A B); intro HAB.
right;unfold two_sides;intuition.
elim (eq_dec_points C D); intro HCD.

  subst;unfold two_sides;right.
  intro H;destruct H as [Hclear1 [Hclear2 [Hclear3 H]]]; clear Hclear1; clear Hclear2; clear Hclear3.
  destruct H as [T [HCol3 HBet]].
  treat_equalities;intuition.

  elim (inter_dec A B C D); intro HInter.

    destruct HInter as [I [HCol3 HCol4]].
    unfold two_sides.
    elim (Bet_dec C I D); intro HBet1.

      left; repeat split; try assumption; I; Col.

      right.
      intro H.
      destruct H as [Hclear1 [Hclear2 [Hclear3 H]]]; clear Hclear1; clear Hclear2; clear Hclear3.
      destruct H as [T [HCol5 HBet2]].
      assert_cols.
      assert (I = T) by (apply inter_unicity with A B C D; Col).
      subst; intuition.

    right.
    unfold two_sides.
    intro H.
    destruct H as [Hclear1 [Hclear2 [Hclear3 H]]]; clear Hclear1; clear Hclear2; clear Hclear3.
    destruct H as [T [HCol3 HBet]].
    apply HInter.
     T; Col5.
Qed.

Lemma not_par_inter_exists : A1 B1 A2 B2,
  ¬Par A1 B1 A2 B2 X, Col X A1 B1 Col X A2 B2.
Proof.
intros.
induction (eq_dec_points A1 B1).
subst; A2; Col.
induction (eq_dec_points A2 B2).
subst; A1; Col.
induction (inter_dec A1 B1 A2 B2).

  assumption.

  exfalso.
  apply H.
  unfold Par.
  left.
  unfold Par_strict.
  repeat split; assumption.
Qed.

Lemma not_par_two_sides : A B C D,
 A BC D¬Par A B C D
  X, Y, Col C D X Col C D Y two_sides A B X Y.
Proof.
intros.
assert(HH:=H1).
apply not_par_inter_exists in H1.
ex_and H1 T.
induction(eq_dec_points C T).

  subst T.
  prolong D C Y D C.
   D; Y; repeat split; try Col.

    intro; apply HH.
    apply par_symmetry; right; repeat split; try assumption.

    induction(eq_dec_points A C).

      subst C.
      intro; apply HH.
      apply par_symmetry; right; repeat split; Col.
      apply col_permutation_2; apply (col_transitivity_1 _ Y); try Col.

        intro; subst Y; apply cong_symmetry in H4; apply cong_identity in H4; subst D; absurde.

        intro; apply HH; apply par_symmetry; right; repeat split; try assumption.
        assert(Col Y A C) by (apply col_permutation_2; apply col_transitivity_1 with B; Col).
        assert(Col A C D).

          apply col_permutation_2; apply (col_transitivity_1 _ Y); try Col.
          intro; subst Y; apply cong_symmetry in H4; apply cong_identity in H4; subst D; absurde.
          apply bet_col in H3.
          apply col_permutation_2; apply col_transitivity_1 with C; Col.

     C; Col.

  prolong C T Y C T.
   C; Y; repeat split; Col.

    apply (col_transitivity_1 _ T); Col.

    intro.
    assert(C = T) by (apply not_par_inter_unicity with A B C D; Col).
    contradiction.

    intro.
    assert(Y = T) by (apply not_par_inter_unicity with A B C D; Col; apply (col_transitivity_1 _ T); Col).
    subst Y; treat_equalities; intuition.

     T; Col.
Qed.

Lemma not_par_other_side : A B C D P,
 A BC D¬Par A B C D¬Col A B P
  Q, Col C D Q two_sides A B P Q.
Proof.
intros.
assert( X, Y, Col C D X Col C D Y two_sides A B X Y)
 by (apply not_par_two_sides;assumption).
ex_and H3 X; ex_and H4 Y.
elim (two_sides_dec A B P X); intro HTS.

   X; split; assumption.

  apply not_two_sides_one_side in HTS; Col.

     Y; split; try assumption.
    apply l9_8_2 with X; try assumption.
    apply one_side_symmetry; assumption.

    intro.
    unfold two_sides in H5.
    intuition.
Qed.

Lemma parallel_unicity_aux : A1 A2 B1 B2 C1 C2 P,
 ¬ Col P A1 A2
 Par A1 A2 B1 B2Col P B1 B2
 Par A1 A2 C1 C2Col P C1 C2
 Col C1 B1 B2 Col C2 B1 B2.
Proof.
intros.
apply par_distincts in H0.
apply par_distincts in H2.
spliter.
assert(HPar1 : Par_strict A1 A2 B1 B2) by (apply (par_not_col_strict _ _ _ _ P); Col; intro; apply H; Col).
assert(HPar2 : Par_strict A1 A2 C1 C2) by (apply (par_not_col_strict _ _ _ _ P); Col; intro; apply H; Col).
elim (line_dec B1 B2 C1 C2); intro HLine.

  assumption.

  assert (HLineNew : ¬ Col C1 B1 B2 ¬ Col C2 B1 B2) by (induction (Col_dec C1 B1 B2); induction (Col_dec C2 B1 B2);tauto).
  clear HLine; rename HLineNew into HLine.
  assert(HC' : C', Col C1 C2 C' two_sides B1 B2 A1 C').

    apply not_par_other_side; try assumption.

      apply col_not_col_not_par.
       P; split; Col.
      induction HLine.

         C1; split; try Col.

         C2; split; try Col.

      intro.
      unfold Par_strict in HPar1.
      spliter.
      apply H12.
       A1; split; Col.

  ex_and HC' C'.
  assert(HH := H0).
  unfold two_sides in H9.
  spliter.
  ex_and H12 B.
  double C' P C.
  unfold is_midpoint in H14.
  spliter.
  assert(HD : D, Bet B D C Bet P D A1) by (apply inner_pasch with C'; Between).
  ex_and HD D.
  assert(C' P) by (intro; subst C'; contradiction).
  assert (Par A1 A2 C' P) by (apply par_col2_par with C1 C2; Col).
  assert(HPar3 : Par_strict A1 A2 C' P) by (apply (par_not_col_strict _ _ _ _ P); Col).
  assert(B P).
    intro.
    subst B.
    apply (par_not_col _ _ _ _ A1) in HPar3.

      apply HPar3; Col.

      Col.

  assert(P C).
    intro.
    subst C.
    apply cong_identity in H15.
    subst C'.
    absurde.
  assert(Col B P B1) by (apply col_permutation_1; apply col_transitivity_1 with B2; Col).
  assert(Col B P B2) by (apply col_permutation_1; apply (col_transitivity_1 _ B1); Col).
  assert(Col C' P C1).

    induction(eq_dec_points C' C1).

      subst C1; Col.

      apply col_permutation_1; apply col_transitivity_1 with C2; Col.

  assert(Col C P C1).

    induction(eq_dec_points C' C1).

      subst C1; Col.

      apply col_permutation_1.
      apply (col_transitivity_1 _ C'); Col.
      apply col_permutation_2.
      apply col_transitivity_1 with P; Col.

  assert(Col C' P C2).

    induction(eq_dec_points C' C2).

      subst C2; Col.

      apply col_permutation_1; apply (col_transitivity_1 _ C1); Col.

  assert(Col C P C2).

    induction(eq_dec_points C' C2).

      subst C2; Col.

      apply col_permutation_1.
      apply (col_transitivity_1 _ C'); Col.
      apply col_permutation_2; apply col_transitivity_1 with P; Col.

  assert(¬Col B P C).

    intro.
    assert(Col B P C') by (apply col_permutation_2; apply col_transitivity_1 with C; Col).
    apply H11.
    apply (col3 B P); assumption.

  assert(P D) by (intro; subst D; apply bet_col in H16; contradiction).
  assert(HE := euclid P B C D A1 H17 H16 H29).
  ex_and HE X; ex_and H30 Y.
  assert(Hx := l12_6 A1 A2 P X).
  induction(eq_dec_points P X).

    subst X.
    apply between_identity in H30.
    subst B.
    absurde.

    assert(Par_strict A1 A2 P X) by (apply (par_strict_col2_par_strict _ _ B1 B2); Col; apply col3 with B P; Col).
    apply Hx in H34.
    assert(Hy := l12_6 A1 A2 P Y).
    induction(eq_dec_points P Y).

      subst Y.
      apply between_identity in H31.
      subst C.
      absurde.

      assert(HPar4 : Par_strict A1 A2 P Y) by (apply (par_strict_col2_par_strict _ _ C1 C2); Col; apply (col3 C P); Col).
      apply Hy in HPar4.
      assert(HOS : one_side A1 A2 X Y)
        by (apply one_side_transitivity with P; try assumption; unfold one_side in *; ex_and H34 Z; Z; split; assumption).
      assert(Ho := HOS).
      unfold one_side in HOS.
      ex_and HOS Z.
      unfold two_sides in H36.
      unfold two_sides in H37.
      spliter.
      assert(HTS : two_sides A1 A2 X Y) by (unfold two_sides; repeat split; try assumption; A1; split; Col).
      apply l9_9 in HTS.
      contradiction.
Qed.

Lemma parallel_unicity :
  A1 A2 B1 B2 C1 C2 P : Tpoint,
  Par A1 A2 B1 B2Col P B1 B2
  Par A1 A2 C1 C2Col P C1 C2
  Col C1 B1 B2 Col C2 B1 B2.
Proof.
intros.
assert( A1 A2 B1 B2) by (apply par_distinct;auto).
assert( A1 A2 C1 C2) by (apply par_distinct;auto).
spliter.
clear H4.
induction(Col_dec P A1 A2).

  induction H.

    apply False_ind.
    apply H.
     P.
    split; Col.

    induction H1.

      apply False_ind.
      apply H1.
       P.
      split; Col.

      spliter.
      assert(Col C1 A1 A2) by (apply (col_transitivity_1 _ C2); Col).
      assert(Col C2 A1 A2) by (apply (col_transitivity_1 _ C1); Col).
      assert(Col B1 A1 A2) by (apply (col_transitivity_1 _ B2); Col).
      assert(Col B2 A1 A2) by (apply (col_transitivity_1 _ B1); Col).
      split; (apply (col3 A1 A2)); Col.

  apply (parallel_unicity_aux A1 A2 _ _ _ _ P); auto.
Qed.

Lemma par_trans : A1 A2 B1 B2 C1 C2,
  Par A1 A2 B1 B2Par B1 B2 C1 C2Par A1 A2 C1 C2.
Proof.
intros.
apply par_distincts in H.
apply par_distincts in H0.
spliter.
unfold Par.
induction (Col_dec A1 A2 C1).

  right.
  assert (Col A1 C1 C2 Col A2 C1 C2) by (apply (parallel_unicity B1 B2 C1 C2 A1 A2 C1);Par;Col;apply par_symmetry;assumption).
  intuition.

  left.
  unfold Par_strict.
  repeat split; try assumption.
  intro HX.
  ex_and HX X.
  assert (Col C1 A1 A2 Col C2 A1 A2) by (apply (parallel_unicity B1 B2 A1 A2 C1 C2 X);Par;Col;apply par_symmetry;assumption).
  intuition.
Qed.

Lemma l12_16 : A1 A2 B1 B2 C1 C2 X,
  Par A1 A2 B1 B2inter A1 A2 C1 C2 X Y, inter B1 B2 C1 C2 Y.
Proof.
intros.
assert(HH:= H).
unfold Par in H.
induction H.

  unfold inter in H0.
  spliter.
  ex_and H0 P.
  assert(HNCol : ¬Col B1 B2 X) by (intro; unfold Par_strict in H; spliter; apply H7; X; Col).
  assert(HH1 := l8_18_existence B1 B2 X HNCol).
  ex_and HH1 X0.
  assert(HPar : ¬Par B1 B2 C1 C2).

    intro.
    assert(Par A1 A2 C1 C2) by (apply par_trans with B1 B2; assumption).
    assert(¬Par A1 A2 C1 C2).

      apply col_not_col_not_par.
       X; Col.
       P; Col.

    contradiction.

  apply not_par_inter_exists in HPar.
  ex_and HPar Y.
   Y.
  split; try Col.
   X.
  split.
  Col.
  intro.
  apply HNCol; Col.

  unfold inter in H0.
  spliter.
  ex_and H0 P.
   X.
  split.

     P.
    split.

      Col.

      intro.
      apply H6.
      apply (col3 B1 B2); Col.

  split; try Col.

    apply par_symmetry in HH.
    unfold Par in HH.
    induction HH.

      unfold Par_strict in H7.
      spliter.
      apply False_ind.
      apply H10.
       A1.
      split; try Col.

      spliter.
      apply (col3 A1 A2); Col.
Qed.

Lemma not_one_side_two_sides :
  A B X Y,
  A B
  ¬ Col X A B
  ¬ Col Y A B
  ¬ one_side A B X Y
  two_sides A B X Y.
Proof.
intros.
intros.
induction(two_sides_dec A B X Y).
assumption.
apply not_two_sides_one_side in H3; try assumption.
contradiction.
Qed.

Lemma one_or_two_sides :
  A B X Y,
  ¬ Col X A B
  ¬ Col Y A B
  two_sides A B X Y one_side A B X Y.
Proof.
intros.

induction(two_sides_dec A B X Y).
left.
assumption.
right.
apply not_two_sides_one_side in H1; try assumption.
intro;subst;Col.
Qed.

Lemma one_side_dec : A B C D,
 one_side A B C D ¬ one_side A B C D.
Proof.
intros.
elim (Col_dec C A B); intro HCol1.

  right.
  intro H.
  destruct H as [C' [Hts1 Hts2]].
  unfold two_sides in ×.
  intuition.

  elim (Col_dec D A B); intro HCol2.

    right.
    intro H.
    destruct H as [C' [Hts1 Hts2]].
    unfold two_sides in ×.
    intuition.

    elim (one_or_two_sides A B C D HCol1 HCol2); intro Hts.

      right.
      apply l9_9;auto.

      tauto.
Qed.

Lemma lea_cases :
  A B C D E F,
  A BC BD EF E
  lea A B C D E F lea D E F A B C.
Proof.
intros.
assert(HH:= or_bet_out A B C H H0).
induction HH.

right.

apply l11_31_2; assumption.

induction H3.
left.
apply l11_31_1; assumption.

assert(HH:= or_bet_out D E F H1 H2).
induction HH.
left.

apply l11_31_2; assumption.

induction H4.
right.
apply l11_31_1; assumption.

assert( C', Conga D E F A B C' one_side A B C' C).
apply angle_construction_1.
assumption.
assumption.
ex_and H5 C'.

induction(two_sides_dec B C A C').
unfold two_sides in H7.
spliter.
ex_and H10 X.

assert(A X).
intro.
subst X.
contradiction.

assert(out A X C').
apply bet_out.
auto.
intro.
subst C'.
apply between_egality in H11.
subst X.
absurde.
apply between_trivial.
assumption.

assert(¬Col A B X).
intro.
apply H3.
apply col_permutation_2.
eapply (col_transitivity_1 _ X).

intro.
subst X.

unfold one_side in H6.
ex_and H6 C0.
unfold two_sides in ×.
spliter.
ex_and H21 T0.
ex_and H18 T1.
apply bet_col in H11.
apply H19.
apply col_permutation_2.
assumption.
apply col_permutation_4.
assumption.
apply col_permutation_1.
assumption.

assert(one_side A B X C').
apply out_one_side.
left.
assumption.
assumption.

assert(one_side A B C X).
eapply one_side_transitivity.
apply one_side_symmetry.
apply H6.
apply one_side_symmetry.
assumption.

assert(out B X C).

eapply col_one_side_out.
apply col_permutation_4.
assumption.
apply invert_one_side.
apply one_side_symmetry.
apply H16.

left.
apply l11_29_b.

C'.
split.
unfold InAngle.
repeat split; try assumption.
intro.
subst C'.
unfold one_side in H6.
ex_and H6 C0.
unfold two_sides in ×.
spliter.
apply H22.
apply col_trivial_3.
X.
split.
assumption.
right.
assumption.
apply conga_sym.
assumption.

induction(Col_dec B C C').
unfold Col in H8.
induction H8.
apply bet_out in H8.
assert(Conga D E F A B C).
eapply out_conga.
apply H5.
apply out_trivial.
auto.
apply out_trivial.
auto.
apply out_trivial.
auto.
apply l6_6.
assumption.
left.
eapply (l11_30 A B C A B C).
apply lea_refl.
assumption.
assumption.
apply conga_refl.
assumption.
assumption.
apply conga_sym.
assumption.
assumption.
intro.
subst C'.
apply between_identity in H8.
subst C.
absurde.

induction H8.
apply between_symmetry in H8.

apply bet_out in H8.
assert(Conga D E F A B C).
eapply out_conga.
apply H5.
apply out_trivial.
auto.
apply out_trivial.
auto.
apply out_trivial.
auto.
assumption.
left.
eapply (l11_30 A B C A B C).
apply lea_refl.
assumption.
assumption.
apply conga_refl.
assumption.
assumption.
apply conga_sym.
assumption.
unfold one_side in H6.
ex_and H6 C0.
unfold two_sides in H6.
spliter.
intro.
subst C'.
apply H10.
apply col_trivial_3.
assumption.

assert (two_sides A B C' C).
repeat split.
assumption.
intro.
apply H4.
eapply col_conga_col.
apply col_permutation_1.
apply H9.
apply conga_sym.
assumption.
intro.
apply H3.
apply col_permutation_1.
assumption.
B.
split.
apply col_trivial_3.
assumption.
apply l9_9 in H9.
contradiction.

right.
apply not_two_sides_one_side in H7.
2:auto.
2:assumption.

assert(two_sides B C' A C).
eapply l9_31.
apply invert_one_side.
assumption.
apply one_side_symmetry.

assumption.
unfold two_sides in H9.
spliter.
ex_and H12 T.

unfold lea.

C'.
split.
unfold InAngle.
repeat split; try assumption.
auto.
T.
split.
assumption.
right.

unfold Col in H12.
induction H12.

assert(one_side A B T C).
apply out_one_side.
right.
assumption.
apply bet_out.
intro.
subst T.
apply H10.
apply bet_col.
assumption.
intro.
subst C.
apply between_identity in H13.
subst T.
apply H10.
apply bet_col.
assumption.
assumption.

assert(two_sides A B C' T).
repeat split.
assumption.
intro.
apply H10.
apply col_permutation_1.
assumption.
intro.
apply H10.
apply col_permutation_2.
eapply (col_transitivity_1 _ T).
intro.
subst T.

unfold one_side in H14.
ex_and H14 C0.
unfold two_sides in H14.
spliter.
apply H17.
apply col_trivial_3.
apply bet_col in H12.
apply col_permutation_4.
assumption.
apply col_permutation_2.
assumption.
B.
split.
apply col_trivial_3.
apply between_symmetry.
assumption.
assert(two_sides A B C' C).
apply l9_2.
eapply l9_8_2.
apply l9_2.
apply H15.
assumption.
apply l9_9 in H16.
contradiction.

repeat split.
intro.
subst T.
apply H3.
apply bet_col.
assumption.
auto.
induction H12.
right.
assumption.
left.
apply between_symmetry.
assumption.
assumption.

intro.
apply H8.
apply col_permutation_1.
assumption.
Qed.

Lemma or_lta_conga_gta : A B C D E F,
 A BC BD EF E
 lta A B C D E F gta A B C D E F Conga A B C D E F.
Proof.
intros.
assert(HH:=lea_cases A B C D E F H H0 H1 H2).
induction HH.
induction(Conga_dec A B C D E F).
right; right.
assumption.
left.
unfold lta.
split; assumption.

induction(Conga_dec A B C D E F).
right; right.
assumption.
right; left.
unfold gta.
unfold lta.
split.
assumption.
intro.
apply H4.
apply conga_sym.
assumption.
Qed.

Lemma not_lta_gea : A B C D E F,
 A BC BD EF E
 ¬ lta A B C D E F
 gea A B C D E F.
Proof.
intros.
assert(HH:=or_lta_conga_gta A B C D E F H H0 H1 H2).
induction HH.
contradiction.
unfold gea.
induction H4.
unfold gta in H4.
unfold lta in H4.
spliter.
assumption.
unfold lea.
C.
split.
apply in_angle_trivial_2; assumption.
apply conga_sym.
assumption.
Qed.

Lemma par_strict_one_side : A B C D P,
 Par_strict A B C DCol C D Pone_side A B C P.
Proof.
intros.
assert(HH:= H).
unfold Par_strict in HH.
spliter.
apply l12_6 in H.
unfold one_side in ×.
ex_and H C'.
C'.
split.
assumption.
apply not_one_side_two_sides.
assumption.
intro.
apply H4.
P.
split; Col.
unfold two_sides in H.
spliter.
assumption.
intro.
apply H4.
unfold one_side in H6.
ex_and H6 P'.
assert(one_side A B P C').
eapply l9_8_1.
apply H6.
assumption.
assert(two_sides A B P C).
eapply l9_8_2.
apply l9_2.
apply H.
apply one_side_symmetry.
assumption.
unfold two_sides in H9.
spliter.
ex_and H12 T.
T.
split.
assumption.

induction(eq_dec_points C P).
subst P.
apply between_identity in H13.
subst T.
apply col_trivial_1.

eapply col_permutation_2.
eapply (col_transitivity_1 _ P).
assumption.
Col.
apply bet_col in H13.
Col.
Qed.

Lemma par_strict_all_one_side : A B C D,
 Par_strict A B C D → ( P, Col C D Pone_side A B C P).
Proof.
intros.
eapply par_strict_one_side.
apply H.
assumption.
Qed.

Lemma Par_dec : A B C D, Par A B C D ¬ Par A B C D.
Proof.
intros.
intros.
elim (eq_dec_points A B); intro HAB.

  subst.
  right.
  unfold Par.
  intro H.
  induction H.

    unfold Par_strict in ×.
    intuition.

    intuition.

  elim (eq_dec_points C D); intro HCD.

    subst.
    right.
    unfold Par.
    intro H.
    induction H.

      unfold Par_strict in ×.
      intuition.

      intuition.

    elim (parallel_existence_spec A B C HAB);intros D' HD'.
    destruct HD' as [HCD' HPar].
    elim (Col_dec C D D'); intro HCol.

      left.
      apply par_col_par with D';Par;Col.

      right.
      intro H.
      apply HCol.
      assert (Par C D C D') by (apply par_trans with A B;Par;apply par_symmetry;assumption).
      apply par_id_3;apply par_symmetry;assumption.
Qed.

Lemma par_not_par : A B C D P Q, Par A B C D¬Par A B P Q¬Par C D P Q.
Proof.
intros.
intro.
apply H0.
eapply par_trans.
apply H.
apply H1.
Qed.

Lemma par_inter : A B C D P Q X, Par A B C D¬Par A B P QCol P Q XCol A B X Y, Col P Q Y Col C D Y.
Proof.
intros.
assert(¬ Par C D P Q).
eapply par_not_par.
apply H.
assumption.
assert(HH:=not_par_inter_exists C D P Q H3).
ex_and HH T.
T.
split; Col.
Qed.

Lemma l12_19 :
   A B C D ,
   ¬Col A B CPar A B C DPar B C D A
   Cong A B C D Cong B C D A two_sides B D A C two_sides A C B D.
Proof.
intros.
assert( P, is_midpoint P A C) by (eapply midpoint_existence).
ex_and H2 P.
double B P D'.

assert(Cong C D' A B).
eapply (l7_13 P); assumption.
assert(Cong B C D' A).
eapply (l7_13 P).
apply l7_2.
assumption.
assumption.

assert(Par A B C D').
eapply l12_17.
intro.
subst B.
apply H.
apply col_trivial_1.
apply H3.
assumption.

assert(Par C D C D').
eapply par_trans.
apply par_symmetry.
apply H0.
apply H6.

assert(Col C D D').
unfold Par in H7.
induction H7.
unfold Par_strict in H7.
spliter.
apply False_ind.
apply H10.
C.
split; apply col_trivial_1.
spliter.
Col.

assert(Par B C D' A).
eapply l12_17.
intro.
subst B.
apply H.
apply col_trivial_2.
apply H2.
apply l7_2.
assumption.

assert(Par D A D' A).
eapply par_trans.
apply par_symmetry.
apply H1.
assumption.

assert(Col A D D').
unfold Par in H10.
induction H10.
unfold Par_strict in H10.
spliter.
apply False_ind.
apply H13.
A.
split; apply col_trivial_3.
spliter.
Col.

assert(D = D').
eapply inter_unicity.
3: apply H11.
apply col_trivial_2.
2: apply H8.
apply col_trivial_2.
intro.
apply H.

assert(Col P C D).
apply col_permutation_2.
eapply (col_transitivity_1 _ A).
intro.
subst C.
apply H.
apply col_trivial_3.
Col.
unfold is_midpoint in H3.
spliter.
apply bet_col in H3.
Col.

assert(Col P C D').
apply col_permutation_2.
eapply (col_transitivity_1 _ D).
apply par_distincts in H0.
spliter.
assumption.
Col.
Col.

assert(Col P A D').
eapply (col_transitivity_1 _ C).
intro.
subst P.
apply l7_2 in H3.
apply is_midpoint_id in H3.
subst C.
apply H.
apply col_trivial_3.
unfold is_midpoint in H3.
spliter.
apply bet_col in H3.
Col.
assumption.
eapply (col3 P D').
intro.
subst D'.
apply l7_2 in H2.
apply is_midpoint_id in H2.
subst P.
apply H.
unfold is_midpoint in H3.
spliter.
apply bet_col.
assumption.
Col.
unfold is_midpoint in H2.
spliter.
apply bet_col in H2.
Col.
Col.
apply par_distincts in H0.
spliter.
assumption.
subst D'.
split.
Cong.
split.
Cong.

assert(B D).
intro.
subst D.
apply l7_3 in H2.
subst P.
apply H.
unfold Par in H0.
induction H0.
unfold Par_strict in H0.
spliter.
apply False_ind.
apply H13.
B.
split; apply col_trivial_3.
spliter.
Col.
unfold is_midpoint in ×.
spliter.

split.

eapply l12_18_c.
Cong.
Cong.
assumption.
assumption.
apply bet_col.
apply H3.
apply bet_col.
assumption.

eapply l12_18_d.
Cong.
Cong.
assumption.
assumption.
apply bet_col.
apply H3.
apply bet_col.
assumption.
Qed.

Lemma l12_20_bis :
   A B C D,
   Par A B C DCong A B C Dtwo_sides B D A C
   Par B C D A Cong B C D A two_sides A C B D.
Proof.
intros.

induction(eq_dec_points B C).
subst C.
unfold two_sides in H1.
spliter.
apply False_ind.
apply H3.
apply col_trivial_1.

induction(eq_dec_points A D).
subst D.
unfold two_sides in H1.
spliter.
apply False_ind.
apply H3.
apply col_trivial_3.

assert(¬ Col A B C).
intro.
assert(Col A B D).
eapply not_strict_par1.
2: apply H4.
2: apply col_trivial_2.
apply par_right_comm.
assumption.

unfold two_sides in H1.
spliter.
contradiction.

assert( P, is_midpoint P A C) by (apply midpoint_existence).
ex_and H5 P.
double B P D'.

assert(Par B C D' A).
eapply l12_17.
assumption.
apply H5.
apply l7_2.
assumption.

assert(Par A B C D').
eapply l12_17.
intro.
subst B.
apply H4.
apply col_trivial_1.
apply H6.
assumption.

assert(Cong C D' A B).
eapply (l7_13 P); assumption.
assert(Cong B C D' A).
eapply (l7_13 P).
apply l7_2.
assumption.
assumption.

assert(Par C D C D').
eapply par_trans.
apply par_symmetry.
apply H.
assumption.

assert(Col C D D').
unfold Par in H11.
induction H11.
unfold Par_strict in H11.
spliter.
apply False_ind.
apply H14.
C.
split; apply col_trivial_1.
spliter.
Col.

assert(Cong C D C D').
eapply (cong_transitivity _ _ A B).
Cong.
Cong.

assert(D = D' is_midpoint C D D').
eapply l7_20.
Col.
assumption.

induction H14.
subst D'.
assert(Par B C D A).
eapply l12_17.
assumption.
apply H5.
apply l7_2.
assumption.
split.
assumption.
assert(HH:=l12_19 A B C D H4 H H14).
spliter.
split; assumption.


assert(two_sides A C B D).
apply par_two_sides_two_sides.
assumption.
assumption.
assert(HH:= H15).
assert(HH1:=H1).
unfold two_sides in H15, H1.
spliter.
ex_and H21 T.
ex_and H18 T'.

assert(T = T').
apply bet_col in H22.
apply bet_col in H23.
eapply (inter_unicity A C B D); Col.
subst T'.

assert(¬Col B C T).
intro.
apply H16.
apply col_permutation_1.
eapply (col_transitivity_1 _ T).
intro.
treat_equalities.
apply H20.
apply bet_col in H23.
Col.
Col.
Col.

assert(one_side B C T D).
eapply out_one_side_1.
assumption.
assumption.
apply col_trivial_3.
apply bet_out in H23.
assumption.
intro.
treat_equalities.
apply H24.
apply col_trivial_3.
auto.

assert(one_side B C T A).
eapply out_one_side_1.
assumption.
assumption.
apply col_trivial_2.
apply between_symmetry in H22.
apply bet_out in H22.
assumption.
intro.
treat_equalities.
apply H24.
apply col_trivial_2.
assumption.

assert(one_side B C A D).
apply (one_side_transitivity _ _ _ T).
apply one_side_symmetry.
assumption.
assumption.

assert(two_sides B C D D').
unfold two_sides.
repeat split.
assumption.
intro.
apply H20.
Col.
intro.
apply H20.
eapply (col_transitivity_1 _ D').
intro.
treat_equalities.
apply H17.
apply col_trivial_3.
Col.
Col.

C.
split.
apply col_trivial_3.
unfold is_midpoint in H14.
spliter.
assumption.

assert(two_sides B C A D').
eapply l9_8_2.
apply H28.
apply one_side_symmetry.
assumption.
unfold Par in H7.
induction H7.
unfold Par_strict in H7.
spliter.
apply False_ind.
apply H32.
unfold two_sides in H29.
spliter.
ex_and H35 X.
X.
split.
assumption.
apply bet_col in H36.
Col.
spliter.

apply False_ind.
apply H4.
eapply (col_transitivity_1 _ P).
intro.
subst P.
apply is_midpoint_id in H6.
tauto.
apply col_permutation_1.
eapply (col_transitivity_1 _ D').
intro.
subst.
apply l7_3 in H5.
subst P.

apply H4.
unfold is_midpoint in H6.
spliter.
auto.
apply bet_col.
assumption.
Col.

unfold is_midpoint in H5.
spliter.
apply bet_col in H5.
Col.
unfold is_midpoint in H6.
spliter.
apply bet_col in H6.
Col.
Qed.

Lemma l12_20 :
  A B C D,
  Par A B C DCong A B C Dtwo_sides A C B D
  Par B C D A Cong B C D A two_sides A C B D.
Proof.
intros.

assert(two_sides B D A C).
apply par_two_sides_two_sides.
apply par_comm.
assumption.
assumption.

assert(HH:=l12_20_bis A B C D H H0 H2).
spliter.
split.
assumption.
split.
assumption.
assumption.
Qed.

Lemma par_one_or_two_sides :
  A B C D,
  Par_strict A B C D
 two_sides A C B D two_sides B D A C one_side A C B D one_side B D A C.
Proof.
intros.
induction(two_sides_dec A C B D).
left.
split.
assumption.
apply par_two_sides_two_sides.
apply par_comm.
unfold Par.
left.
assumption.
assumption.
right.

assert(HH:=H).
unfold Par_strict in H.
spliter.

assert(A C).
intro.
subst C.
apply H3.
A.
split; Col.

assert(B D).
intro.
subst D.
apply H3.
B.
split; Col.

split.

apply not_two_sides_one_side.
assumption.
intro.
apply H3.
C.
split; Col.
intro.
apply H3.
A.
split; Col.
assumption.

apply not_two_sides_one_side.
assumption.
intro.
apply H3.
D.
split; Col.
intro.
apply H3.
B.
split; Col.
intro.
apply H0.
apply par_two_sides_two_sides.
left.
assumption.
assumption.
Qed.

Lemma l12_21_a :
  A B C D,
  two_sides A C B D
  (Par A B C DConga B A C D C A).
Proof.
intros.

assert(two_sides B D A C).
apply par_two_sides_two_sides.
apply par_comm.
assumption.
assumption.

assert(B C).
intro.
subst B.
unfold two_sides in H.
spliter.
apply H2.
apply col_trivial_3.

assert(¬Col B C D).
unfold two_sides in H1.
spliter.
intro.
apply H4.
Col.

assert(inter B C D C C).
repeat split.
D.
split.
apply col_trivial_1.
intro.
apply H3.
Col.
apply col_trivial_2.
apply col_trivial_2.

assert(HH:= parallel_existence B C A H2).
ex_and HH X.
ex_and H5 Y.

assert(HH:=l12_16 B C X Y D C C H6 H4).
ex_and HH D'.

apply par_distincts in H0.
spliter.

assert(¬Col A B C).
intro.
unfold Par in H0.
induction H0.
unfold Par_strict in H0.
spliter.
apply H14.
C.
split; Col.
spliter.
contradiction.

assert(Par B C A D').
eapply par_col2_par.
intro.
subst D'.

unfold Par in H0.
induction H0.
unfold Par_strict in H0.
spliter.
apply H14.

unfold inter in H7.
ex_and H8 P.
A.
split; Col.
spliter.
contradiction.
apply H6.
Col.
unfold inter in H8.
spliter.
assumption.

assert(Par_strict A B C D).
unfold Par in H0.
induction H0.
assumption.
spliter.
apply False_ind.
apply H11.
apply col_permutation_1.
eapply (col_transitivity_1 _ D).
assumption.
Col.
Col.

assert(Par_strict B C A D').
unfold Par in H12.
induction H12.
assumption.
spliter.
unfold Par_strict.
repeat split; try assumption.
intro.
ex_and H17 P.
apply H11.

eapply col_transitivity_1.
apply H14.
Col.
Col.

assert(Par A B C D').
eapply par_col_par.
intro.
subst D'.

unfold Par_strict in H14.
spliter.
apply H17.
C.
split; Col.
apply H0.
unfold inter in H8.
spliter.
Col.

apply par_right_comm in H12.

assert(HH:= l12_19 A B C D' H11 H15 H12).
spliter.

assert(A C).
unfold two_sides in H19.
spliter.
assumption.

assert(Conga B A C D' C A).
apply cong3_conga.
auto.
auto.
repeat split; Cong.

eapply l11_10.
apply H21.
apply out_trivial.
auto.
apply out_trivial.
auto.

unfold inter in H8.
spliter.
induction H23.

assert(one_side A C D D').
eapply l9_8_1.
apply l9_2.
apply H.
apply l9_2.
assumption.
assert(two_sides A C D D').
unfold two_sides.
repeat split.
assumption.
unfold two_sides in H.
spliter.
assumption.
unfold two_sides in H19.
spliter.
assumption.
C.
split.
apply col_trivial_3.
assumption.
apply l9_9 in H25.
contradiction.
induction H23.
apply bet_out in H23.
apply l6_6.
assumption.
intro.
treat_equalities.
auto.
auto.
apply between_symmetry in H23.
apply bet_out in H23.
assumption.
auto.
intro.
treat_equalities.
auto.
apply out_trivial.
auto.
Qed.

Lemma l12_21 : A B C D,
 two_sides A C B D
 (Conga B A C D C A Par A B C D).
Proof.
intros.
split.
intro.
apply l12_21_b ; assumption.
intro.
apply l12_21_a; assumption.
Qed.

Lemma l12_22_a : A B C D P,
 out P A Cone_side P A B DPar A B C D
 Conga B A P D C P.
Proof.
intros.

unfold Par in H1.
induction H1.

assert(¬Col A B C).
intro.
unfold Par_strict in H1.
spliter.
apply H5.
C.
Col.

assert( A C).
intro.
treat_equalities.
assert(HH := not_par_strict_id A B D).
contradiction.
assert(HH:= parallel_existence A C B H3).
ex_and HH X.
ex_and H4 Y.

assert(inter A C C D C).

apply inter_right_comm.
apply inter_trivial.
intro.
unfold Par_strict in H1.
spliter.
apply H10.
A.
split; Col.

assert(HH:= l12_16 A C X Y C D C H5 H7).
ex_and HH D'.

assert(Par A C B D').
eapply par_col2_par.
intro.
unfold Par_strict in H1.
spliter.
unfold inter in H8.
spliter.
treat_equalities.
apply H12.
B.
Col.
apply H5.
Col.
unfold inter in H8.
spliter;
assumption.

assert(Par A B C D').
eapply par_col_par.
intro.
treat_equalities.
apply H2.
apply par_comm in H9.
apply par_id in H9.
Col.
unfold Par.
left.
apply H1.
unfold inter in H8.
spliter.
assumption.

assert(Par_strict A C B D').
unfold Par in H9.
induction H9.
assumption.
spliter.
apply False_ind.
apply H2.
apply col_permutation_2.
eapply (col_transitivity_1 _ D').
assumption.
Col.
Col.

assert(Cong A B D' C
     Cong B D' C A two_sides B C A D' two_sides A D' B C).

eapply l12_19.
eapply par_not_col.
apply H11.
Col.

apply par_right_comm.
assumption.
apply par_symmetry.
apply par_left_comm.
assumption.
spliter.

prolong C A C' C A.

assert(Par B D' A C').
eapply par_col_par.
intro.
treat_equalities.
tauto.

unfold Par.
left.

apply par_strict_symmetry.
apply H11.
apply bet_col in H16.
Col.

assert(Cong B D' A C').
eCong.

assert(Par_strict A B C D').
unfold Par in H10.
induction H10.
assumption.
spliter.
apply False_ind.
apply H2.
apply col_permutation_1.
eapply (col_transitivity_1 _ D').
intro.
treat_equalities.
tauto.
Col.
Col.

assert(HH := l12_6 A B C D' H20).

assert(two_sides A B C C').
unfold two_sides.
repeat split.
intro.
treat_equalities.
apply H2.
Col.
intro.
apply H2.
Col.
intro.
apply H2.

eapply (col_transitivity_1 _ C').
intro.
treat_equalities.
tauto.
Col.
apply bet_col in H16.
Col.
A.
split.
Col.
assumption.

assert(two_sides A B D' C').
eapply l9_8_2.
apply H21.
assumption.

assert(two_sides C' D' A B).
apply par_two_sides_two_sides.
apply par_comm.
apply par_symmetry.
assumption.
apply l9_2.
assumption.
apply l9_2 in H23.

apply invert_two_sides in H22.
assert(HH1:= l12_20 B D' A C' H18 H19 H22).
spliter.

assert(Cong_3 D' C A B A C').
repeat split; Cong.
apply cong3_conga in H27.

assert(one_side A C D D').
eapply one_side_transitivity with B.
apply col_one_side with P.
apply out_col in H.
Col.
assumption.
apply invert_one_side.
apply one_side_symmetry.
apply H0.
apply l12_6.
induction H9.
assumption.
spliter.
apply False_ind.
apply H2.
apply col_permutation_2.
eapply (col_transitivity_1 _ D').
assumption.
Col.
Col.

assert(out C D' D).
unfold inter in H8.
spliter.

induction H30.
apply l6_6.
apply bet_out.
intro.
treat_equalities.
unfold Par_strict in H1.
tauto.
intro.
treat_equalities.
unfold two_sides in H14.
spliter.
apply H12.
Col.
assumption.

induction H30.
apply bet_out.
intro.
treat_equalities.
unfold Conga in H27.
tauto.

intro.
treat_equalities.
unfold Conga in H27.
tauto.

apply between_symmetry.

assumption.

assert(two_sides A C D D').
unfold two_sides.
repeat split.
auto.

unfold one_side in H28.
ex_and H28 K.
unfold two_sides in H28.
tauto.

unfold one_side in H28.
ex_and H28 K.
unfold two_sides in H31.
tauto.
C.
split.
Col.
apply between_symmetry.
assumption.
apply l9_9 in H31.
contradiction.

unfold out in H.
spliter.
induction H31.

assert(out C A C').
unfold out.
repeat split.
assumption.
intro.
subst C'.
apply between_identity in H16.
subst C.

assert(HX:=not_par_strict_id A B D').
apply HX.
contradiction.
left.
assumption.

assert(Conga D' C A D C P).
eapply l11_10.
apply conga_refl.
3: apply H29.
3:apply H32.
intro.
treat_equalities.
unfold out in H29.
tauto.
intro.
treat_equalities.
unfold two_sides in H22.
spliter.
apply H12.
Col.
apply out_trivial.
intro.
treat_equalities.
unfold out in H29.
tauto.

unfold out.
repeat split.
intro.
treat_equalities.
unfold Conga in H27.
tauto.
intro.
treat_equalities.
unfold two_sides in H14.
spliter.
apply H13.
Col.

unfold out in H32.
spliter.
induction H34.
eapply (l5_1 _ A).
auto.
apply between_symmetry.
assumption.
assumption.
right.
eapply between_exchange4.
apply H34.
apply between_symmetry.
assumption.

assert(Conga B A P B A C').
eapply l11_10.
apply (conga_refl B A P).
intro.
treat_equalities.
apply H2.
Col.
intro.
treat_equalities.
tauto.
apply out_trivial.
intro.
treat_equalities.
unfold Conga in H33.
tauto.
apply out_trivial.
intro.
treat_equalities.
tauto.
apply out_trivial.
intro.
treat_equalities.
unfold Conga in H33.
tauto.

unfold out.
repeat split.
intro.
treat_equalities.
unfold out in H32.
tauto.
auto.
eapply (l5_2 C).
auto.
assumption.
apply between_symmetry.
assumption.

eapply conga_trans.
apply H34.
eapply conga_trans.
apply conga_sym.
apply H27.
assumption.
apply conga_comm.

assert(Conga D C A B A C').
eapply l11_10.
apply H27.
apply l6_6.
assumption.
apply out_trivial.
assumption.
apply out_trivial.
intro.
treat_equalities.
apply H2.
Col.
apply out_trivial.
intro.
treat_equalities.
apply H2.
Col.

eapply l11_13.
apply conga_comm.
apply conga_sym.
apply H32.

eapply outer_transitivity_between.
apply between_symmetry.
apply H16.
apply between_symmetry.
assumption.
assumption.
auto.
apply between_symmetry.
assumption.
auto.
intro.
treat_equalities.
unfold two_sides in H14.
spliter.
apply H13.
Col.
assumption.
spliter.

induction(eq_dec_points A C).
treat_equalities.

unfold out in H.
spliter.

assert(HH:= H0).
unfold one_side in HH.
ex_and HH T.
unfold two_sides in ×.
spliter.

induction H4.
assert(two_sides P A B D).
unfold two_sides.
repeat split.
auto.
assumption.
assumption.
A.
split.
Col.
assumption.
apply l9_9 in H14.
contradiction.

induction H4.
eapply l11_10.
apply (conga_refl B A P).
auto.
auto.
apply out_trivial.
auto.
apply out_trivial.
auto.
unfold out.
repeat split.
auto.
auto.
left.
assumption.
apply out_trivial.
auto.
eapply l11_10.
apply (conga_refl B A P).
auto.
auto.
apply out_trivial.
auto.
apply out_trivial.
auto.
unfold out.
repeat split.
auto.
auto.
right.
apply between_symmetry.
assumption.
apply out_trivial.
auto.

unfold one_side in H0.
ex_and H0 T.
unfold two_sides in ×.
spliter.

apply False_ind.
apply H7.
apply col_permutation_1.
eapply (col_transitivity_1 _ C).
assumption.
Col.
unfold out in H.
spliter.
induction H14; apply bet_col in H14; Col.
Qed.

Lemma l12_22 :
   A B C D P,
  out P A Cone_side P A B D
  (Conga B A P D C P Par A B C D).
Proof.
intros.
split;
intro.
eapply (l12_22_b _ _ _ _ P); assumption.
apply l12_22_a; assumption.
Qed.

Lemma l12_23 :
  A B C,
  ¬Col A B C
   B', C',
  two_sides A C B B' two_sides A B C C'
      Bet B' A C' Conga A B C B A C' Conga A C B C A B'.
Proof.
intros.

assert( B0, is_midpoint B0 A B) by (apply midpoint_existence).
assert( C0, is_midpoint C0 A C) by (apply midpoint_existence).
ex_and H0 B0.
ex_and H1 C0.
prolong B C0 B' B C0.
prolong C B0 C' C B0.
B'.
C'.

assert(two_sides A C B B').

eapply mid_two_sides.
intro.
treat_equalities.
apply H.
Col.
apply H0.

intro.
apply H.
Col.
split.
assumption.
Cong.

assert(two_sides A B C C').

eapply mid_two_sides.
intro.
treat_equalities.
apply H.
Col.
apply H2.
assumption.
split.
assumption.
Cong.

split.
assumption.
split.
assumption.

assert(Par A B' C B).
eapply l12_17.
intro.
treat_equalities.

assert(C0 = B0).
eapply l7_17.
2: apply H2.
split.
apply between_symmetry.
assumption.
Cong.
subst C0.
assert(B=C).
eapply symmetric_point_unicity.
apply H2.
assumption.
subst C.
apply H.
Col.
apply H0.
split.
apply between_symmetry.
assumption.
Cong.

assert(Par A C' B C).
eapply l12_17.
intro.
treat_equalities.

assert(C0 = B0).
eapply l7_17.
apply H0.
split.
apply between_symmetry.
assumption.
Cong.
subst C0.
assert(B=C).
eapply symmetric_point_unicity.
apply H2.
assumption.
subst C.
apply H.
Col.
apply H2.
split.
apply between_symmetry.
assumption.
Cong.

assert(Par A B' A C').
eapply par_trans.
apply H8.
apply par_symmetry.
apply par_right_comm.
assumption.
apply par_id in H10.

assert(one_side A C B0 C').
eapply out_one_side_1.
intro.
treat_equalities.
apply H.
Col.
intro.
apply H.
eapply (col_transitivity_1 _ B0).
intro.
treat_equalities;
unfold two_sides.
apply H.
apply is_midpoint_id in H2; subst; Col.
unfold is_midpoint in H2.
spliter.
apply bet_col in H2.
Col.
Col.
apply col_trivial_2.
unfold out.
repeat split.
intro.
treat_equalities.
unfold two_sides in H7.
spliter.
ex_and H11 T.
apply between_identity in H12.
subst T.
contradiction.
intro.
treat_equalities;
repeat split.
unfold two_sides in H7.
spliter.
unfold is_midpoint in H2.
spliter.
apply bet_col in H2.
apply H7.
Col.
left.
assumption.

assert(one_side A C B0 B).
eapply out_one_side_1.
intro.
treat_equalities.
apply H.
Col.
intro.
apply H.
eapply (col_transitivity_1 _ B0).
intro.
treat_equalities;
unfold two_sides.
apply H.
apply is_midpoint_id in H2; subst; Col.
unfold is_midpoint in H2.
spliter.
apply bet_col in H2.
Col.
Col.
apply col_trivial_3.
unfold out.
repeat split.
intro.
treat_equalities.
unfold two_sides in H7.
apply is_midpoint_id in H2; subst.
tauto.
intro.
treat_equalities;
repeat split.
unfold two_sides in H7.
tauto.
unfold is_midpoint in H2.
spliter.
left.
assumption.

assert(one_side A C B C').
eapply one_side_transitivity.
2:apply H11;

intro.
apply one_side_symmetry.
assumption.

assert(two_sides A C B' C').
apply l9_2.
eapply l9_8_2.
apply H6.
assumption.

split.
unfold two_sides in H14.
spliter.
ex_and H17 T.
assert(A = T).

eapply (inter_unicity A C B' C').
Col.
Col.
Col.
apply bet_col in H18.
Col.
intro.
apply H15.
Col.
intro.
treat_equalities.
contradiction.
subst T.
assumption.

split.
apply l9_2 in H7.

assert(HH:= l12_21_a A C' B C H7 H9).
apply conga_comm.
apply conga_sym.
assumption.

apply par_symmetry in H8.
apply invert_two_sides in H6.
assert(HH:= l12_21_a C B A B' H6 H8).
apply conga_comm.
assumption.
Qed.

Lemma parallel_trans : A B C D E F, Par A B C DPar C D E FPar A B E F.
Proof.
intros.
assert(H1:=par_distinct A B C D H).
assert(H2:=par_distinct C D E F H0).
spliter.

assert(P0:=H).
assert(P1:=H0).

induction(Col_dec A E F).
right.
repeat split; auto.

induction H; induction H0.

assert(Col E A B Col F A B).
apply (parallel_unicity C D A B E F A).

apply par_symmetry.
assumption.
Col.
assumption.
assumption.
spliter.
ColR.

assert(Col E A B Col F A B).
spliter.
apply (parallel_unicity C D A B E F A).

apply par_symmetry.
assumption.
Col.
assumption.
assumption.
spliter.
ColR.

spliter.

assert(Col A E F Col B E F).
apply (parallel_unicity C D E F A B A).

assumption.
Col.
apply par_symmetry.
assumption.
Col.
spliter.
Col.
spliter.

assert(Col C D E).
ColR.

assert(Col C D F).
ColR.
eapply col3.
apply H2.
Col.
Col.
Col.
left.

unfold Par_strict.
repeat split; auto.
intro.
ex_and H6 P.

apply H5.

induction H; induction H0.

assert(Col A E F Col B E F).
apply(parallel_unicity C D E F A B P); auto.

apply par_symmetry.
assumption.
spliter.
assumption.

spliter.

assert(Col A E F Col B E F).
apply(parallel_unicity C D E F A B P); auto.

apply par_symmetry.
assumption.
spliter.
assumption.

assert(Col A E F Col B E F).
apply(parallel_unicity C D E F A B P); auto.

apply par_symmetry.
assumption.
spliter.
assumption.

spliter.
assert(Col C D E).
ColR.
assert(Col C D F).
ColR.
eapply col3.
apply H2.
Col.
assumption.
assumption.
Qed.

Lemma not_par_strict_inter_exists :
  A1 B1 A2 B2,
  ¬Par_strict A1 B1 A2 B2
   X, Col X A1 B1 Col X A2 B2.
Proof.
intros.
induction (eq_dec_points A1 B1).
subst.
A2.
Col.
induction (eq_dec_points A2 B2).
subst.
A1.
Col.
induction (inter_dec A1 B1 A2 B2).
assumption.
unfold Par_strict in H.
exfalso.
apply H.
repeat split;
assumption.
Qed.

Lemma not_par_inter : A B A' B' X Y, ¬Par A B A' B' → ( P, Col P X Y (Col P A B Col P A' B')).
intros.
induction(Par_dec A B X Y).

assert(¬ Par A' B' X Y).
intro.
apply H.
apply(par_trans _ _ X Y); Par.
assert(HH:=not_par_inter_exists A' B' X Y H1).
ex_and HH P.
P.
split.
Col.
right.
Col.
assert(HH:=not_par_inter_exists A B X Y H0).
ex_and HH P.
P.
split.
Col.
left.
Col.
Qed.

Lemma not_par_one_not_par : A B A' B' X Y, ¬Par A B A' B'¬Par A B X Y ¬Par A' B' X Y.
intros.
assert(HH:=not_par_inter A B A' B' X Y H).
ex_and HH P.
induction(Par_dec A B X Y).
right.
intro.
apply H.
apply(par_trans _ _ X Y); Par.
left.
auto.
Qed.

Lemma col_par_par_col : A B C A' B' C', Col A B CPar A B A' B'Par B C B' C'Col A' B' C'.
intros.
apply par_distincts in H0.
apply par_distincts in H1.
spliter.

assert(Par A B B C).
right.
repeat split; Col.
assert(Par A' B' B' C').
apply (par_trans _ _ A' B').
Par.
apply (par_trans _ _ B C).
apply (par_trans _ _ A B); Par.
Par.
induction H7.
apply False_ind.
apply H7.
B'.
split; Col.
spliter.
Col.
Qed.

Lemma parallel_existence1 : A B P, A B Q, Par A B P Q.
intros.
assert(HH:=parallel_existence A B P H).
ex_and HH X.
ex_and H0 Y.
apply par_distincts in H1.
spliter.
induction(eq_dec_points P X).
Y.
apply par_symmetry.
apply par_comm.
apply (par_col_par_2 _ X).
intro.
subst X.
subst Y.
tauto.
Col.
Par.
X.
apply par_symmetry.
apply par_comm.
apply (par_col_par_2 _ Y).
intro.
subst X.
tauto.
Col.
Par.
Qed.

Lemma par_strict_not_col : A B C D, Par_strict A B C D X, Col A B X¬Col C D X.
Proof.
intros.
intro.
unfold Par_strict in H.
spliter.
apply H4.
X.
split; Col.
Qed.

Lemma perp_inter_exists : A B C D, Perp A B C D P, Col A B P Col C D P.
Proof.
intros.
apply perp_not_par in H.
apply not_par_inter_exists in H.
ex_and H P.
P.
split;Col.
Qed.

Lemma perp_inter_perp_in : A B C D, Perp A B C D P, Col A B P Col C D P Perp_in P A B C D.
Proof.
intros.
assert(HH:=perp_inter_exists A B C D H).
ex_and HH P.
P.
split.
Col.
split.
Col.
apply l8_14_2_1b_bis; Col.
Qed.

Lemma cong_conga_perp : A B C P, two_sides B P A CCong A B C BConga A B P C B PPerp A C B P.
intros.
assert(HH:=H).
unfold two_sides in HH.
spliter.
ex_and H5 T.
assert(B P).
intro.
subst P.
apply H3.
Col.

assert(A B).
intro.
subst B.
apply H3.
Col.
assert(C B).
intro.
subst C.
apply H4.
Col.
assert(A C).
intro.
subst C.
assert(one_side B P A A).
apply one_side_reflexivity.
assumption.
apply l9_9 in H.
contradiction.

induction (Bet_dec A B C).
assert(Per P B A).

apply(l11_18_2 P B A C); auto.
repeat split; auto.
apply conga_comm.
assumption.
eapply (col_per_perp _ _ _ C) in H12; auto.
apply perp_right_comm.
assumption.
apply bet_col in H11.
Col.

assert(B T).
intro.
subst T.
contradiction.

assert(Conga T B A T B C).

induction H5.
eapply (l11_13 P _ _ P); Between.
apply conga_comm.
apply H1.

assert(out B P T).
repeat split; auto.
induction H5.
left.
Between.
right.
Between.

apply conga_comm.
eapply (out_conga A _ P C _ P); auto.
apply out_trivial.
auto.
apply out_trivial.
auto.

assert(Cong T A T C).
apply (cong2_conga_cong T B A T B C); Cong.
assert(is_midpoint T A C).
split; Cong.

assert(Per B T A).
unfold Per.
C.
split; Cong.

eapply (col_per_perp _ _ _ C) in H16; auto.
apply perp_sym.
apply (perp_col _ T); Col.
Perp.
intro.
subst T.
apply is_midpoint_id in H15.
contradiction.
intro.
subst T.
apply l7_2 in H15.
apply is_midpoint_id in H15.
apply H10.
auto.
apply bet_col in H6.
Col.
Qed.

End T13.