Ltac assert_non_zero_hyps_circum_ortho_center :=
  repeat
( match goal with 
| H: is_circumcenter ?O ?A ?B ?C |- _ => 
 assert_if_not_exist (2 * (Py A B A * Py A C A - Py B A C * Py B A C) <> 0);
 [(apply  (is_circumcenter_non_zero O A B C H))|idtac]
| H: is_orthocenter ?O ?A ?B ?C |- _ => 
 assert_if_not_exist ((Py A B A * Py A C A - Py B A C * Py B A C) <> 0);
 [(apply  (is_orthocenter_non_zero O A B C H))|idtac]
end).(*
Lemma test_assert_non_zero_hyps_circum :
 forall O A B C,
 is_circumcenter O A B C ->
 is_orthocenter O A B C -> 
 1=1.
Proof.
intros.
assert_non_zero_hyps_circum_ortho_center.
*)


(* warning we do not unfold the parallel assumption related to ratios *)

Ltac geoInit :=
  unfold_non_primitive_constructions; intros; 
  unfold perp, S4, Py4 in |- *; 
  unfold Col in *; DecomposeMratio;
  prepare_half_free_construction;
  DecompAndAll;
  check_ratio_hyps;
  assert_non_zero_hyps_circum_ortho_center;
  unfold is_circumcenter,  is_orthocenter, is_centroid, is_Lemoine in *;
  add_non_zero_hyps; 
  put_on_inter_line_parallel;repeat split;
  try (apply -> parallel_equiv);
  unfold parallel_s.Ltac simpl_left  := apply f_equal2;[solve [ring] | idtac];idtac "simpl gauche".Ltac simpl_right := apply f_equal2;[idtac | solve[ring]];idtac "simpl droite".Ltac simpl_left_right := repeat (simpl_left || simpl_right).

Lemma f_equal2_sym: forall (f : F -> F -> F), (forall x y, f x y = f y x) -> forall (x1 y1 : F) (x2 y2 : F), x1 = y1 -> x2 = y2 -> f x1 x2 = f y2 y1.