Library Ch13_1


Require Export project.

Section L13.

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

Pappus Desargues

Lemma triangle_mid_par : A B C P Q, ¬Col A B Cis_midpoint P B Cis_midpoint Q A CPar_strict A B Q P.
Proof.
intros.
apply not_col_distincts in H.
spliter.
assert( D : Tpoint, Parallelogram C A B D).
apply(plg_existence C A B); auto.
ex_and H5 D.

assert(Parallelogram_strict C A B D).
induction H6.
assumption.
unfold Parallelogram_flat in H5.
spliter.
apply False_ind.
apply H.
ColR.
assert(HH:= midpoint_existence B D).
ex_and HH R.

assert(Par Q R C D is_midpoint P Q R Cong C D Q R).

apply(half_plgs C A B D Q R P); Midpoint.
spliter.
assert(Par Q P C D).
eapply (par_col_par_2 _ R).
intro.
subst Q.
apply is_midpoint_id in H9.
subst R.
apply par_distincts in H8.
tauto.
unfold is_midpoint in H9.
spliter.
apply bet_col in H9.
Col.
assumption.
assert(Par Q P A B).
eapply par_trans.
apply H11.
apply plg_par; auto.
apply par_symmetry in H12.
induction H12.
assumption.
spliter.
assert(Col A B P).
ColR.
unfold is_midpoint in H0.
spliter.
apply bet_col in H0.

assert(B P).
intro.
subst P.
apply cong_symmetry in H17.
apply cong_identity in H17.
contradiction.
apply False_ind.
apply H.
ColR.
Qed.

Lemma l13_1 : A B C P Q R, ¬Col A B Cis_midpoint P B Cis_midpoint Q A Cis_midpoint R A B
                                       → X, Y, Perp_in R X Y A B Perp X Y P Q.
intros.
apply not_col_distincts in H.
spliter.
R.
assert(Col A B R).
unfold is_midpoint in H2.
spliter.
apply bet_col in H2.
Col.

assert(HH:=l10_15 A B R C H6 H).
ex_and HH T.
T.
split.
assert(A R).
intro.
subst R.
apply is_midpoint_id in H2.
contradiction.
assert(Perp A R T R).
eapply (perp_col _ B); auto.
apply perp_left_comm in H10.
apply perp_perp_in in H10.

eapply (perp_in_col_perp_in _ _ _ R); Col.
apply perp_in_comm.
apply perp_in_sym.
assumption.
apply perp_sym.
eapply par_perp_perp.
2: apply perp_right_comm.
2: apply H7.
left.
apply par_strict_right_comm.
apply (triangle_mid_par _ _ C); auto.
Qed.

Lemma per_lt : A B C, A BC BPer A B Clt A B A C lt C B A C.
intros.
assert(lt B A A C lt B C A C).
apply( l11_46 A B C).
apply per_not_col; auto.
left.
assumption.
spliter.
split;
apply lt_left_comm;
assumption.
Qed.

Lemma cong_perp_conga : A B C P, Cong A B C BPerp A C B PConga A B P C B P two_sides B P A C.
intros.

assert(A C B P).
split.
apply perp_not_eq_1 in H0.
assumption.
apply perp_not_eq_2 in H0.
assumption.
spliter.

assert(A B).
intro.
subst B.
apply cong_symmetry in H.
apply cong_identity in H.
apply H1.
auto.

assert(C B).
intro.
subst B.
apply cong_identity in H.
contradiction.

induction(Col_dec A B C).

assert(¬ Col B A P).
apply perp_not_col.
apply perp_comm.
apply (perp_col _ C); Col.

assert(Per P B A).
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
apply perp_sym.
eapply (perp_col _ C); Col.

assert(Per P B C).
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
apply perp_sym.
eapply (perp_col _ A); Col.
Perp.

apply l8_2 in H7.
apply l8_2 in H8.

split.
apply l11_16; auto.

assert( A = C is_midpoint B A C).
eapply l7_20; Cong.
induction H9.
contradiction.
unfold two_sides.
repeat split.
auto.
intro.
apply H6.
Col.
intro.
apply H6.
ColR.
B.
unfold is_midpoint in H9.
spliter.
split; Between.

assert(HH:= H0).

unfold Perp in HH.
ex_and HH T.

apply perp_in_col in H6.
spliter.

assert(B T).
intro.
subst T.
apply H5.
Col.

assert(Perp B T A C).
apply (perp_col _ P); Perp.

assert(A T).
intro.
subst T.
apply perp_comm in H9.
apply perp_perp_in in H9.
apply perp_in_comm in H9.
apply perp_in_per in H9.
assert(lt B A B C lt C A B C).

apply( per_lt B A C); auto.
spliter.
unfold lt in H10.
spliter.
apply H12.
Cong.

assert(C T).
intro.
subst T.
apply perp_left_comm in H9.
apply perp_perp_in in H9.
apply perp_in_comm in H9.
apply perp_in_per in H9.
assert(lt B C B A lt A C B A).

apply( per_lt B C A); auto.
spliter.
unfold lt in H11.
spliter.
apply H13.
Cong.

assert(Perp_in T B T T A).
apply perp_in_comm.
apply perp_perp_in.
apply perp_sym.
apply (perp_col _ C).
assumption.
apply perp_sym.
apply perp_left_comm.
apply (perp_col _ P); Perp.
Col.

assert(Perp_in T B T T C).
apply perp_in_comm.
apply perp_perp_in.
apply perp_sym.
apply (perp_col _ A).
assumption.
apply perp_sym.
apply perp_left_comm.
apply (perp_col _ P); Perp.
Col.

assert(Cong T A T C Conga T A B T C B Conga T B A T B C).
apply( l11_52 A T B C T B); Cong.
eapply l11_16; auto.

apply perp_in_per.
apply perp_in_comm.
apply perp_in_sym.
assumption.

apply perp_in_per.
apply perp_in_comm.
apply perp_in_sym.
assumption.

assert(lt B T B A lt A T B A).
apply( per_lt B T A); auto.
apply perp_in_per.
assumption.
spliter.
apply le_comm.
unfold lt in H14.
spliter.
assumption.
spliter.

split.

induction(Bet_dec P B T).
apply conga_comm.
eapply l11_13; auto.
apply H16.
Between.
Between.
apply conga_comm.
assert(out B T P).
unfold out.
repeat split; auto.
induction H7.
right.
assumption.
induction H7.
left.
Between.
apply between_symmetry in H7.
contradiction.

eapply out_conga.
apply H16.
assumption.
apply out_trivial.
auto.
assumption.
apply out_trivial.
auto.

assert(A = C is_midpoint T A C).
apply l7_20;
Col.
induction H17.
contradiction.
unfold two_sides.
repeat split; Col.

assert(¬ Col T A B).
apply perp_not_col.
apply perp_in_perp in H12.
induction H12.
apply perp_not_eq_1 in H12.
tauto.
Perp.
intro.
apply H18.
ColR.

assert(¬ Col T C B).
apply perp_not_col.
apply perp_in_perp in H13.
induction H13.
apply perp_not_eq_1 in H13.
tauto.
Perp.
intro.
apply H18.
ColR.
T.
apply midpoint_bet in H17.
split; Col.
Qed.

Lemma os_out_os : A B C D C' P , Col A B Pone_side A B C Dout P C C'one_side A B C' D.
intros.

assert(A B ¬ Col C A B).
unfold one_side in H0.
ex_and H0 T.
unfold two_sides in H0.
tauto.
spliter.

prolong C P T C P.

assert(P T).
intro.
subst T.
apply cong_symmetry in H5.
apply cong_identity in H5.
subst P.
apply H3.
Col.

assert(two_sides A B C T).
unfold two_sides.
repeat split; Col.

intro.
apply H3.
assert(Col P T A).
ColR.
assert(Col P T B).
ColR.
apply bet_col in H4.
apply (col3 P T); Col.
P.
split; Col.

assert(two_sides A B T C').
apply bet_col in H4.
eapply (out_out_two_sides _ _ T C _ _ P); Col.
apply l9_2.
assumption.
apply out_trivial.
auto.

assert(one_side A B C C').
eapply l9_8_1.
apply H7.
apply l9_2.
assumption.
eapply one_side_transitivity.
apply one_side_symmetry.
apply H9.
assumption.
Qed.

Lemma ts_ts_os : A B C D, two_sides A B C Dtwo_sides C D A Bone_side A C B D.
intros.
unfold two_sides in ×.
spliter.
ex_and H6 T1.
ex_and H3 T.
assert(T1 = T).
apply bet_col in H7.
apply bet_col in H8.
apply (inter_unicity A B C D); Col.
subst T1.

prolong A T A' A T.
prolong C T C' C T.
assert(Parallelogram A C A' C').
eapply (mid_plg _ _ _ _ T).
left.
intro.
subst A'.
apply between_identity in H9.
subst T.
contradiction.
unfold is_midpoint; split; Cong.
unfold is_midpoint; split; Cong.

assert(A A').
intro.
subst A'.
apply between_identity in H9.
subst T.
contradiction.

assert(C C').
intro.
subst C'.
apply between_identity in H11.
subst T.
contradiction.

assert(Parallelogram_strict A C A' C').
induction H13.
assumption.
unfold Parallelogram_flat in H13.
spliter.
apply False_ind.

apply H4.
apply bet_col in H7.
apply bet_col in H8.
apply bet_col in H9.
apply bet_col in H11.
assert(Col A C T).
ColR.
assert(Col A T B).
ColR.
assert(A T).
intro.
subst T.
apply cong_identity in H10.
contradiction.
ColR.

apply plgs_par_strict in H16.
spliter.

assert(one_side A C A' C').
eapply l12_6.
assumption.

assert(out A B A').
repeat split; auto.
eapply (l5_1 _ T); Between.
intro.
subst T.
apply cong_identity in H10.
subst A'.
tauto.

assert(out C C' D).
repeat split; auto.
eapply (l5_1 _ T); Between.
intro.
subst T.
apply cong_identity in H12.
subst C'.
tauto.

assert(one_side A C A' B).
eapply (os_out_os _ _ B _ _ A); Col.
apply one_side_reflexivity.
intro.
apply H4.
Col.

assert(one_side A C C' D).
apply invert_one_side.
apply one_side_symmetry.
eapply (os_out_os _ _ C' _ _ C); Col.
apply one_side_reflexivity.
intro.
apply H1.
apply out_col in H20.
ColR.

eapply one_side_transitivity.
apply one_side_symmetry.
apply H21.
eapply one_side_transitivity.
apply H18.
assumption.
Qed.

Lemma ts_per_per_ts : A B C D, two_sides A B C DPer B C APer B D Atwo_sides C D A B.
intros.
unfold two_sides in H.
spliter.
ex_and H4 P.

assert(C D).
intro.
subst D.
apply between_identity in H5.
subst P.
contradiction.

assert(B C).
intro.
subst C.
apply H2.
Col.

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

assert( A C).
intro.
subst C.
apply H2.
Col.

assert( A D).
intro.
subst D.
apply H3.
Col.

assert(Perp B C C A).
apply per_perp_in in H0; auto.
apply perp_in_comm in H0.
apply perp_in_perp in H0.
induction H0.
apply perp_comm.
assumption.
apply perp_not_eq_1 in H0.
tauto.

assert(Perp B D D A).
apply per_perp_in in H1; auto.
apply perp_in_comm in H1.
apply perp_in_perp in H1.
induction H1.
apply perp_comm.
assumption.
apply perp_not_eq_1 in H1.
tauto.

assert(¬ Col A C D).
intro.
assert(Par B C B D).
eapply l12_9.
apply I.
apply H11.
apply perp_sym.
apply perp_comm.
eapply (perp_col _ D); Col.
Perp.
induction H14.
apply H14.
B.
split; Col.
spliter.
apply H2.
eapply (col_transitivity_1 _ D); Col.

assert(¬ Col B C D).
intro.

assert(Par A C A D).
eapply l12_9.
apply I.
apply perp_comm.
apply perp_sym.
apply H11.
apply perp_sym.
apply perp_comm.
eapply (perp_col _ D); Col.
induction H15.
apply H15.
A.
split; Col.
spliter.
apply H2.
eapply (col_transitivity_1 _ D); Col.

unfold two_sides.
repeat split; auto.

P.
split.
apply bet_col in H5.
Col.

assert( X : Tpoint, Col A B X Perp A B C X).
apply(l8_18_existence A B C).
intro.
apply H2.
Col.

assert( X : Tpoint, Col A B X Perp A B D X).
apply(l8_18_existence A B D).
intro.
apply H3.
Col.

ex_and H15 PC.
ex_and H16 PD.

assert(Perp_in PC A B C PC).
apply(l8_14_2_1b_bis A B C PC PC H17); Col.

assert(Perp_in PD A B D PD).
apply(l8_14_2_1b_bis A B D PD PD H18); Col.

assert(Bet A PC B Distincts A PC B).
apply(l11_47 A B C PC).
apply l8_2.
assumption.
Perp.

assert(Bet A PD B Distincts A PD B).
apply(l11_47 A B D PD).
apply l8_2.
assumption.
Perp.

spliter.

assert(Bet PC P PD).

eapply (projp_preserves_bet C P D).
assumption.
unfold projp.
split.
apply H.
left.
split; Col.
unfold projp.
split.
assumption.
right.
split; Col.
unfold projp.
split.
assumption.
left.
split; Col.

induction(eq_dec_points PC PD).
subst PD.
apply between_identity in H25.
subst PC.
assumption.

assert(Bet A PC PD Bet A PD PC).
eapply l5_3.
apply H21.
assumption.
induction H27.
eBetween.
apply between_exchange4 with PC.
apply between_exchange2 with PD; Between.
Between.
Qed.

Lemma lea_in_angle : A B C A' B' C' P, lea A' B' C' A B CConga A B P A' B' C'one_side A B C P
                                               → InAngle P A B C.
intros.

unfold lea in H.
ex_and H T.
eapply conga_preserves_in_angle.
3: apply H.
apply conga_refl.
assert(HH0:=H0).
unfold Conga in HH0.
spliter.
clear H6.
repeat split; auto.
intro.
subst C.
unfold one_side in H1.
ex_and H1 X.
unfold two_sides in H1.
spliter.
apply H4.
Col.
eapply conga_trans; apply conga_sym.
apply H2.
apply H0.
apply one_side_symmetry.
assumption.
Qed.

Lemma l13_2_1 : A B C D E, two_sides A B C DPer B C APer B D ACol C D E
                                → Perp A E C DConga C A B D A B
                                → Conga B A C D A E Conga B A D C A E Bet C E D.
intros.
intros.
assert(HH:= H).
unfold two_sides in HH.
spliter.

assert(A C A B A D).
unfold Conga in H4.
spliter.
repeat split; auto.
spliter.

assert(Cong B C B D Cong A C A D Conga C B A D B A).

apply(l11_50_2 B A C B A D).
intro.
apply H6.
Col.
eapply l11_16; auto.
apply l8_2.
auto.
intro.
subst C.
apply H6.
Col.
apply l8_2.
auto.
intro.
subst D.
apply H7.
Col.
apply conga_comm.
auto.
Cong.
spliter.

assert(Perp C D A B).

apply( cong_conga_perp C A D B); Cong.
assert(Col A B E).
eapply perp_perp_col.
apply perp_sym.
apply H15.
auto.

assert(two_sides C D A B).
apply ts_per_per_ts; auto.
unfold two_sides in H17.
spliter.
ex_and H20 T1.
ex_and H8 T.
assert(T = T1).
apply bet_col in H21.
apply bet_col in H22.
apply (inter_unicity A B C D); Col.
subst T1.
assert(T = E).
apply (inter_unicity A B C D); Col.
subst T.

split.
apply conga_left_comm.
eapply out_conga.
apply H4.
apply out_trivial; auto.
apply out_trivial; auto.
apply out_trivial; auto.
unfold out.
repeat split; auto.
intro.
subst E.
contradiction.
split.
apply conga_sym.
apply conga_right_comm.
eapply out_conga.
apply H4.
apply out_trivial; auto.
unfold out.
repeat split; auto.
intro.
subst E.
contradiction.
apply out_trivial; auto.
apply out_trivial; auto.
assumption.
Qed.

Lemma inangle_one_side : A B C P Q , ¬ Col A B C¬ Col A B P¬ Col A B Q
                                            → InAngle P A B CInAngle Q A B C
                                            → one_side A B P Q.
intros.
unfold InAngle in ×.
spliter.
ex_and H9 P'.
ex_and H6 Q'.
induction H10.
subst P'.
apply bet_col in H9.
contradiction.
induction H11.
subst Q'.
apply bet_col in H6.
contradiction.

assert(one_side A B P' Q').
prolong P' A T A C.
unfold one_side.
T.
unfold two_sides.

assert(A P').
intro.
subst P'.
apply out_col in H10.
apply H0.
Col.

repeat split; auto.

intro.
apply H0.

assert(P' B).
unfold out in H10.
spliter.
assumption.
apply out_col in H10.
ColR.

intro.

induction(eq_dec_points A T).
subst T.
apply cong_symmetry in H13.
apply cong_identity in H13.
subst C.
apply H.
Col.

apply H.
apply bet_col in H9.
apply bet_col in H12.
assert(Col T A C).
ColR.

eapply (col_transitivity_1 _ T); Col.
A.
split; Col.

intro.
apply H1.

assert(Q' B).
unfold out in H11.
spliter.
assumption.
apply out_col in H11.
ColR.

intro.

induction(eq_dec_points A T).
subst T.
apply cong_symmetry in H13.
apply cong_identity in H13.
subst C.
apply H.
Col.

apply H.
apply bet_col in H9.
apply bet_col in H12.
assert(Col T A C).
ColR.

eapply (col_transitivity_1 _ T); Col.
A.
split; Col.

assert(Bet A P' Q' Bet A Q' P').
eapply l5_3.
apply H9.
assumption.
induction H15.
eapply (outer_transitivity_between2 _ P');
Between.
eapply (between_exchange3 P'); Between.

assert(one_side A B P P').
eapply (out_one_side_1 _ _ _ _ B); Col.
apply l6_6.
auto.

assert(one_side A B Q Q').
eapply (out_one_side_1 _ _ _ _ B); Col.
apply l6_6.
auto.

eapply one_side_transitivity.
apply H13.
apply one_side_symmetry.
eapply one_side_transitivity.
apply H14.
apply one_side_symmetry.
assumption.
Qed.

Lemma inangle_one_side2 : A B C P Q , ¬ Col A B C¬ Col A B P¬ Col A B Q
                                              → ¬ Col C B P¬ Col C B Q
                                            → InAngle P A B CInAngle Q A B C
                                            → one_side A B P Q one_side C B P Q.
intros.
split.
apply (inangle_one_side _ _ C); Col.
apply (inangle_one_side _ _ A); Col.
apply l11_24.
auto.
apply l11_24.
auto.
Qed.

Lemma l13_2 : A B C D E, two_sides A B C DPer B C APer B D ACol C D EPerp A E C D
                                → Conga B A C D A E Conga B A D C A E Bet C E D.
intros.
assert(HH:= H).
unfold two_sides in HH.
spliter.

assert(C D).
intro.
subst D.
assert(one_side A B C C).
apply one_side_reflexivity.
assumption.
apply l9_9 in H.
contradiction.

assert( C', Conga B A C D A C' one_side D A C' B).
apply(angle_construction_1 B A C D A B).
intro.
apply H5.
Col.
intro.
apply H6.
Col.
ex_and H9 E'.

assert(A B A C A D).
unfold Conga in H9.
spliter; auto.
spliter.

assert(HH:=l11_22 C A E' B D A B E').

assert(HH1:=ts_per_per_ts A B C D H H0 H1).
unfold two_sides in HH1.
spliter.
ex_and H7 T.
ex_and H17 T2.
assert(T = T2).
eapply (inter_unicity A B C D).
Col.
apply bet_col in H18.
Col.
apply bet_col in H19.
Col.
Col.
intro.
apply H5.
Col.
assumption.
subst T2.

assert(InAngle B D A C).
unfold InAngle.
repeat split; auto.
T.
split.
Between.
right.
unfold out.
repeat split.
intro.
subst T.

assert(¬ Col C D A Per A E D).

apply(l8_16_1 C D A D E H8 H2).
Col.
intro.
subst E.
apply H15.
auto.
apply perp_sym.
assumption.
spliter.
apply H20.
Col.
auto.
left.
assumption.

assert(lea C A B C A D).
unfold lea.
B.
split.
apply l11_24.
assumption.
apply conga_refl; auto.

assert(InAngle E' D A C).
eapply lea_in_angle.
apply lea_comm.
apply H21.
apply conga_sym.
assumption.

assert(HH1:=ts_per_per_ts A B C D H H0 H1).
assert(one_side D A C B).
apply ts_ts_os.
apply invert_two_sides.
assumption.
apply l9_2.
assumption.
eapply one_side_transitivity.
apply H22.
apply one_side_symmetry.
assumption.
unfold InAngle in H22.
spliter.
ex_and H25 E''.

induction H26.
subst E''.
apply False_ind.
apply H15.
apply bet_col in H25.
Col.

assert(Conga B A C D A E'').
eapply (out_conga B A C D A E').
auto.
apply out_trivial; auto.
apply out_trivial; auto.
apply out_trivial; auto.
apply l6_6.
auto.

assert(A T).
intro.
subst T.
apply H15.
Col.

induction(eq_dec_points E'' T).
subst E''.
apply l13_2_1; auto.
eapply out_conga.
apply conga_left_comm.
apply H27.
apply out_trivial; auto.
apply out_trivial; auto.
apply out_trivial; auto.
unfold out.
repeat split; auto.

assert(D E'').
intro.
subst E''.
apply conga_sym in H27.
apply eq_conga_out in H27.
apply out_col in H27.
apply H5.
Col.
assert(C E'').
intro.
subst E''.
assert(out A B D two_sides C A B D).
apply(l11_22_aux C A B D).
apply conga_comm.
assumption.
induction H31.
apply out_col in H31.
apply H6.
Col.
assert(one_side A C B D).
apply ts_ts_os.
assumption.
apply ts_per_per_ts; auto.
apply invert_one_side in H32.
apply l9_9 in H31.
contradiction.

assert(A E'').
intro.
subst E''.
unfold out in H26.
tauto.

assert(¬ Col E'' A B).
intro.
apply H29.
apply bet_col in H25.
apply (inter_unicity A B C D); Col.

assert(Conga C A E'' D A B).

apply (l11_22 C A E'' B D A B E'').
split.

induction(one_side_dec A B C E'').
right.

split.
auto.

unfold one_side.
C.
split.

unfold two_sides.
repeat split.
auto.
intro.
apply H15.
apply bet_col in H25.
apply col_permutation_1.
eapply (col_transitivity_1 _ E''); Col.
intro.
apply bet_col in H25.
apply H15.
apply col_permutation_2.
eapply (col_transitivity_1 _ E''); Col.

E''.
split; Col.

assert(two_sides A E'' T C).
unfold two_sides.
repeat split.
auto.
intro.
apply H29.
apply (inter_unicity A B C D);Col.
eapply (col_transitivity_1 _ T); Col.
apply bet_col in H25.
Col.

intro.

apply H15.
ColR.

E''.
split.
Col.

assert(Bet C T E'' Bet C E'' T).
eapply l5_3.
apply H18.
Between.

induction H35.
assert(two_sides A B C E'').
unfold two_sides.
repeat split; auto.

T.
split.
Col.
auto.
apply l9_9 in H36.
contradiction.
Between.

eapply (l9_5 _ _ T _ A); Col.

unfold out.
repeat split; auto.

left.

apply not_one_side_two_sides in H34; auto.
split.
auto.

assert(one_side A B D E'').
eapply l9_8_1.
apply l9_2.
apply H.
apply l9_2.
assumption.

assert(two_sides A E'' T D).
unfold two_sides.
repeat split.
auto.
intro.
apply H33.
apply col_permutation_2.
apply(col_transitivity_1 _ T); Col.
intro.
apply bet_col in H25.
apply H15.
apply col_permutation_1.
eapply (col_transitivity_1 _ E''); Col.

E''.
split.
Col.

assert(Bet D T E'' Bet D E'' T).
eapply l5_3.
apply between_symmetry.
apply H18.
assumption.

induction H36.

assert(two_sides A B D E'').
unfold two_sides.
repeat split; auto.
T.
split; Col.
apply l9_9 in H37.
contradiction.
Between.

apply l9_2.

eapply (l9_5 _ _ T _ A).
auto.
Col.
unfold out.
repeat split; auto.
split.
apply conga_left_comm.
auto.
apply conga_right_comm.
apply conga_refl; auto.


prolong B C C' B C.
prolong B D D' B D.

assert(Cong_3 B A D D' A D).

apply l8_2 in H1.
unfold Per in H1.
ex_and H1 D''.

assert(is_midpoint D B D').
unfold is_midpoint.
split; Cong.
assert(D' = D'').
eapply symmetric_point_unicity.
apply H40.
auto.
subst D''.
repeat split; Cong.
assert(Conga B A D D' A D).
apply cong3_conga; auto.

assert(Cong_3 B A C C' A C).
apply l8_2 in H0.
unfold Per in H0.
ex_and H0 C''.

assert(is_midpoint C B C').
unfold is_midpoint.
split; Cong.
assert(C' = C'').
eapply symmetric_point_unicity.
apply H42.
auto.
subst C''.
repeat split; Cong.
assert(Conga B A C C' A C).
apply cong3_conga; auto.

assert(Conga E'' A C' D' A E'').

apply l11_22 with C D.
split.

clear HH.


left.

assert(one_side C A D E'').

eapply out_out_one_side.
apply one_side_reflexivity.
intro.
apply H15.
Col.
unfold out.
repeat split; auto.
right.
Between.

assert(one_side C A B D).
apply in_angle_one_side.
intro.
apply H15.
Col.
intro.
apply H5.
Col.
apply l11_24.
auto.

assert(two_sides C A B C').
unfold two_sides.
repeat split.
auto.
intro.
apply H5.
Col.

intro.
apply H5.
apply bet_col in H35.

assert(C C').
intro.
subst C'.
apply cong_symmetry in H36.
apply cong_identity in H36.
subst C.
apply H16.
Col.
eapply (col_transitivity_1 _ C'); Col.
C.
split; Col.

assert(one_side C A B E'').
eapply one_side_transitivity.
apply H44.
auto.

assert(one_side D A C E'').

eapply out_out_one_side.
apply one_side_reflexivity.
intro.
apply H15.
Col.
unfold out.
repeat split; auto.

assert(one_side D A B C).
apply in_angle_one_side.
intro.
apply H15.
Col.
intro.
apply H6.
Col.
auto.

assert(two_sides D A B D').
unfold two_sides.
repeat split.
auto.
intro.
apply H6.
Col.

intro.
apply H6.
apply bet_col in H37.

assert(D D').
intro.
subst D'.
apply cong_symmetry in H38.
apply cong_identity in H38.
subst D.
apply H16.
Col.
eapply (col_transitivity_1 _ D'); Col.
D.
split; Col.

assert(one_side D A B E'').
eapply one_side_transitivity.
apply H48.
auto.

split.

apply invert_two_sides.
eapply l9_8_2.
apply H45.
auto.

apply invert_two_sides.
apply l9_2.
eapply l9_8_2.
apply H49.
auto.

split.
eapply conga_trans.
apply conga_comm.
apply H34.
apply H40.
apply conga_sym.
eapply conga_trans.
apply conga_sym.
apply H27.
apply conga_right_comm.
auto.

assert(D' B).
intro.
subst D'.
apply between_identity in H37.
subst D.
apply H16.
Col.

assert(C' B).
intro.
subst C'.
apply between_identity in H35.
subst C.
apply H16.
Col.

assert(¬ Col C' D' B).
intro.
apply H16.
apply bet_col in H35.
apply bet_col in H37.

assert(Col C' B D).
ColR.
ColR.

assert(Par_strict C' D' C D).

apply(triangle_mid_par C' D' B D C).
auto.
unfold is_midpoint.
split.
Between.
Cong.
unfold is_midpoint.
split.
Between.
Cong.

assert(two_sides A E'' C D).

unfold two_sides.
repeat split.
auto.
intro.
apply H15.
apply bet_col in H25.
apply col_permutation_2.
eapply (col_transitivity_1 _ E''); Col.
intro.

apply H15.
apply bet_col in H25.
apply col_permutation_1.
eapply (col_transitivity_1 _ E''); Col.

E''.
split; Col.
Between.

assert(two_sides B A C D).
apply in_angle_two_sides.
intro.
apply H5.
Col.
intro.
apply H6.
Col.
apply l11_24.
assumption.
assert (one_side A B C C').
apply (out_one_side_1 _ _ _ _ B); Col.
unfold out.
repeat split; auto.

intro.
subst C.
apply H5.
Col.

assert (one_side A B D D').
apply (out_one_side_1 _ _ _ _ B); Col.
unfold out.
repeat split; auto.

intro.
subst D.
apply H6.
Col.

apply invert_two_sides in H49.

assert(two_sides A B C' D).
eapply l9_8_2.
apply H49.
auto.

assert(two_sides A B C' D').
apply l9_2.
eapply l9_8_2.
apply l9_2.
apply H52.
auto.

assert(Perp C' D' A E'').
eapply cong_conga_perp.

apply conga_right_comm in H43.
apply l11_22_aux in H43.

induction H43.

assert(one_side A B C' D').
eapply (out_one_side_1 _ _ _ _ A); Col.
intro.

assert(B C').
intro.
subst C'.
apply H46.
Col.
apply H5.
apply col_permutation_1.
eapply col_transitivity_1.
apply H55.
apply bet_col in H35.
Col.
Col.
apply l9_9 in H53.
contradiction.
apply invert_two_sides.
assumption.
unfold Cong_3 in ×.
spliter.
eCong.
apply conga_left_comm.
assumption.

assert(Perp C D A E'').
eapply par_perp_perp.
left.
apply H47.
assumption.
assert(Col A E E'').
eapply perp_perp_col.
apply H3.
apply perp_sym.
assumption.

assert(E'' = E).
eapply (inter_unicity C D A E).
apply bet_col in H25.
Col.
apply out_col in H26.
Col.
Col.
Col.
intro.
apply H15.
Col.
apply perp_not_eq_1 in H3.
assumption.
subst E''.
split.
auto.
split.
apply conga_sym.
apply conga_right_comm.
auto.
Between.
Qed.

Lemma l13_8 : O P Q U V, U OV OCol O P QCol O U V
                                → Per P U OPer Q V O → (out O P Q out O U V).
intros.

induction(eq_dec_points P U).
subst P.

assert(Col Q V O).
ColR.
assert(HH:= l8_9 Q V O H4 H5).
induction HH.
subst Q.
tauto.
subst V.
tauto.

assert(Q V).
intro.
subst Q.
assert(HH:= per_not_col P U O H5 H H3).
apply HH.
ColR.

assert(projp P U O U).
unfold projp.
split.
auto.
left.
split.
Col.
apply per_perp_in in H3; auto.
apply perp_in_perp in H3.
induction H3.
apply perp_not_eq_1 in H3.
tauto.
apply perp_sym.
apply perp_right_comm.
assumption.

assert(projp Q V O U).
unfold projp.
split.
auto.
left.
split.
Col.
apply per_perp_in in H4; auto.
apply perp_in_perp in H4.
induction H4.
apply perp_not_eq_1 in H4.
tauto.
eapply perp_col.
auto.

apply perp_sym.
apply perp_right_comm.
apply H4.
Col.

assert(projp O O O U).
unfold projp.
split.
auto.
right; Col.

split.
intro.
unfold out.
repeat split; auto.
unfold out in H10.
spliter.
induction H12.

left.
apply (projp_preserves_bet O P Q _ _ _ O U); auto.

right.
apply (projp_preserves_bet O Q P _ _ _ O U); auto.

intro.

assert(HH:= perp_vector U O H).
ex_and HH X.

ex_and H11 Y.

assert(P O).
intro.
subst P.
apply perBAB in H3.
subst U.
tauto.

assert(Q O).
intro.
subst Q.
apply perBAB in H4.
subst V.
tauto.

assert(X Y).
apply perp_not_eq_2 in H12.
auto.

assert(¬ Par O P X Y ).
intro.

assert(Perp O P U O).
apply(par_perp_perp X Y O P U O).
apply par_symmetry.
assumption.
Perp.
assert(Per P O U).
eapply perp_in_per.
apply perp_in_sym.
apply perp_perp_in.
Perp.
apply H.
eapply (l8_7 P); auto.

assert(project O O O P X Y).
unfold project.
split.
auto.
split.
auto.
split.
auto.
split.
Col.
right.
auto.

assert(project U P O P X Y).
split.
auto.
split.
auto.
split.
auto.
split.
Col.
left.
apply per_perp_in in H3; auto.
apply perp_in_sym in H3.
apply perp_in_perp in H3.
induction H3.
apply (l12_9 _ _ _ _ O U).
apply I.
Perp.
Perp.
apply perp_not_eq_1 in H3.
tauto.

assert(project V Q O P X Y).
split.
auto.
split.
auto.
split.
auto.
split.
Col.
left.
apply per_perp_in in H4; auto.
apply perp_in_sym in H4.
apply perp_in_perp in H4.
induction H4.
apply (l12_9 _ _ _ _ O V).
apply I.
eauto with perp.
eauto with perp.
apply perp_not_eq_1 in H4.
tauto.

repeat split;
auto.

unfold out in H10.
spliter.
induction H20.
left.
eapply project_preserves_bet.
apply H20.
apply H16.
assumption.
assumption.

right.
eapply project_preserves_bet.
apply H20.
apply H16.
assumption.
assumption.
Qed.

Definition Perp2 := fun A B C D P X, Y, Col P X Y Perp X Y A B Perp X Y C D.

Lemma perp2_refl : A B P, A BPerp2 A B A B P.
intros.
induction(Col_dec A B P).
assert(HH:=not_col_exists A B H).
ex_and HH X.

assert(HH:=l10_15 A B P X H0 H1).
ex_and HH Q.
unfold Perp2.
Q.
P.
split; Perp.
Col.

assert(HH:=l8_18_existence A B P H0).
ex_and HH Q.
unfold Perp2.
P.
Q.
split; Perp.
Col.
Qed.

Lemma perp2_sym : A B C D P, Perp2 A B C D PPerp2 C D A B P.
unfold Perp2.
intros.
ex_and H X.
ex_and H0 Y.
X.
Y.
repeat split; Perp.
Qed.

Lemma perp2_left_comm : A B C D P, Perp2 A B C D PPerp2 B A C D P.
unfold Perp2.
intros.
ex_and H X.
ex_and H0 Y.
X.
Y.
repeat split; Perp.
Qed.

Lemma perp2_right_comm : A B C D P, Perp2 A B C D PPerp2 A B D C P.
unfold Perp2.
intros.
ex_and H X.
ex_and H0 Y.
X.
Y.
repeat split; Perp.
Qed.

Lemma perp2_comm : A B C D P, Perp2 A B C D PPerp2 B A D C P.
unfold Perp2.
intros.
ex_and H X.
ex_and H0 Y.
X.
Y.
repeat split; Perp.
Qed.

Lemma perp2_trans : A B C D E F P, Perp2 A B C D PPerp2 C D E F PPerp2 A B E F P.
intros.
unfold Perp2 in ×.
ex_and H X.
ex_and H1 Y.
ex_and H0 X'.
ex_and H3 Y'.
assert(Par X Y X' Y').
eapply (l12_9 _ _ _ _ C D); Perp.
apply I.
X.
Y.

assert(Col X X' Y').
induction H5.
unfold Par_strict in H5.
spliter.
apply False_ind.
apply H8.
P.
split; Col.
spliter.
auto.
assert(Col Y X' Y').
induction H5.
unfold Par_strict in H5.
spliter.
apply False_ind.
apply H9.
P.
split; Col.
spliter.
auto.
repeat split; auto.
assert(X Y).
apply perp_not_eq_1 in H1.
assert(X' Y').
apply perp_not_eq_1 in H3.
auto.
auto.

induction(eq_dec_points X Y').
subst Y'.
apply (perp_col _ X').
auto.
Perp.
ColR.

apply (perp_col _ Y').
auto.
apply perp_left_comm.
apply(perp_col _ X').
auto.
Perp.
ColR.
apply par_symmetry in H5.
induction H5.
unfold Par_strict in H5.
spliter.
apply False_ind.
apply H12.
P.
split; Col.
spliter.
Col.
Qed.

Lemma perp2_par : A B C D O, Perp2 A B C D OPar A B C D.
intros.
unfold Perp2 in H.
ex_and H X.
ex_and H0 Y.
eapply (l12_9 _ _ _ _ X Y).
apply I.
Perp.
Perp.
Qed.

Lemma perp2_preserves_bet : O A B A' B', Bet O A BCol O A' B'¬Col O A A'
Perp2 A A' B B' OBet O A' B'.
Proof.
intros.

assert(O A').
intro.
subst A'.
apply H1.
Col.
assert( A A').
intro.
subst A'.
apply H1.
Col.

assert(¬ Par O A' A A').
intro.
unfold Par in H5.
induction H5.
unfold Par_strict in H5.
spliter.
apply H8.
A'.
split; Col.
spliter.
contradiction.

eapply (project_preserves_bet O A' A A' O A B O A' B');
auto;
unfold project;
repeat split; Col.
left.
apply par_reflexivity.
auto.
left.
apply perp2_par in H2.
apply par_symmetry.
auto.
Qed.

Lemma perp2_perp_in : A B C D O, Perp2 A B C D O¬Col O A B ¬Col O C D
  P, Q, Col A B P Col C D Q Col O P Q Perp_in P O P A B Perp_in Q O Q C D.
Proof.
intros.
unfold Perp2 in H.
ex_and H X.
ex_and H1 Y.
assert(X Y).
apply perp_not_eq_1 in H2.
auto.
assert(HH:= perp_inter_perp_in X Y A B H2).
ex_and HH P.
assert(HH:= perp_inter_perp_in X Y C D H3).
ex_and HH Q.
P.
Q.
split; auto.
split; auto.
split.
apply (col3 X Y); Col.
split.

induction(eq_dec_points X O).
subst X.

apply perp_in_sym.
apply(perp_in_col_perp_in A B O Y P P).
intro.
subst P.
apply H.
Col.
Col.
apply perp_in_sym.
auto.
assert(Perp_in P A B X O).

apply(perp_in_col_perp_in A B X Y O P H11).
Col.
apply perp_in_sym.
auto.

apply perp_in_right_comm in H12.
eapply (perp_in_col_perp_in _ _ _ _ P) in H12 .
apply perp_in_sym.
auto.
intro.
subst P.
apply H.
Col.
ColR.

induction(eq_dec_points X O).
subst X.

apply perp_in_sym.
apply(perp_in_col_perp_in C D O Y Q Q).
intro.
subst Q.
apply H0.
Col.
Col.
apply perp_in_sym.
auto.
assert(Perp_in Q C D X O).

apply(perp_in_col_perp_in C D X Y O Q H11).
Col.
apply perp_in_sym.
auto.

apply perp_in_right_comm in H12.
eapply (perp_in_col_perp_in _ _ _ _ Q) in H12 .
apply perp_in_sym.
auto.
intro.
subst Q.
apply H0.
Col.
ColR.
Qed.

Lemma perp_vector1 : A B P, A B Q, Perp A B P Q.
intros.
induction (Col_dec A B P).
assert(HH:=not_col_exists A B H).
ex_and HH X.

assert(HH:= l10_15 A B P X H0 H1).
ex_and HH Q.
Q.
Perp.

assert(HH:=l8_18_existence A B P H0).
ex_and HH Q.
Q.
auto.
Qed.

Lemma par_perp2 : A B C D P, Par A B C DPerp2 A B C D P.
intros.
apply par_distincts in H.
spliter.
unfold Perp2.
assert(HH:= perp_vector1 A B P H0).
ex_and HH Q.
P.
Q.
repeat split.
Col.
Perp.
apply perp_sym.
apply (par_perp_perp A B); auto.
Qed.

End L13.