Ltac homt :=
  first [ apply scal_hom; auto; homt | 
          apply add_hom; auto; homt  |
          apply hom3E                 |
          apply hom3l; homt           |
          apply hom3r; homt           |
          apply hom2; homt            |
          apply hom1p                 |
          apply hom1d; homt           |
          apply hom0l; homt           |
          apply hom0r; homt           |
          apply hom0p; homt           |
          apply hom01                 |
          apply homd
   ].Ltac hom3t :=  
  apply proj_homn_eq; auto; try homt.Ltac hom0t := 
  apply proj_hom0_eq; auto; try homt.(* A tactic to normalize one specific bracket *)
Ltac normb a b c :=
 generalize (bracket_norm a b c); 
 intros (Hn1, (Hn2, (Hn3, (Hn4, Hn5))));
 rewrite ?Hn1, ?Hn2, ?Hn3, ?Hn4, ?Hn5;
 clear Hn1 Hn2 Hn3 Hn4 Hn5.

Theorem Desargues (a b c a' b' c': point) : let AB := line a b in let A'B' := line a' b' in let p := intersection AB A'B' in let AC := line a c in let A'C' := line a' c' in let q := intersection AC A'C' in let BC := line b c in let B'C' := line b' c' in let r := intersection BC B'C' in let AA' := line a a' in let BB' := line b b' in let CC' := line c c' in collinear p q r <-> collinear a b c \/ collinear a' b' c' \/ concur AA' BB' CC'.