Section DivTerm.
Load "hCoefStructure".
Load "mCoefStructure".
Load "hOrderStructure".
Load "mOrderStructure".
Load "hTerm".
Set Implicit Arguments.
Unset Strict Implicit.
Definition divTerm :
Term A n ->
forall (b : Term A n) (nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b), Term A n.
intros H; case H; intros b2 c2 H'; case H'; intros b3 c3; simpl in |- *.
intros nZb3; exact (divA b2 b3 nZb3, div_mon n c2 c3).
Defined.
Set Strict Implicit.
Unset Implicit Arguments.
intros a b c; case a; case b; case c; simpl in |- *; auto.
intros a0 m a1 m0 a2 m1 nZc H' H'0 H'1; split; auto.
case H'1; intros H'3 H'4; clear H'1.
case H'0; intros H'2 H'5; clear H'0.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with
(y := divA
(plusA (multA (divA a2 a0 nZc) a0) (multA (divA a1 a0 nZc) a0))
a0 nZc); auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with
(y := divA (multA (plusA (divA a2 a0 nZc) (divA a1 a0 nZc)) a0) a0 nZc);
auto.
apply divA_eqA_comp with (1 := cs); auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := plusA (multA a0 (divA a2 a0 nZc)) (multA a0 (divA a1 a0 nZc)));
auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := multA a0 (plusA (divA a2 a0 nZc) (divA a1 a0 nZc)));
auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with
(y := multA (plusA (divA a2 a0 nZc) (divA a1 a0 nZc)) (divA a0 a0 nZc));
auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with
(y := divA (multA a0 (plusA (divA a2 a0 nZc) (divA a1 a0 nZc))) a0 nZc);
auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with
(y := multA (divA a0 a0 nZc) (plusA (divA a2 a0 nZc) (divA a1 a0 nZc)));
auto.
apply divA_multA_comp_r with (1 := cs); auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := multA (plusA (divA a2 a0 nZc) (divA a1 a0 nZc)) A1);
auto.
apply (eqA_sym _ _ _ _ _ _ _ _ _ cs); auto.
apply multA_eqA_comp with (1 := cs); auto.
apply (eqA_sym _ _ _ _ _ _ _ _ _ cs); auto.
apply divA_A1 with (1 := cs); auto.
apply multA_A1_r with (1 := cs); auto.
Qed.
intros a b; case a; case b; simpl in |- *; auto.
intros d c A0' c0 nZA2 H'0; split; auto.
case H'0; intros H'1 H'2; clear H'0.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := divA (invA (multA (divA d A0' nZA2) A0')) A0' nZA2);
auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := divA (multA (invA (divA d A0' nZA2)) A0') A0' nZA2);
auto.
apply divA_eqA_comp with (1 := cs); auto.
apply (eqA_sym _ _ _ _ _ _ _ _ _ cs); apply multA_invA_com_l with (1 := cs);
auto.
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := multA (invA (divA d A0' nZA2)) (divA A0' A0' nZA2));
auto.
apply divA_multA_comp_l with (1 := cs).
apply
(eqA_trans _ _ _ _ _ _ _ _ _ cs)
with (y := multA (invA (divA d A0' nZA2)) A1); auto.
apply multA_eqA_comp with (1 := cs); auto.
apply divA_A1 with (1 := cs).
apply multA_A1_r with (1 := cs).
Qed.
intros a b; case a; case b; simpl in |- *; auto.
split; auto.
apply divA_invA_r with (1 := cs); auto.
Qed.
intros a b c d; case a; case b; case c; case d; unfold eqT in |- *;
simpl in |- *; auto.
intros A0' c0 d2 c2 H' c3 H'0 c4 H'1 H'2 H'3 H'4; rewrite H'3; rewrite H'4;
auto.
Qed.
intros a b c d; case a; case b; case c; case d; simpl in |- *; auto.
intros A0' c0 d2 c2 d3 c3 d4 c4 nZd2 H'0 H'1 H'2.
case H'2; intros H'3 H'4; clear H'2.
case H'1; intros H'2 H'5; clear H'1.
split; auto.
rewrite H'5; rewrite H'4; auto.
Qed.
Hint Resolve eqTerm_divTerm_comp.

Theorem divTerm_multTerm_l :
forall (a b c : Term A n) (nZa : ~ zeroP (A:=A) A0 eqA (n:=n) a),
eqTerm (A:=A) eqA (n:=n) b (multTerm (A:=A) multA (n:=n) (divTerm b nZa) a) ->
eqTerm (A:=A) eqA (n:=n) (divTerm (multTerm (A:=A) multA (n:=n) c b) nZa)
(multTerm (A:=A) multA (n:=n) c (divTerm b nZa)).