Proof with Geometry.
intros.
unfold mid_point in *.
DecompAndAll.
rename H0 into H.
assert (Col B O Q)...
clear H1.
rename H0 into H1.
rename H3 into H0.
cases_equality A P...
assert (A = O)...
assert (A ** O + O ** P = A ** P)...
assert (A ** P = 0)...
rewrite H5 in H4; clear H5...
rewrite <- H0 in H4...
assert (A ** O + A ** O = 2 * A ** O)...
ring...
rewrite H5 in H4; clear H5...
IsoleVar (A ** O) H4...
assert (0 / 2 = 0)...
field...
rewrite H6 in H4...
unfold parallel in |- *...
unfold S4 in |- *...
rewrite H3...
assert (S P P B = 0)...
rewrite H5...
ring_simplify.
assert (Col P B Q)...
rewrite <- H3...
rewrite <- H4 in H1...
assert (A <> O)...
unfold not in |- *; intro...
assert (A ** O = 0)...
rewrite H5 in H0...
assert (O = P)...
assert (A = P)...
congruence...
cases_equality B O...
unfold parallel in |- *...
unfold S4 in |- *...
assert (B ** O = 0)...
rewrite H6 in H2...
assert (O = Q)...
assert (B = Q)...
congruence...
rewrite H7 in H...
rewrite H8...
rewrite H...
assert (S A Q Q = 0)...
rewrite H9...
cases_col O A B...
unfold parallel in |- *...
unfold S4 in |- *...
assert (Col A O B)...
assert (Col A O P)...
assert (Col A P B); eauto with Geom...
assert (Col B O Q)...
assert (Col B O A)...
assert (Col B Q A); eauto with Geom...
rewrite H9...
assert (Col A B Q)...
rewrite H13...
assert (Q ** B / O ** B = S Q A B / S O A B)...
assert (Q <> O)...
unfold not in |- *; intro...
assert (O ** Q = 0)...
assert (B ** O = 0)...
congruence...
assert (Q ** B / O ** B = 2)...
assert (Q ** B = Q ** O + O ** B)...
symmetry  in |- *...
rewrite H9...
assert (O ** B = Q ** O)...
rewrite H10...
field...
assert (O <> P)...
unfold not in |- *; intro...
assert (O ** P = 0)...
assert (A ** O = 0)...
congruence...
assert (P ** A / O ** A = S P A B / S O A B)...
assert (P ** A / O ** A = A ** P / A ** O)...
assert (A ** O + O ** P = A ** P)...
rewrite <- H13 in H12...
rewrite H0 in H12...
assert ((O ** P + O ** P) / O ** P = 2)...
field...
rewrite H14 in H12...
unfold parallel in |- *...
assert (S Q A B / S O A B = S P A B / S O A B)...
congruence...
assert (S Q A B = S A B Q)...
assert (S A P B = - S P A B)...
unfold S4 in |- *...
rewrite <- H16...
rewrite H17...
RewriteVar (S Q A B) H15...
field...
Qed.

(* Specifications: *)
Theorem euclid_parallel_existence_strong :
forall A B P : Point, A<>B -> {Q : Point | parallel A B P Q /\ P<>Q}.