(* Gabriel Braun April 2013 *)

Require Export GeoCoq.Tarski_dev.Ch13_5_Pappus_Pascal.

Section Desargues_Hessenberg.

Context `{T2D:Tarski_2D}.
Context `{TE:@Tarski_euclidean Tn TnEQD}.

Lemma l13_15_1 : forall A B C A' B' C' O ,
  ~ Col A B C -> ~ Par O B A C ->
  Par_strict A B A' B' -> Par_strict A C A' C'->
  Col O A A' -> Col O B B' -> Col O C C' ->
  Par B C B' C'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col B A' B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col A A' B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn B C B' C' *)
    assert(B <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
      subst B.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn B C B' C' *)
    assert(A <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn O A B' *)
(* Goal: @Col Tn O C C' *)
      subst A.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~ Col A' A C).
(* Goal: not (@Col Tn A' A C) *)
(* Goal: @Par Tn B C B' C' *)
      eapply (par_not_col A' C').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(C <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst C.
(* Goal: False *)
(* Goal: False *)
      apply H10.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Col Tn O C C' *)
    assert(~Col O A B).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
      exists O.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O A B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O A C).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
      exists O.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O A C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ C); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A); Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(~ Col A' B' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par A' C' A B).
(* Goal: @Par Tn A' C' A B *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B C B' C' *)
        apply(par_col_par_2 A' B' A B C').
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          subst C'.
(* Goal: False *)
(* Goal: @Col Tn A' B' C' *)
(* Goal: @Par Tn A' B' A B *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B C B' C' *)
          unfold Par_strict in H2.
(* Goal: False *)
(* Goal: @Col Tn C' B' A' *)
(* Goal: @Par Tn C' B' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          tauto.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par A C A B).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply(par_trans A C A' C'); Par.
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H16.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter; Col.
(* Goal: @Par Tn B C B' C' *)
    induction(col_dec O B C).
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
      right.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      repeat split.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        subst C.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        subst C'.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H14.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
        assert(Col O B C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ C); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ O); Col.
(* Goal: @Col Tn C B' C' *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O C B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ O); Col.
(* Goal: @Par Tn B' C' B C *)
    assert(B' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B' C' B C *)
    assert(B' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(A' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst A'.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H6.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
    (* TODO modify assert_diffs in order to use par_not_col automatically *)
(* Goal: @Par Tn B C B' C' *)
    assert(~ Col A A' C').
(* Goal: not (@Col Tn A A' C') *)
(* Goal: @Par Tn B C B' C' *)
      eapply (par_not_col A C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(C' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H19.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O A' B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
      exists O.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn O A B *)
(* Goal: @Col Tn O A' B' *)
(* Goal: @Par Tn B C B' C' *)
        assert(Col O A' B).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ B'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ A'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O A' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
      exists O.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col B' A B).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists B'.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col A' A B).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
    (********** construct L *********)
(* Goal: @Par Tn B C B' C' *)
    assert(exists C : Tpoint, exists D : Tpoint, C <> D /\ Par O B C D /\ Col A C D).
(* Goal: @ex (@Tpoint Tn) (fun C : @Tpoint Tn => @ex (@Tpoint Tn) (fun D : @Tpoint Tn => and (not (@eq (@Tpoint Tn) C D)) (and (@Par Tn O B C D) (@Col Tn A C D)))) *)
(* Goal: @Par Tn B C B' C' *)
      apply(parallel_existence O B A).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn B C B' C' *)
    ex_and H25 X.
(* Goal: @Par Tn B C B' C' *)
    ex_and H26 Y.
(* Goal: @Par Tn B C B' C' *)
    assert(exists L : Tpoint, Col L X Y /\ Col L A' C').
(* Goal: @ex (@Tpoint Tn) (fun L : @Tpoint Tn => and (@Col Tn L X Y) (@Col Tn L A' C')) *)
(* Goal: @Par Tn B C B' C' *)
      apply(not_par_inter_exists X Y A' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
      apply H0.
(* Goal: @Par Tn O B A C *)
(* Goal: @Par Tn B C B' C' *)
      eapply (par_trans O B X Y).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Par Tn A C X Y *)
(* Goal: @Par Tn B C B' C' *)
      apply (par_trans A C A' C').
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn B C B' C' *)
    ex_and H28 L.
(* Goal: @Par Tn B C B' C' *)
    assert(A <> L).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      subst L.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
      contradiction.
(* Goal: @Par Tn B C B' C' *)
    assert(Par A L O B').
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(par_col_par_2 _ B); Col.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply par_left_comm.
(* Goal: @Par Tn L A O B *)
(* Goal: @Par Tn B C B' C' *)
      induction(eq_dec_points X L).
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B C B' C' *)
        subst X.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_col_par_2 _ X); try auto.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply par_left_comm.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
    (********** construct M *********)
(* Goal: @Par Tn B C B' C' *)
    assert(~ Par X Y O C).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par O B O C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans O B X Y); Par.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      induction H33.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
        apply H33.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
        exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H15.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(HH:=not_par_inter_exists X Y O C H32).
(* Goal: @Par Tn B C B' C' *)
    ex_and HH M.
(* Goal: @Par Tn B C B' C' *)
    assert(A <> M).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
      subst M.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(Par O B A M).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ B'); Col.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_col_par_2 _ L); try auto.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      ColR.
    (*************** construct N ********************)
(* Goal: @Par Tn B C B' C' *)
    assert(L <> A').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      subst L.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      clean_trivial_hyps.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) Y X) *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Col Tn O C M *)
(* Goal: @Col Tn Y X C' *)
(* Goal: @Col Tn Y X M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      apply H12.
(* Goal: @Col Tn O A B *)
(* Goal: @Par Tn B C B' C' *)
      induction(eq_dec_points A' X).
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B C B' C' *)
        subst X.
(* Goal: @Col Tn O A B *)
(* Goal: @Par Tn B C B' C' *)
        assert(Par A' A O B).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Col Tn O A B *)
(* Goal: @Col Tn O A B *)
(* Goal: @Par Tn B C B' C' *)
        induction H29.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
          apply H29.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
          exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
(* Goal: @Col Tn O A B *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par X A' O B).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Col Tn O A B *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par A' A O B).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_col_par_2 _ X); try auto.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
          ColR.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      induction H38.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H38.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
        exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~ Par L B' A' B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      induction H38.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H38.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split;Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H14.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      eapply (col_transitivity_1 _ L); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~ Par A B L B').
(* Goal: not (@Par Tn A B L B') *)
(* Goal: @Par Tn B C B' C' *)
      apply(par_not_par A' B' A B L B').
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H38.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn B C B' C' *)
    assert(HH:=not_par_inter_exists A B L B' H39 ).
(* Goal: @Par Tn B C B' C' *)
    ex_and HH N.
(* Goal: @Par Tn B C B' C' *)
    assert(Par_strict A L O B').
(* Goal: @Par_strict Tn B C B' C'' *)
(* Goal: @Par Tn B C B' C' *)
      induction H31.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) Y X) *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Col Tn O C M *)
(* Goal: @Col Tn Y X C' *)
(* Goal: @Col Tn Y X M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      apply H12.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(A <> N).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
      subst N.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
      apply H42.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B'; Col.
(* Goal: @Par Tn B C B' C' *)
    assert(Par A N A' B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ B); Col.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn B C B' C' *)
    clean_duplicated_hyps.
    (**********************************)
(* Goal: @Par Tn B C B' C' *)
    assert(Par O N L A').
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn B C B' C' *)
      induction(par_dec A O N L).
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn B C B' C' *)
        assert(Par_strict A O N L).
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          induction H17.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
            auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
          apply H23.
(* Goal: @Col Tn B' A B *)
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn B C B' C' *)
          assert(Col N A B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            eapply (col_transitivity_1 _ L); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          eapply (col_transitivity_1 _ N); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l13_14 A O A' A N L N B'); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn B C B' C' *)
      assert(N <> L).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        subst L.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        apply H42.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn O N L A' *)
(* Goal: @Par Tn B C B' C' *)
      assert(HH:=not_par_inter_exists A O N L H17).
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      ex_and HH P.
(* Goal: @Par Tn A C C' A' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply par_right_comm.
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
      assert(P <> L).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        apply H42.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
        exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
      assert(P <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        apply H42.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X L C') (@Col Tn X O O)) *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        exists L.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ N); Col.
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
      assert(L <> B').
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        subst L.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        apply H42.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(A <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
        assert(Col A B L).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ N); Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        assert(Col L A B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ N); Col.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H39.
(* Goal: @Par Tn C D C' D' *)
        apply par_symmetry.
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
        right.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
        repeat split.
(* Goal: not (@eq (@Tpoint Tn) L B') *)
(* Goal: not (@eq (@Tpoint Tn) A B) *)
(* Goal: @Col Tn L A B *)
(* Goal: @Col Tn B' A B *)
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
          assumption.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
          subst B.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
          apply H23.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(P <> N).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) Y X) *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Col Tn O C M *)
(* Goal: @Col Tn Y X C' *)
(* Goal: @Col Tn Y X M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        apply H12.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ N); Col.
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
      assert(A' <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H38.
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
        right.
(* Goal: not (@eq (@Tpoint Tn) L B') *)
(* Goal: not (@eq (@Tpoint Tn) A B) *)
(* Goal: @Col Tn L A B *)
(* Goal: @Col Tn B' A B *)
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
        repeat split; try assumption.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          subst B'.
(* Goal: False *)
          apply H21.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
          ColR.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      assert(B' <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
        apply H21.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ A); Col.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(l13_11 O A' A L N B' P); Par; try ColR.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
      apply H42.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X L C') (@Col Tn X O O)) *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
      exists L.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Col Tn L O B' *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col L O N).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ P); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ N); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
    (* apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ A); Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
    apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ O); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
    apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ L); Col.
    *)
(* Goal: @Par Tn B C B' C' *)
    assert(Par A' C' O N).
(* Goal: @Par Tn A' C' O N *)
(* Goal: @Par Tn B C B' C' *)
      apply (par_col_par_2 _ L).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        subst C'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
        apply H22.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn B C B' C' *)
    assert(Par O N A C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_trans _ _ A' C'); Par.
(* Goal: @Par Tn B C B' C' *)
    assert(Par N M B C).
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      induction(par_dec A N O C).
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
        assert(Par_strict A N O C).
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          induction H47.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
            auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Par Tn A C C' A' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply par_right_comm.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l13_14 A N B A O C M O ); Par; Col.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(HH:= not_par_inter_exists A N O C H47).
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      ex_and HH P.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(B <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H15.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(A <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(M <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
        induction H36.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
          apply H36.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists B.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ N); Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) Y X) *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Col Tn O C M *)
(* Goal: @Col Tn Y X C' *)
(* Goal: @Col Tn Y X M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        apply H12.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ M); Col.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(O <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        induction H46.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          apply H46.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn N M B C *)
(* Goal: @Par Tn B C B' C' *)
      assert(P <> N).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        induction H46.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          apply H46.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
          exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(l13_11 N B A C M O P); Par; try ColR.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Col N A C) by ColR.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      ColR.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
    (* apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ A); Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
    apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ N); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
    apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ O); Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
    apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ C); Col.
    *)
(* Goal: @Par Tn B C B' C' *)
    assert(Par N M B' C').
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      induction(par_dec N B' O C').
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(Par_strict N B' O C').
(* Goal: @Par_strict Tn N B' O C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          induction H48.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
            auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          induction H46.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
            apply H46.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
            exists C.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
            split.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
              ColR.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
          contradiction.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(M <> L).
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
          subst M.
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          apply H49.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X L C') (@Col Tn X O O)) *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
          exists L.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply(col_transitivity_1 _ C); Col.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(L <> C').
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          subst C'.
(* Goal: False *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          apply H49.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X L C') (@Col Tn X O O)) *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
          exists L.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(Par L M O B').
(* Goal: not (@eq (@Tpoint Tn) L B') *)
(* Goal: not (@eq (@Tpoint Tn) A B) *)
(* Goal: @Col Tn L A B *)
(* Goal: @Col Tn B' A B *)
(* Goal: @Par Tn O N A' L *)
(* Goal: @Par Tn B C B' C' *)
          apply (par_col_par_2 _ A); try assumption.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
            auto.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
            ColR.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(Par L C' O N).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (par_col_par_2 _ A'); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn A C C' A' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply par_right_comm.
(* Goal: @Par Tn N M C' B' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        apply(l13_14 B' N B' L O C' M O);sfinish.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      assert(HH:= not_par_inter_exists N B' O C' H48).
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      ex_and HH P.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      assert(B' <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H15.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
      induction(eq_dec_points C'  L).
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        subst L.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(C' = M).
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
          induction (col_dec O X C).
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
            apply (l6_21 O C Y X).
(* Goal: not (@Par Tn A' B' C' D') *)
              intro.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
              assert(Col O X Y) by ColR.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) Y X) *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Col Tn O C M *)
(* Goal: @Col Tn Y X C' *)
(* Goal: @Col Tn Y X M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
              induction H26.
(* Goal: False *)
(* Goal: not (@Par Tn A' B' C' D') *)
                apply H26.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
                exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              spliter.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) Y X) *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Col Tn O C M *)
(* Goal: @Col Tn Y X C' *)
(* Goal: @Col Tn Y X M *)
(* Goal: @eq (@Tpoint Tn) C' M *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
              apply H12.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              apply(col3 X Y); Col.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
              auto.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (l6_21 O C X Y); Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst M.
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
        right.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        repeat split; try auto.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
          subst N.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          apply par_distincts in H47; spliter; auto.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          intro; subst; apply H14; Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      assert(L <> P).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
        subst P.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
        apply H22.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ L); Col.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
      induction (eq_dec_points L M).
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        subst L.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
        assert(C' = M).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (l6_21 O C A' C'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
            apply H22.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
            ColR.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            subst C'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
            apply H22.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
            subst M.
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
            right.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            repeat split; try auto. Col. Col.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
              assert(Par L M O B').
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply (par_col_par_2 _ A); try assumption. ColR.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
              Par.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
            assert(Par L C' N O).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              apply (par_col_par_2 _ A'); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
              Par.
(* Goal: @Par Tn N M B' C' *)
(* Goal: @Par Tn B C B' C' *)
            assert(B' <> N).
(* Goal: not (@Par Tn A' B' C' D') *)
              intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              subst N.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
              contradiction.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
            apply(l13_11  N B' L  C' M O P); Par.
(* Goal: not (@Par Tn A' B' C' D') *)
              intro.
(* Goal: False *)
(* Goal: @Col Tn P B' L *)
(* Goal: not (@eq (@Tpoint Tn) M P) *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              assert(Col P B' C').
(* Goal: @Col Tn P B' C' *)
(* Goal: False *)
(* Goal: @Col Tn P B' L *)
(* Goal: not (@eq (@Tpoint Tn) M P) *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                apply (col_transitivity_1 _ N).
(* Goal: not (@Par Tn A' B' C' D') *)
                  intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  subst N.
(* Goal: False *)
(* Goal: @Col Tn P N B' *)
(* Goal: @Col Tn P N C' *)
(* Goal: False *)
(* Goal: @Col Tn P B' L *)
(* Goal: not (@eq (@Tpoint Tn) M P) *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  induction H45.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
                    apply H45.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Col Tn C' E' D' *)
(* Goal: @Par Tn C' E' C E *)
                    exists C'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                    split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  spliter.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
                  apply H22.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  ColR.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                Col.
(* Goal: False *)
(* Goal: @Col Tn P B' L *)
(* Goal: not (@eq (@Tpoint Tn) M P) *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              assert(Col C' O B' ).
(* Goal: @Col Tn C' O B' *)
(* Goal: False *)
(* Goal: @Col Tn P B' L *)
(* Goal: not (@eq (@Tpoint Tn) M P) *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                apply (col_transitivity_1 _ P).
(* Goal: not (@Par Tn A' B' C' D') *)
                  intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  subst P.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
                  clean_trivial_hyps.
(* Goal: False *)
(* Goal: @Col Tn C' P O *)
(* Goal: @Col Tn C' P B' *)
(* Goal: False *)
(* Goal: @Col Tn P B' L *)
(* Goal: not (@eq (@Tpoint Tn) M P) *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  assert(Col B' C' L).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                    apply (col_transitivity_1 _ N); Col.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
                  apply H14.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  ColR.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                Col.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
              assert(Col O B C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                apply (col_transitivity_1 _ B'); Col.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
              apply H15.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
              ColR.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
              ColR.
(* Goal: not (@Par Tn A' B' C' D') *)
              intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              subst M.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              assert(Col B' P L).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                apply (col_transitivity_1 _ N); Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              assert(Col L A B').
(* Goal: @Col Tn L A B' *)
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                assert(Col P A L).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  apply (col3 X Y); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                apply (col_transitivity_1 _ P); Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) O P) *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              apply H42.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
              exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              split; Col.
(* Goal: not (@Par Tn A' B' C' D') *)
              intro.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              subst P.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
              assert(N = B).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                apply (l6_21 A B O B'); Col.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  subst N.
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
                  induction H47.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                    apply H47.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                    exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                    split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  spliter.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  assert(B = O).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                    apply (l6_21 O B' M C); Col.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
                  subst B.
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                  induction H56.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                    apply H56.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X L C') (@Col Tn X O O)) *)
(* Goal: False *)
(* Goal: @Col Tn P C' M *)
(* Goal: @Col Tn P M O *)
(* Goal: @Par Tn B C B' C' *)
                    exists L.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
                    split; Col.
(* Goal: False *)
(* Goal: @Col Tn C' B' A' *)
(* Goal: @Par Tn C' B' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
                  tauto.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  ColR.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
                  ColR.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
                  apply (par_trans _ _ N M); Par.
              Qed.

Lemma l13_15_2_aux : forall A B C A' B' C' O , ~Col A B C
                                         -> ~Par O A B C
                                         -> Par O B A C
                                         -> Par_strict A B A' B'
                                         -> Par_strict A C A' C'
                                         -> Col O A A' -> Col O B B' -> Col O C C'
                                         -> Par B C B' C'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O A B /\ ~Col O B C /\ ~Col O A C).
(* Goal: not (@Par Tn A' B' C' D') *)
      induction H1; repeat split; intro.
(* Goal: False *)
        apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
        apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
        apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
        exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Par Tn B C B' C' *)
    assert( A <> O /\ B <> O /\ C <> O).
(* Goal: and (not (@eq (@Tpoint Tn) A O)) (and (not (@eq (@Tpoint Tn) B O)) (not (@eq (@Tpoint Tn) C O))) *)
(* Goal: @Par Tn B C B' C' *)
      repeat split; intro; subst O.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
        apply H9.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: False *)
(* Goal: False *)
        apply H8.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
      apply H9.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Par Tn B C B' C' *)
    assert( A' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst A'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par O B A B).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ B'); Col.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn B C B' C'' *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      induction H13.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
      contradiction.
(* Goal: @Par Tn B' C' B C *)
    assert(B' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
      assert(Par O A B A).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(par_col_par_2 _ A'); Col.
(* Goal: @Par Tn D Y A X *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply par_comm.
(* Goal: @Par Tn C D C' D' *)
        apply par_symmetry.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H14.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H14.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(C' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par O A C A).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ A'); Col.
(* Goal: @Par Tn D Y A X *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply par_comm.
(* Goal: @Par Tn C D C' D' *)
        apply par_symmetry.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H15.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H15.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
      apply H9.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O A' B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O A B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ A'); Col.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O B' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O B C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B'); Col.
(* Goal: False *)
(* Goal: False *)
      apply H8.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ C'); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(~Col O A' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O A C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ A'); Col.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
      apply H9.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ C'); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(A <> A').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst A'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      apply H3.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    assert(B <> B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    assert(C <> C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      apply H3.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
      exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn B C B' C' *)
    induction(par_dec B C B' C').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn B C B' C' *)
    assert(B <> C).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst C.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B C B' C' *)
    assert(HP:=parallel_existence B C B' H23).
(* Goal: @Par Tn B C B' C' *)
    ex_and HP X.
(* Goal: @Par Tn B C B' C' *)
    ex_and H24 Y.
(* Goal: @Par Tn B C B' C' *)
    assert(~Par X Y O C).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par O C B C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _  X Y); Par.
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H28.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H28.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
      contradiction.
(* Goal: @Par Tn B C B' C' *)
    assert(HH:=not_par_inter_exists X Y O C H27).
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    ex_and HH C''.
(* Goal: @Par Tn B C B' C' *)
    assert(B' <> C'').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      subst C''.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Col O B C).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B'); Col.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
      contradiction.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(Par B' C'' B C ).
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B C B' C' *)
      induction(eq_dec_points B' X).
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B C B' C' *)
        subst X.
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B C B' C' *)
        apply (par_col_par_2 _ Y).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn B' C'' B C *)
(* Goal: @Par Tn B C B' C' *)
      apply (par_col_par_2 _ X).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(col_transitivity_1 _ Y); Col.
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply par_left_comm.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(Par A C A' C'').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      eapply(l13_15_1 B A C B' A' C'' O); Col.
(* Goal: @Par_strict Tn B A B' A' *)
(* Goal: @Par_strict Tn B C B' C'' *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply par_strict_comm.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par_strict Tn B C B' C'' *)
(* Goal: @Par Tn B C B' C' *)
      induction H31.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: False *)
(* Goal: False *)
      apply H8.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(col_transitivity_1 _ B'); Col.
(* Goal: @Par Tn B C B' C' *)
    assert(C' <> C'').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      subst C''.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      apply H22.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: False *)
    assert(Par A' C' A' C'').
(* Goal: @Par Tn A' C' A' C'' *)
(* Goal: False *)
      apply (par_trans _ _ A C).
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(C' = C'').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l6_21 A' C' O C); Col.
(* Goal: @Col Tn A' C' C'' *)
(* Goal: @Par Tn B C B' C' *)
        induction H34.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn A' C' C'' *)
(* Goal: @Par Tn B C B' C' *)
        apply H34.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
    contradiction.
Qed.

Lemma l13_15_2 : forall A B C A' B' C' O , ~Col A B C
                                         -> Par O B A C
                                         -> Par_strict A B A' B'
                                         -> Par_strict A C A' C'
                                         -> Col O A A' -> Col O B B' -> Col O C C'
                                         -> Par B C B' C'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn B C B' C' *)
    induction(par_dec B C B' C').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn B C B' C' *)
    assert(HH:=not_par_one_not_par B C B' C' O A H6).
(* Goal: @Par Tn C D C' D' *)
    induction HH.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply (l13_15_2_aux A B C A' B' C' O); auto.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    apply par_symmetry.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(~ Col A' B' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B' C' B C *)
      assert(Par A' B' A' C').
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
        right.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        repeat split; Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          subst B'.
(* Goal: False *)
          apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        subst C'.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par A B A C).
(* Goal: @Par Tn A B A C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B' C' B C *)
        apply(par_trans _ _ A' B').
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          left.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Par Tn A' B' A C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B' C' B C *)
        apply(par_trans _ _ A' C').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn B' C' B C *)
      induction H10.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: False *)
        apply H10.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn B' C' B C *)
    assert(B' <> O).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
      assert(Par O A B A).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ A'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn O A B' *)
(* Goal: @Col Tn O C C' *)
          subst A.
(* Goal: False *)
          apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
          exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par Tn D Y A X *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply par_comm.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn C' C'' B C *)
(* Goal: False *)
      induction H9.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
        apply H9.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
      apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
      exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn B' C' B C *)
    assert(Par O B O B').
(* Goal: @Par Tn O B O B' *)
(* Goal: @Par Tn B' C' B C *)
      right.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      repeat split; Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
      subst B.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
      apply par_distincts in H0.
(* Goal: False *)
(* Goal: @Col Tn C' B' A' *)
(* Goal: @Par Tn C' B' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      tauto.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    apply (l13_15_2_aux A' B' C' A B C O); Col; Par.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Par Tn O A B' C' *)
(* Goal: @Par Tn O B' A' C' *)
      apply (par_col_par_2 _ A').
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn O A B' *)
(* Goal: @Col Tn O C C' *)
        subst A.
(* Goal: False *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Par Tn O A' B' C' *)
(* Goal: @Par Tn O B' A' C' *)
        induction H0.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
          apply H0.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
          exists O.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn O B' A' C' *)
    apply (par_trans _ _ O B).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn A' C' A' C'' *)
(* Goal: False *)
    apply (par_trans _ _ A C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    Par.
Qed.


Lemma l13_15 : forall A B C A' B' C' O , ~Col A B C
                                         -> Par_strict A B A' B'
                                         -> Par_strict A C A' C'
                                         -> Col O A A' -> Col O B B' -> Col O C C'
                                         -> Par B C B' C'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn B C B' C' *)
    induction(par_dec O B A C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (l13_15_2 A B C A' B' C' O); Col; Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    apply (l13_15_1 A B C A' B' C' O); Col; Par.
Qed.


Lemma l13_15_par : forall A B C A' B' C', ~Col A B C
                                         -> Par_strict A B A' B'
                                         -> Par_strict A C A' C'
                                         -> Par A A' B B'
                                         -> Par A A' C C'
                                         -> Par B C B' C'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn B C B' C' *)
    assert(Plg B' A' A B).
(* Goal: @Plg Tn B' A' A B *)
(* Goal: @Par Tn B C B' C' *)
      apply(pars_par_plg B' A' A B).
(* Goal: @Par_strict Tn B' A' A B *)
(* Goal: @Par Tn B' B A' A *)
(* Goal: @Par Tn B C B' C' *)
        apply par_strict_left_comm.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn B C B' C' *)
    apply plg_to_parallelogram in H4.
(* Goal: @Par Tn B C B' C' *)
    apply plg_permut in H4.
    assert(Plg  A' C' C A).
      apply(pars_par_plg  A' C' C A).
(* Goal: @Par_strict Tn A' C' C A *)
(* Goal: @Par Tn A' A C' C *)
(* Goal: @Par Tn B C B' C' *)
        apply par_strict_right_comm.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn B C B' C' *)
    apply plg_to_parallelogram in H5.
(* Goal: @Par Tn B C B' C' *)
    apply plg_permut in H5.
(* Goal: @Par Tn B C B' C' *)
    assert(Parallelogram B B' C' C \/ B = B' /\ A' = A /\ C = C' /\ B = C).
(* Goal: or (@Parallelogram Tn B B' C' C) (and (@eq (@Tpoint Tn) B B') (and (@eq (@Tpoint Tn) A' A) (and (@eq (@Tpoint Tn) C C') (@eq (@Tpoint Tn) B C)))) *)
(* Goal: @Par Tn B C B' C' *)
      apply(plg_pseudo_trans B B' A' A C C').
(* Goal: @Parallelogram Tn B B' A' A *)
(* Goal: @Parallelogram Tn A' A C C' *)
(* Goal: @Par Tn B C B' C' *)
        apply plg_sym.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Parallelogram Tn A' A C C' *)
(* Goal: @Par Tn B C B' C' *)
      apply plg_comm2.
(* Goal: @Parallelogram Tn C A A' C' *)
(* Goal: @Par Tn B C B' C' *)
      apply plg_permut.
(* Goal: @Parallelogram Tn C A A' C' *)
(* Goal: @Par Tn B C B' C' *)
      apply plg_permut.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn B C B' C' *)
    assert(Par B B' C C').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_trans _ _ A A'); Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    induction H7.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      induction H6.
(* Goal: @Par Tn C D C' D' *)
        assert(B <> B').
(* Goal: not (@eq (@Tpoint Tn) B B') *)
(* Goal: @Par Tn B C B' C' *)
(* Goal: @Par Tn B C B' C' *)
(* Goal: @Par Tn B C B' C' *)
          apply par_distincts in H2.
(* Goal: False *)
(* Goal: @Col Tn C' B' A' *)
(* Goal: @Par Tn C' B' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          tauto.
(* Goal: @Par Tn B C B' C' *)
(* Goal: @Par Tn B C B' C' *)
        apply plg_par in H6.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        subst C'.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply H7.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst C.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H7.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    induction H6.
(* Goal: @Par Tn B C B' C' *)
(* Goal: @Par Tn B C B' C' *)
      apply plg_par in H6.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      assert(Par A B A C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A' B'); left; Par.
(* Goal: False *)
(* Goal: @Par Tn B C B' C' *)
      induction H11.
(* Goal: False *)
(* Goal: False *)
        apply H11.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
    subst B'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
    subst A'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    subst C'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
    subst C.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply False_ind.
(* Goal: False *)
    apply H1.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    split; Col.
Qed.

Lemma l13_18_2 : forall A B C A' B' C' O, ~Col A B C
                               -> Par_strict A B A' B'
                               -> Par_strict A C A' C'
                               -> (Par_strict B C B' C' /\ Col O A A' /\ Col O B B' -> Col O C C').
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Col Tn O C C' *)
    assert(~ Col O A B).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
      apply H0.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A B) (@Col Tn X A' B')) *)
(* Goal: @Col Tn O C C' *)
      exists O.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(col_transitivity_1 _ A); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn O A B' *)
(* Goal: @Col Tn O C C' *)
        subst A.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
        apply H0.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(col_transitivity_1 _ B); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
      subst B.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
      apply H0.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn O C C' *)
    assert(exists X : Tpoint, Col X B' C' /\ Col X O C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply not_par_inter_exists, par_not_par with B C; Par.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      induction H6.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply H6.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists B'.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split;Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ O); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn O C C' *)
      subst O.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
      apply H0.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn O C C' *)
    ex_and H6 C''.
(* Goal: @Col Tn O C C' *)
    induction(col_dec O C C').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply False_ind.
(* Goal: False *)
    assert(Par C' C'' B C ).
(* Goal: @Par Tn C' A' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply (par_col_par_2 _ B').
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        subst C''.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply par_left_comm.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: False *)
    assert(Par_strict C' C'' B C).
(* Goal: @Par_strict Tn C' C'' B C *)
(* Goal: False *)
      induction H9.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: False *)
(* Goal: False *)
      apply H8.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn C C' O *)
(* Goal: False *)
      apply (col_transitivity_1 _ C'').
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        subst C''.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: False *)
    assert(~Col O B C).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: False *)
      apply H10.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ O); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
      subst B.
(* Goal: False *)
(* Goal: False *)
      apply H5.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(Par B' C'' B C).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ C') ; Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        subst B'.
(* Goal: False *)
(* Goal: False *)
        apply H11.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(col_transitivity_1 _ C''); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        subst C''.
(* Goal: False *)
(* Goal: @Par Tn B' C' B C *)
(* Goal: False *)
        apply H0.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: False *)
    assert(Par_strict B' C'' B C).
(* Goal: @Par_strict Tn B' C'' B C *)
(* Goal: False *)
      induction H12.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: False *)
(* Goal: False *)
      apply H11.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(Par A C A' C'').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(l13_15 B A C B' A' C'' O); Par; Col.
(* Goal: False *)
    assert(Par A' C' A' C'').
(* Goal: @Par Tn A' C' A' C'' *)
(* Goal: False *)
      apply (par_trans _ _ A C).
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
    induction H15.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H15.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(~ Col A' B' C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply(col_par_par_col A' B' C' A B C H19); left; Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert( C' = C'').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(l6_21 A' C' B' C'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H19.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    subst C''.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    Col.
Qed.

Lemma l13_18_3 : forall A B C A' B' C', ~Col A B C
                               -> Par_strict A B A' B'
                               -> Par_strict A C A' C'
                               -> (Par_strict B C B' C' /\ Par A A' B B')
                               -> (Par C C' A A' /\ Par C C' B B').
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
    assert(Par C C' A A').
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      apply par_distincts in H3.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(HH:= parallel_existence1 B B' C H5).
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      ex_and HH P.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      induction(par_dec C P B C).
(* Goal: @Par Tn C C' A A' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        induction H7.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          apply H7.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
          exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Par Tn C C' A A' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        assert(Col P B' C).
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          induction H6.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply False_ind.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
            apply H6.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        assert(Col C B B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ P); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(~ Par C P B' C').
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply H7.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply(par_trans _ _ B' C'); Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(HH:=not_par_inter_exists C P B' C' H8).
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      ex_and HH C''.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      induction(eq_dec_points B' C'').
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        subst C''.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        induction H6.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          apply H6.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        spliter; apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(col_transitivity_1 _ P); Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(Par C C'' B B' ).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ P); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          subst C''.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
          exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(Par B' C'' B C).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ C'); Col.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(~ Col A' B' C').
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        assert(Par C' A' B C).
(* Goal: @Par Tn C' A' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          apply (par_col_par_2 _ B').
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            subst C'.
(* Goal: False *)
(* Goal: @Col Tn C' B' A' *)
(* Goal: @Par Tn C' B' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
            unfold Par_strict in H1.
(* Goal: False *)
(* Goal: @Col Tn C' B' A' *)
(* Goal: @Par Tn C' B' B C *)
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
            tauto.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply par_left_comm.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Col Tn A B C *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        assert(Par B C A C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          apply (par_trans _ _ A' C'); Par.
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H16.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
          exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter; Col.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(Par A C A' C'').
(* Goal: @Par Tn A C A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
        apply(l13_15_par B A C B' A' C'').
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
          apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Par_strict Tn B A B' A' *)
(* Goal: @Par_strict Tn B C B' C'' *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          apply par_strict_comm.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn B C B' C'' *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          induction H13.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
            Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn B B' A A' *)
(* Goal: @Par Tn B B' C C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
          apply H2.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      assert(C' = C'').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 C' A' B' C'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          subst C'.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          apply H14.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          eapply (col_par_par_col A C A); Col.
(* Goal: @Par Tn A C C' A' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
            apply par_right_comm.
(* Goal: @Par Tn A C A' C' *)
(* Goal: @Par Tn C A A' C'' *)
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
            left.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
            Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par Tn C C' A A' *)
(* Goal: and (@Par Tn C C' A A') (@Par Tn C C' B B') *)
      subst C''.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_trans _ _ B B'); Par.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
    split.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    apply (par_trans _ _ A A'); Par.
Qed.

Lemma l13_18 :  forall A B C A' B' C' O, ~Col A B C /\ Par_strict A B A' B' /\  Par_strict A C A' C'
                                        ->(Par_strict B C B' C' /\ Col O A A' /\ Col O B B' -> Col O C C')
                                          /\ ((Par_strict B C B' C' /\ Par A A' B B') -> (Par C C' A A' /\ Par C C' B B'))
                                          /\ (Par A A' B B' /\ Par A A' C C' -> Par B C B' C').
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
    split.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
      intros.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply (l13_18_2 A B C A' B' C' O); auto.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
    split.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
      intros.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply l13_18_3; auto.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
    apply (l13_15_par A B C A' B' C'); auto.
Qed.

Lemma l13_19_aux : forall A B C D A' B' C' D' O, ~Col O A B -> A <> A' -> A <> C
                                          -> O <> A -> O <> A' -> O <> C -> O <> C'
                                          -> O <> B -> O <> B' -> O <> D -> O <> D'
                                          -> Col O A C -> Col O A A' -> Col O A C'
                                          -> Col O B D -> Col O B B' -> Col O B D'
                                          -> ~Par A B C D
                                          -> Par A B A' B' -> Par A D A' D' -> Par B C B' C'
                                          -> Par C D C' D'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn C D C' D' *)
    assert(HH:= not_par_inter_exists A B C D H16).
(* Goal: @Par Tn C D C' D' *)
    ex_and HH E.
(* Goal: @Par Tn C D C' D' *)
    assert(~Par A' B' O E).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      assert(Par A B O E).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A' B'); Par.
(* Goal: @Par_strict Tn X A E Z *)
(* Goal: @Par Tn C D C' D' *)
      induction H23.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H23.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A E) (@Col Tn X A' E)) *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        exists E.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ E); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(HH:= not_par_inter_exists A' B' O E H22).
(* Goal: @Par Tn C D C' D' *)
    ex_and HH E'.
(* Goal: @Par Tn C D C' D' *)
    assert(C <> E).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst E.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ C); Col.
(* Goal: @Par Tn C D C' D' *)
    induction(col_dec A D E).
(* Goal: @Par Tn D C D' C' *)
(* Goal: @Par Tn D C D' C' *)
      assert(B = D).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l6_21 O B A E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        subst E.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: False *)
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col A O D).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ C); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ D); Col.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(Par A' B' A' D').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A B); Par.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H27.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H27.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(B' = D').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        eapply(l6_21 A' B' O B'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ A'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B); Col.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    assert(B <> B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H17.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H17.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A'); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(Par D E D' E').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      eapply (l13_15 A _ _ A' _ _ O); Col.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H18.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col A' A D).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ D'); Col.
(* Goal: False *)
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col A O D).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ A'); Col.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ D); Col.
(* Goal: @Par Tn C D C' D' *)
        assert(Par A E A' E').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply(par_col_par_2 _ B); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
            subst E.
(* Goal: False *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply H26.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Par Tn C D C' D' *)
          apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply(par_col_par_2 _ B'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
            subst E'.
(* Goal: False *)
(* Goal: @Par Tn A' B' A B *)
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
            assert(Col O A E).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              apply(col_transitivity_1 _ A'); Col.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
            apply H.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
            apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply(col_transitivity_1 _ E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
            subst E.
(* Goal: False *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply H26.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H28.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col A' A E).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply(col_transitivity_1 _ E'); Col.
(* Goal: False *)
(* Goal: @Col Tn O D D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col A O E).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply(col_transitivity_1 _ A'); Col.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(col_transitivity_1 _ E); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(col_transitivity_1 _ B); Col.
(* Goal: @Par Tn D Y A X *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
    apply par_comm.
(* Goal: @Par Tn D C D' C' *)
    induction(col_dec B C E).
(* Goal: @Par Tn D C D' C' *)
(* Goal: @Par Tn D C D' C' *)
      assert(B = D).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l6_21 O B C E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ C); Col.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(Par A' B' A' D').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A B); Par.
(* Goal: @Par_strict Tn Y B E Z *)
(* Goal: @Par Tn C D C' D' *)
      induction H30.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn B C D' C' *)
(* Goal: @Par Tn D C D' C' *)
        apply H30.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(B' = D').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        eapply(l6_21 A' B' O B'); Col.
(* Goal: not (@Col Tn A' B' O) *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Par Tn B C D' C' *)
(* Goal: @Par Tn D C D' C' *)
          Col5.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    assert(Par C E C' E').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      eapply (l13_15 B _ _ B' _ _ O); Col.
(* Goal: @Par_strict Tn A D A' D' *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        induction H19.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn O A B *)
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Par Tn D C D' C' *)
        assert(Col B O C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ B'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ C'); Col.
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Par B E B' E').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (par_col_par_2 _ A); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
            subst E.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
            apply H29.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Par Tn C D C' D' *)
          apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (par_col_par_2 _ A'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
            subst E'.
(* Goal: False *)
(* Goal: @Par Tn B' A' B A *)
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Par Tn D C D' C' *)
            assert(Col O B E).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
              apply (col_transitivity_1 _ B'); Col.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
            apply H.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
            apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply (col_transitivity_1 _ E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
            intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
            subst E.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
            apply H29.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn Y B E Z *)
(* Goal: @Par Tn C D C' D' *)
        induction H30.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          auto.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn O A B *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Par Tn D C D' C' *)
        assert(Col O B' E').
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ B); Col.
(* Goal: @Col Tn O A B *)
(* Goal: @Col Tn O C C' *)
(* Goal: @Par Tn D C D' C' *)
        assert(Col B' A' O).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ E'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ A'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply(par_col_par_2 _ E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(col_transitivity_1 _ C); Col.
(* Goal: @Par Tn C D C' D' *)
    apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply(par_col_par_2 _ E'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(col_transitivity_1 _ C'); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (col_par_par_col D E C); Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    Par.
Qed.


Lemma l13_19 : forall A B C D A' B' C' D' O, ~Col O A B
                                          -> O <> A -> O <> A' -> O <> C -> O <> C'
                                          -> O <> B -> O <> B' -> O <> D -> O <> D'
                                          -> Col O A C -> Col O A A' -> Col O A C'
                                          -> Col O B D -> Col O B B' -> Col O B D'
                                          -> Par A B A' B' -> Par A D A' D' -> Par B C B' C'
                                          -> Par C D C' D'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn C D C' D' *)
    induction (eq_dec_points A A').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst A'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(B = B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l6_21 A B O B); Col.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H14.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          apply H14.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(D = D').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l6_21 A D O B); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
          apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ D); Col.
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
          induction H15.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
            apply H15.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(C = C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply(l6_21 B C O A); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
          apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ C); Col.
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          induction H16.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
            apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
            split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Par Tn C D C D *)
(* Goal: @Par Tn C D C' D' *)
      apply par_reflexivity.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ C); Col.
(* Goal: @Par Tn C D C' D' *)
    induction(eq_dec_points A C).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst C.
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(A' = C').
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Par A' B' B' C').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          apply (par_trans _ _ A B); Par.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H18.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply H18.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        eapply (l6_21 B' C' O A); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
        apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ B'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1 _ C'); Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn C D C' D' *)
    induction(eq_dec_points A' C').
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Par Tn C D A' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(A = C).
(* Goal: @eq (@Tpoint Tn) A C *)
(* Goal: @Par Tn C D A' D' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Par A B B C).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          apply (par_trans _ _ A' B'); Par.
(* Goal: @Par_strict Tn A D A' D' *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        induction H19.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
          apply H19.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        eapply (l6_21 B C O A'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
          apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ C); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1 _ A); Col.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
      contradiction.
(* Goal: @Par Tn C D C' D' *)
    induction(par_dec C D C' D').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn C D C' D' *)
    assert(HH:=not_par_one_not_par C D C' D' A' B' H20).
(* Goal: @Par Tn C D C' D' *)
    induction HH.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(~ Par C D A B).
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
        apply H21.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A B); Par.
      (*assert(HH:= not_par_inter C D C' D' A B H19).
(* Goal: @Par Tn C D C' D' *)
      ex_and HH E.
      induction H21.*)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l13_19_aux A B C D A' B' C' D' O); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H21.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_trans _ _ A B); Par.
(* Goal: @Par Tn C D C' D' *)
    apply par_symmetry.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    apply (l13_19_aux A' B' C' D' A B C D O); Par.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn O A' C' *)
(* Goal: @Col Tn O A' A *)
(* Goal: @Col Tn O A' C *)
(* Goal: @Col Tn O B' D' *)
(* Goal: @Col Tn O B' B *)
(* Goal: @Col Tn O B' D *)
      apply H.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ A); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1 _ B); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (col_transitivity_1 _ B); Col.
Qed.


Lemma l13_19_par_aux : forall A B C D A' B' C' D' X Y,
                                             X <> A -> X <> A' -> X <> C -> X <> C'
                                          -> Y <> B -> Y <> B' -> Y <> D -> Y <> D'
                                          -> Col X A C -> Col X A A' -> Col X A C'
                                          -> Col Y B D -> Col Y B B' -> Col Y B D'
                                          -> A <> C -> B <> D -> A <> A'
                                          -> Par_strict X A Y B
                                          -> ~Par A B C D
                                          -> Par A B A' B' -> Par A D A' D' -> Par B C B' C'
                                          -> Par C D C' D'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn C D C' D' *)
    assert(HH := not_par_inter_exists A B C D H17).
(* Goal: @Par Tn C D C' D' *)
    ex_and HH E.
(* Goal: @Par Tn C D C' D' *)
    assert(HH:= parallel_existence1 X A E H).
(* Goal: @Par Tn C D C' D' *)
    ex_and HH Z.
(* Goal: @Par Tn C D C' D' *)
    assert(~Par A B E Z).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
      assert(Par Y B E Z).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ X A); Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      induction H24.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H24.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A E) (@Col Tn X A' E)) *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        exists E.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par_strict Tn X A E Z *)
(* Goal: @Par Tn C D C' D' *)
      induction H23.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H23.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      induction H25.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H25.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A E) (@Col Tn X A' E)) *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
      exists E.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split;ColR.
(* Goal: @Par Tn C D C' D' *)
    assert(~Par A' B' E Z).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H24.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_trans _ _ A' B'); Par.
(* Goal: @Par Tn C D C' D' *)
    assert(HH:= not_par_inter_exists A' B' E Z H25).
(* Goal: @Par Tn C D C' D' *)
    ex_and HH E'.
(* Goal: @Par Tn C D C' D' *)
    assert(~Col A D E).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      induction (eq_dec_points A E).
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        subst E.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 X A D A); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
          intro.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
          exists D.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: not (@eq (@Tpoint Tn) D A) *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply par_distincts in H19.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        auto.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Col A B D) by ColR.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      ColR.
(* Goal: @Par Tn C D C' D' *)
    assert(Par_strict X A E Z).
(* Goal: @Par_strict Tn X A E Z *)
(* Goal: @Par Tn C D C' D' *)
      induction H23.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Col E X A) by ColR.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Col A C E) by ColR.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H13.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l6_21 A E D C); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        subst D.
(* Goal: False *)
(* Goal: @Col Tn D C A *)
(* Goal: @Par Tn C D C' D' *)
        contradiction.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        subst E.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        clean_trivial_hyps.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ C); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(Par Y B E Z).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (par_trans _ _ X A); Par.
(* Goal: @Par Tn C D C' D' *)
    assert(Par_strict Y B E Z).
(* Goal: @Par_strict Tn Y B E Z *)
(* Goal: @Par Tn C D C' D' *)
      induction H30.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Col E Y B) by ColR.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Col B D E) by ColR.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H14.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l6_21 B E C D); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        subst E.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        clean_trivial_hyps.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ D); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
      exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert_diffs; ColR.
(* Goal: @Par Tn C D C' D' *)
    assert(~Col A' D' E').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      assert(Col A' B' D').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ E'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        subst E'.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H29.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn A' Y B *)
(* Goal: @Par Tn C D C' D' *)
      assert(Col Y B' D').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ B); Col.
(* Goal: @Col Tn A' Y B *)
(* Goal: @Par Tn C D C' D' *)
      assert(Col B' A' Y).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ D'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        subst D'.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        assert(Par A D A B).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          apply(par_trans _ _ A' B'); Par.
(* Goal: False *)
(* Goal: @Col Tn A' Y B *)
(* Goal: @Par Tn C D C' D' *)
        induction H35.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Col Tn A' Y B *)
(* Goal: @Par Tn C D C' D' *)
          apply H35.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ D); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1  _ B'); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(~ Col X A B).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    assert(~ Col Y A B).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    assert(B <> B').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H15.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply(l6_21 X A B A); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
        subst B.
(* Goal: False *)
(* Goal: @Col Tn B A A' *)
(* Goal: @Par Tn C D C' D' *)
        apply H33.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H18.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply H18.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par Tn C D C' D' *)
    assert(C <> C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Par_strict Tn B C B' C' *)
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      induction H20.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H20.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
        exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
      exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1  _ B'); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(D <> D').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @Par_strict Tn A D A' D' *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
      induction H19.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H19.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        exists D.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
      exists D.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1  _ A'); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(A' <> C').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      assert(Par B C A B).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A' B'); Par.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      induction H38.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H38.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; ColR.
(* Goal: @Par Tn C D C' D' *)
    assert(B' <> D').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Par A D A B).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ A' B'); Par.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      induction H39.
(* Goal: False *)
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
        apply H39.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1  _ D); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(A <> E).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst E.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H28.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn C D C' D' *)
    assert(A' <> E').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
      subst E'.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H32.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      Col.
(* Goal: @Par Tn C D C' D' *)
    assert(B <> E).
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst E.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H31.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    assert(B' <> E').
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
      subst E'.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      apply H31.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
    (*-------------------*)
(* Goal: @Par Tn C D C' D' *)
    assert(Par A E A' E').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ B); Col.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ B'); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    assert(Par_strict A E A' E').
(* Goal: @Par_strict Tn A E A' E' *)
(* Goal: @Par Tn C D C' D' *)
      induction H44.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
      apply H45.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l6_21 X A' B' E'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ A'); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
      apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (col_transitivity_1  _ A); Col.
(* Goal: @Par Tn C D C' D' *)
    assert(Par D E D' E').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply(l13_15_par A D E A' D' E'); Par.
(* Goal: @Par_strict Tn A D A' D' *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        induction H19.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        exists D.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn D X A *)
(* Goal: @Par Tn A A' D D' *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_1.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ A'); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ D'); Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ X); Col.
(* Goal: @Par Tn C D C' D' *)
        apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ Y); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1  _ B); Col.
(* Goal: @Par Tn D Y A X *)
(* Goal: @Par Tn A A' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply par_comm.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ B); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ E Z); Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ X); Par; Col.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ Z); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        subst E'.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        apply H45.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A E) (@Col Tn X A' E)) *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        exists E.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    assert(Par C E C' E').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      eapply(l13_15_par B C E B' C' E'); Par.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        assert(Col B A C) by ColR.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; ColR.
(* Goal: @Par_strict Tn B C B' C' *)
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        induction H20.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn B' X A *)
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col X C C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1  _ A); Col.
(* Goal: @Col Tn B' X A *)
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Col C B' X).
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1  _ C'); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (col_transitivity_1  _ C); Col.
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        assert(Par B E B' E').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (par_col_par_2 _ A); Col.
(* Goal: @Par Tn C D C' D' *)
          apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (par_col_par_2 _ A'); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn B E B' E' *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        induction H47.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
          Par.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        assert(Col B' A' B) by ColR.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A' X A) (@Col Tn A' Y B) *)
(* Goal: @Par Tn B B' C C' *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        split; sfinish.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D C' D' *)
        apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ X); Col.
(* Goal: @Col Tn C X C' *)
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
          apply col_permutation_2.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply (col_transitivity_1  _ A); Col.
(* Goal: @Par Tn C X B Y *)
(* Goal: @Par Tn B B' E E' *)
(* Goal: @Par Tn C D C' D' *)
        apply par_left_comm.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (par_col_par_2 _ A); Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply (par_trans _ _ E Z); Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ Y); Col.
(* Goal: @Par Tn C D C' D' *)
      apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (par_col_par_2 _ Z); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        subst E'.
(* Goal: False *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        apply H45.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A E) (@Col Tn X A' E)) *)
(* Goal: @Par Tn E Z B Y *)
(* Goal: @Par Tn C D C' D' *)
        exists E.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (par_col_par_2 _ E); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
      exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    apply par_symmetry.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    apply (par_col_par_2 _ E'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Col Tn C' E' D' *)
(* Goal: @Par Tn C' E' C E *)
      exists C'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      apply (col_par_par_col C E D); Col ; Par.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    Par.
Qed.


Lemma l13_19_par : forall A B C D A' B' C' D' X Y,
 X <> A -> X <> A' -> X <> C -> X <> C'-> Y <> B -> Y <> B' -> Y <> D -> Y <> D' ->
 Col X A C -> Col X A A' -> Col X A C' -> Col Y B D -> Col Y B B' -> Col Y B D' ->
 Par_strict X A Y B -> Par A B A' B' -> Par A D A' D' -> Par B C B' C' ->
 Par C D C' D'.
Proof.
(* Goal: forall (A B C D A' B' C' D' X Y : @Tpoint Tn) (_ : not (@eq (@Tpoint Tn) X A)) (_ : not (@eq (@Tpoint Tn) X A')) (_ : not (@eq (@Tpoint Tn) X C)) (_ : not (@eq (@Tpoint Tn) X C')) (_ : not (@eq (@Tpoint Tn) Y B)) (_ : not (@eq (@Tpoint Tn) Y B')) (_ : not (@eq (@Tpoint Tn) Y D)) (_ : not (@eq (@Tpoint Tn) Y D')) (_ : @Col Tn X A C) (_ : @Col Tn X A A') (_ : @Col Tn X A C') (_ : @Col Tn Y B D) (_ : @Col Tn Y B B') (_ : @Col Tn Y B D') (_ : @Par_strict Tn X A Y B) (_ : @Par Tn A B A' B') (_ : @Par Tn A D A' D') (_ : @Par Tn B C B' C'), @Par Tn C D C' D' *)
    intros.
(* Goal: @Par Tn C D C' D' *)
    induction(eq_dec_points A C).
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst C.
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(Par A' B' B' C').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply(par_trans _ _ A B); Par.
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H17.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H17.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(A' = C').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 X A B' A'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn A D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists B'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    induction(eq_dec_points B D).
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(Par A' B' A' D').
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply(par_trans _ _ A B); Par.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H18.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H18.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(B' = D').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 Y B A' B'); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C B C' D' *)
(* Goal: @Par Tn C D C' D' *)
        exists A'.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    induction(eq_dec_points A A').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst A'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      induction H14.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        apply H14.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(B = B').
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 Y B A B); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      subst B'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(C = C').
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H16.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) C C' *)
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
          apply H16.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 X A B C); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
      assert(D = D').
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
        induction H15.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @eq (@Tpoint Tn) D D' *)
(* Goal: @Par Tn C D C D' *)
(* Goal: @Par Tn C D C' D' *)
          apply H15.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply (l6_21 Y B A D); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn C D C D *)
(* Goal: @Par Tn C D C' D' *)
      apply par_reflexivity.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      subst D.
(* Goal: False *)
(* Goal: @Par Tn C D C' D' *)
      clean_trivial_hyps.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: @Par Tn C D C' D' *)
      exists C.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split; Col.
(* Goal: @Par Tn C D C' D' *)
    induction(par_dec C D C' D').
(* Goal: @Par Tn C D C' D' *)
(* Goal: @Par Tn C D C' D' *)
      auto.
(* Goal: @Par Tn C D C' D' *)
    assert(HH:=not_par_one_not_par C D C' D' A B H20).
(* Goal: @Par Tn C D C' D' *)
    induction HH.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      eapply (l13_19_par_aux A B C D A' B' C' D' X Y); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
      apply H21.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
      Par.
(* Goal: @Par Tn C D C' D' *)
    apply par_distincts in H14.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
    spliter.
(* Goal: @Par Tn C D C' D' *)
    apply par_symmetry.
(* Goal: @Par Tn C' D' C D *)
    eapply (l13_19_par_aux A' B' C' D' A B C D X Y); sfinish.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst C'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H17.
(* Goal: @eq (@Tpoint Tn) A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l6_21 X A B A); finish.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        assert(Par B C B A).
(* Goal: @Par Tn B C B A *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply(par_trans _ _ A' B');finish.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        induction H24.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply H24.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X B C) (@Col Tn X B A)) *)
(* Goal: @Col Tn B A C *)
(* Goal: not (@eq (@Tpoint Tn) B' D') *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists B.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H18.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      subst D'.
(* Goal: @eq (@Tpoint Tn) B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      assert(Par A D A B).
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
        apply(par_trans _ _ A' B'); Par.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply (l6_21 Y B A B); Col.
(* Goal: not (@Par Tn A' B' C' D') *)
        intro.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        apply H13.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        split; Col.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        induction H24.
(* Goal: @Col Tn A B D *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          apply H24.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X A D) (@Col Tn X A B)) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          exists A.
(* Goal: and (@Col Tn A A D) (@Col Tn A A B) *)
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
          split; Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        spliter.
(* Goal: @Col Tn A B D *)
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
        Col.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      unfold Par_strict in H13.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      spliter.
(* Goal: @Par_strict Tn X A' Y B' *)
(* Goal: not (@Par Tn A' B' C' D') *)
      unfold Par_strict.
(* Goal: and (not (@eq (@Tpoint Tn) X A')) (and (not (@eq (@Tpoint Tn) Y B')) (and (@Coplanar Tn X A' Y B') (not (@ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A') (@Col Tn X0 Y B')))))) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      repeat split; auto; try apply all_coplanar.
(* Goal: not (@Par Tn A' B' C' D') *)
      intro.
(* Goal: False *)
(* Goal: not (@Par Tn A' B' C' D') *)
      apply H26.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      ex_and H27 P.
(* Goal: @ex (@Tpoint Tn) (fun X0 : @Tpoint Tn => and (@Col Tn X0 X A) (@Col Tn X0 Y B)) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      exists P.
(* Goal: and (@Col Tn P X A) (@Col Tn P Y B) *)
(* Goal: not (@Par Tn A' B' C' D') *)
      split.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
        ColR.
(* Goal: @Col Tn P Y B *)
(* Goal: not (@Par Tn A' B' C' D') *)
      ColR.
(* Goal: not (@Par Tn A' B' C' D') *)
    intro.
(* Goal: False *)
    apply H21.
(* Goal: @Par Tn C D A B *)
(* Goal: @Par Tn C D C' D' *)
    apply (par_trans _ _ A' B'); Par.
Qed.

End Desargues_Hessenberg.
