(* This program is free software; you can redistribute it and/or      *)
(* modify it under the terms of the GNU Lesser General Public License *)
(* as published by the Free Software Foundation; either version 2.1   *)
(* of the License, or (at your option) any later version.             *)
(*                                                                    *)
(* This program is distributed in the hope that it will be useful,    *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of     *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *)
(* GNU General Public License for more details.                       *)
(*                                                                    *)
(* You should have received a copy of the GNU Lesser General Public   *)
(* License along with this program; if not, write to the Free         *)
(* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *)
(* 02110-1301 USA                                                     *)
Require Export homographic_correctness.
Require Export Qquadratic_sign.
Require Export Qquadratic_Qpositive_to_Qpositive.
Require Export Qquadratic_sign_properties.
Require Export Qquadratic.
Require Export quadraticAcc_Qquadratic_sign.
Require Export Qquadratic_Qpositive_to_Q_properties.
Definition spec_q (a b c d e f g h : Z) (q1 q2 : Q) : Q :=
Qmult
(Qplus (Qplus (Qplus (Qmult (Qmult a q1) q2) (Qmult b q1)) (Qmult c q2))
d)
(Qinv
(Qplus
(Qplus (Qplus (Qmult (Qmult e q1) q2) (Qmult f q1)) (Qmult g q2)) h)).
Definition spec_Qquadratic_Qpositive_to_Q (a b c d e f g h : Z)
(p1 p2 : Qpositive) : Q :=
Qmult
(Qplus
(Qplus
(Qplus (Qmult (Qmult a (Qpos p1)) (Qpos p2)) (Qmult b (Qpos p1)))
(Qmult c (Qpos p2))) d)
(Qinv
(Qplus
(Qplus
(Qplus (Qmult (Qmult e (Qpos p1)) (Qpos p2)) (Qmult f (Qpos p1)))
(Qmult g (Qpos p2))) h)).
(* Here we should expect that ap1p2+bp1+cp2+d > 0 and ep1p1+fp1+gp2+h > 0, this follow - hopefully - from quadraticAcc *)
Definition spec_Qquadratic_Qpositive_to_Qpositive2
(a b c d e f g h : Z) (p1 p2 : Qpositive) : Qpositive :=
Qpositive_mult
(Q_tail
(Qplus
(Qplus
(Qplus (Qmult (Qmult a (Qpos p1)) (Qpos p2)) (Qmult b (Qpos p1)))
(Qmult c (Qpos p2))) d))
(Qpositive_inv
(Q_tail
(Qplus
(Qplus
(Qplus (Qmult (Qmult e (Qpos p1)) (Qpos p2))
(Qmult f (Qpos p1))) (Qmult g (Qpos p2))) h))).

(* Specifications: *)
Lemma spec_Qquadratic_Qpositive_to_Q_commut :
forall (a b c d e f g h : Z) (p1 p2 : Qpositive),
spec_Qquadratic_Qpositive_to_Q a b c d e f g h p1 p2 =
spec_Qquadratic_Qpositive_to_Q a c b d e g f h p2 p1.
Lemma spec_Qquadratic_Qpositive_to_Qpositive2_commut :
forall (a b c d e f g h : Z) (p1 p2 : Qpositive),
spec_Qquadratic_Qpositive_to_Qpositive2 a b c d e f g h p1 p2 =
spec_Qquadratic_Qpositive_to_Qpositive2 a c b d e g f h p2 p1.
Lemma spec_Qquadratic_Qpositive_to_Q_p_One :
forall (a b c d e f g h : Z) (p : Qpositive),
spec_Qquadratic_Qpositive_to_Q a b c d e f g h p One =
spec_Qhomographic_Qpositive_to_Q (a + b) (c + d) (e + f) (g + h) p.
Lemma spec_Qquadratic_Qpositive_to_Q_p_One_unfolded :
forall (a b c d e f g h : Z) (p : Qpositive),
Qmult
(Qplus
(Qplus (Qplus (Qmult (Qmult a (Qpos p)) (Qpos One)) (Qmult b (Qpos p)))
(Qmult c (Qpos One))) d)
(Qinv
(Qplus
(Qplus
(Qplus (Qmult (Qmult e (Qpos p)) (Qpos One)) (Qmult f (Qpos p)))
(Qmult g (Qpos One))) h)) =
Qmult (Qplus (Qmult (a + b)%Z (Qpos p)) (c + d)%Z)
(Qinv (Qplus (Qmult (e + f)%Z (Qpos p)) (g + h)%Z)).