DoTripletAux.v
Require Export Triplet.
Require Export Memory.
Section sect.
Variable n:rNat.
Variable a:(memory n).
Variable f:rNat ->bool.
Variable rMa:(realizeMemory n f a).
Local mEvalEval := (mEvalEval n f a rMa).
Theorem
mEvalEvalTriplet:
(op:rBoolOp)
(i1, i2, i3:rZ) (Hi1:(rZLe i1 n)) (Hi2:(rZLe i2 n)) (Hi3:(rZLe i3 n))
(evalTriplet f (Triplet op i1 i2 i3))=
(evalTriplet
f (Triplet op (mEval n a i1 Hi1) (mEval n a i2 Hi2) (mEval n a i3 Hi3))).
Intros op i1 i2 i3 Hi1 Hi2 Hi3; Simpl.
Rewrite (mEvalEval i1 Hi1); Auto.
Rewrite (mEvalEval i2 Hi2); Auto.
Rewrite (mEvalEval i3 Hi3); Auto.
Qed.
Hints Resolve mEvalEvalTriplet.
Theorem
tContrAddEq:
(i, j:rZ) (Hi:(rZLe i n)) (Hj:(rZLe j n)) (addEq n a i j Hi Hj)=(tContr n) ->
(fEval f i)=(negb (fEval f j)).
Intros i j Hi Hj H'.
Inversion rMa.
Rewrite (H i (rZComp j) Hi (rZLeComp n j Hj)); Auto.
Rewrite (fEvalComp f j); Auto.
Rewrite (addEqContr n a i j Hi Hj); Auto.
Qed.
Theorem
tSometrAddEq:
(b:(memory n))
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n))
(addEq n a i j Hi Hj)=(tSome n b) -> (mEval n b k Hk)=(mEval n b l Hl) ->
(implb (eqb (fEval f i) (fEval f j)) (eqb (fEval f k) (fEval f l)))=true.
Intros b i j k l Hi Hj Hk Hl addEq0 mEval0; Inversion rMa.
Case (addEqInv n a b i j k l Hi Hj Hk Hl addEq0 mEval0); Intros isE0;
[Idtac |
Case isE0; Clear isE0; Intros isE0;
[Case isE0; Clear isE0; Intros isE0 isE1 |
Case isE0; Clear isE0; Intros isE0;
[Case isE0; Clear isE0; Intros isE0 isE1 |
Case isE0; Clear isE0; Intros isE0; Case isE0; Clear isE0;
Intros isE0 isE1]]]; Auto.
Rewrite (H k l Hk Hl); Auto.
Case (fEval f i); Case (fEval f j); Case (fEval f l); Simpl; Auto.
Rewrite (H j l Hj Hl); Auto; Rewrite (H i k Hi Hk); Auto.
Case (fEval f k); Case (fEval f l); Simpl; Auto.
Rewrite (H j (rZComp l) Hj (rZLeComp n l Hl)); Auto.
Rewrite (H i (rZComp k) Hi (rZLeComp n k Hk)); Auto.
Rewrite (fEvalComp f l); Rewrite (fEvalComp f k); Case (fEval f k);
Case (fEval f l); Simpl; Auto.
Rewrite isE0; Auto.
Rewrite isE1; Auto.
Rewrite (H j k Hj Hk); Auto; Rewrite (H i l Hi Hl); Auto.
Case (fEval f k); Case (fEval f l); Simpl; Auto.
Rewrite (H j (rZComp k) Hj (rZLeComp n k Hk)); Auto.
Rewrite (H i (rZComp l) Hi (rZLeComp n l Hl)); Auto.
Rewrite (fEvalComp f l); Rewrite (fEvalComp f k); Case (fEval f k);
Case (fEval f l); Simpl; Auto.
Rewrite isE0; Auto.
Rewrite isE1; Auto.
Qed.
Theorem
tSometrAddEqbis:
(b:(memory n))
(i, j:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n)) (addEq n a i j Hi Hj)=(tSome n b) -> (realizeMemory n f b) ->
(fEval f i)=(fEval f j).
Intros b i j Hi Hj H'1 rMb; Inversion rMb; Auto.
Apply H with Hi := Hi Hj := Hj; Auto.
Apply addEqSome with m1 := a; Auto.
Qed.
Theorem
tSometrAddEqter:
(b:(memory n))
(i, j:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(addEq n a i j Hi Hj)=(tSome n b) -> (fEval f i)=(fEval f j) ->
(realizeMemory n f b).
Intros b i j Hi Hj H' H'0.
Apply realizeMemoryDef.
Intros i0 j0 Hi0 Hj0 isE.
Generalize (tSometrAddEq b i j i0 j0 Hi Hj Hi0 Hj0 H' isE).
Rewrite H'0.
Case (fEval f j); Simpl; Case (fEval f i0); Simpl; Case (fEval f j0); Simpl;
Auto.
Qed.
Definition
addEqDouble :=
[p, q, r, s:rZ]
[Hp:(rZLe p n)] [Hq:(rZLe q n)] [Hr:(rZLe r n)] [Hs:(rZLe s n)]
Cases (addEq n a p q Hp Hq) of
(tSome b) => Cases (addEq n b r s Hr Hs) of
(tSome c) => (tSome n c)
| tContr => (tContr n)
| tNop => (tSome n b)
end
| tContr => (tContr n)
| tNop => (addEq n a r s Hr Hs)
end.
Theorem
tContraddEqDoubleIsEqual:
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n)) (addEqDouble i j k l Hi Hj Hk Hl)=(tContr n) ->
(orb
(eqb (fEval f i) (negb (fEval f j)))
(orb
(eqb (fEval f k) (negb (fEval f l)))
(orb
(andb
(eqb (fEval f k) (fEval f i)) (eqb (fEval f l) (negb (fEval f j))))
(orb
(andb
(eqb (fEval f k) (negb (fEval f i)))
(eqb (fEval f l) (fEval f j)))
(orb
(andb
(eqb (fEval f k) (fEval f j))
(eqb (fEval f l) (negb (fEval f i))))
(andb
(eqb (fEval f k) (negb (fEval f j)))
(eqb (fEval f l) (fEval f i))))))))=true.
Inversion rMa.
Intros i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros b H'0; Generalize (refl_equal ? (addEq n b k l Hk Hl));
Pattern 2 3 (addEq n b k l Hk Hl); Case (addEq n b k l Hk Hl).
Intros m H'1 H'2; Inversion H'2.
Intros H'1 H'2.
Cut (mEval n b k Hk)=(mEval n b (rZComp l) (rZLeComp n l Hl));
[Intros H'3 | Rewrite (addEqContr n b k l Hk Hl)]; Auto.
Case (addEqInv n a b i j k (rZComp l) Hi Hj Hk (rZLeComp n l Hl) H'0 H'3);
Intros isE0;
[Idtac |
Case isE0; Clear isE0; Intros isE0;
[Case isE0; Clear isE0; Intros isE0 isE1 |
Case isE0; Clear isE0; Intros isE0;
[Case isE0; Clear isE0; Intros isE0 isE1 |
Case isE0; Clear isE0; Intros isE0; Case isE0; Clear isE0;
Intros isE0 isE1]]]; Auto.
Rewrite (H k (rZComp l) Hk (rZLeComp n l Hl)); Auto.
Rewrite (fEvalComp f l); Case (fEval f i); Simpl; Case (fEval f j); Simpl;
Case (fEval f l); Simpl; Auto.
Rewrite (H i k Hi Hk); Auto; Rewrite (H j (rZComp l) Hj (rZLeComp n l Hl)); Auto.
Rewrite (fEvalComp f l); Case (fEval f k); Case (fEval f l); Simpl; Auto.
Rewrite (H j l Hj Hl); Auto.
Rewrite (H i (rZComp k) Hi (rZLeComp n k Hk)); Auto.
Rewrite (fEvalComp f k); Case (fEval f k); Case (fEval f l); Simpl; Auto.
Rewrite isE0; Auto.
Rewrite isE1; Auto.
Rewrite (mEvalComp n a l Hl (rZLeComp n l Hl)); Auto.
Rewrite (H j k Hj Hk); Auto; Rewrite (H i (rZComp l) Hi (rZLeComp n l Hl)); Auto.
Rewrite (fEvalComp f l); Case (fEval f k); Case (fEval f l); Simpl; Auto.
Rewrite (H j (rZComp k) Hj (rZLeComp n k Hk)); Auto.
Rewrite (H i l Hi Hl); Auto.
Rewrite (fEvalComp f k); Case (fEval f k); Case (fEval f l); Simpl; Auto.
Rewrite isE0; Auto.
Rewrite (mEvalComp n a l Hl (rZLeComp n l Hl)); Auto.
Rewrite (mEvalComp n a k Hk (rZLeComp n k Hk)); Auto.
Intros H'1 H'2; Inversion H'2.
Intros H'1 H'2; Rewrite (tContrAddEq i j Hi Hj); Auto.
Case (fEval f j); Simpl; Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Intros H'0 H'1; Rewrite (tContrAddEq k l Hk Hl); Auto.
Case (fEval f j); Case (fEval f l); Simpl; Auto with bool.
Qed.
Theorem
addEqDoubleNopDef:
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n))
(mEval n a i Hi)=(mEval n a j Hj) -> (mEval n a k Hk)=(mEval n a l Hl) ->
(addEqDouble i j k l Hi Hj Hk Hl)=(tNop n).
Intros i j k l Hi Hj Hk Hl H' H'0; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj); Auto.
Intros m H'1; Absurd (mEval n a i Hi)=(mEval n a j Hj); Auto.
Apply addEqDef1 with m2 := m; Auto.
Intros H'1; Absurd (mEval n a i Hi)=(mEval n a j Hj); Auto.
Rewrite (addEqContr n a i j Hi Hj); Auto.
Intros H'1.
Apply nopAddEq; Auto.
Qed.
Theorem
addEqDoubleNopIsEqual1:
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n)) (Hl:(rZLe l n)) (addEqDouble i j k l Hi Hj Hk Hl)=(tNop n) ->
(mEval n a i Hi)=(mEval n a j Hj).
Intros i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros m H'; Generalize (refl_equal ? (addEq n m k l Hk Hl));
Pattern 2 3 (addEq n m k l Hk Hl); Case (addEq n m k l Hk Hl); Auto.
Intros m0 H'0 H'1; Inversion H'1.
Intros H'0 H'1; Inversion H'1.
Intros H'0 H'1; Inversion H'1.
Intros H'0 H'1; Inversion H'1.
Intros H' H'0; Apply addEqNop; Auto.
Qed.
Theorem
addEqDoubleIsEqual1:
(b:(memory n))
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n)) (addEqDouble i j k l Hi Hj Hk Hl)=(tSome n b) ->
(mEval n b i Hi)=(mEval n b j Hj).
Intros b i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros m H'; Generalize (refl_equal ? (addEq n m k l Hk Hl));
Pattern 2 3 (addEq n m k l Hk Hl); Case (addEq n m k l Hk Hl).
Intros m0 H'0 H'1; Auto.
Apply addEqSomeDef1 with m1 := m i1 := k j1 := l Hi1 := Hk Hj1 := Hl; Auto.
Rewrite <- H'1; Auto.
Apply addEqSome with m1 := a; Auto.
Intros H'0 H'1; Inversion H'1.
Intros H'0 H'1.
Apply addEqSome with m1 := a; Auto.
Rewrite <- H'1; Auto.
Intros H' H'0; Inversion H'0.
Intros H' H'0.
Apply addEqSomeDef1 with m1 := a i1 := k j1 := l Hi1 := Hk Hj1 := Hl; Auto.
Qed.
Theorem
addEqDoubleNopIsEqual2:
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n)) (Hl:(rZLe l n)) (addEqDouble i j k l Hi Hj Hk Hl)=(tNop n) ->
(mEval n a k Hk)=(mEval n a l Hl).
Intros i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros m H'; Generalize (refl_equal ? (addEq n m k l Hk Hl));
Pattern 2 3 (addEq n m k l Hk Hl); Case (addEq n m k l Hk Hl); Auto.
Intros m0 H'0 H'1; Inversion H'1.
Intros H'0 H'1; Inversion H'1.
Intros H'0 H'1; Inversion H'1.
Intros H'0 H'1; Inversion H'1.
Intros H' H'0; Apply addEqNop; Auto.
Qed.
Theorem
addEqDoubleIsEqual2:
(b:(memory n))
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n)) (addEqDouble i j k l Hi Hj Hk Hl)=(tSome n b) ->
(mEval n b k Hk)=(mEval n b l Hl).
Intros b i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros m H'; Generalize (refl_equal ? (addEq n m k l Hk Hl));
Pattern 2 3 (addEq n m k l Hk Hl); Case (addEq n m k l Hk Hl).
Intros m0 H'0 H'1; Auto.
Apply addEqSome with m1 := m; Auto.
Rewrite <- H'1; Auto.
Intros H'0 H'1; Inversion H'1.
Intros H'0 H'1; Apply addEqNop; Auto.
Inversion H'1; Auto.
Rewrite <- H0; Auto.
Intros H' H'0; Inversion H'0.
Intros H' H'0; Apply addEqSome with m1 := a; Auto.
Qed.
Theorem
someaddEqDouble:
(b:(memory n))
(i, j, k, l, u, v:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n))
(Hu:(rZLe u n))
(Hv:(rZLe v n))
(addEqDouble i j k l Hi Hj Hk Hl)=(tSome n b) ->
(mEval n b u Hu)=(mEval n b v Hv) ->
(implb
(andb (eqb (fEval f i) (fEval f j)) (eqb (fEval f k) (fEval f l)))
(eqb (fEval f u) (fEval f v)))=true.
Intros b i j k l u v Hi Hj Hk Hl Hu Hv; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros c H'0; Generalize (refl_equal ? (addEq n c k l Hk Hl));
Pattern 2 3 (addEq n c k l Hk Hl); Case (addEq n c k l Hk Hl).
Intros d H' H'1 H'2; Inversion H'1.
Rewrite H0 in H'.
Case (addEqInv n c b k l u v Hk Hl Hu Hv H' H'2); Intros isE0;
[Idtac |
Case isE0; Clear isE0; Intros isE0;
[Case isE0; Clear isE0; Intros isE0 isE1 |
Case isE0; Clear isE0; Intros isE0;
[Case isE0; Clear isE0; Intros isE0 isE1 |
Case isE0; Clear isE0; Intros isE0; Case isE0; Clear isE0;
Intros isE0 isE1]]].
Generalize (tSometrAddEq c i j u v Hi Hj Hu Hv H'0 isE0).
Case (fEval f u); Simpl; Case (fEval f v); Simpl; Case (fEval f i); Simpl;
Case (fEval f j); Simpl; Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Generalize (tSometrAddEq c i j l v Hi Hj Hl Hv H'0 isE1);
Generalize (tSometrAddEq c i j k u Hi Hj Hk Hu H'0 isE0).
Case (fEval f u); Simpl; Case (fEval f v); Simpl; Case (fEval f i); Simpl;
Case (fEval f j); Simpl; Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Cut (mEval n c k Hk)=(mEval n c (rZComp u) (rZLeComp n u Hu));
[Intros isE2 | Rewrite isE0]; Auto.
Cut (mEval n c l Hl)=(mEval n c (rZComp v) (rZLeComp n v Hv));
[Intros isE3 | Rewrite isE1]; Auto.
Generalize (tSometrAddEq c i j l (rZComp v) Hi Hj Hl (rZLeComp n v Hv) H'0 isE3);
Generalize (tSometrAddEq
c i j k (rZComp u) Hi Hj Hk (rZLeComp n u Hu) H'0 isE2).
Rewrite (fEvalComp f v); Rewrite (fEvalComp f u); Case (fEval f u); Simpl;
Case (fEval f v); Simpl; Case (fEval f i); Simpl; Case (fEval f j); Simpl;
Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Generalize (tSometrAddEq c i j l u Hi Hj Hl Hu H'0 isE1);
Generalize (tSometrAddEq c i j k v Hi Hj Hk Hv H'0 isE0).
Case (fEval f u); Simpl; Case (fEval f v); Simpl; Case (fEval f i); Simpl;
Case (fEval f j); Simpl; Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Cut (mEval n c k Hk)=(mEval n c (rZComp v) (rZLeComp n v Hv));
[Intros isE2 | Rewrite isE0]; Auto.
Cut (mEval n c l Hl)=(mEval n c (rZComp u) (rZLeComp n u Hu));
[Intros isE3 | Rewrite isE1]; Auto.
Generalize (tSometrAddEq c i j l (rZComp u) Hi Hj Hl (rZLeComp n u Hu) H'0 isE3);
Generalize (tSometrAddEq
c i j k (rZComp v) Hi Hj Hk (rZLeComp n v Hv) H'0 isE2).
Rewrite (fEvalComp f v); Rewrite (fEvalComp f u); Case (fEval f u); Simpl;
Case (fEval f v); Simpl; Case (fEval f i); Simpl; Case (fEval f j); Simpl;
Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Intros H' H'1; Inversion H'1.
Intros H' H'1 H'2; Inversion H'1.
Rewrite H0 in H'0.
Generalize (tSometrAddEq b i j u v Hi Hj Hu Hv H'0 H'2).
Case (fEval f u); Simpl; Case (fEval f v); Simpl; Case (fEval f i); Simpl;
Case (fEval f j); Simpl; Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Intros H' H'0; Inversion H'0.
Intros H' H'0 H'1.
Generalize (tSometrAddEq b k l u v Hk Hl Hu Hv H'0 H'1).
Case (fEval f u); Simpl; Case (fEval f v); Simpl; Case (fEval f i); Simpl;
Case (fEval f j); Simpl; Case (fEval f k); Simpl; Case (fEval f l); Simpl; Auto.
Qed.
Theorem
mLessAddEqDouble:
(b:(memory n))
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n)) (addEqDouble i j k l Hi Hj Hk Hl)=(tSome n b) ->(mLess n b a).
Intros b i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n a i j Hi Hj));
Pattern 2 3 (addEq n a i j Hi Hj); Case (addEq n a i j Hi Hj).
Intros c H'0; Generalize (refl_equal ? (addEq n c k l Hk Hl));
Pattern 2 3 (addEq n c k l Hk Hl); Case (addEq n c k l Hk Hl).
Intros d H' H'1; Inversion H'1.
Apply (mLessTrans n) with y := c; Auto.
Apply addEqMless with i := k j := l Hi := Hk Hj := Hl; Auto.
Rewrite <- H0; Auto.
Apply addEqMless with i := i j := j Hi := Hi Hj := Hj; Auto.
Intros H' H'1; Inversion H'1.
Intros H' H'1; Inversion H'1.
Apply addEqMless with i := i j := j Hi := Hi Hj := Hj; Auto.
Rewrite <- H0; Auto.
Intros H' H'1; Inversion H'1.
Intros H' H'0.
Apply addEqMless with i := k j := l Hi := Hk Hj := Hl; Auto.
Qed.
End sect.
Theorem
addEqDoubleSomeInc:
(n:rNat)
(m1, m2:(memory n))
(i, j, k, l:rZ)
(Hi:(rZLe i n))
(Hj:(rZLe j n))
(Hk:(rZLe k n))
(Hl:(rZLe l n)) (addEqDouble n m1 i j k l Hi Hj Hk Hl)=(tSome n m2) ->
(inclMem n m1 m2).
Intros n m1 m2 i j k l Hi Hj Hk Hl; Unfold addEqDouble.
Generalize (refl_equal ? (addEq n m1 i j Hi Hj));
Pattern 2 3 (addEq n m1 i j Hi Hj); Case (addEq n m1 i j Hi Hj).
Intros m3 H'0; Generalize (refl_equal ? (addEq n m3 k l Hk Hl));
Pattern 2 3 (addEq n m3 k l Hk Hl); Case (addEq n m3 k l Hk Hl).
Intros m4 H' H'1; Inversion H'1.
Rewrite <- H0; Auto.
Apply (inclMemTrans n) with y := m3; Auto.
Apply addEqSomeIncl with i := i j := j Hi := Hi Hj := Hj; Auto.
Apply addEqSomeIncl with i := k j := l Hi := Hk Hj := Hl; Auto.
Intros H' H'1; Inversion H'1.
Intros H' H'1; Inversion H'1.
Rewrite <- H0.
Apply addEqSomeIncl with i := i j := j Hi := Hi Hj := Hj; Auto.
Intros H' H'0; Inversion H'0.
Intros H' H'0.
Apply addEqSomeIncl with i := k j := l Hi := Hk Hj := Hl; Auto.
Qed.
Theorem
addDoubleEqEq:
(n:rNat)
(m1, m2:(memory n))
(i1, i2, j1, j2, k1, k2, l1, l2:rZ)
(Hi1:(rZLe i1 n))
(Hi2:(rZLe i2 n))
(Hj1:(rZLe j1 n))
(Hj2:(rZLe j2 n))
(Hk1:(rZLe k1 n))
(Hk2:(rZLe k2 n))
(Hl1:(rZLe l1 n))
(Hl2:(rZLe l2 n))
(eqMem n m1 m2) ->
(mEval n m1 i1 Hi1)=(mEval n m1 i2 Hi2) ->
(mEval n m1 j1 Hj1)=(mEval n m1 j2 Hj2) ->
(mEval n m1 k1 Hk1)=(mEval n m1 k2 Hk2) ->
(mEval n m1 l1 Hl1)=(mEval n m1 l2 Hl2) ->
(eqtMem
n (addEqDouble n m1 i1 j1 k1 l1 Hi1 Hj1 Hk1 Hl1)
(addEqDouble n m2 i2 j2 k2 l2 Hi2 Hj2 Hk2 Hl2)).
Intros n m1 m2 i1 i2 j1 j2 k1 k2 l1 l2 Hi1 Hi2 Hj1 Hj2 Hk1 Hk2 Hl1 Hl2 H' H'0
H'1 H'2 H'3; Unfold addEqDouble.
Cut (eqtMem n (addEq n m1 i1 j1 Hi1 Hj1) (addEq n m2 i2 j2 Hi2 Hj2)).
2:Apply addEqEq; Auto.
Case (addEq n m1 i1 j1 Hi1 Hj1); Auto.
Intros m H'4; Inversion H'4.
Cut (eqtMem n (addEq n m k1 l1 Hk1 Hl1) (addEq n b k2 l2 Hk2 Hl2)).
Case (addEq n m k1 l1 Hk1 Hl1); Auto.
Intros m0 H'5; Inversion H'5.
Apply eqtMemDefSome; Auto.
Intros H'5; Inversion H'5.
Apply eqtMemDefContr; Auto.
Intros H'5; Inversion H'5.
Apply eqtMemDefSome; Auto.
Apply addEqEq; Auto.
Apply eqMeminv1 with m1 := b; Auto.
Apply (eqMemSym n); Auto.
Apply addEqSomeDef1 with m1 := m2 i1 := i2 j1 := j2 Hi1 := Hi2 Hj1 := Hj2; Auto.
Apply eqMeminv1 with m1 := m1; Auto.
Apply eqMeminv1 with m1 := b; Auto.
Apply (eqMemSym n); Auto.
Apply addEqSomeDef1 with m1 := m2 i1 := i2 j1 := j2 Hi1 := Hi2 Hj1 := Hj2; Auto.
Apply eqMeminv1 with m1 := m1; Auto.
Intros H'5; Inversion H'5.
Apply eqtMemDefContr; Auto.
Intros H'5; Inversion H'5.
Apply addEqEq; Auto.
Qed.
Hints Resolve addDoubleEqEq.
25/03/99, 16:39