Library Ch13_4_cos


Require Export Ch13_3_angles.

Ltac anga_instance_o a A B P C :=
        assert(tempo_anga:= anga_const_o a A B P);
        match goal with
           |H: anga a |- _assert(tempo_H:= H); apply tempo_anga in tempo_H; ex_elim tempo_H C
        end;
        clear tempo_anga.

Section Cosinus.

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


Definition lcos := fun lb lc alg lb lg lc anga a
                                  ( A, B, C, (Per C B A lb A B lc A C a B A C)).

Lemma l13_6 : a lc ld l, lcos lc l alcos ld l aeqL lc ld.
Proof.
intros.
unfold lcos in ×.
spliter.
ex_and H6 X1.
ex_and H7 Y1.
ex_and H6 Z1.
ex_and H3 X2.
ex_and H10 Y2.
ex_and H3 Z2.
clean_duplicated_hyps.
assert(is_len X1 Z1 l).
split; auto.
assert(is_len X2 Z2 l).
split; auto.
assert(Cong X1 Z1 X2 Z2).
eapply (is_len_cong _ _ _ _ l); auto.

assert(is_anga Y1 X1 Z1 a).
split; auto.
assert(is_anga Y2 X2 Z2 a).
split; auto.
assert(Conga Y1 X1 Z1 Y2 X2 Z2).
apply (is_anga_conga _ _ _ _ _ _ a);
split; auto.

assert(is_len X1 Y1 lc).
split; auto.
assert(is_len X2 Y2 ld).
split; auto.

induction(eq_dec_points Z1 Y1).
subst Z1.
assert(out X2 Y2 Z2).
apply (eq_conga_out Y1 X1); auto.
assert(Y2 = Z2).

assert(Z2 = Y2 X2 = Y2).
apply l8_9.
auto.
apply out_col in H19.
Col.
induction H20.
auto.

unfold out in H19.
spliter.
subst Y2.
tauto.
subst Z2.

assert(eqL l lc).
apply ex_eql.
X1.
Y1.
split; auto.
assert(eqL l ld).
apply ex_eql.
X2.
Y2.
split; auto.

eapply (eql_trans _ l _); auto.
apply eql_sym; auto.

assert(Z2 Y2).
intro.
subst Z2.

assert(out X1 Y1 Z1).
apply (eq_conga_out Y2 X2).
apply conga_sym.
auto.

assert(Y1 = Z1).

assert(Z1 = Y1 X1 = Y1).
apply l8_9.
auto.
apply out_col in H20.
Col.
induction H21.
auto.
subst Y1.
unfold out in H20.
spliter.
tauto.
subst Z1.
tauto.

apply conga_distinct in H16.
spliter.

assert(Conga X1 Y1 Z1 X2 Y2 Z2).
apply l11_16;
Perp; auto.

assert(¬Col Z1 X1 Y1).
intro.
assert(X1 = Y1 Z1 = Y1).
apply l8_9.
Perp.
Col.
induction H27.
subst Y1.
tauto.
contradiction.
apply conga_comm in H16.
apply cong_commutativity in H13.

assert(HH:=l11_50_2 Z1 X1 Y1 Z2 X2 Y2 H26 H25 H16 H13).
spliter.

apply ex_eql.
X1.
Y1.
split.
auto.
eapply is_len_cong_is_len.
apply H18.
Cong.
Qed.

Lemma null_lcos_eql : lp l a, lcos lp l ais_null_anga aeqL l lp.
Proof.
intros.

unfold lcos in H.
spliter.
ex_and H3 A.
ex_and H4 B.
ex_and H3 C.

unfold is_null_anga in H0.
spliter.

assert(HH:= H7 B A C H6).

assert(Col A B C) by (apply out_col;auto).

assert(Col C B A) by Col.

assert(HQ:= l8_9 C B A H3 H9).

induction HQ.
subst C.

apply (all_eql A B).
split; auto.
split; auto.
subst B.
exfalso.
unfold out in HH.
tauto.
Qed.

Lemma eql_lcos_null : l lp a, lcos l lp aeqL l lpis_null_anga a.
Proof.
intros.

unfold lcos in H.
spliter.
ex_and H3 B.
ex_and H4 A.
ex_and H3 C.

assert( A0 B0 : Tpoint, l A0 B0 lp A0 B0).
apply H0; auto.

assert(HP:= (H7 B A)).
assert(HQ:= (H7 B C)).
destruct HP.
destruct HQ.

assert(l B C).
apply H11.
auto.
assert(lp B A).
apply H8.
auto.
clear H7 H8 H9 H10 H11.
assert(Cong B A B C).
apply (lg_cong l); auto.
unfold Per in H3.
ex_and H3 B'.

assert(HH:= anga_distinct a A B C H2 H6).
spliter.

assert(A = C).
eapply (l4_18 B B').
intro.
subst B'.
apply l7_3 in H3.
contradiction.
unfold is_midpoint in H3;
assert(HH:= midpoint_col).
spliter.
apply bet_col in H3.
Col.
auto.
unfold is_midpoint in H3.
spliter.
eapply cong_transitivity.
apply cong_symmetry.
apply cong_commutativity.
apply H11.
eapply cong_transitivity.
apply cong_commutativity.
apply H7.
Cong.
subst C.

unfold is_null_anga.
split.
auto.

intros A0 B0 C0 HP.
apply (eq_conga_out A B).
apply (anga_conga a); auto.
Qed.

Lemma lcos_lg_not_null: l lp a, lcos l lp a¬lg_null l ¬lg_null lp.
Proof.
intros.
unfold lcos in H.
spliter.
ex_and H2 A.
ex_and H3 B.
ex_and H2 C.
assert(HH:= anga_distinct a B A C H1 H5).
spliter.
unfold lg_null.
split;
intro;
spliter;
ex_and H9 X.
assert (Cong A B X X) by (apply (lg_cong l); auto).
treat_equalities;intuition.
assert(Cong A C X X) by (apply (lg_cong lp); auto).
treat_equalities;intuition.
Qed.

Lemma anga_col_out : a A B C, anga aa A B CCol A B Cout B A C.
Proof.
intros.

assert(acute A B C).
apply (anga_acute a); auto.
unfold Col in H1.
induction H1.
apply acute_not_bet in H2.
contradiction.
unfold out.
apply (anga_distinct a A B C) in H.
spliter.
repeat split; auto.
induction H1.
right.
auto.
left.
Between.
auto.
Qed.

Lemma perp_acute_out : A B C C', acute A B CPerp A B C C'Col A B C'out B A C'.
Proof.
intros.

assert (HH:= H).
unfold acute in HH.
ex_and HH A0.
ex_and H2 B0.
ex_and H3 C0.

assert(HH:=H3).
unfold lta in HH.
spliter.
unfold lea in H4.
ex_and H4 P0.
apply conga_distinct in H6.
spliter.

assert(C' B).
intro.
subst C'.

assert(Per A B C).
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in; auto.
Perp.
unfold InAngle in H4.
spliter.
apply H5.
apply l11_16; auto.

induction H1.
apply False_ind.
assert(HH:= H4).
unfold InAngle in HH.
spliter.
ex_and H15 X.

induction H16.
subst X.
assert(¬ Col A0 B0 C0).
apply per_not_col; auto.
assert(Col A0 B0 C0).
apply bet_col.
auto.
contradiction.

assert(lea A B C A0 B0 C0).
unfold lta in H3.
spliter.
auto.

assert(HQ:= l11_29_a A B C A0 B0 C0 H17).
ex_and HQ Q.

assert(Per A B Q).
apply (l11_17 A0 B0 C0).
auto.
apply conga_sym.
auto.

assert(Perp_in B Q B A B).
apply perp_in_right_comm.
apply per_perp_in.
apply conga_distinct in H19.
spliter.
auto.
auto.
apply l8_2.
auto.

assert(HH:= perp_in_perp Q B A B B H21).
induction HH.
apply perp_distinct in H22.
tauto.

assert(HH:= l12_9 Q B C C' A B I).

assert(Par Q B C C').
apply HH; Perp.

assert(one_side B Q C C').

apply l12_6.
induction H23.
apply par_strict_left_comm.
auto.
spliter.
apply False_ind.

assert(¬Col B C' C).

apply per_not_col;
auto.
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
apply perp_comm.

apply (perp_col _ A); Perp.
apply bet_col in H1.
Col.
apply H27.
Col.

assert(one_side Q B C A).
eapply in_angle_one_side.
intro.

assert(¬ Col B Q A).

apply( perp_not_col).
Perp.
apply H26.
Col.
intro.
apply H11.
eapply (l8_18_unicity A B Q).
intro.
assert(¬Col B A Q).
apply perp_not_col.
Perp.
apply H27.
Col.
apply bet_col in H1.
Col.

apply perp_sym.
apply perp_left_comm.
eapply (perp_col _ C).
intro.
subst Q.
unfold one_side in H24.
ex_and H24 T.
unfold two_sides in H26.
spliter.
apply H27.
Col.
Perp.

unfold Par in H23.
induction H23.
apply False_ind.
apply H23.
C.
split; Col.
spliter.
Col.
Col.
Perp.
apply l11_24.
auto.
apply invert_one_side in H25.
assert(one_side B Q A C').
eapply one_side_transitivity.
apply one_side_symmetry.
apply H25.
assumption.

assert(¬ Col B A Q).
apply perp_not_col.
Perp.

assert(two_sides B Q A C').
unfold two_sides.
repeat split; auto.
apply perp_distinct in H22.
spliter.
auto.
intro.
apply H27.
Col.
intro.
apply H27.
apply bet_col in H1.
ColR.
B.
split.
Col.
auto.
apply l9_9_bis in H26.
contradiction.
unfold out.
repeat split; auto.
induction H1.
right.
auto.
left.
Between.
Qed.

Lemma perp_out_acute : A B C C', out B A C'Perp A B C C'Col A B C'acute A B C.
Proof.
intros.

assert(A B C C' B C').
apply perp_distinct in H0.
unfold out in H.
spliter.
repeat split; auto.
spliter.

assert(acute C' B C).

assert(Perp C' B C C').
apply perp_left_comm.
apply (perp_col _ A); Col.
Perp.

assert( M, is_midpoint M B C).
apply midpoint_existence.
ex_and H6 M.
prolong C' M P C' M.
assert(is_midpoint M C' P).
split; Cong.
assert(Plg C' B P C).
unfold Plg.
split.
right.
intro.
subst C.
apply l7_3 in H7.
subst M.

apply perp_not_col in H5.
apply H5.
Col.
M.
split; auto.

assert(Parallelogram C' B P C).
apply plg_to_parallelogram.
auto.

induction H11.
unfold acute.
C'.
B.
P.
split.

assert(Rectangle C' B P C).
apply plg_per_rect1.
auto.
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
apply perp_sym.

apply (perp_col _ A); Perp.
apply out_col in H.
auto.
eapply (rect_per2 _ _ _ C).
auto.

unfold lta.
split.
unfold lea.
C.
split.
apply plgs_in_angle.
auto.
apply conga_refl; auto.
intro.
subst C.

apply perp_not_col in H5.
apply H5.
Col.

assert(Par_strict C C' B P Par_strict C P C' B).
apply plgs_par_strict.
apply plgs_permut.
apply plgs_permut.
apply plgs_permut.
auto.
spliter.

intro.

apply l11_22_aux in H14.

induction H14.
apply H12.
apply out_col in H14.
C.
split; Col.
apply par_strict_symmetry in H13.

apply l12_6 in H13.
apply l9_9 in H14.
contradiction.

unfold Parallelogram_flat in H11.
spliter.
apply perp_not_col in H5.
contradiction.

assert(C B).
apply acute_distinct in H5.
spliter.
auto.

assert(Conga A B C C' B C).
apply (out_conga C' B C C' B C).
apply conga_refl; auto.

apply l6_6.
auto.
apply out_trivial; auto.
apply out_trivial; auto.
apply out_trivial; auto.
apply (acute_lea_acute A B C C' B C).
auto.
unfold lea.
C.
split.

apply in_angle_trivial_2; auto.
auto.
Qed.

Lemma perp_out__acute : A B C C', Perp A B C C'Col A B C' → (acute A B C out B A C').
Proof.
intros.
split.
intro.
apply (perp_acute_out _ _ C); auto.
intro.
apply (perp_out_acute _ _ C C'); auto.
Qed.

Lemma obtuse_not_acute : A B C, obtuse A B C¬ acute A B C.
Proof.
intros.
intro.
unfold obtuse in H.
unfold acute in H0.

ex_and H A0.
ex_and H1 B0.
ex_and H C0.

ex_and H0 A1.
ex_and H2 B1.
ex_and H0 C1.

assert(A0 B0 C0 B0 A1 B1 C1 B1 A B C B).
unfold gta in H1.
unfold lta in ×.
unfold lea in ×.
spliter.
ex_and H1 P0.
ex_and H2 P.
unfold InAngle in H2.
unfold Conga in H5 .
unfold Conga in H6 .
spliter.
repeat split; auto.
spliter.

assert(Conga A0 B0 C0 A1 B1 C1).
apply l11_16; auto.

assert(gta A B C A1 B1 C1).
apply (conga_preserves_gta A B C A0 B0 C0).
apply conga_refl; auto.
auto.
assumption.

assert(HH:=not_lta_and_gta A B C A1 B1 C1).
apply HH.
split; auto.
Qed.

Lemma acute_not_obtuse : A B C, acute A B C¬ obtuse A B C.
Proof.
intros.
intro.
apply obtuse_not_acute in H0.
contradiction.
Qed.

Lemma perp_obtuse_bet : A B C C', Perp A B C C'Col A B C'obtuse A B CBet A B C'.
Proof.
intros.

assert(HH:= H1).
unfold obtuse in HH.
ex_and HH A0.
ex_and H2 B0.
ex_and H3 C0.

assert(A0 B0 C0 B0 A B C B).
unfold gta in H3.
unfold lta in H3.
spliter.
unfold lea in H3.
ex_and H3 P.
unfold Conga in H5.
spliter.
repeat split; auto.
intro.
subst C.
apply perp_comm in H.
apply perp_not_col in H.
apply H.
Col.
spliter.

assert(B C').
intro.
subst C'.

assert(Per A B C).
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
Perp.

assert(Conga A0 B0 C0 A B C).
apply l11_16; auto.

unfold gta in H3.
unfold lta in H3.
spliter.
unfold lea in H3.
contradiction.

induction H0.
auto.

assert(out B A C').
unfold out.
repeat split; auto.

induction H0.
right.
auto.
left.
Between.
eapply (perp_out_acute _ _ C) in H9.
apply obtuse_not_acute in H1.
contradiction.
auto.
apply out_col in H9.
Col.
Qed.

Lemma perp_bet_obtuse : A B C C', B C'Perp A B C C'Col A B C'Bet A B C'obtuse A B C.
Proof.
intros.

assert( M, is_midpoint M B C).
apply midpoint_existence.
ex_and H3 M.
prolong C' M P C' M.
assert(is_midpoint M C' P).
unfold is_midpoint.
split; auto.
Cong.
assert(Plg B C' C P).
unfold Plg.
split.
left.
intro.
subst C.
apply perp_comm in H0.
apply perp_not_col in H0.
apply H0.
Col.
M.
split; auto.

assert(Parallelogram B C' C P).
apply plg_to_parallelogram.
auto.
induction H8.
assert(Par_strict B C' C P Par_strict B P C' C).
apply plgs_par_strict.
auto.
spliter.

apply plgs_comm2 in H8.

assert(Rectangle C' B P C).
apply plg_per_rect.
apply parallelogram_to_plg.
left.
auto.
left.
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
apply perp_sym.
apply (perp_col _ A).
intro.
subst C'.
unfold Par_strict in H9.
tauto.
Perp.
Col.

assert(Per C' B P).
eapply rect_per1.
apply plg_per_rect.
apply H7.
right; left.
apply perp_in_per.
apply perp_in_sym.
apply perp_perp_in.
apply perp_comm.
apply (perp_col _ A).
auto.
Perp.
Col.

assert(A B C B P B).

apply perp_distinct in H0.
spliter.

repeat split.
auto.
intro.
subst C.
apply H10.
B.
split; Col.
intro.
subst P.
apply H10.
C.
split; Col.
spliter.

unfold obtuse.
A.
B.
P.
split.

apply l8_2.
eapply (per_col _ _ C').
auto.
Perp.
Col.

unfold gta.
unfold lta.
split.

unfold lea.
P.
split.
unfold InAngle.
repeat split; auto.

assert(one_side B P C C').
apply l12_6.
apply par_strict_right_comm.
auto.
assert(two_sides B P A C').
unfold two_sides.
repeat split.
auto.
intro.
apply H9.
P.
split.
ColR.
Col.
intro.
apply H10.
C'.
split; Col.
B.
split; Col.

assert(two_sides B P C A).
eapply l9_8_2.
apply l9_2.
apply H17.
apply one_side_symmetry.
auto.
unfold two_sides in H18.
spliter.
ex_and H21 T.
T.
split.

repeat split.
Between.
right.

assert(¬ Col T A B).
intro.
assert(T = B).
apply bet_col in H22.
apply (inter_unicity B A P B); Col.
subst T.
apply bet_col in H22.

assert(Col B C C').
ColR.

apply H9.
C.
split; Col.

induction H21.

assert(one_side A B T C).
eapply out_one_side_1.
auto.
intro.
apply H23.
Col.

apply col_trivial_3.
unfold out.
repeat split.
intro.
subst T.
apply bet_col in H21.
contradiction.
intro.
unfold one_side in H16.
subst C.
apply between_identity in H22.
subst T.
apply bet_col in H21.
contradiction.
left.
Between.

assert(one_side A B C P).
apply l12_6.
unfold Par_strict.
repeat split; auto.
intro.
subst P.
apply H10.
C.
split; Col.
intro.
ex_and H25 K.
apply H9.
K.
split.
ColR.
auto.
assert(one_side A B T P).
eapply one_side_transitivity.
apply H24.
auto.
assert(two_sides A B T P).
unfold two_sides.
repeat split.
auto.
auto.
intro.
unfold two_sides in H17.
spliter.
apply H28.
Col.
B.
split.
Col.
Between.
apply l9_9 in H27.
contradiction.
unfold out.
repeat split.
intro.
subst T.
apply H23.
Col.
intro.
subst P.
apply H10.
C.
split; Col.
induction H21.
right.
auto.
left.
Between.
apply conga_refl.
auto.
auto.

assert(Per P B A).
apply (per_col _ _ C').
auto.
Perp.
Col.
intro.

assert(Per A B C).
apply (l11_17 A B P).
Perp.
auto.
assert(Col C P B).
eapply (per_per_col _ _ A);
Perp.
apply H10.
C.
split; Col.

unfold Parallelogram_flat in H8.
spliter.
apply False_ind.

assert(Perp B C' C C').
apply (perp_col _ A).
auto.
Perp.
Col.
apply perp_left_comm in H13.
apply perp_not_col in H13.
apply H13.
Col.
Qed.

Lemma anga_conga_anga : a A B C A' B' C' , anga aa A B CConga A B C A' B' C'a A' B' C'.
Proof.
intros.
unfold anga in H.
ex_and H A0.
ex_and H2 B0.
ex_and H C0.
assert(HH := H2 A B C).
assert(HP := H2 A' B' C').
destruct HH.
destruct HP.
apply H4 in H0.
assert(Conga A0 B0 C0 A' B' C').
eapply conga_trans.
apply H0.
apply H1.
apply H5.
auto.
Qed.

Lemma anga_out_anga : a A B C A' C', anga aa A B Cout B A A'out B C C'a A' B C'.
Proof.
intros.
assert(HH:= H).
unfold anga in HH.
ex_and HH A0.
ex_and H3 B0.
ex_and H4 C0.
assert(HP:= H4 A B C).
destruct HP.
assert(Conga A0 B0 C0 A B C).
apply H6.
auto.

assert(HP:= anga_distincts a A B C H H0).
spliter.

assert(Conga A B C A' B C').
apply (out_conga A B C A B C).
apply conga_refl; auto.
apply out_trivial; auto.
apply out_trivial; auto.
auto.
auto.
assert(HH:= H4 A' B C').
destruct HH.
apply H11.
apply (conga_trans _ _ _ A B C);
auto.
Qed.

Lemma out_out_anga : a A B C A' B' C', anga aout B A Cout B' A' C'a A B Ca A' B' C'.
Proof.
intros.
assert(Conga A B C A' B' C').
apply l11_21_b; auto.
apply (anga_conga_anga a A B C); auto.
Qed.

Lemma is_null_all : a A B, A Bis_null_anga aa A B A.
Proof.
intros.
unfold is_null_anga in H0.
spliter.

assert(HH:= H0).
unfold anga in HH.
ex_and HH A0.
ex_and H2 B0.
ex_and H3 C0.
apply acute_distinct in H2.
spliter.
assert (HH:= H3 A0 B0 C0).
destruct HH.
assert (a A0 B0 C0).
apply H6.
apply conga_refl; auto.
assert(HH:= (H1 A0 B0 C0)).

eapply (out_out_anga a A0 B0 C0); auto.
apply out_trivial.
auto.
Qed.

Lemma lcos_const0 : l lp a, lcos lp l ais_null_anga a
  A, B, C, l A B lp B C a A B C.
Proof.
intros.
assert(HH:=H).
unfold lcos in HH.
spliter.

ex_and H4 A.
ex_and H5 B.
ex_and H4 C.
C.
A.
B.
repeat split.
apply lg_sym; auto.
auto.
apply anga_sym; auto.
Qed.

Lemma lcos_const1 : l lp a P, lcos lp l a¬ is_null_anga a
  A, B, C, ¬Col A B P one_side A B C P l A B lp B C a A B C.
Proof.
intros.
assert(HH:=H).
unfold lcos in HH.
spliter.

assert(HH:= (lcos_lg_not_null lp l a H)).
spliter.

lg_instance_not_col l P A B.
A.
B.

assert(HH:=anga_const_o a A B P H8 H0 H3).
ex_and HH C'.

assert(A B B C').
assert(HP:= anga_distinct a A B C' H3 H9).
spliter.
auto.
spliter.

assert(HH:=ex_point_lg_out lp B C' H12 H1 H5).
ex_and HH C.
C.
repeat split; auto.

assert(¬ Col A B C').
unfold one_side in H10.
ex_and H10 D.
unfold two_sides in H10.
spliter.
intro.
apply H16.
Col.

assert(HP:=out_one_side_1 A B C' C B H11 H15).
eapply (one_side_transitivity _ _ _ C').
apply one_side_symmetry.

apply HP.
Col.
apply l6_6.
auto.
auto.
apply (anga_out_anga a A B C'); auto.
apply out_trivial.
auto.
apply l6_6.
auto.
Qed.

Lemma lcos_const : lp l a, lcos lp l a
  A, B, C, lp A B l B C a A B C.
Proof.
intros.

unfold lcos in H.
spliter.
ex_and H2 A.
ex_and H3 B.
ex_and H2 C.
B.
A.
C.
repeat split; auto.
apply lg_sym; auto.
Qed.

Lemma lcos_lg_distincts : lp l a A B C, lcos lp l al A Blp B Ca A B CA B C B.
Proof.
intros.
assert(HH:= lcos_lg_not_null lp l a H).
spliter.
unfold lg_null in ×.
split.
intro.
subst B.
apply H4.
unfold lcos in H.
split.
tauto.
A.
auto.
intro.
subst C.
apply H3.
unfold lcos in H.
split.
tauto.
B.
auto.
Qed.

Lemma lcos_const_a : lp l a B, lcos lp l a A, C, l A B lp B C a A B C.
Proof.
intros.
assert(HH:=H).
unfold lcos in HH.
spliter.
clear H3.

assert(HH:= ex_point_lg l B H1).
ex_and HH A.
assert(l A B).
apply lg_sym; auto.
A.

assert(HH:= lcos_lg_not_null lp l a H).
spliter.

assert(A B).
intro.
subst A.
apply H6.
unfold lg_null.
split.
auto.
B.
auto.

assert(HH:= anga_const a A B H2 H7).
ex_and HH C'.

assert(HH:= anga_distincts a A B C' H2 H8).
spliter.
assert(B C'); auto.

assert(HH:= ex_point_lg_out lp B C' H11 H0 H5).
ex_and HH C.
C.
repeat split; auto.
apply (anga_out_anga a A B C' A C); auto.
apply out_trivial.
auto.
apply l6_6.
auto.
Qed.

Lemma lcos_const_ab : lp l a B A, lcos lp l al A B C, lp B C a A B C.
Proof.
intros.
assert(HH:=H).
unfold lcos in HH.
spliter.
clear H4.

assert(HH:= lcos_lg_not_null lp l a H).
spliter.

assert(A B).
intro.
subst A.
apply H5.
unfold lg_null.
split.
auto.
B.
auto.

assert(HH:= anga_const a A B H3 H6).
ex_and HH C'.

assert(HH:= anga_distincts a A B C' H3 H7).
spliter.
assert(B C'); auto.

assert(HH:= ex_point_lg_out lp B C' H10 H1 H4).
ex_and HH C.
C.
repeat split; auto.
apply (anga_out_anga a A B C' A C); auto.
apply out_trivial.
auto.
apply l6_6.
auto.
Qed.

Lemma lcos_const_cb : lp l a B C, lcos lp l alp B C A, l A B a A B C.
Proof.
intros.
assert(HH:=H).
unfold lcos in HH.
spliter.
clear H4.

assert(HH:= lcos_lg_not_null lp l a H).
spliter.

assert(C B).
intro.
subst C.
apply H4.
unfold lg_null.
split.
auto.
B.
auto.

assert(HH:= anga_const a C B H3 H6).
ex_and HH A'.

assert(HH:= anga_distincts a C B A' H3 H7).
spliter.
assert(B A'); auto.

assert(HH:= ex_point_lg_out l B A' H10 H2 H5).
ex_and HH A.

A.
split.
apply lg_sym; auto.

apply(anga_out_anga a A' B C); auto.
apply anga_sym; auto.
apply l6_6.
auto.
apply out_trivial.
auto.
Qed.

Lemma lcos_lg_anga : l lp a, lcos lp l alcos lp l a lg l lg lp anga a.
Proof.
intros.
split.
auto.
unfold lcos in H.
tauto.
Qed.

Lemma eql_lg : l1 l2, eqL l1 l2lg l1 lg l2.
Proof.
intros.
unfold eqL in H.
tauto.
Qed.

Lemma lcos_eql_lcos : lp1 l1 lp2 l2 a, eqL lp1 lp2eqL l1 l2lcos lp1 l1 alcos lp2 l2 a.
Proof.
intros.
unfold lcos in ×.
spliter.
ex_and H4 A.
ex_and H5 B.
ex_and H4 C.

assert(HH:=eql_lg l1 l2 H0).
assert(HP:=eql_lg lp1 lp2 H).
spliter.

repeat split; auto.

A.
B.
C.
unfold eqL in ×.
spliter.
repeat split; auto.
apply H15.
auto.
apply H13; auto.
Qed.

Lemma ang_not_lg_null : a la lc A B C, lg lalg lcang a
 la A Blc C Ba A B C¬ lg_null la ¬ lg_null lc.
Proof.
intros.
assert(HH:=ang_distincts a A B C H1 H4).
spliter.
split.
intro.

unfold lg_null in H7.
spliter.
ex_and H8 P.
assert(HH:= lg_cong la A B P P H H2 H9).
apply cong_identity in HH.
contradiction.

intro.
unfold lg_null in H7.
spliter.
ex_and H8 P.
assert(HH:= lg_cong lc C B P P H0 H3 H9).
apply cong_identity in HH.
contradiction.
Qed.

Lemma anga_not_lg_null : a la lc A B C, lg lalg lc
 anga ala A Blc C Ba A B C¬ lg_null la ¬ lg_null lc.
Proof.
intros.
apply anga_is_ang in H1.
apply(ang_not_lg_null a la lc A B C); auto.
Qed.

Lemma lcos_not_lg_null : lp l a, lcos lp l a¬ lg_null lp.
Proof.
intros.
intro.
unfold lg_null in H0.
spliter.
unfold lcos in H.
spliter.
ex_and H4 B.
ex_and H5 A.
ex_and H4 C.
ex_and H1 P.
unfold lg in H0.
ex_and H0 X.
ex_and H1 Y.
assert(HH:= (H0 B A)).
destruct HH.
assert(HH:= (H0 P P)).
destruct HH.
apply H11 in H8.
apply H9 in H5.
assert(Cong B A P P).
apply (cong_transitivity _ _ X Y); Cong.
assert(A = B).
eapply (cong_identity _ _ P).
Cong.
assert(HH:=anga_distincts a A B C H3 H7).
spliter.
contradiction.
Qed.

Lemma lcos_const_o : lp l a A B P, ¬ Col A B P¬ is_null_anga alg llg lp
  anga al A Blcos lp l a
   C, one_side A B C P a A B C lp B C.
Proof.
intros.

assert(HH:= anga_const_o a A B P H H0 H3).
ex_and HH C'.
assert(A B C' B).
apply (anga_distincts a);
auto.
spliter.

assert(HH:= lcos_not_lg_null lp l a H5).

assert (B C').
intro.
apply H9.
auto.
assert(HP:=lg_exists C' B).
ex_and HP lc'.

assert(HQ:=anga_not_lg_null a l lc' A B C' H1 H11 H3 H4 H12 H6).
spliter.

assert(HR:= ex_point_lg_out lp B C' H10 H2 HH).
ex_and HR C.
C.

split.
apply invert_one_side.
apply one_side_symmetry.
apply (out_out_one_side _ _ _ C').
apply invert_one_side.
apply one_side_symmetry.
auto.
apply l6_6.
auto.
split.
eapply (anga_out_anga a A B C'); auto.
apply out_trivial.
auto.
apply l6_6.
auto.
auto.
Qed.

Lemma anga_col_null : a A B C, anga aa A B CCol A B Cout B A C is_null_anga a.
Proof.
intros.
assert(HH:= anga_distincts a A B C H H0).
spliter.

assert(out B A C).
induction H1.
assert(HP:=anga_acute a A B C H H0).
assert(HH:=acute_not_bet A B C HP).
contradiction.

induction H1.
unfold out.
repeat split; auto.
unfold out.
repeat split; auto.
left.
Between.
split.
auto.
apply (out_null_anga a A B C); auto.
Qed.

Lemma flat_not_acute : A B C, Bet A B C¬ acute A B C.
Proof.
intros.
intro.
unfold acute in H0.
ex_and H0 A'.
ex_and H1 B'.
ex_and H0 C'.
unfold lta in H1.
spliter.
unfold lea in H1.
ex_and H1 P'.
unfold InAngle in H1.
spliter.
ex_and H6 X.
apply conga_distinct in H3.
spliter.
assert(A C).
intro.
subst C.
apply between_identity in H.
contradiction.
induction H7.
subst X.
apply H2.
apply conga_line; auto.
repeat split; auto.
repeat split; auto.
intro.
subst C'.
apply between_identity in H6.
contradiction.

assert(Conga A B C A' B' X).
apply (out_conga A B C A' B' P').
auto.
apply out_trivial; auto.
apply out_trivial; auto.
apply out_trivial; auto.
apply l6_6.
auto.
apply H2.

assert(Bet A' B' X).
apply (bet_conga_bet A B C); auto.

apply conga_line.
repeat split; auto.
repeat split; auto.
intro.
subst C'.
apply between_identity in H6.
subst X.
contradiction.
auto.
apply (between_exchange4 _ _ X); auto.
Qed.

Lemma acute_comp_not_acute : A B C D, Bet A B Cacute A B D¬ acute C B D.
Proof.
intros.
intro.

induction(Col_dec A C D).
induction H2.

assert(Bet A B D).
eBetween.
assert(HH:= flat_not_acute A B D H3).
contradiction.
induction H2.
assert(Bet A B D Bet A D B).
apply (l5_3 A B D C).
auto.
Between.
induction H3.
assert(HH:= flat_not_acute A B D H3).
contradiction.
assert(Bet C B D).
eBetween.
assert(HH:= flat_not_acute C B D H4).
contradiction.
assert(Bet C B D).
eBetween.
assert(HH:= flat_not_acute C B D H3).
contradiction.

unfold acute in ×.
ex_and H0 A0.
ex_and H3 B0.
ex_and H0 C0.

ex_and H1 A1.
ex_and H4 B1.
ex_and H1 C1.

apply lta_diff in H3.
apply lta_diff in H4.
spliter.

assert(HH:=l11_16 A0 B0 C0 A1 B1 C1 H0 H11 H12 H1 H7 H8).

assert(lta C B D A0 B0 C0).

eapply(conga_preserves_lta C B D A1 B1 C1).
apply conga_refl; auto.
apply conga_sym.
auto.
auto.
clear H4.

assert(A C).
intro.
subst C.
apply between_identity in H.
contradiction.

assert(Col A C B).
apply bet_col in H.
Col.

assert(HP:= l10_15 A C B D H14 H2).
ex_and HP P.

assert(HP:= perp_col A C P B B H9 H15 H14).
apply perp_left_comm in HP.
apply perp_perp_in in HP.
assert(Per A B P).
apply perp_in_per.
apply perp_in_comm.
auto.

assert(HR:= perp_not_eq_2 A C P B H15).
assert(HQ:=l11_16 A B P A0 B0 C0 H17 H9 HR H0 H11 H12).

assert(lta A B D A B P).
apply (conga_preserves_lta A B D A0 B0 C0); auto.
apply conga_refl; auto.
apply conga_sym.
auto.

assert(lta C B D A B P).
apply (conga_preserves_lta C B D A0 B0 C0); auto.
apply conga_refl; auto.
apply conga_sym.
auto.
clear HQ H13 H8 HH H3 H11 H12 H0 H1 H7.

unfold lta in ×.
spliter.

assert((lea A B D A B P lea C B P C B D)).
apply (l11_36 A B D A B P C C); auto.
destruct H8.
assert(lea C B P C B D).
apply H8.
auto.

assert(Conga A B P C B P).

apply l11_16; auto.
apply perp_in_per.

assert(Perp C B P B).
apply(perp_col _ A).
auto.
apply perp_left_comm.
auto.
apply bet_col in H.
Col.
apply perp_in_comm.
apply perp_perp_in.
apply perp_left_comm.
auto.

assert(lea A B P C B D).
apply (l11_30 C B P C B D); auto.
apply conga_sym.
auto.
apply conga_refl; auto.

assert(HH:=lea_asym C B D A B P H0 H18).
contradiction.
Qed.

Lemma lcos_per : A B C lp l a, anga alg llg lp
  lcos lp l al A Clp A Ba B A CPer A B C.
Proof.
intros.

induction(eq_dec_points B C).
subst C.
apply l8_5.

unfold lcos in H2.
spliter.
ex_and H9 A0.
ex_and H10 B0.
ex_and H9 C0.

assert(Conga B0 A0 C0 B A C).
apply (anga_conga a); auto.
assert(Cong A0 C0 A C).
apply (lg_cong l); auto.
assert(Cong A0 B0 A B).
apply (lg_cong lp); auto.
assert(HH:=l11_49 B0 A0 C0 B A C H13 H15 H14).
spliter.

assert(B0 C0).
intro.
subst C0.
apply H6.
apply (cong_identity _ _ B0).
Cong.
apply H17 in H18.
spliter.
eapply (l11_17 A0 B0 C0).
apply l8_2.
auto.
auto.
Qed.

Lemma is_null_anga_dec : a, anga ais_null_anga a ¬is_null_anga a.
Proof.
intros a H.
assert (H' := H).
unfold anga in H.
destruct H as [A [B [C [Hacute HConga]]]].
elim (out_dec B A C); intro Hout.

  left.
  unfold is_null_anga.
  split; auto.
  intros.
  apply (out_conga_out A B C); auto.
  apply HConga.
  assumption.

  right.
  unfold is_null_anga.
  intro H.
  destruct H as [Hclear H]; clear Hclear.
  apply Hout.
  apply H.
  apply HConga.
  apply acute_distinct in Hacute.
  spliter.
  apply conga_refl; auto.
Qed.

Lemma lcos_lg : a lp l A B C, lcos lp l aPerp A B B Ca B A Cl A Clp A B.
Proof.
intros.

assert(HH:=H).
unfold lcos in HH.
spliter.
ex_and H6 A'.
ex_and H7 B'.
ex_and H6 C'.

assert(Cong A C A' C').
apply (lg_cong l); auto.
assert(Conga B A C B' A' C').
apply (anga_conga a); auto.

induction(is_null_anga_dec a).
assert(HP := null_lcos_eql lp l a H H12).

unfold is_null_anga in H12.
spliter.
assert(HH:= (H13 B A C H1)).

apply perp_comm in H0.
apply perp_not_col in H0.
apply False_ind.
apply H0.
apply out_col in HH.
Col.

apply conga_distinct in H11.
spliter.

assert(Conga A B C A' B' C').
apply l11_16; auto.
apply perp_in_per.
apply perp_in_comm.
apply perp_perp_in.
apply perp_comm.
auto.
apply perp_not_eq_2 in H0.
auto.
apply l8_2.
auto.
intro.
subst C'.
apply H12.
unfold is_null_anga.

split; auto.
intros.
assert(Conga A0 B0 C0 B' A' B').
apply (anga_conga a); auto.

apply (out_conga_out B' A' B') .
apply out_trivial; auto.
apply conga_sym.
auto.

assert(Cong C B C' B' Cong A B A' B' Conga B C A B' C' A').
apply(l11_50_2 C A B C' A' B').
apply perp_comm in H0.
apply perp_not_col in H0.
intro.
apply H0.
Col.
auto.
apply conga_comm.
auto.
Cong.
spliter.
apply (lg_cong_lg lp A' B');auto.
Cong.
assumption.
Qed.

Lemma l13_7 : a b l la lb lab lba, lcos la l alcos lb l b
  lcos lab la blcos lba lb aeqL lab lba.
Proof.
intros.

apply lcos_lg_anga in H.
apply lcos_lg_anga in H0.
apply lcos_lg_anga in H1.
apply lcos_lg_anga in H2.
spliter.
clean_duplicated_hyps.

induction (is_null_anga_dec a).

assert(HH:=null_lcos_eql lba lb a H2 H3).
assert(HP:=null_lcos_eql la l a H H3).
assert(lcos lab l b).

eapply (lcos_eql_lcos lab la); auto.
apply eql_refl; auto.
apply eql_sym; auto.
assert(HQ:= l13_6 b lb lab l H0 H5).
assert(eqL lab lb).
apply eql_sym; auto.
apply (eql_trans _ lb); auto.

induction (is_null_anga_dec b).

assert(HH:=null_lcos_eql lab la b H1 H5).
assert(HP:=null_lcos_eql lb l b H0 H5).
assert(lcos lba l a).

apply(lcos_eql_lcos lba lb); auto.
apply eql_refl; auto.
apply eql_sym; auto.

assert(HQ:= l13_6 a la lba l H H6).
assert(eqL lba la).
apply eql_sym; auto.
apply (eql_trans _ la); auto.
apply eql_sym; auto.

assert(HH:=lcos_const la l a H).
ex_and HH C.
ex_and H6 A.
ex_and H8 B.

assert(HH:= anga_distincts a C A B H14 H9).
spliter.

assert(¬Col A B C).
intro.
apply H3.
assert(Col C A B).
Col.
assert(HH:= anga_col_null a C A B H14 H9 H18).
spliter.
auto.

assert(HH:=l10_2_existence B A C).
ex_and HH P.
assert( ¬ Col B A P).
eapply (osym_not_col _ _ C).
apply l10_4.
auto.
intro.
apply H17.
Col.

assert(l B A).
apply lg_sym; auto.

assert(HH:= lcos_const_o lb l b B A P H19 H5 H12 H10 H11 H20 H0).
ex_and HH D.

assert(two_sides B A P C).
apply l10_14.
intro.
subst P.
assert(Col C B A).
apply(l10_8 B A C); auto.
apply H19.
Col.
auto.
auto.

assert(two_sides B A D C).

eapply (l9_8_2 _ _ P).
auto.
apply one_side_symmetry.
auto.

assert(Per A C B).
apply (lcos_per _ _ _ la l a); auto.
apply lg_sym; auto.

assert(Per A D B).
apply (lcos_per _ _ _ lb l b); auto.
apply anga_sym; auto.

assert(¬ Col C D A).
intro.

assert(Per B C D).
apply(per_col B C A D); auto.
apply l8_2.
auto.
Col.
assert(Per B D C).
apply(per_col B D A C); auto.
unfold one_side in H21.
ex_and H21 T.
unfold two_sides in H21.
spliter.
intro.
subst D.
apply H31.
Col.
apply l8_2.
auto.
Col.
assert(C = D).
apply (l8_7 B); auto.

subst D.
unfold two_sides in H25.
spliter.
ex_and H33 T.
assert(C=T).
apply between_identity.
auto.
subst T.
contradiction.

assert(HH:= l8_18_existence C D A H28).
ex_and HH E.

assert(Conga B A C D A E Conga B A D C A E Bet C E D).
apply(l13_2 A B C D E).
apply invert_two_sides.
apply l9_2.
auto.
apply l8_2.
auto.
apply l8_2.
auto.
auto.
apply perp_sym.
auto.
spliter.

assert(a D A E).
eapply (anga_conga_anga a B A C); auto.
apply anga_sym; auto.
assert(b C A E).
eapply (anga_conga_anga b B A D); auto.

assert(Perp C E A E).
eapply (perp_col _ D) .
intro.
subst E.
apply H5.
unfold is_null_anga.
split; auto.
intros.
assert(Conga A0 B0 C0 C A C).
apply (anga_conga b); auto.
apply (out_conga_out C A C A0 B0 C0 ).
apply out_trivial; auto.
apply conga_sym.
auto.
auto.
auto.

assert(lab A E).

apply (lcos_lg b lab la A E C H1).

apply perp_sym in H36.
apply perp_right_comm in H36.
auto.
apply anga_sym; auto.
apply lg_sym; auto.

assert(Perp D E A E).
eapply (perp_col _ C) .
intro.
subst E.
apply H3.
unfold is_null_anga.
split; auto.
intros.
assert(Conga A0 B0 C0 D A D).
apply (anga_conga a); auto.
apply (out_conga_out D A D A0 B0 C0 ).
apply out_trivial; auto.
apply perp_not_eq_2 in H36.
auto.
apply conga_sym.
auto.
apply perp_left_comm.
auto.
Col.

assert(lba A E).

apply (lcos_lg a lba lb A E D).
auto.
apply perp_sym.
apply perp_left_comm.
auto.
apply anga_sym; auto.
auto.

apply ex_eql.
A.
E.
split.
unfold is_len.
split; auto.
unfold is_len.
split; auto.
assumption.
assumption.
Qed.

Lemma out_acute : A B C, out B A Cacute A B C.
Proof.
intros.
assert( A B C B).
unfold out in H.
tauto.
spliter.
assert(HH:= not_col_exists A B H0).
ex_and HH Q.
assert( P : Tpoint, Perp A B P B one_side A B Q P).
apply(l10_15 A B B Q).
Col.
auto.
ex_and H3 P.

assert(Per P B A).
apply perp_in_per.
apply perp_left_comm in H3.
apply perp_in_comm.
apply perp_perp_in.
Perp.
unfold acute.
A.
B.
P.
split.
apply l8_2.
auto.
unfold lta.
split.
unfold lea.
C.
split.
apply col_in_angle; auto.
apply perp_not_eq_2 in H3.
auto.
apply conga_refl; auto.
intro.
apply out_conga_out in H6.
apply perp_left_comm in H3.
apply perp_not_col in H3.
apply out_col in H6.
contradiction.
assumption.
Qed.

Lemma perp_acute : A B C P, Col A C PPerp_in P B P A Cacute A B P.
Proof.
intros.
assert(HH0:=H0).
assert(HH:= l11_43 P A B).

induction(Col_dec P A B).

assert(Perp B A A C).
eapply (perp_col _ P).
intro.
subst A.
assert(Perp_in B B P C B).
apply perp_perp_in.
apply perp_in_perp in H0.
induction H0.
apply perp_not_eq_1 in H0.
tauto.
Perp.

assert(P=B).
eapply(l8_14_3 B P B C); Perp.
subst P.
apply perp_in_perp in H0.
induction H0.
apply perp_not_eq_1 in H0.
tauto.
apply perp_not_eq_1 in H0.
tauto.
apply perp_in_perp in H0.
induction H0.
apply perp_not_eq_1 in H0.
tauto.
auto.
Col.

apply perp_comm in H2.
apply perp_perp_in in H2.
apply perp_in_comm in H2.
apply perp_in_sym in H2.
eapply (perp_in_col_perp_in _ _ _ _ P) in H2.
assert( A = P).
eapply(l8_14_3 A C B P); Perp.
subst P.
apply out_acute.
apply perp_in_perp in H2.
induction H2.
apply out_trivial.
apply perp_not_eq_2 in H2.
auto.
apply perp_not_eq_1 in H2.
tauto.
apply perp_in_perp in H0.
induction H0;
apply perp_not_eq_1 in H0;
tauto.
Col.
apply acute_sym.

apply l11_43.
auto.
left.
assert(A P).
intro.
subst P.
apply H1.
Col.

eapply (perp_in_col_perp_in _ _ _ _ P) in H0; auto.
apply perp_in_per.
Perp.
Qed.

Lemma null_lcos : l a,lg l¬lg_null lis_null_anga alcos l l a.
Proof.
intros.
unfold is_null_anga in H1.
spliter.
assert(HH:=ex_points_anga a H1).
ex_and HH A.
ex_and H3 B.
ex_and H4 C.
assert(HH:=H2 A B C H3).

unfold lcos.
repeat split; auto.

assert(B A).
unfold out in HH.
spliter.
auto.

lg_instance l A' B'.

assert(HP:=ex_point_lg_out l B A H4 H H0).
ex_and HP P.
B.
P.
P.

repeat split; auto.

apply l8_2.
apply l8_5.
apply (anga_out_anga _ A _ C); auto.
apply l6_6.
auto.
apply (out2_out_2 _ _ _ A).
apply l6_6.
auto.
auto.
Qed.

Lemma perp2_preserves_bet1 : O A B A' B', Bet A O BCol O A' B'¬Col O A A'
 Perp2 A A' B B' OBet A' O 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.

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

Lemma eqA_preserves_anga : a b, anga aang beqA a banga b.
Proof.
intros.
unfold eqA in H1.
spliter.
anga_instance a A B C.
assert(HH:= H3 A B C).
destruct HH.
unfold anga.
A.
B.
C.
split.
unfold anga in H.
ex_and H A'.
ex_and H7 B'.
ex_and H C'.
assert(a A' B' C').
assert(HP:= H7 A B C).
destruct HP.
assert(Conga A B C A' B' C').
apply conga_sym.
auto.
assert(HP:=is_ang_conga_is_ang A B C A' B' C' a).
assert(is_ang A' B' C' a).
apply HP.
split; auto.
auto.
unfold is_ang in H11.
spliter.
auto.

apply (acute_lea_acute _ _ _ A' B' C').
auto.
unfold lea.
C'.
split.
assert (HH:= is_ang_distinct A' B' C' a).
assert( A' B' C' B').
apply HH.
split; auto.
spliter.
apply in_angle_trivial_2; auto.
eapply (is_ang_conga _ _ _ _ _ _ a).
split; auto.
split; auto.
intros.
split.
intro.
assert(HH:= H3 x y z).
destruct HH.
assert(is_ang x y z a).
eapply (is_ang_conga_is_ang A B C).
split; auto.
auto.
unfold is_ang in H10.
spliter.
apply H8.
auto.
intro.
assert(HH:= H3 x y z).
destruct HH.
assert(a x y z).
apply H9.
auto.

eapply (is_ang_conga _ _ _ _ _ _ a).
split; auto.
split; auto.
Qed.

End Cosinus.