unfold circonscrit in |- *; intros A B C O1 O2 O3 I H H0 H1.
elim H1; intros H6 H7; elim H7; intros H8 H9; clear H7 H1; try exact H8.
elim H0; intros H1 H7; elim H7; intros H10 H11; clear H7 H0; try exact H10.
elim H; intros H0 H7; elim H7; intros H12 H13; clear H7 H; try exact H12.
elim
existence_mediatrice_base_isocele with (A := O2) (B := I) (C := A) (D := O1);
auto; intros.
elim
existence_mediatrice_base_isocele with (A := O1) (B := I) (C := B) (D := O3);
auto; intros.
elim
existence_mediatrice_base_isocele with (A := O3) (B := I) (C := C) (D := O2);
auto; intros.
split;
[ apply double_orthogonal; auto | split; apply double_orthogonal; auto ].
apply isocele_bissectrice_hauteur; auto.
apply isocele_bissectrice_hauteur; auto.
apply isocele_bissectrice_hauteur; auto.
apply isocele_bissectrice_hauteur; auto.
apply isocele_bissectrice_hauteur; auto.
apply isocele_bissectrice_hauteur; auto.
Qed.

Theorem general_Napoleon :
forall A B C P0 Q T O1 O2 I : PO,
circonscrit T A B O1 ->
circonscrit I A B O1 ->
circonscrit Q A C O2 ->
circonscrit I A C O2 ->
~ colineaire (vec P0 B) (vec P0 C) ->
R
(plus (cons (vec P0 C) (vec P0 B))
(plus (cons (vec T B) (vec T A)) (cons (vec Q A) (vec Q C)))) pi ->
exists O3 : PO,
R (double (cons (vec O1 O2) (vec O1 O3)))
(double (cons (vec T A) (vec T B))) /\
R (double (cons (vec O1 O3) (vec O2 O3)))
(double (cons (vec P0 B) (vec P0 C))) /\
R (double (cons (vec O1 O2) (vec O2 O3)))
(double (cons (vec Q A) (vec Q C))).