End Quadrilateral_inter_dec_1.
Ltac assert_cols :=
repeat
match goal with
| H:Bet ?X1 ?X2 ?X3 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;assert (Col X1 X2 X3) by (apply bet_col;apply H)
| H:Midpoint ?X1 ?X2 ?X3 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;let N := fresh in assert (N := midpoint_col X2 X1 X3 H)
| H:Out ?X1 ?X2 ?X3 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;let N := fresh in assert (N := out_col X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;let N := fresh in assert (N := par_id X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X3 ?X1 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;let N := fresh in
assert (N := par_id X1 X2 X3 (par_right_comm X1 X2 X3 X1 H))
| H:Par ?X2 ?X1 ?X1 ?X3 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;let N := fresh in
assert (N := par_id X1 X2 X3 (par_left_comm X2 X1 X1 X3 H))
| H:Par ?X2 ?X1 ?X3 ?X1 |- _ =>
not_exist_hyp_perm_col X1 X2 X3;let N := fresh in
assert (N := par_id X1 X2 X3 (par_comm X2 X1 X3 X1 H))
end.
Ltac permutation_intro_in_hyps_aux :=
repeat
match goal with
| H : Plg_tagged ?A ?B ?C ?D |- _ => apply Plg_tagged_Plg in H; apply Plg_perm in H; spliter
| H : Par_tagged ?A ?B ?C ?D |- _ => apply Par_tagged_Par in H; apply Par_perm in H; spliter
| H : Par_strict_tagged ?A ?B ?C ?D |- _ => apply Par_strict_tagged_Par_strict in H; apply Par_strict_perm in H; spliter
| H : Perp_tagged ?A ?B ?C ?D |- _ => apply Perp_tagged_Perp in H; apply Perp_perm in H; spliter
| H : Perp_in_tagged ?X ?A ?B ?C ?D |- _ => apply Perp_in_tagged_Perp_in in H; apply Perp_in_perm in H; spliter
| H : Per_tagged ?A ?B ?C |- _ => apply Per_tagged_Per in H; apply Per_perm in H; spliter
| H : Mid_tagged ?A ?B ?C |- _ => apply Mid_tagged_Mid in H; apply Mid_perm in H; spliter
| H : NCol_tagged ?A ?B ?C |- _ => apply NCol_tagged_NCol in H; apply NCol_perm in H; spliter
| H : Col_tagged ?A ?B ?C |- _ => apply Col_tagged_Col in H; apply Col_perm in H; spliter
| H : Bet_tagged ?A ?B ?C |- _ => apply Bet_tagged_Bet in H; apply Bet_perm in H; spliter
| H : Cong_tagged ?A ?B ?C ?D |- _ => apply Cong_tagged_Cong in H; apply Cong_perm in H; spliter
| H : Diff_tagged ?A ?B |- _ => apply Diff_tagged_Diff in H; apply Diff_perm in H; spliter
end.
Ltac permutation_intro_in_hyps := clean_reap_hyps; clean_trivial_hyps; tag_hyps; permutation_intro_in_hyps_aux.
Ltac assert_cols_aux :=
repeat
match goal with
| H:Bet ?X1 ?X2 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);assert (Col X1 X2 X3) by (apply bet_col;apply H)
| H:Midpoint ?X1 ?X2 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := midpoint_col X2 X1 X3 H)
| H:Out ?X1 ?X2 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := out_col X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := par_id X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := par_id_1 X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := par_id_2 X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := par_id_3 X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := par_id_4 X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X1 ?X3 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := par_id_5 X1 X2 X3 H)
| H:Par ?X1 ?X2 ?X3 ?X4, H2:Col ?X1 ?X2 ?X5, H3:Col ?X3 ?X4 ?X5 |- _ =>
not_exist_hyp (Col X1 X2 X3);let N := fresh in assert (N := not_strict_par1 X1 X2 X3 X4 X5 H H2 H3)
end.
Ltac assert_cols_perm := permutation_intro_in_hyps; assert_cols_aux; clean_reap_hyps.
Ltac not_exist_hyp_perm_cong A B C D := not_exist_hyp (Cong A B C D); not_exist_hyp (Cong A B D C);
not_exist_hyp (Cong B A C D); not_exist_hyp (Cong B A D C);
not_exist_hyp (Cong C D A B); not_exist_hyp (Cong C D B A);
not_exist_hyp (Cong D C A B); not_exist_hyp (Cong D C B A).
Ltac assert_congs_1 :=
repeat
match goal with
| H:Midpoint ?X1 ?X2 ?X3 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong X1 X2 X1 X3;
assert (h := midpoint_cong X2 X1 X3 H)
| H1:Midpoint ?M1 ?A1 ?B1, H2:Midpoint ?M2 ?A2 ?B2, H3:Cong ?A1 ?B1 ?A2 ?B2 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong A1 M1 A2 M2;
assert (h := cong_cong_half_1 A1 M1 B1 A2 M2 B2 H1 H2 H3)
| H:Parallelogram ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong X1 X2 X3 X4;
assert (h := plg_cong_1 X1 X2 X3 X4 H)
| H:Parallelogram_strict ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong X1 X2 X3 X4;
assert (h := plgs_cong_1 X1 X2 X3 X4 H)
end.
Ltac assert_congs_2 :=
repeat
match goal with
| H1:Midpoint ?M1 ?A1 ?B1, H2:Midpoint ?M2 ?A2 ?B2, H3:Cong ?A1 ?B1 ?A2 ?B2 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong A1 M1 A2 M2;
assert (h := cong_cong_half_2 A1 M1 B1 A2 M2 B2 H1 H2 H3)
| H:Parallelogram ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong X1 X4 X2 X3;
assert (h := plg_cong_2 X1 X2 X3 X4 H);clean_reap_hyps
| H:Parallelogram_strict ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_cong X1 X4 X2 X3;
assert (h := plgs_cong_2 X1 X2 X3 X4 H);clean_reap_hyps
end.
Ltac assert_congs_perm := permutation_intro_in_hyps; assert_congs_1; assert_congs_2; clean_reap_hyps.
Ltac not_exist_hyp_perm_para A B C D := not_exist_hyp (Parallelogram A B C D); not_exist_hyp (Parallelogram B C D A);
not_exist_hyp (Parallelogram C D A B); not_exist_hyp (Parallelogram D A B C);
not_exist_hyp (Parallelogram A D C B); not_exist_hyp (Parallelogram D C B A);
not_exist_hyp (Parallelogram C B A D); not_exist_hyp (Parallelogram B A D C).
Ltac not_exist_hyp_perm_para_s A B C D := not_exist_hyp (Parallelogram_strict A B C D);
not_exist_hyp (Parallelogram_strict B C D A);
not_exist_hyp (Parallelogram_strict C D A B);
not_exist_hyp (Parallelogram_strict D A B C);
not_exist_hyp (Parallelogram_strict A D C B);
not_exist_hyp (Parallelogram_strict D C B A);
not_exist_hyp (Parallelogram_strict C B A D);
not_exist_hyp (Parallelogram_strict B A D C).
Ltac assert_paras_aux :=
repeat
match goal with
| H:Parallelogram_strict ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_para X1 X2 X3 X4;
assert (h := Parallelogram_strict_Parallelogram X1 X2 X3 X4 H)
| H:Plg ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_para X1 X2 X3 X4;
assert (h := plg_to_parallelogram X1 X2 X3 X4 H)
| H:(~ Col ?X1 ?X2 ?X3), H2:Par ?X1 ?X2 ?X3 ?X4, H3:Par ?X1 ?X4 ?X2 ?X3 |- _ =>
let h := fresh in
not_exist_hyp_perm_para_s X1 X2 X3 X4;
assert (h := parallel_2_plg X1 X2 X3 X4 H H2 H3)
end.
Ltac assert_paras_perm := permutation_intro_in_hyps; assert_paras_aux; clean_reap_hyps.
Ltac not_exist_hyp_perm_npara A B C D := not_exist_hyp (~Parallelogram A B C D); not_exist_hyp (~Parallelogram B C D A);
not_exist_hyp (~Parallelogram C D A B); not_exist_hyp (~Parallelogram D A B C);
not_exist_hyp (~Parallelogram A D C B); not_exist_hyp (~Parallelogram D C B A);
not_exist_hyp (~Parallelogram C B A D); not_exist_hyp (~Parallelogram B A D C).
Ltac assert_nparas_1 :=
repeat
match goal with
| H:(?X1<>?X2), H2:Parallelogram ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_npara X1 X2 X4 X3;
assert (h := plg_not_comm_1 X1 X2 X3 X4 H H2)
end.
Ltac assert_nparas_2 :=
repeat
match goal with
| H:(?X1<>?X2), H2:Parallelogram ?X1 ?X2 ?X3 ?X4 |- _ =>
let h := fresh in
not_exist_hyp_perm_npara X2 X1 X3 X4;
assert (h := plg_not_comm_2 X1 X2 X3 X4 H H2)
end.
Ltac assert_nparas_perm := permutation_intro_in_hyps; assert_nparas_1; assert_nparas_2; clean_reap_hyps.
Ltac diag_plg_intersection M A B C D H :=
let T := fresh in assert(T:= plg_mid A B C D H);
ex_and T M.
Tactic Notation "Name" ident(M) "the" "intersection" "of" "the" "diagonals" "(" ident(A) ident(C) ")" "and" "(" ident(B) ident(D) ")" "of" "the" "parallelogram" ident(H) :=
diag_plg_intersection M A B C D H.
Ltac assert_diffs :=
repeat
match goal with
| H:(~Col ?X1 ?X2 ?X3) |- _ =>
let h := fresh in
not_exist_hyp3 X1 X2 X1 X3 X2 X3;
assert (h := not_col_distincts X1 X2 X3 H);decompose [and] h;clear h;clean_reap_hyps
| H:(~Bet ?X1 ?X2 ?X3) |- _ =>
let h := fresh in
not_exist_hyp2 X1 X2 X2 X3;
assert (h := not_bet_distincts X1 X2 X3 H);decompose [and] h;clear h;clean_reap_hyps
| H:Bet ?A ?B ?C, H2 : ?A <> ?B |-_ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= bet_neq12__neq A B C H H2);clean_reap_hyps
| H:Bet ?A ?B ?C, H2 : ?B <> ?A |-_ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= bet_neq21__neq A B C H H2);clean_reap_hyps
| H:Bet ?A ?B ?C, H2 : ?B <> ?C |-_ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= bet_neq23__neq A B C H H2);clean_reap_hyps
| H:Bet ?A ?B ?C, H2 : ?C <> ?B |-_ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= bet_neq32__neq A B C H H2);clean_reap_hyps
| H:Cong ?A ?B ?C ?D, H2 : ?A <> ?B |-_ =>
let T:= fresh in (not_exist_hyp_comm C D);
assert (T:= cong_diff A B C D H2 H);clean_reap_hyps
| H:Cong ?A ?B ?C ?D, H2 : ?B <> ?A |-_ =>
let T:= fresh in (not_exist_hyp_comm C D);
assert (T:= cong_diff_2 A B C D H2 H);clean_reap_hyps
| H:Cong ?A ?B ?C ?D, H2 : ?C <> ?D |-_ =>
let T:= fresh in (not_exist_hyp_comm A B);
assert (T:= cong_diff_3 A B C D H2 H);clean_reap_hyps
| H:Cong ?A ?B ?C ?D, H2 : ?D <> ?C |-_ =>
let T:= fresh in (not_exist_hyp_comm A B);
assert (T:= cong_diff_4 A B C D H2 H);clean_reap_hyps
| H:Le ?A ?B ?C ?D, H2 : ?A <> ?B |-_ =>
let T:= fresh in (not_exist_hyp_comm C D);
assert (T:= le_diff A B C D H2 H);clean_reap_hyps
| H:Le ?A ?B ?C ?D, H2 : ?B <> ?A |-_ =>
let T:= fresh in (not_exist_hyp_comm C D);
assert (T:= le_diff A B C D (swap_diff B A H2) H);clean_reap_hyps
| H:Lt ?A ?B ?C ?D |-_ =>
let T:= fresh in (not_exist_hyp_comm C D);
assert (T:= lt_diff A B C D H);clean_reap_hyps
| H:Midpoint ?I ?A ?B, H2 : ?A<>?B |- _ =>
let T:= fresh in (not_exist_hyp2 I B I A);
assert (T:= midpoint_distinct_1 I A B H2 H);
decompose [and] T;clear T;clean_reap_hyps
| H:Midpoint ?I ?A ?B, H2 : ?B<>?A |- _ =>
let T:= fresh in (not_exist_hyp2 I B I A);
assert (T:= midpoint_distinct_1 I A B (swap_diff B A H2) H);
decompose [and] T;clear T;clean_reap_hyps
| H:Midpoint ?I ?A ?B, H2 : ?I<>?A |- _ =>
let T:= fresh in (not_exist_hyp2 I B A B);
assert (T:= midpoint_distinct_2 I A B H2 H);
decompose [and] T;clear T;clean_reap_hyps
| H:Midpoint ?I ?A ?B, H2 : ?A<>?I |- _ =>
let T:= fresh in (not_exist_hyp2 I B A B);
assert (T:= midpoint_distinct_2 I A B (swap_diff A I H2) H);
decompose [and] T;clear T;clean_reap_hyps
| H:Midpoint ?I ?A ?B, H2 : ?I<>?B |- _ =>
let T:= fresh in (not_exist_hyp2 I A A B);
assert (T:= midpoint_distinct_3 I A B H2 H);
decompose [and] T;clear T;clean_reap_hyps
| H:Midpoint ?I ?A ?B, H2 : ?B<>?I |- _ =>
let T:= fresh in (not_exist_hyp2 I A A B);
assert (T:= midpoint_distinct_3 I A B (swap_diff B I H2) H);
decompose [and] T;clear T;clean_reap_hyps
| H:Per ?A ?B ?C, H2 : ?A<>?B |- _ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= per_distinct A B C H H2); clean_reap_hyps
| H:Per ?A ?B ?C, H2 : ?B<>?A |- _ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= per_distinct A B C H (swap_diff B A H2)); clean_reap_hyps
| H:Per ?A ?B ?C, H2 : ?B<>?C |- _ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= per_distinct_1 A B C H H2); clean_reap_hyps
| H:Per ?A ?B ?C, H2 : ?C<>?B |- _ =>
let T:= fresh in (not_exist_hyp_comm A C);
assert (T:= per_distinct_1 A B C H (swap_diff C B H2)); clean_reap_hyps
| H:Perp ?A ?B ?C ?D |- _ =>
let T:= fresh in (not_exist_hyp2 A B C D);
assert (T:= perp_distinct A B C D H);
decompose [and] T;clear T;clean_reap_hyps
| H:Perp_at ?X ?A ?B ?C ?D |- _ =>
let T:= fresh in (not_exist_hyp2 A B C D);
assert (T:= perp_in_distinct X A B C D H);
decompose [and] T;clear T;clean_reap_hyps
| H:Out ?A ?B ?C |- _ =>
let T:= fresh in (not_exist_hyp2 A B A C);
assert (T:= out_distinct A B C H);
decompose [and] T;clear T;clean_reap_hyps
| H:TS ?A ?B ?C ?D |- _ =>
let h := fresh in
not_exist_hyp6 A B A C A D B C B D C D;
assert (h := ts_distincts A B C D H);decompose [and] h;clear h;clean_reap_hyps
| H:OS ?A ?B ?C ?D |- _ =>
let h := fresh in
not_exist_hyp5 A B A C A D B C B D;
assert (h := os_distincts A B C D H);decompose [and] h;clear h;clean_reap_hyps
| H:~ Coplanar ?A ?B ?C ?D |- _ =>
let h := fresh in
not_exist_hyp6 A B A C A D B C B D C D;
assert (h := ncop_distincts A B C D H);decompose [and] h;clear h;clean_reap_hyps
| H:CongA ?A ?B ?C ?A' ?B' ?C' |- _ =>
let T:= fresh in (not_exist_hyp_comm A B);
assert (T:= conga_diff1 A B C A' B' C' H);clean_reap_hyps
| H:CongA ?A ?B ?C ?A' ?B' ?C' |- _ =>
let T:= fresh in (not_exist_hyp_comm B C);
assert (T:= conga_diff2 A B C A' B' C' H);clean_reap_hyps
| H:CongA ?A ?B ?C ?A' ?B' ?C' |- _ =>
let T:= fresh in (not_exist_hyp_comm A' B');
assert (T:= conga_diff45 A B C A' B' C' H);clean_reap_hyps
| H:CongA ?A ?B ?C ?A' ?B' ?C' |- _ =>
let T:= fresh in (not_exist_hyp_comm B' C');
assert (T:= conga_diff56 A B C A' B' C' H);clean_reap_hyps
| H:(InAngle ?P ?A ?B ?C) |- _ =>
let h := fresh in
not_exist_hyp3 A B C B P B;
assert (h := inangle_distincts A B C P H);decompose [and] h;clear h;clean_reap_hyps
| H:LeA ?A ?B ?C ?D ?E ?F |- _ =>
let h := fresh in
not_exist_hyp4 A B B C D E E F;
assert (h := lea_distincts A B C D E F H);decompose [and] h;clear h;clean_reap_hyps
| H:LtA ?A ?B ?C ?D ?E ?F |- _ =>
let h := fresh in
not_exist_hyp4 A B B C D E E F;
assert (h := lta_distincts A B C D E F H);decompose [and] h;clear h;clean_reap_hyps
| H:(Acute ?A ?B ?C) |- _ =>
let h := fresh in
not_exist_hyp2 A B B C;
assert (h := acute_distincts A B C H);decompose [and] h;clear h;clean_reap_hyps
| H:(Obtuse ?A ?B ?C) |- _ =>
let h := fresh in
not_exist_hyp2 A B B C;
assert (h := obtuse_distincts A B C H);decompose [and] h;clear h;clean_reap_hyps
| H:SuppA ?A ?B ?C ?D ?E ?F |- _ =>
let h := fresh in
not_exist_hyp4 A B B C D E E F;
assert (h := suppa_distincts A B C D E F H);decompose [and] h;clear h;clean_reap_hyps
| H:(Orth_at ?X ?A ?B ?C ?U ?V) |- _ =>
let h := fresh in
not_exist_hyp4 A B A C B C U V;
assert (h := orth_at_distincts A B C U V X H);decompose [and] h;clear h;clean_reap_hyps
| H:(Orth ?A ?B ?C ?U ?V) |- _ =>
let h := fresh in
not_exist_hyp4 A B A C B C U V;
assert (h := orth_distincts A B C U V H);decompose [and] h;clear h;clean_reap_hyps
| H:Inter ?A ?B ?C ?D ?X |- _ =>
let T:= fresh in (not_exist_hyp2 A B C D);
assert (T:= inter_distincts A B C D X H);decompose [and] T;clear T;clean_reap_hyps
| H:Par_strict ?A ?B ?C ?D |- _ =>
let T:= fresh in (not_exist_hyp6 A B A C A D B C B D C D);
assert (T:= par_strict_distinct A B C D H);
decompose [and] T;clear T;clean_reap_hyps
| H:Par ?A ?B ?C ?D |- _ =>
let T:= fresh in (not_exist_hyp2 A B C D);
assert (T:= par_distincts A B C D H);decompose [and] T;clear T;clean_reap_hyps
| H:Perp ?A ?B ?C ?D |- _ =>
let T:= fresh in (not_exist_hyp2 A B C D);
assert (T:= perp_distinct A B C D H);
decompose [and] T;clear T;clean_reap_hyps
| H:Perp_at ?X ?A ?B ?C ?D |- _ =>
let T:= fresh in (not_exist_hyp2 A B C D);
assert (T:= perp_in_distinct X A B C D H);
decompose [and] T;clear T;clean_reap_hyps
| H:Out ?A ?B ?C |- _ =>
let T:= fresh in (not_exist_hyp2 A B A C);
assert (T:= out_distinct A B C H);
decompose [and] T;clear T;clean_reap_hyps
| H:SumA ?A ?B ?C ?D ?E ?F ?G ?I ?J |- _ =>
let h := fresh in
not_exist_hyp6 A B B C D E E F G I I J;
assert (h := suma_distincts A B C D E F G I J H);decompose [and] h;clear h;clean_reap_hyps
| H:TriSumA ?A ?B ?C ?D ?E ?F |- _ =>
let h := fresh in
not_exist_hyp5 A B B C A C D E E F;
assert (h := trisuma_distincts A B C D E F H);decompose [and] h;clear h;clean_reap_hyps
| H:SAMS ?A ?B ?C ?D ?E ?F |- _ =>
let h := fresh in
not_exist_hyp4 A B B C D E E F;
assert (h := sams_distincts A B C D E F H);decompose [and] h;clear h;clean_reap_hyps
| H:Parallelogram_strict ?A ?B ?C ?D |- _ =>
let T := fresh in
not_exist_hyp6 A B B C C D D A A C B D;
assert (T:= plgs_diff A B C D H);decompose [and] T;clear T;clean_reap_hyps
end.
Hint Resolve parallelogram_strict_not_col
parallelogram_strict_not_col_2
parallelogram_strict_not_col_3
parallelogram_strict_not_col_4 : col.
Hint Resolve plg_cong_1 plg_cong_2 plgs_cong_1 plgs_cong_2 : cong.
Section Quadrilateral_inter_dec_2.
Context `{TE:Tarski_euclidean}.

(* Specifications: *)
Lemma parallelogram_strict_midpoint : forall A B C D I,
Parallelogram_strict A B C D ->
Col I A C ->
Col I B D ->
Midpoint I A C /\ Midpoint I B D.
Lemma rmb_perp :
forall A B C D,
A <> C -> B <> D ->
Rhombus A B C D ->
Perp A C B D.
Lemma rect_permut : forall A B C D, Rectangle A B C D -> Rectangle B C D A.
Lemma rect_comm2 : forall A B C D, Rectangle A B C D -> Rectangle B A D C.
Lemma rect_per1 : forall A B C D, Rectangle A B C D -> Per B A D.
Lemma rect_per2 : forall A B C D, Rectangle A B C D -> Per A B C.
Lemma rect_per3 : forall A B C D, Rectangle A B C D -> Per B C D.
Lemma rect_per4 : forall A B C D, Rectangle A B C D -> Per A D C.
Lemma plg_per_rect1 : forall A B C D, Plg A B C D -> Per D A B -> Rectangle A B C D.
Lemma plg_per_rect2 : forall A B C D, Plg A B C D -> Per C B A -> Rectangle A B C D.
Lemma plg_per_rect3 : forall A B C D, Plg A B C D -> Per A D C -> Rectangle A B C D.
Lemma plg_per_rect4 : forall A B C D, Plg A B C D -> Per B C D -> Rectangle A B C D.
Lemma plg_per_rect : forall A B C D, Plg A B C D -> (Per D A B \/ Per C B A \/ Per A D C \/ Per B C D) -> Rectangle A B C D.
Lemma rect_per : forall A B C D, Rectangle A B C D -> Per B A D /\ Per A B C /\ Per B C D /\ Per A D C.
Lemma plgf_rect_id : forall A B C D, Parallelogram_flat A B C D -> Rectangle A B C D -> A = D /\ B = C \/ A = B /\ D = C.
Lemma cop_perp3__perp :
forall A B C D,
Coplanar A B C D ->
Perp A B B C ->
Perp B C C D ->
Perp C D D A ->
Perp D A A B.
Lemma cop_perp3__rect :
forall A B C D,
Coplanar A B C D ->
Perp A B B C ->
Perp B C C D ->
Perp C D D A ->
Rectangle A B C D.
Lemma conga_to_par_os : forall A B C D P , Bet A D P -> OS A D B C -> CongA B A P C D P
-> Par A B C D.
Lemma plg_par : forall A B C D, A <> B -> B <> C -> Parallelogram A B C D -> Par A B C D /\ Par A D B C.
Lemma plg_par_1 : forall A B C D, A <> B -> B <> C -> Parallelogram A B C D -> Par A B C D.
Proof with finish.