(* Gabriel Braun April 2013 *)

Require Export GeoCoq.Tarski_dev.Ch13_4_cos.
Require Export GeoCoq.Tarski_dev.Annexes.project.

Section Pappus_Pascal.

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

Lemma l13_10_aux1 : forall O A B P Q la lb lp lq,
 Col O A B -> Col O P Q -> Perp O P P A -> Perp O Q Q B ->
 Q_Cong la -> Q_Cong lb -> Q_Cong lp -> Q_Cong lq -> la O A -> lb O B -> lp O P -> lq O Q ->
 exists a, Q_CongA_Acute a /\ Lcos lp la a /\ Lcos lq lb a.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
    assert(Acute A O P).
(* Goal: @Acute Tn A O P *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply (perp_acute _ _ P);finish.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
    assert(P <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
      subst P.
(* Goal: False *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply perp_not_eq_1 in H1.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      tauto.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(A <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A.
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply perp_not_col in H1.
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply H1.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
    assert(Q <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      subst Q.
(* Goal: False *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply perp_not_eq_1 in H2.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      tauto.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
    assert(B <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      subst B.
(* Goal: False *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply perp_not_col in H2.
(* Goal: False *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply H2.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
    assert(HH:= anga_exists A O P H13 H12 H11).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lla la a) (@Lcos Tn llb lb a))) *)
    ex_and HH a.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
    assert(a B O Q).
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(~ Par O P A P).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        unfold Par in H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        induction H18.
(* Goal: False *)
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
          unfold Par_strict in H18.
(* Goal: @Perp2 Tn A B C D P *)
          spliter.
(* Goal: False *)
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
          apply H21.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P X Y) (and (@Perp Tn X Y A B) (@Perp Tn X Y C D)))) *)
          exists P.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          split; Col.
(* Goal: @Perp2 Tn A B C D P *)
        spliter.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        apply perp_comm in H1.
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        apply perp_not_col in H1.
(* Goal: False *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        apply H1.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(A <> P).
(* Goal: not (@eq (@Tpoint Tn) A P) *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        apply perp_not_eq_2 in H1.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(Proj O O O P A P).
(* Goal: @Proj Tn B Q O P A P *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        unfold Proj.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        repeat split; Col.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(Proj A P O P A P).
(* Goal: @Proj Tn B Q O P A P *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        unfold Proj.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        repeat split; Col.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        left.
(* Goal: @Par Tn A P A P *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        apply par_reflexivity.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(Proj B Q O P A P).
(* Goal: @Proj Tn B Q O P A P *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        unfold Proj.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        repeat split; Col.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        left.
(* Goal: @Par Tn B Q A P *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        apply (l12_9 _ _ _ _ O P); Cop.
(* Goal: @Perp Tn P Q C D *)
          apply perp_sym.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          eapply (perp_col _ Q); Col.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Perp.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      induction H.
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        assert(Bet O P Q).

(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(per23_preserves_bet O A B P Q); auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp_in_per.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_comm in H1.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_perp_in in H1.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply perp_in_per.
(* Goal: @Perp_at Tn Q O Q Q B *)
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_comm in H2.
(* Goal: @Perp_at Tn Q O Q Q B *)
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_perp_in in H2.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.

(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
   (*       apply(project_preserves_bet O P A P O A B O P Q); auto. *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        assert(CongA A O P B O Q).
(* Goal: @CongA Tn A O P B O Q *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
          eapply (out_conga B _ Q B _ Q).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply conga_refl; auto.
(* Goal: @Out Tn O Q P *)
(* Goal: @Out Tn O B B *)
(* Goal: @Out Tn O Q Q *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
            unfold Out.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            repeat split; auto.
(* Goal: @Out Tn O Q P *)
(* Goal: @Out Tn O B B *)
(* Goal: @Out Tn O Q Q *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
            unfold Out.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            repeat split; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply (anga_conga_anga _ A O P); auto.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      induction H.
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        assert(Bet P Q O).

(* Goal: @Bet Tn B' O A' *)
(* Goal: not (@eq (@Tpoint Tn) A' O) *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply between_symmetry.
(* Goal: @Bet Tn O Q P *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply(per23_preserves_bet O B A Q P); Between.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.

(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply perp_in_per.
(* Goal: @Perp_at Tn Q O Q Q B *)
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_comm in H2.
(* Goal: @Perp_at Tn Q O Q Q B *)
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_perp_in in H2.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_comm in H1.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_perp_in in H1.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.

(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
 (*         apply(project_preserves_bet O P A P A B O P Q O); auto.*)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
        assert(CongA A O P B O Q).
(* Goal: @CongA Tn A O P B O Q *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
          eapply (out_conga B _ Q B _ Q).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply conga_refl; auto.
(* Goal: @Out Tn O Q P *)
(* Goal: @Out Tn O B B *)
(* Goal: @Out Tn O Q Q *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
            unfold Out.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            repeat split; auto.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            left.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
            Between.
(* Goal: @Out Tn O Q P *)
(* Goal: @Out Tn O B B *)
(* Goal: @Out Tn O Q Q *)
(* Goal: a B O Q *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
            unfold Out.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            repeat split; auto.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            left.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
            Between.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply (anga_conga_anga _ A O P); auto.
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(Bet Q O P).

(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply(per13_preserves_bet B O A Q P); auto.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply perp_in_per.
(* Goal: @Perp_at Tn Q O Q Q B *)
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_comm in H2.
(* Goal: @Perp_at Tn Q O Q Q B *)
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_perp_in in H2.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_comm in H1.
(* Goal: @Per Tn O P A *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
apply perp_perp_in in H1.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.

(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
 (*       apply(project_preserves_bet O P A P B O A Q O P); auto. *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      assert(CongA A O P B O Q).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        eapply (l11_14 ); Between.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (anga_conga_anga _ A O P); auto.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lla la a) (@Lcos Tn llb lb a))) *)
    exists a.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    repeat split; auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      exists O.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P X Y) (and (@Perp Tn X Y A B) (@Perp Tn X Y C D)))) *)
      exists P.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      exists A.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      repeat split; auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp_in_per.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Perp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply anga_sym; auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    exists O.
(* Goal: @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P P Y) (and (@Perp Tn P Y A B) (@Perp Tn P Y C D))) *)
    exists Q.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => and (@Len Tn O B lb) (@Len Tn O B llb)) *)
(* Goal: @Lcos Tn llb lb a *)
    exists B.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    repeat split; auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply perp_in_per.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Perp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply anga_sym; auto.
Qed.

Lemma l13_10_aux2 : forall O A B la lla lb llb,
 Col O A B  -> Q_Cong la -> Q_Cong lla -> Q_Cong lb -> Q_Cong llb -> la O A -> lla O A -> lb O B -> llb O B ->
 A <> O -> B <> O -> exists a, Q_CongA_Acute a /\ Lcos lla la a /\ Lcos llb lb a.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lla la a) (@Lcos Tn llb lb a))) *)
    assert(HH:=anga_exists A O A H8 H8 (acute_trivial A O H8)).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lla la a) (@Lcos Tn llb lb a))) *)
    ex_and HH a.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lla la a) (@Lcos Tn llb lb a))) *)
    exists a.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    split; auto.
(* Goal: a P O P *)
(* Goal: a A O P *)
    assert(Q_CongA_Null_Acute a).
(* Goal: @Q_CongA_Null_Acute Tn a *)
(* Goal: and (@Lcos Tn lla la a) (@Lcos Tn llb lb a) *)
      assert(Out O A A /\ Q_CongA_Null_Acute a).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(anga_col_null a A O A); auto.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      tauto.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    split.
(* Goal: @Lcos Tn lla la a *)
(* Goal: @Lcos Tn llb lb a *)
      assert(EqL la lla).
(* Goal: @EqL Tn lb llb *)
(* Goal: @Lcos Tn llb lb a *)
        apply ex_eql.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists O.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists A.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        repeat split; auto.
(* Goal: @Lcos Tn lla la a *)
(* Goal: @Lcos Tn llb lb a *)
      rewrite <- H13.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply null_lcos; auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Lcos Tn llb lb a *)
      unfold Q_Cong_Null in H14.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: False *)
(* Goal: @Lcos Tn llb lb a *)
      ex_and H15 X.
(* Goal: False *)
(* Goal: @Lcos Tn llb lb a *)
      assert(HH:= lg_cong la O A X X H0 H4 H16).
(* Goal: False *)
      treat_equalities.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      tauto.
(* Goal: @Lcos Tn llb lb a *)
    assert(HH:=anga_exists B O B H9 H9 (acute_trivial B O H9)).
(* Goal: @Lcos Tn llb lb a *)
    ex_and HH b.
(* Goal: @Lcos Tn llb lb a *)
    assert(EqA a b).
(* Goal: @EqA Tn a b *)
(* Goal: @Lcos Tn llb lb a *)
      assert(HH:=null_anga A O B O a b).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply HH; split; auto.
(* Goal: @Lcos Tn llb lb a *)
    assert(EqL lb llb).
(* Goal: @EqL Tn lb llb *)
(* Goal: @Lcos Tn llb lb a *)
      apply ex_eql.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      exists O.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => and (@Len Tn O B lb) (@Len Tn O B llb)) *)
(* Goal: @Lcos Tn llb lb a *)
      exists B.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      repeat split; auto.
(* Goal: @Lcos Tn llb lb a *)
    rewrite <- H16.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply null_lcos; auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    intro.
(* Goal: False *)
    unfold Q_Cong_Null in H17.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: False *)
    ex_and H18 X.
(* Goal: False *)
    assert(HH:= lg_cong lb O B X X H2 H6 H19).
(* Goal: False *)
    treat_equalities.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    tauto.
Qed.


Lemma l13_6_bis : forall lp l1 l2 a, Lcos lp l1 a -> Lcos lp l2 a -> EqL l1 l2.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @EqL Tn l1 l2 *)
    induction(is_null_anga_dec a).
(* Goal: @Col Tn A B P *)
      apply lcos_lg_anga in H.
(* Goal: @Col Tn A B P *)
      apply lcos_lg_anga in H0.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(HH:= null_lcos_eql lp l1 a H H1).
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(HP:= null_lcos_eql lp l2 a H0 H1).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      transitivity lp; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      symmetry; auto.
(* Goal: @Col Tn A B P *)
      apply lcos_lg_anga in H.
(* Goal: @Col Tn A B P *)
      apply lcos_lg_anga in H0.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: a A O P *)
      assert (HH:= H).
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(HH0:= H0).
(* Goal: a A O P *)
      unfold Lcos in HH.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      unfold Lcos in HH0.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      ex_and H11 A.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      ex_and H16 B.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      ex_and H11 C.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      ex_and H15 A'.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      ex_and H19 B'.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      ex_and H15 C'.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(HH:=not_null_not_col a B A C H4 H1 H18).
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(HP:=not_null_not_col a B' A' C' H4 H1 H21).
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(B <> C).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
        subst C.
(* Goal: False *)
(* Goal: @CongA Tn A B C A' B' C' *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
        apply HH.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(B' <> C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        subst C'.
(* Goal: False *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
        apply HP.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
      assert(HQ:= anga_distincts a B A C H4  H18).
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(HR:= anga_distincts a B' A' C' H4 H21).
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(Cong A B A' B').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply (lg_cong lp); auto.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(CongA B A C B' A' C').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply (anga_conga a); auto.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(CongA C B A C' B' A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply l11_16; auto.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      assert(Cong A C A' C' /\ Cong B C B' C' /\ CongA A C B A' C' B').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(l11_50_1 A B C A' B' C'); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @CongA Tn A B C A' B' C' *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
          apply HH.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @CongA Tn B' O N N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply conga_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      apply (all_eql A' C').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        split; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      split; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      eapply (lg_cong_lg _ A C); auto.
(* Goal: @Q_CongA_Acute Tn a *)
    unfold Lcos in *;intuition.
Qed.


Lemma lcos3_lcos2 : forall l1 l2 a b c d n, Eq_Lcos3 l1 a b n l2 c d n -> Eq_Lcos2 l1 a b l2 c d.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Eq_Lcos2 Tn l1 a b l2 c d *)
    unfold Eq_Lcos3 in H.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    ex_and H lp.
(* Goal: @Eq_Lcos2 Tn lb n' l' la' n l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    unfold Eq_Lcos2.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp l1 a b) (@Lcos2 Tn lp l2 c d)) *)
    apply lcos3_lcos_2_1 in H.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp l1 a b) (@Lcos2 Tn lp l2 c d)) *)
    apply lcos3_lcos_2_1 in H0.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp l1 a b) (@Lcos2 Tn lp l2 c d)) *)
    ex_and H ll1.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp l1 a b) (@Lcos2 Tn lp l2 c d)) *)
    ex_and H0 ll2.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp l1 a b) (@Lcos2 Tn lp l2 c d)) *)
    assert (EqL ll1 ll2).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      eapply(l13_6_bis lp _ _ n); auto.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp l1 a b) (@Lcos2 Tn lp l2 c d)) *)
    exists ll1.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    split; auto.
(* Goal: @Lcos2 Tn ll1 l2 c d *)
    apply lcos2_lg_anga in H.
(* Goal: @Lcos2 Tn ll1 l2 c d *)
    apply lcos2_lg_anga in H0.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply(lcos2_eql_lcos2 l2 l2 ll2 ll1 c d); auto.
(* Goal: @EqL Tn lb lb *)
(* Goal: @EqL Tn bn'l' bl'n' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      reflexivity.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    symmetry; auto.
Qed.

Lemma lcos2_lcos : forall l1 l2 a b c, Eq_Lcos2 l1 a c l2 b c -> Eq_Lcos l1 a l2 b.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    unfold Eq_Lcos2 in H.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    ex_and H lp.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    unfold Lcos2 in H.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    unfold Lcos2 in H0.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    ex_and H lx.
(* Goal: @Eq_Lcos Tn l1 a l2 b *)
    ex_and H0 ly.
(* Goal: @Eq_Lcos Tn la n' lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    unfold Eq_Lcos.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn lp l1 a) (@Lcos Tn lp l2 b)) *)
    assert(EqL lx ly).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      eapply(l13_6_bis lp _ _ c); auto.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn lp l1 a) (@Lcos Tn lp l2 b)) *)
    exists lx.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    split; auto.
(* Goal: @Col Tn A B P *)
    apply lcos_lg_anga in H.
(* Goal: @Col Tn A B P *)
    apply lcos_lg_anga in H0.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    rewrite H3;auto.
Qed.

Lemma lcos_per_anga : forall O A P la lp a, Lcos lp la a -> la O A -> lp O P -> Per A P O -> a A O P.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: a A O P *)
    assert(HH:= H).
(* Goal: a A O P *)
    unfold Lcos in HH.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: a A O P *)
    ex_and H6 O'.
(* Goal: a A O P *)
    ex_and H7 P'.
(* Goal: a A O P *)
    ex_and H6 A'.
(* Goal: a A O P *)
    assert(Cong O A O' A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (lg_cong la); auto.
(* Goal: a A O P *)
    assert(Cong O P O' P').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (lg_cong lp); auto.
(* Goal: False *)
    assert(HH:= lcos_lg_not_null lp la a H).
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: a A O P *)
    induction(eq_dec_points A P).
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A.
(* Goal: a P O P *)
(* Goal: a A O P *)
      assert(Cong O' A' O' P').
(* Goal: @Cong Tn O' A' O' P' *)
(* Goal: a P O P *)
(* Goal: a A O P *)
        apply (cong_transitivity _ _ O P); Cong.
(* Goal: a P O P *)
(* Goal: a A O P *)
      assert(A' = P').
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: a P O P *)
(* Goal: a A O P *)
        induction(col_dec A' P' O').
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: a P O P *)
(* Goal: a A O P *)
          assert(A' = P' \/ O' = P').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply l8_9; auto.
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: a P O P *)
(* Goal: a A O P *)
          induction H16.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: False *)
(* Goal: a P O P *)
(* Goal: a A O P *)
          subst P'.
(* Goal: @Cong Tn P O A O *)
(* Goal: a A O P *)
          eapply (cong_identity _  O' O'); Cong.
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: a P O P *)
(* Goal: a A O P *)
        assert(Lt P' A' A' O' /\ Lt P' O' A' O').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert_diffs; apply(l11_46 A' P' O'); auto.
(* Goal: @Perp2 Tn A B C D P *)
        spliter.
(* Goal: @eq (@Tpoint Tn) A' P' *)
(* Goal: a P O P *)
(* Goal: a A O P *)
        unfold Lt in H17.
(* Goal: @Perp2 Tn A B C D P *)
        spliter.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply False_ind.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
        apply H18.
(* Goal: @Cong Tn P O A O *)
(* Goal: a A O P *)
        Cong.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A'.
(* Goal: a P O P *)
(* Goal: a A O P *)
      assert(Q_CongA_Null_Acute a).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(out_null_anga a P' O' P'); auto.
(* Goal: @Out Tn O A' A' *)
(* Goal: @Out Tn O A' B' *)
        apply out_trivial.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: a P O P *)
(* Goal: a A O P *)
        subst P'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) A' C') *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
        apply H12.
(* Goal: @Q_Cong_Null Tn ln' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        unfold Q_Cong_Null.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        split.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => lp A A) *)
(* Goal: a P O P *)
(* Goal: a A O P *)
        exists O'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: a P O P *)
(* Goal: a A O P *)
      apply(is_null_all a P O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
        subst P.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) A' C') *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
        apply H12.
(* Goal: @Q_Cong_Null Tn ln' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        unfold Q_Cong_Null.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        split.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists O.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
(* Goal: a A O P *)
    assert(O <> P).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
      subst P.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) A' C') *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
      apply H12.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      split.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      exists O.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
(* Goal: a A O P *)
    induction(col_dec A P O).
(* Goal: a A O P *)
      assert (HH:=anga_distincts a P' O' A' H5 H9).
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: a A O P *)
      assert(A' <> P').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        subst A'.
(* Goal: False *)
(* Goal: a A O P *)
(* Goal: a A O P *)
        assert(A = P \/ O = P).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply l8_9; auto.
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
        induction H19.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        contradiction.
(* Goal: a A O P *)
(* Goal: a A O P *)
      assert(~ Col A P O).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(per_not_col A P O); auto.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      contradiction.
(* Goal: a A O P *)
    assert (HH:=anga_distincts a P' O' A' H5 H9).
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: a A O P *)
    assert(A' <> P').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A'.
(* Goal: False *)
(* Goal: a A O P *)
      assert(Cong O P O A).
(* Goal: @Cong Tn P O A O *)
(* Goal: a A O P *)
        apply (cong_transitivity _ _ O' P'); Cong.
(* Goal: and (@Cong Tn P A P' A') (and (@CongA Tn P A O P' A' O') (@CongA Tn P O A P' O' A')) *)
(* Goal: a A O P *)
      assert(Lt P A A O /\ Lt P O A O).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert_diffs; apply(l11_46 A P O); auto.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: False *)
(* Goal: a A O P *)
      unfold Lt in H21.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: False *)
(* Goal: a A O P *)
      apply H22.
(* Goal: @Cong Tn P O A O *)
(* Goal: a A O P *)
      Cong.
(* Goal: a A O P *)
    assert(CongA A P O A' P' O').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply l11_16; auto.
(* Goal: a A O P *)
    assert(Cong P A P' A' /\ CongA P A O P' A' O' /\ CongA P O A P' O' A').
(* Goal: and (@Cong Tn P A P' A') (and (@CongA Tn P A O P' A' O') (@CongA Tn P O A P' O' A')) *)
(* Goal: a A O P *)
      assert(Lt P A A O /\ Lt P O A O).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert_diffs; apply(l11_46 A P O); auto.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: and (@Cong Tn P A P' A') (and (@CongA Tn P A O P' A' O') (@CongA Tn P O A P' O' A')) *)
(* Goal: a A O P *)
      unfold Lt in H22.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
(* Goal: @Cong Tn P O A O *)
(* Goal: a A O P *)
      apply(l11_52 A P O A' P' O' ); Cong.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: a A O P *)
    apply conga_comm in H23.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply (anga_conga_anga a A' O' P'); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (anga_sym a); auto.
(* Goal: @CongA Tn A' O' P' A O P *)
    apply conga_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    auto.
Qed.

Lemma lcos_lcos_cop__col : forall la lb lp a b O A B P,
 Lcos lp la a -> Lcos lp lb b -> la O A -> lb O B -> lp O P -> a A O P -> b B O P -> Coplanar O A B P ->
 Col A B P.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Col Tn A B P *)
    apply lcos_lg_anga in H.
(* Goal: @Col Tn A B P *)
    apply lcos_lg_anga in H0.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: @Col Tn A B P *)
    assert(Per O P A).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (lcos_per O P A lp la a); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply anga_sym; auto.
(* Goal: @Col Tn A B P *)
    assert(Per O P B).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (lcos_per O P B lp lb b); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply anga_sym; auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
    apply cop_per2__col with O; Perp.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    intro.
(* Goal: False *)
    subst P.
(* Goal: False *)
    assert(HH:=lcos_lg_not_null lp la a H).
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: False *)
    apply H15.
(* Goal: @Q_Cong_Null Tn ln' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    unfold Q_Cong_Null.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    split; auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    exists O.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    auto.
Qed.

(*****strange ****)

Lemma per13_preserves_bet_inv : forall A B C A' C', Bet A' B C' -> B <> A' -> B <> C' ->  Col A B C  -> Per B A' A -> Per B C' C -> Bet A B C.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
intros.
(* Goal: @Bet Tn A B C *)
assert(Col A' B C').
(* Goal: @Col Tn A' B C' *)
(* Goal: @Bet Tn A B C *)
apply bet_col in H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.

(* Goal: @Bet Tn A B C *)
induction(eq_dec_points A A').
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst A'.
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(Col B C' C).
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(HH:=l8_9 B C' C H4 H6 ).
(* Goal: @Col Tn A' B' C *)
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
induction HH.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
contradiction.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst C'.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
assumption.

(* Goal: @Bet Tn A B C *)
assert(C <> C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst C'.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
assert(Col B A' A).
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
assert(HH:=l8_9 B A' A H3 H7).
induction HH;
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
contradiction.

(* Goal: @Bet Tn A B C *)
assert(Perp B A' A' A).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply per_perp_in in H3; auto.
(* Goal: @Perp Tn B A' A' A *)
(* Goal: @Bet Tn A B C *)
apply perp_in_comm in H3.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
apply perp_in_perp_bis in H3.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
induction H3.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.
(* Goal: @Perp Tn B A' A' A *)
(* Goal: @Bet Tn A B C *)
apply perp_distinct in H3.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
tauto.

(* Goal: @Bet Tn A B C *)
assert(Perp B C' C' C).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply per_perp_in in H4; auto.
(* Goal: @Perp Tn B C' C' C *)
(* Goal: @Bet Tn A B C *)
apply perp_in_comm in H4.
(* Goal: @Perp Tn A B X Y *)
apply perp_in_perp_bis in H4.
(* Goal: @Perp Tn A B X Y *)
induction H4.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Perp.
(* Goal: @Perp Tn B C' C' C *)
(* Goal: @Bet Tn A B C *)
apply perp_distinct in H4.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
tauto.

(* Goal: @Bet Tn A B C *)
assert(Par A A' C C').
(* Goal: @Par Tn A A' C C' *)
(* Goal: @Bet Tn A B C *)
apply(l12_9 A A' C C' B A'); Perp; Cop.
(* Goal: @Perp Tn P Q C D *)
apply perp_sym.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
apply(perp_col _ C'); Perp.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.

(* Goal: @Out Tn O A' B' *)
induction H10.
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(HH:=par_strict_symmetry A A' C C' H10).
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply l12_6 in H10.
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply l12_6 in HH.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(~Col A' A B).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply per_not_col in H3; auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply H3.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(~Col C' C B).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply per_not_col in H4; auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply H4.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(OS A' A B C').
(* Goal: @OS Tn C' C B A' *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply out_one_side.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
left; auto.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
repeat split.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst A'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply H11.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst C'.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply one_side_symmetry in H10.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
unfold OS in H10.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
ex_and H10 X.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
unfold TS in H10.
(* Goal: @Perp2 Tn A B C D P *)
spliter.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply H10.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
left.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
assumption.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(OS C' C B A').
(* Goal: @OS Tn C' C B A' *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply out_one_side.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
left; auto.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
repeat split.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst C'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) A' C') *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply H12.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst C'.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply one_side_symmetry in H10.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
unfold OS in H10.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
ex_and H10 X.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
unfold TS in H10.
(* Goal: @Perp2 Tn A B C D P *)
spliter.
(* Goal: False *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply H10.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
Col.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
left.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
Between.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(OS A' A B C).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply(one_side_transitivity _ _ _ C'); auto.
(* Goal: @OS Tn C C' B A' *)
(* Goal: @OS Tn C C' A' A *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply invert_one_side.
(* Goal: @OS Tn C C' A' A *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply one_side_symmetry.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
assumption.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(OS C C' B A).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply(one_side_transitivity _ _ _ A'); auto.
(* Goal: @OS Tn C C' B A' *)
(* Goal: @OS Tn C C' A' A *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply invert_one_side.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
assumption.
(* Goal: @OS Tn C C' A' A *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply one_side_symmetry.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
assumption.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
apply invert_one_side in H15.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(HP:= col_one_side_out A A' B C H2 H15).

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
assert(Out C B A).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
apply(col_one_side_out C C' B A); Col.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
unfold Out in *.
(* Goal: @Perp2 Tn A B C D P *)
spliter.

(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
induction H19.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
Between.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
induction H22.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
Between.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply False_ind.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
apply H18.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
apply (between_equality _ _ B); Between.

(****************************)

(* Goal: @Perp2 Tn A B C D P *)
spliter.
(* Goal: @Bet Tn A B C *)
assert(Perp A' C' A A').
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
apply (perp_col _ B); Perp.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst C'.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
apply between_identity in H.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
subst A'.
(* Goal: False *)
(* Goal: @Bet Tn A B C *)
apply perp_distinct in H9.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
tauto.
(* Goal: @Bet Tn A B C *)
apply perp_not_col in H14.

(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn A' B' C *)
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
apply H14.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
Qed.

Lemma l13_10_aux3 : forall A B C A' B' C' O,
  ~ Col O A A' ->
  B <> O -> C <> O -> Col O A B -> Col O B C ->
  B' <> O -> C' <> O ->
  Col O A' B' -> Col O B' C' -> Perp2 B C' C B' O -> Perp2 C A' A C' O ->
  Bet A O B -> Bet A' O B'.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(A <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Out Tn O A' B' *)
    assert(A' <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(Col O A C).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply (col_transitivity_1 _ B); Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(Col O A' C').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: @Bet Tn A' O B' *)
    assert(Bet C A O \/ Bet A C O \/ Bet O C B \/ Bet O B C).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply(fourth_point A O B C); auto.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      ColR.
(* Goal: @Out Tn O A' B' *)
    induction H15.
(* Goal: @Out Tn O A' B' *)
      assert(Bet O C' A').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet23 O A C C' A'); Between.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
               ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
               apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.

(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet B' O C').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet13 O B C B' C'); eBetween.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
          ColR.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
          eBetween.

    (***************)
(* Goal: @Out Tn O A' B' *)
    induction H15.
(* Goal: @Bet Tn B' O C' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet C O B).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        eBetween.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O A' C').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet23 O C A A' C'); Between.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.

(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet B' O C').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet13 O B C B' C'); Between.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
(* Goal: @Out Tn O A' B' *)
    induction H15.
(* Goal: @Bet Tn A' O B' *)
      assert(Bet A O C).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        eBetween.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O B' C').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet23 O C B B' C'); Between.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: @Bet Tn A' O B' *)
      assert(Bet C' O A').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        apply(perp2_preserves_bet13 O C A C' A'); Col.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
Between.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
(* Goal: @Bet Tn A' O B' *)
    assert(Bet A O C).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
      eBetween.
(* Goal: @Out Tn O A' B' *)
    assert(Bet O C' B').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply(perp2_preserves_bet23 O B C C' B'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Bet Tn A' O B' *)
    assert(Bet C' O A').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply(perp2_preserves_bet13 O C A C' A'); Col.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
Between.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
    eBetween.
Qed.

Lemma l13_10_aux4 : forall A B C A' B' C' O,
  ~ Col O A A' -> B <> O -> C <> O -> Col O A B -> Col O B C -> B' <> O -> C' <> O ->
  Col O A' B' -> Col O B' C' -> Perp2 B C' C B' O -> Perp2 C A' A C' O -> Bet O A B ->
  Out O A' B'.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(A <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Out Tn O A' B' *)
    assert(A' <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(Col O A C).
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
    ColR.
(* Goal: @Out Tn O A' B' *)
    induction(eq_dec_points A B).
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      subst B.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
    assert (HH : Par C A' C B').
(* Goal: @Par Tn C A' C B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(~ Col A C' O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
(* Goal: @Par Tn C A' C B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
    assert(HH:= perp2_pseudo_trans C A' A C' C B' O H9 H8 H14).
(* Goal: @Par Tn C A' C B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      ex_and HH X.
(* Goal: @Par Tn C A' C B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      ex_and H15 Y.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply (l12_9 _ _ _ _ X Y); Perp.
(* Goal: @Coplanar Tn X Y A' C *)
(* Goal: @Coplanar Tn X Y A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
        Cop.
(* Goal: @Coplanar Tn X Y A' C *)
(* Goal: @Coplanar Tn X Y A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
        Cop.
(* Goal: @Coplanar Tn X Y A' C *)
(* Goal: @Coplanar Tn X Y A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
        Cop.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists O.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        left.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        split; Col.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(A' = B').
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
        assert(Col A' B' C).
(* Goal: @Col Tn A' B' C *)
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
          induction HH.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply False_ind.
(* Goal: False *)
(* Goal: @Col Tn A' B' C *)
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
            apply H14.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X C A') (@Col Tn X C B')) *)
(* Goal: @Col Tn A' B' C *)
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
            exists C.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            split; Col.
(* Goal: @Perp2 Tn A B C D P *)
          spliter.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        apply (l6_21 O C' C B'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        subst B'.
(* Goal: False *)
(* Goal: @Col Tn O C' A' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
apply par_distinct in HH.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
tauto.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst B'.
(* Goal: @Out Tn O A' A' *)
(* Goal: @Out Tn O A' B' *)
      apply out_trivial.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.


(* Goal: @Out Tn O A' B' *)
    assert(Bet C O A \/ Bet O C A \/ Bet A C B \/ Bet A B C).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply(fourth_point O A B C); auto.

(* Goal: @Out Tn O A' B' *)
    induction H15.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet B' O C').
(* Goal: @Bet Tn B' O C' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
        assert(Bet C O B).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        eBetween.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet13 O B C B' C'); Between.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Col Tn O A A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
  (*        assert(Col O A B').

(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply (col_transitivity_1 _ C); Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (col_transitivity_1 _ B'); Col.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.*)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet A' O C').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet13 O A C A' C');Between.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply perp2_sym.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
assumption.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
repeat split; auto.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
apply(l5_2 C' O A' B'); Between.

(* Goal: @Out Tn O A' B' *)
    induction H15.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O C B).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O B' C').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        apply(perp2_preserves_bet23 O C B B' C'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O A' C').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
        apply(perp2_preserves_bet23 O C A A' C'); Between.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
 ColR.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      repeat split; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
apply(l5_3 O A' B' C'); auto.

(* Goal: @Out Tn O A' B' *)
    induction H15.
(* Goal: @Out Tn O A' B' *)
      assert(Bet O A C).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
(* Goal: @Out Tn O A' B' *)
      assert(Bet O C' A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(perp2_preserves_bet23 O A C C' A'); auto.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O C B).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      assert(Bet O B' C').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply(perp2_preserves_bet23 O C B B' C'); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
repeat split; auto.
(* Goal: or (and (@Col Tn B N A) (@Col Tn O B' A)) (or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A))) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
right.
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.

(*      assert(Bet O B' A').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
*)
(* Goal: @Out Tn O A' B' *)
    assert(Bet O A C).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.
(* Goal: @Out Tn O A' B' *)
    assert( Bet O B C).
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
eBetween.

(* Goal: @Out Tn O A' B' *)
    assert(Bet O C' B').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply(perp2_preserves_bet23  O B C C' B'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Out Tn O A' B' *)
    assert(Bet O C' A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply(perp2_preserves_bet23  O A C C' A'); auto.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    repeat split; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply (l5_1 _ C'); auto.
Qed.

Lemma l13_10_aux5 : forall A B C A' B' C' O,
 ~ Col O A A' -> B <> O -> C <> O -> Col O A B -> Col O B C ->
 B' <> O -> C' <> O -> Col O A' B' -> Col O B' C'->
 Perp2 B C' C B' O -> Perp2 C A' A C' O -> Out O A B ->
 Out O A' B'.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Out Tn O A' B' *)
    assert(A' <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Out Tn O A' B' *)
    induction H10.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: @Out Tn O A' B' *)
    induction H13.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      eapply (l13_10_aux4 A B C _ _ C'); auto.
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply l6_6.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
    apply(l13_10_aux4 B A C B' A' C'); try assumption.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      ColR.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      ColR.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      ColR.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply perp2_sym.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      assumption.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    auto.
Qed.

Lemma cop_per2__perp : forall A B X Y,
 A <> B -> X <> Y ->
 (B <> X \/ B <> Y) ->
 Coplanar A B X Y ->
 Per A B X -> Per A B Y ->
 Perp A B X Y.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Perp Tn A B X Y *)
    induction H1.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
      assert(HH:=H3).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply per_perp_in in H3; auto.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
      apply perp_in_perp_bis in H3.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
      induction H3.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
        apply perp_not_eq_1 in H3.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        tauto.
(* Goal: @Perp Tn P Q C D *)
      apply perp_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply (perp_col _ B); auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Perp.
(* Goal: @Col Tn Y B X *)
      apply col_permutation_5.
(* Goal: @Coplanar Tn X Y A' C *)
(* Goal: @Coplanar Tn X Y A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      apply cop_per2__col with A; Perp; Cop.
(* Goal: @Perp Tn A B X Y *)
    assert(HH:=H4).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply per_perp_in in H4; auto.
(* Goal: @Perp Tn A B X Y *)
    apply perp_in_perp_bis in H4.
(* Goal: @Perp Tn A B X Y *)
    induction H4.
(* Goal: @Perp Tn A B X Y *)
(* Goal: @Perp Tn A B X Y *)
      apply perp_not_eq_1 in H4.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      tauto.
(* Goal: @Perp Tn P Q C D *)
    apply perp_sym.
(* Goal: @Perp Tn N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply perp_left_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply (perp_col _ B); auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Perp.
(* Goal: @Col Tn Y B X *)
    apply col_permutation_5.
(* Goal: @Coplanar Tn X Y A' C *)
(* Goal: @Coplanar Tn X Y A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
    eapply cop_per2__col with A; Perp; Cop.
Qed.

Lemma l13_10 : forall A B C A' B' C' O,
  ~ Col O A A' -> B <> O -> C <> O ->
  Col O A B -> Col O B C ->
  B' <> O -> C' <> O ->
  Col O A' B' -> Col O B' C' ->
  Perp2 B C' C B' O -> Perp2 C A' A C' O ->
  Perp2 A B' B A' O.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(HH8:= H8).
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(HH9:= H9).
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(Col O A C).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply (col_transitivity_1 _ B); Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(Col O A' C').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(A <> O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    assert(~ Col A B' O).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      apply (col_transitivity_1 _ B'); Col.
(* Goal: @Perp2 Tn A B' B A' O *)
    apply perp2_perp_in in HH8.
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      ex_and HH8 L.
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      ex_and H14 L'.
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      apply perp2_perp_in in HH9.
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH9 M.
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H19 M'.
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=l8_18_existence A B' O H13).
(* Goal: @Perp2 Tn A B' B A' O *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH N.
(* Goal: @Perp2 Tn A B C D P *)
        unfold Perp2.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists O.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => @ex (@Tpoint Tn) (fun C : @Tpoint Tn => and (@Per Tn C B O) (and (ln O B) (and (lb' O C) (n B O C))))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists N.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        repeat split.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O A).
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH la.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O B).
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH lb.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O C).
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH lc.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O A').
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH la'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O B').
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH lb'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O C').
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH lc'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O L).
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH ll.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O L').
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH ll'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O M).
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH lm.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O M').
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH lm'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(HH:=lg_exists O N).
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and HH ln.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(O <> L).
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_perp_bis in H17.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction H17.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_not_eq_1 in H17.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_not_eq_1 in H17.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(O <> L').
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_perp_bis in H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_not_eq_1 in H18.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_not_eq_1 in H18.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(~ Col O B B').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(Col O A B').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            eapply (col_transitivity_1 _ B); Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          eapply (col_transitivity_1 _ B'); Col.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(~ Col O C C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H.
(* Goal: @Col Tn O A A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(Col O A C').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            eapply (col_transitivity_1 _ C); Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          eapply (col_transitivity_1 _ C'); Col.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists a, Q_CongA_Acute a /\ Lcos ll lb a /\ Lcos ll' lc a).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lb a) (@Lcos Tn ll' lc a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction(eq_dec_points B L).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst L.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lb a) (@Lcos Tn ll' lc a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lb a) (@Lcos Tn ll' lc a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(C = L').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (l6_21 O B B' L'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst L'.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              contradiction.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst L'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply (l13_10_aux2 O B C); Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (l13_10_aux1 O B C L L'); Col.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_perp_bis in H17.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction H17.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply perp_not_eq_1 in H17.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              tauto.
(* Goal: @Perp Tn P Q C D *)
            apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            eapply (perp_col _ C');auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Perp.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_perp_bis in H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_not_eq_1 in H18.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q C D *)
          apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          eapply (perp_col _ B'); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst L'.
(* Goal: False *)
(* Goal: @Perp Tn C B' L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(Col O B L).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (col_transitivity_1 _ C); Col.
(* Goal: False *)
(* Goal: @Perp Tn C B' L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply H52.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply(l6_21 O C C' B B L); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst C'.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            unfold Perp_at in H17.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H52 l'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists a, Q_CongA_Acute a /\ Lcos ll lc' a /\ Lcos ll' lb' a).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction(eq_dec_points C' L).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst L.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(B' = L').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (l6_21 O C' C L'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst L'.
(* Goal: False *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn ll lc' a) (@Lcos Tn ll' lb' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply H51.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst L'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            eapply (l13_10_aux2 O C' B'); Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (l13_10_aux1 O C' B' L L'); Col.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_perp_bis in H17.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction H17.
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L L C' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply perp_not_eq_1 in H17.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              tauto.
(* Goal: @Perp Tn P Q C D *)
            apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_comm.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            eapply (perp_col _ B); Col.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Perp.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_perp_bis in H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction H18.
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O L' L' B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_not_eq_1 in H18.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q C D *)
          apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_comm.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          eapply (perp_col _ C);Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst L'.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(Col O C' L).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (col_transitivity_1 _ B'); Col.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply H55.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply(l6_21 O B' B C' C' L); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst C'.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            unfold Perp_at in H17.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H55 l.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists a, Q_CongA_Acute a /\ Lcos lm lc a /\ Lcos lm' la a).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm lc a) (@Lcos Tn lm' la a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction (eq_dec_points C M).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst M.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm lc a) (@Lcos Tn lm' la a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm lc a) (@Lcos Tn lm' la a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(A = M').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (l6_21 O C C' M'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst M'.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              contradiction.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst M'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply (l13_10_aux2 O C A); Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (l13_10_aux1 O C A M M'); Col.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_perp_bis in H22.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction H22.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply perp_not_eq_1 in H22.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              tauto.
(* Goal: @Perp Tn P Q C D *)
            apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            eapply (perp_col _ A');auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Perp.
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_perp_bis in H23.
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction H23.
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_not_eq_1 in H23.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q C D *)
          apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          eapply (perp_col _ C'); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst M'.
(* Goal: False *)
(* Goal: @Perp Tn A C' M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(Col O C M).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (col_transitivity_1 _ A); Col.
(* Goal: False *)
(* Goal: @Perp Tn A C' M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply H58.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply(l6_21 O A A' C C M); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst A'.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            unfold Perp_at in H22.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H58 m'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists a, Q_CongA_Acute a /\ Lcos lm la' a /\ Lcos lm' lc' a).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction(eq_dec_points A' M).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst M.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lm la' a) (@Lcos Tn lm' lc' a))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(C' = M').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (l6_21 O A' A M'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst M'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst M'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            eapply (l13_10_aux2 O A' C'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst A'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (l13_10_aux1 O A' C' M M'); Col.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_perp_bis in H22.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction H22.
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M M A' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply perp_not_eq_1 in H22.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              tauto.
(* Goal: @Perp Tn P Q C D *)
            apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_comm.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            eapply (perp_col _ C);Col.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Perp.
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_perp_bis in H23.
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction H23.
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O M' M' C' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_not_eq_1 in H23.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q C D *)
          apply perp_sym.
(* Goal: @Perp Tn M' C' O M' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_comm.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          eapply (perp_col _ A);Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst M'.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(Col O A' M).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              eapply (col_transitivity_1 _ C'); Col.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply H61.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply(l6_21 O C' C A' A' M); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst A'.
(* Goal: False *)
(* Goal: @Perp Tn C' A M' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            unfold Perp_at in H22.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            tauto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H61 m.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists a, Q_CongA_Acute a /\ Lcos ln la a).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(exists a, Q_CongA_Acute a /\ a A O N).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (a A O N)) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(anga_exists A O N).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst A.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply perp_not_eq_2 in H25.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Per Tn A N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction(eq_dec_points A N).
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst N.
(* Goal: @Acute Tn B' O B' *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply acute_trivial.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: @Acute Tn A O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst A.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            eapply (perp_acute _ _ N).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: @Perp_at Tn N O N B' N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_left_comm.
(* Goal: @Perp_at Tn N N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_perp_in.
(* Goal: @Perp Tn P Q C D *)
            apply perp_sym.
(* Goal: @Perp Tn A N O N *)
(* Goal: n' N O A *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (perp_col _ B').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Perp.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Col.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H64 n'.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln la a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists n'.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @Lcos Tn ln lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Lcos.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          repeat split; auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists O.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => @ex (@Tpoint Tn) (fun C : @Tpoint Tn => and (@Per Tn C B O) (and (ln O B) (and (lb' O C) (n B O C))))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists N.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists A.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          repeat split; auto.
(* Goal: @Per Tn A N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction(eq_dec_points A N).
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst N.
(* Goal: @Per Tn B' B' O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply l8_2.
(* Goal: @Per Tn O B' B' *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply l8_5.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_per.
(* Goal: @Perp_at Tn N B' N N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_comm.
(* Goal: @Perp_at Tn N N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_perp_in.
(* Goal: @Perp Tn N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_left_comm.
(* Goal: @Perp Tn A N O N *)
(* Goal: n' N O A *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (perp_col _ B').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Perp.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Col.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply anga_sym; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H64 n'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists a, Q_CongA_Acute a /\ Lcos ln lb' a).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(exists a, Q_CongA_Acute a /\ a B' O N).
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (a B' O N)) *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(anga_exists B' O N).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst B'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply H50.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply perp_not_eq_2 in H25.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction(eq_dec_points B' N).
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst N.
(* Goal: @Acute Tn B' O B' *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply acute_trivial.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            eapply (perp_acute _ _ N).
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: @Perp_at Tn N O N B' N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_left_comm.
(* Goal: @Perp_at Tn N N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_perp_in.
(* Goal: @Perp Tn P Q C D *)
            apply perp_sym.
(* Goal: @Perp Tn B' N O N *)
(* Goal: n N O B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (perp_col _ A).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Perp.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Col.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H66 n.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists n.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @Lcos Tn ln lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Lcos.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          repeat split; auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists O.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => @ex (@Tpoint Tn) (fun C : @Tpoint Tn => and (@Per Tn C B O) (and (ln O B) (and (lb' O C) (n B O C))))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists N.
(* Goal: @ex (@Tpoint Tn) (fun C : @Tpoint Tn => and (@Per Tn C N O) (and (ln O N) (and (lb' O C) (n N O C)))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists B'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          repeat split; auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction(eq_dec_points B' N).
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst N.
(* Goal: @Per Tn B' B' O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply l8_2.
(* Goal: @Per Tn O B' B' *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply l8_5.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_per.
(* Goal: @Perp_at Tn N B' N N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_in_comm.
(* Goal: @Perp_at Tn N N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_perp_in.
(* Goal: @Perp Tn N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply perp_left_comm.
(* Goal: @Perp Tn B' N O N *)
(* Goal: n N O B' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (perp_col _ A).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Perp.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Col.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply anga_sym; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H66 n.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos lc l' lb' l).
(* Goal: @Eq_Lcos Tn la n' lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn lp lc l') (@Lcos Tn lp lb' l)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists ll'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos lb l' lc' l).
(* Goal: @Eq_Lcos Tn la n' lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun la : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn la lb l') (@Lcos Tn bl'n' la n')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists ll.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos lc m' la' m).
(* Goal: @Eq_Lcos Tn la n' lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn lp lc m') (@Lcos Tn lp la' m)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos la m' lc' m).
(* Goal: @Eq_Lcos Tn la n' lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn lp la m') (@Lcos Tn lp lc' m)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lm'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos la n' lb' n).
(* Goal: @Eq_Lcos Tn la n' lb' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn lp la n') (@Lcos Tn lp lb' n)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists ln.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists lp, Lcos lp lb n').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(lcos_exists lb n'); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Q_Cong_Null in H73.
(* Goal: @Perp2 Tn A B C D P *)
          spliter.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H74 X.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H0.
(* Goal: @eq (@Tpoint Tn) B O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          eapply (cong_identity _ _ X).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lg_cong lb); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lg_sym lb); auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H73 bn'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists lp, Lcos lp ll n').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(lcos_exists ll n'); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Q_Cong_Null in H73.
(* Goal: @Perp2 Tn A B C D P *)
          spliter.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H75 X.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply H48.
(* Goal: @eq (@Tpoint Tn) O L *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (cong_identity _ _ X).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lg_cong ll); auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H73 bl'n'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(exists lp, Lcos lp bn' l').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(lcos_exists bn' l'); auto.
(* Goal: @Q_Cong Tn bn' *)
(* Goal: not (@Q_Cong_Null Tn bn') *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply lcos_lg_anga in H74.
(* Goal: @Perp2 Tn A B C D P *)
            spliter.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: not (@Q_Cong_Null Tn bn') *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(HH:= lcos_lg_not_null bn' lb n' H74 ).
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          tauto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H73 bn'l'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Lcos2 bl'n' lb l' n').
(* Goal: @Lcos2 Tn bn'l' lb n' l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Lcos2.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun la : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn la lb l') (@Lcos Tn bl'n' la n')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists ll.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Lcos2 bn'l' lb n' l').
(* Goal: @Lcos2 Tn bn'l' lb n' l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Lcos2.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun la : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos Tn la lb n') (@Lcos Tn bn'l' la l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists bn'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(EqL bl'n' bn'l').
(* Goal: @EqL Tn bl'n' bn'l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos2_comm in H77.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos2_uniqueness lb _ _ l' n'); auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply lcos_lg_anga in H75.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply lcos_lg_anga in H76.
(* Goal: @Perp2 Tn A B C D P *)
        spliter.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos2 lb l' n' lb n' l').
(* Goal: @Eq_Lcos2 Tn lb n' l' la' n l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos2.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb l' n') (@Lcos2 Tn lp lb n' l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists bl'n'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos2 Tn bl'n' lb n' l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          eapply (lcos2_eql_lcos2 lb _ bn'l').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @EqL Tn lb lb *)
(* Goal: @EqL Tn bn'l' bl'n' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            reflexivity.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          symmetry; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos2 lb l' n' lc' l n').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_lcos2_eq; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m lc' l n' m).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos2_eq_lcos3_eq; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m lc' m l n').
(* Goal: @Eq_Lcos3 Tn lb l' n' m lc' m l n' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3 in H87.
(* Goal: @Eq_Lcos3 Tn lb l' n' m lc' m l n' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H87 lp.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb n' l') (@Lcos2 Tn lp la' n l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos3 Tn lp lc m' l' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut1.
(* Goal: @Lcos3 Tn lp la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut2.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 la m' l n' lc' m l n').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_lcos3_eq; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m la m' l n').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos3_eq_trans _ _ _ _ lc' m l n'); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_eq_sym; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m la n' m' l).
(* Goal: @Eq_Lcos3 Tn lb l' n' m la n' m' l *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3 in H90.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la n' m' l *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H90 lp.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb n' l') (@Lcos2 Tn lp la' n l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos3 Tn lp lc m' l' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut1.
(* Goal: @Lcos3 Tn lp la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut2.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 la n' m' l lb' n m' l).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_lcos3_eq; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m lb' n m' l).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos3_eq_trans _ _ _ _ la n' m' l); auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m lb' l n m').
(* Goal: @Eq_Lcos3 Tn lb l' n' m lb' l n m' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3 in H93.
(* Goal: @Eq_Lcos3 Tn lb l' n' m lb' l n m' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H93 lp.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb n' l') (@Lcos2 Tn lp la' n l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos3 Tn lp lc m' l' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut1.
(* Goal: @Lcos3 Tn lp la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut2.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb' l n m' lc l' n m').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_lcos3_eq; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_sym; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m lc l' n m').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos3_eq_trans _ _ _ _ lb' l n m'); auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m lc m' l' n).
(* Goal: @Eq_Lcos3 Tn lb l' n' m lc m' l' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3 in H96.
(* Goal: @Eq_Lcos3 Tn lb l' n' m lc m' l' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H96 lp.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb n' l') (@Lcos2 Tn lp la' n l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos3 Tn lp lc m' l' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut1.
(* Goal: @Lcos3 Tn lp la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut2.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 la' m l' n lc m' l' n).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_lcos3_eq; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos_eq_sym; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m la' m l' n).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos3_eq_trans _ _ _ _ lc m' l' n); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_eq_sym; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos3 lb l' n' m la' n l' m).
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3 in H99.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H99 lp.
(* Goal: @Eq_Lcos3 Tn lb l' n' m la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos3.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb n' l') (@Lcos2 Tn lp la' n l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos3 Tn lp la' n l' m *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos3_permut2.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos2 lb l' n' la' n l').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos3_lcos2 _ _ _ _ _ _ m); auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos2 lb n' l' la' n l').
(* Goal: @Eq_Lcos2 Tn lb n' l' la' n l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos2 in H101.
(* Goal: @Eq_Lcos2 Tn lb n' l' la' n l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H101 lp.
(* Goal: @Eq_Lcos2 Tn lb n' l' la' n l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          unfold Eq_Lcos2.
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun lp : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Lcos2 Tn lp lb n' l') (@Lcos2 Tn lp la' n l')) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists lp.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split; auto.
(* Goal: @Lcos2 Tn lp lb n' l' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply lcos2_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Eq_Lcos lb n' la' n).
(* Goal: @Eq_Lcos Tn lb n' la' n *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply (lcos2_lcos) in H102.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        clear H85 H86 H87 H88 H89 H90 H91 H92 H93 H94 H95 H96 H97 H98 H99 H100 H101 H102.
(*************** we construct the length ln'  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        unfold Eq_Lcos in H103.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        ex_and H103 ln'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(O <> N).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_not_eq_2 in H25; auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply lcos_lg_anga in H85.
(* Goal: @Perp2 Tn A B C D P *)
        spliter.
(*************** we prove : n' A O N  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(n' A O N).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(lcos_per_anga _ _ _ la ln); auto.
(* Goal: @Per Tn A N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction(eq_dec_points A N).
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst N.
(* Goal: @Per Tn B' B' O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply l8_2.
(* Goal: @Per Tn O B' B' *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply l8_5.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_per.
(* Goal: @Perp_at Tn N B' N N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_comm.
(* Goal: @Perp_at Tn N N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_perp_in.
(* Goal: @Perp Tn N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_left_comm.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (perp_col _ B'); Col.
(*************** we prove : n B O N  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(n B' O N).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(lcos_per_anga _ _ _ lb' ln); auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction(eq_dec_points B' N).
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst N.
(* Goal: @Per Tn B' B' O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply l8_2.
(* Goal: @Per Tn O B' B' *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply l8_5.
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_per.
(* Goal: @Perp_at Tn N B' N N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_in_comm.
(* Goal: @Perp_at Tn N N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_perp_in.
(* Goal: @Perp Tn N B' O N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply perp_left_comm.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (perp_col _ A); Col.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Perp.
(*************** two cases  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        assert(Bet A O B \/ Out O A B \/ ~ Col A O B).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(or_bet_out A O B); auto.
(*************** case : Bet A O B  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        induction H93.
(*************** we extend NO with N' such as ln' O N' ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(HH:=ex_point_lg_bet ln' N O H89).
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and HH N'.
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(O <> N').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst N'.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(HH:=lcos_lg_not_null ln' lb n' H85).
(* Goal: @Perp2 Tn A B C D P *)
            spliter.
(* Goal: False *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply H96.
(* Goal: @Q_Cong_Null Tn ln' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            unfold Q_Cong_Null.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            split; auto.
(* Goal: @ex (@Tpoint Tn) (fun A : @Tpoint Tn => ln' A A) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            exists O.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(A' <> B).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst A'.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            contradiction.
(*************** we prove (Per O N' B) using Lcos ln' lb n'  ********************)        
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(Per O N' B).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(lcos_per O N' B ln' lb n'); auto.
(* Goal: n' N' O B *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(CongA N O A B O N').
(*************** pair of vertical angles (angles opposés par Le sommet) ********************)  
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
              apply(l11_13 N' O A A O N' N B ); Between.
(* Goal: @CongA Tn N' O B' B' O N' *)
(* Goal: @Bet Tn B' O A' *)
(* Goal: not (@eq (@Tpoint Tn) A' O) *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply conga_left_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply conga_refl; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (anga_conga_anga n' A O N); auto.
(* Goal: @CongA Tn B' O N N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply conga_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(*************** we prove (Per O N' A') usinglcos ln' la' n  ********************) 
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(Per O N' A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(lcos_per O N' A' ln' la' n); auto.
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(CongA N O B' A' O N').
(* Goal: @Bet Tn C O A *)
(* Goal: not (@Col Tn O C C') *)
(* Goal: @Bet Tn A' O B' *)
              apply(l11_13 N' O B' B' O N' N A' ); Between.
(* Goal: @CongA Tn N' O B' B' O N' *)
(* Goal: @Bet Tn B' O A' *)
(* Goal: not (@eq (@Tpoint Tn) A' O) *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply conga_left_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply conga_refl; auto.
(* Goal: @Bet Tn B' O A' *)
(* Goal: not (@eq (@Tpoint Tn) A' O) *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply between_symmetry.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply(l13_10_aux3 A B C A' B' C' O); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst A'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
              Col.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            eapply (anga_conga_anga  n B' O N); auto.
(* Goal: @CongA Tn B' O N N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply conga_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(*************** we prove (Perp O N B A')  ********************) 
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply (perp_col _ N'); Col.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply cop_per2__perp; auto.
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          induction(eq_dec_points N' B).
(* Goal: or (and (@Col Tn B N A) (@Col Tn O B' A)) (or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A))) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            right.
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            subst N'.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          left.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply coplanar_perm_16.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply col_cop__cop with N; Col.
(* Goal: @Coplanar Tn B A' O N *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply coplanar_perm_5.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          apply col_cop__cop with B'; Col.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists A.
(* Goal: or (and (@Col Tn B N A) (@Col Tn O B' A)) (or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A))) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          right.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          left.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          split; Col.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        induction H93.
(*************** case : out O A B  ********************)
(*************** we construct N' on the half-line ON such as ln' O N' /\ out O N' N  ********************)        
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(exists N' : Tpoint, ln' O N' /\ Out O N' N).
(* Goal: @ex (@Tpoint Tn) (fun N' : @Tpoint Tn => and (ln' O N') (@Out Tn O N' N)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(ex_point_lg_out ln' O N H87 H89).
(* Goal: not (@Q_Cong_Null Tn ln') *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(HH:=lcos_lg_not_null ln' la' n H86).
(* Goal: @Perp2 Tn A B C D P *)
            spliter.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          ex_and H94 N'.
(*************** we prove (Per O N' B) using Lcos ln' lb n'  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(Per O N' B).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(lcos_per O N' B ln' lb n'); auto.
(* Goal: n' N' O B *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(CongA A O N B O N').
(* Goal: @CongA Tn A O N B O N' *)
(* Goal: n' N' O B *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply(out_conga A O N A O N A N B N').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply conga_refl ; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                auto.
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply l6_6.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (anga_conga_anga n' A O N); auto.
(* Goal: @CongA Tn B' O N N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply conga_right_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(*************** we prove (Per O N' A) using Lcos ln' la' n  ********************)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          assert(Per O N' A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply(lcos_per O N' A' ln' la' n); auto.
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            assert(CongA B' O N A' O N').
(* Goal: @CongA Tn B' O N A' O N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply(out_conga B' O N B' O N B' N A' N').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply conga_refl; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply out_trivial; auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply out_trivial; auto.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
                eapply (l13_10_aux5 B A C B' A' C'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  subst A'.
(* Goal: False *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  apply H.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
                  Col.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  auto.
(* Goal: @Perp2 Tn C B' B C' O *)
(* Goal: @Out Tn O B A *)
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  apply perp2_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                  auto.
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                apply l6_6.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
                auto.
(* Goal: @Out Tn O N N' *)
(* Goal: n N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              apply l6_6.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (anga_conga_anga n B' O N); auto.
(* Goal: @CongA Tn B' O N N' O A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply conga_right_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @Perp Tn O N B A' *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply(perp_col _ N').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply (cop_per2__perp); auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst N'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              unfold Out in H95.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              tauto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst A'.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              contradiction.
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            induction(eq_dec_points N' B).
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst N'.
(* Goal: or (and (@Col Tn B N A) (@Col Tn O B' A)) (or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A))) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              right.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              subst A'.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
              contradiction.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            left.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            auto.
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply coplanar_perm_16.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply col_cop__cop with N; Col.
(* Goal: @Coplanar Tn B A' O N *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply coplanar_perm_5.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            apply col_cop__cop with B'; Col.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            exists A.
(* Goal: or (and (@Col Tn B N A) (@Col Tn O B' A)) (or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A))) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            right.
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            left.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            split; Col.
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          apply out_col in H95.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply False_ind.
(* Goal: False *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply H93.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      split; intro; apply H; ColR.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      split; intro; apply H; ColR.
Qed.

End Pappus_Pascal.

(** lcos_lcos_col -> lcos2_cop__col
    per_per_perp -> cop_per2__perp *)

Section Pappus_Pascal_2.

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

Lemma par__perp2 : forall A B C D P, Par A B C D -> Perp2 A B C D P.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Perp2 Tn A B C D P *)
    apply par_distincts in H.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
(* Goal: @Perp2 Tn A B C D P *)
    unfold Perp2.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P X Y) (and (@Perp Tn X Y A B) (@Perp Tn X Y C D)))) *)
    assert(HH:= perp_exists P A B H0).
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P X Y) (and (@Perp Tn X Y A B) (@Perp Tn X Y C D)))) *)
    ex_and HH Q.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P X Y) (and (@Perp Tn X Y A B) (@Perp Tn X Y C D)))) *)
    exists P.
(* Goal: @ex (@Tpoint Tn) (fun Y : @Tpoint Tn => and (@Col Tn P P Y) (and (@Perp Tn P Y A B) (@Perp Tn P Y C D))) *)
    exists Q.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    repeat split.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Perp.
(* Goal: @Perp Tn P Q C D *)
    apply perp_sym.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply (par_perp__perp A B); auto.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply perp_sym; auto.
Qed.

Lemma l13_11 : forall A B C A' B' C' O,
  ~ Col O A A' ->
  B <> O -> C <> O ->
  Col O A B -> Col O B C ->
  B' <> O -> C' <> O ->
  Col O A' B' -> Col O B' C' -> Par B C' C B' -> Par C A' A C' ->
  Par A B' B A'.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
(* Goal: @Par Tn A B' B A' *)
    assert(HH:=par__perp2 B C' C B' O H8).
(* Goal: @Par Tn A B' B A' *)
    assert(HP:=par__perp2 C A' A C' O H9).
(* Goal: @Par Tn A B' B A' *)
    assert(HQ:=perp2_par A B' B A' O).
(* Goal: @Par Tn A B' B A' *)
    apply HQ.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply(l13_10 A B C A' B' C' O); auto.
Qed.


Lemma l13_14 : forall O A B C O' A' B' C',
  Par_strict O A O' A' -> Col O A B -> Col O B C -> Col O A C ->
  Col O' A' B' -> Col O' B' C' -> Col O' A' C' ->
  Par A C' A' C -> Par B C' B' C -> Par A B' A' B.
Proof.
(* Goal: forall (A B C A' B' C' O : @Tpoint Tn) (_ : not (@Col Tn O A A')) (_ : not (@eq (@Tpoint Tn) B O)) (_ : not (@eq (@Tpoint Tn) C O)) (_ : @Col Tn O A B) (_ : @Col Tn O B C) (_ : not (@eq (@Tpoint Tn) B' O)) (_ : not (@eq (@Tpoint Tn) C' O)) (_ : @Col Tn O A' B') (_ : @Col Tn O B' C') (_ : @Par Tn B C' C B') (_ : @Par Tn C A' A C'), @Par Tn A B' B A' *)
    intros.
    assert(HP:= H).
    unfold Par_strict in HP.
(* Goal: @Perp2 Tn A B C D P *)
    spliter.
    assert(~Col O A A').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
      apply H11.
      exists A'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      split; Col.
    induction(eq_dec_points A C).
(* Goal: False *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      subst C.
      induction H6.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        apply False_ind.
        apply H6.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists A.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        split; Col.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
      assert(A' =  C').
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        eapply (l6_21 A C' O' A'); Col.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
        apply H11.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists A.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        split.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
        eapply (col_transitivity_1 _ C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          subst C'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
          apply H11.
(* Goal: @Coplanar Tn B N O B' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          exists A.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst C'.
      Par.
    assert(A' <> C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst C'.
      induction H6.
        apply H6.
        exists A'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        split; Col.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
      apply H13.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      eapply (l6_21 A A' O A); Col.
    assert(Par_strict A C A' C').
      unfold Par_strict.
      repeat split; auto; try apply all_coplanar.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
      apply H11.
(* Goal: False *)
(* Goal: @Lcos Tn llb lb a *)
      ex_and H15 X.
      exists X.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      split.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      ColR.
    assert(Plg A C A' C').
      apply(pars_par_plg A C A' C').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
      apply par_right_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
    induction(eq_dec_points B C).
(* Goal: False *)
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
      subst C.
      assert(B' = C').
        eapply (l6_21 B C' A' C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
          apply H11.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => and (@Len Tn O B lb) (@Len Tn O B llb)) *)
(* Goal: @Lcos Tn llb lb a *)
          exists B.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          split.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            Col.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
          ColR.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
          auto.
          induction H7.
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
            apply False_ind.
            apply H7.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => and (@Len Tn O B lb) (@Len Tn O B llb)) *)
(* Goal: @Lcos Tn llb lb a *)
            exists B.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
            split; Col.
(* Goal: @Perp2 Tn A B C D P *)
          spliter.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
          ColR.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          Col.
      subst.
      Par.
(* Goal: @EqL Tn l1 l2 *)
(* Goal: @Q_CongA_Acute Tn a *)
    assert(B' <> C').
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: @Perp Tn B' C L' O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst C'.
      induction H7.
        apply H7.
(* Goal: @ex (@Tpoint Tn) (fun C : @Tpoint Tn => and (@Per Tn C N O) (and (ln O N) (and (lb' O C) (n N O C)))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists B'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        split; Col.
(* Goal: @Perp2 Tn A B C D P *)
      spliter.
      apply H17.
      eapply (l6_21 A C B' B).
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
        induction H6.
          apply H6.
(* Goal: @ex (@Tpoint Tn) (fun X : @Tpoint Tn => and (@Col Tn X C A') (@Col Tn X C B')) *)
(* Goal: @Col Tn A' B' C *)
(* Goal: @eq (@Tpoint Tn) A' B' *)
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
          exists C.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
          split; Col.
(* Goal: @Perp2 Tn A B C D P *)
        spliter.
(* Goal: False *)
        apply H15.
(* Goal: @ex (@Tpoint Tn) (fun C : @Tpoint Tn => and (@Per Tn C N O) (and (ln O N) (and (lb' O C) (n N O C)))) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        exists B'.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        split; Col.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
    assert(Par_strict B C B' C').
      unfold Par_strict.
      repeat split; auto; try apply all_coplanar.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
      apply H11.
      ex_and H19 X.
      exists X.
(* Goal: and (@Q_CongA_Acute Tn n) (@Lcos Tn ln lb' n) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      split.
        assert(Col X O B).
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
          ColR.
        induction(eq_dec_points O B).
          subst O.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
          ColR.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
      assert(Col X O' B').
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
      induction(eq_dec_points O' B').
        subst O'.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        ColR.
(* Goal: @Col Tn O A' C' *)
(* Goal: @Perp2 Tn A C' C A' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      ColR.
    assert(Plg B C B' C').
      apply(pars_par_plg B C B' C').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        auto.
      apply par_right_comm.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
    assert(Parallelogram A C A' C').
      apply plg_to_parallelogram.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
    assert(Parallelogram B C B' C').
      apply plg_to_parallelogram.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      auto.
    apply plg_mid in H21.
    apply plg_mid in H22.
    ex_and H21 M.
    ex_and H22 N.
    assert(M = N).
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      eapply (l7_17 C C'); auto.
(* Goal: @Per Tn B' N O *)
(* Goal: @Per Tn B' N O *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    subst N.
    assert(Parallelogram A B A' B').
      apply(mid_plg A B A' B' M).
(* Goal: or (and (@Col Tn B O A) (@Col Tn N B' A)) (and (@Col Tn B B' A) (@Col Tn N O A)) *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        left.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        subst A'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) A' C') *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
        apply H12.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
        Col.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
        assumption.
(* Goal: @Perp2 Tn C A' A C' O *)
(* Goal: @Perp2 Tn C B' B C' O *)
      assumption.
    apply par_right_comm.
(* Goal: @Out Tn O A' B' *)
    induction(eq_dec_points A B).
(* Goal: @Out Tn O A' B' *)
(* Goal: @Out Tn O A' B' *)
      subst B.
      assert(B' = A').
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
        eapply (symmetric_point_uniqueness A M); auto.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) N O) *)
(* Goal: @Acute Tn B' O N *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (@Lcos Tn ln lb' a)) *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst B'.
(* Goal: @Par Tn A P A P *)
(* Goal: a B O Q *)
(* Goal: @ex (forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop) (fun a : forall (_ : @Tpoint Tn) (_ : @Tpoint Tn) (_ : @Tpoint Tn), Prop => and (@Q_CongA_Acute Tn a) (and (@Lcos Tn lp la a) (@Lcos Tn lq lb a))) *)
      apply par_reflexivity.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
      subst A'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) A' C') *)
(* Goal: or (@Bet Tn C' B A') (@Bet Tn C' A' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
      apply H12.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
      Col.
(* Goal: not (@eq (@Tpoint Tn) N' B) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    apply plg_par; auto.
(* Goal: not (@eq (@Tpoint Tn) B A') *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    intro.
(* Goal: False *)
(* Goal: or (not (@eq (@Tpoint Tn) N' B)) (not (@eq (@Tpoint Tn) N' A')) *)
(* Goal: @Coplanar Tn O N' B A' *)
(* Goal: @Col Tn O N' N *)
(* Goal: @Perp Tn O N B A' *)
(* Goal: and (not (@Col Tn O C A')) (not (@Col Tn O A C')) *)
(* Goal: and (not (@Col Tn O B C')) (not (@Col Tn O C B')) *)
    subst A'.
(* Goal: False *)
(* Goal: not (@eq (@Tpoint Tn) C' A') *)
(* Goal: or (@Bet Tn A' B C') (@Bet Tn A' C' B) *)
(* Goal: @Bet Tn A B C *)
(* Goal: @Bet Tn A B C *)
    apply H11.
(* Goal: @ex (@Tpoint Tn) (fun B : @Tpoint Tn => and (@Len Tn O B lb) (@Len Tn O B llb)) *)
(* Goal: @Lcos Tn llb lb a *)
    exists B.
(* Goal: @Col Tn P P Q *)
(* Goal: @Perp Tn P Q A B *)
(* Goal: @Perp Tn P Q C D *)
    split; Col.
Qed.

End Pappus_Pascal_2.