rZ.v


Require Import Relation_Definitions.
Parameter rNat:Set.
Parameter zero:rNat.
Parameter rnext:rNat ->rNat.
(* rZ are signed rNat *)

Inductive rZ: Set :=
     rZPlus: rNat ->
rZ
    | rZMinus: rNat ->rZ .

(* We single out zero as being intepreted as True *)

Definition rZTrue := (rZPlus zero).

Definition
rZFalse := (rZMinus zero).

(* Complementary *)

Definition
rZComp: rZ ->rZ :=
   [r:rZ]
      Cases r of
          (rZPlus m) => (rZMinus m)
         | (rZMinus m) => (rZPlus m)
      end.

Theorem rZCompInv: (m:rZ)(rZComp (rZComp m))=m.
Intros m; Case m; Simpl; Auto.
Qed.
Parameter rlt:rNat -> rNat ->Prop.

Axiom rNatDec:(n, m:rNat){n=m}+{~ n=m}.

Axiom rltDec:(m, n:rNat){(rlt m n)}+{(rlt n m) \/ m=n}.

Axiom rltEDec:(m, n:rNat){(rlt m n)}+{(rlt n m)}+{m=n}.

Axiom rltDef2:(m, n:rNat) (rlt m n) ->~ m=n.

Axiom rltTrans:(transitive rNat rlt).

Axiom rltNotRefl:(a:rNat)~ (rlt a a).
Hints Resolve rltNotRefl.

Axiom rnextRlt:(m:rNat)(rlt m (rnext m)).
Hints Resolve rnextRlt.

Axiom rnextNotZero:(m:rNat)(rlt zero (rnext m)).
Hints Resolve rnextNotZero.

Definition rmax: rNat -> rNat ->rNat.
Intros n m; Case (rltDec n m); Intros Rlt0.
Exact m.
Exact n.
Defined.

Lemma
rmaxRlt: (n, m, p:rNat) (rlt m n) -> (rlt p n) ->(rlt (rmax m p) n).
Intros n m p; Unfold rmax; Case (rltDec m p); Auto.
Qed.

Lemma rmaxRltLeft: (n, m, p:rNat) (rlt (rmax m p) n) ->(rlt m n).
Intros n m p; Unfold rmax; Case (rltDec m p); Auto; Intros Rlt0.
Intros Rlt1; Apply rltTrans with y := p; Auto.
Qed.

Lemma rmaxRltRight: (n, m, p:rNat) (rlt (rmax m p) n) ->(rlt p n).
Intros n m p; Unfold rmax; Case (rltDec m p); Auto; Intros Rlt0.
Case Rlt0; Clear Rlt0; Intros Rlt0; Auto.
Intros Rlt1; Apply rltTrans with y := m; Auto.
Rewrite <- Rlt0; Auto.
Qed.

Axiom rNextInv:(n, m:rNat) (rlt n (rnext m)) ->n=m \/ (rlt n m).

Lemma rltTransRnext1: (n, m, p:rNat) (rlt n (rnext m)) -> (rlt m p) ->(rlt n p).
Intros n m p H' H'0; Case (rNextInv n m); Auto.
Intros H'1; Rewrite H'1; Auto.
Intros H'1; Apply rltTrans with y := m; Auto.
Qed.

Lemma
rltTransRnext2: (n, m, p:rNat) (rlt n m) -> (rlt m (rnext p)) ->(rlt n p).
Intros n m p H' H'0; Case (rNextInv m p); Auto.
Intros H'1; Rewrite <- H'1; Auto.
Intros H'1; Apply rltTrans with y := m; Auto.
Qed.

Lemma
rltRnext2Inv: (n, m:rNat) (rlt (rnext n) (rnext m)) ->(rlt n m).
Intros n m H'; Case (rNextInv (rnext n) m); Auto.
Intros H'0; Rewrite <- H'0; Auto.
Intros H'1; Apply rltTrans with y := (rnext n); Auto.
Qed.

Lemma
rnextMono: (m, n:rNat) (rlt m n) ->(rlt (rnext m) (rnext n)).
Intros m n H'.
Case (rltDec (rnext m) n); Intros Rlt0; Auto.
Apply rltTrans with y := n; Auto.
Case Rlt0; Intros Rlt1.
Elim (rNextInv n m); Auto; Intros Rlt2; Absurd (rlt m m); Auto.
Rewrite Rlt2 in H'; Auto.
Apply rltTrans with y := n; Auto.
Rewrite <- Rlt1; Auto.
Qed.
Hints Resolve
rnextMono.

Lemma rltRmaxLeft: (n, m:rNat)(rlt n (rnext (rmax n m))).
Intros n m; Unfold rmax; Case (rltDec n m); Auto; Intros Rlt0.
Apply rltTrans with y := m; Auto.
Qed.

Lemma rltRmaxRight: (n, m:rNat)(rlt m (rnext (rmax n m))).
Intros n m; Unfold rmax; Case (rltDec n m); Auto; Intros Rlt0.
Case Rlt0; Clear Rlt0; Intros Rlt0; Auto.
Apply rltTrans with y := n; Auto.
Rewrite <- Rlt0; Auto.
Qed.
Hints Resolve rltRmaxLeft rltRmaxRight.

Theorem rltAntiSym: (a, b:rNat) (rlt a b) ->~ (rlt b a).
Intros a b H'; Red; Intros H'0; Absurd (rlt a a); Auto.
Apply rltTrans with y := b; Auto.
Qed.

Definition
rZDec: (a, b:rZ){a=b}+{~ a=b}.
Intros a b; Case a; Case b; Try (Intros; Right; Red; Intros; Discriminate);
 Intros a' b'; Case (rNatDec a' b'); Intros Eq1;
 Try (Left; Rewrite Eq1; Auto; Fail); Auto; Intros; Right; Red; Intros Eq2;
 Apply Eq1; Inversion Eq2; Auto.
Defined.

(*Absolute value*)

Definition valRz :=
   [a:
rZ]
      Cases a of
          (rZPlus b) => b
         | (rZMinus b) => b
      end.

Definition rZlt := [a, b:rZ](rlt (valRz a) (valRz b)).

Definition eqRz := [a, b:rZ](valRz a)=(valRz b).
Hints Unfold eqRz rZlt.

Theorem eqrZRefl: (reflexive rZ eqRz).
Red; Intros a; Case a; Simpl; Auto.
Qed.
Hints Resolve eqrZRefl.

Theorem eqrZSym: (symmetric rZ eqRz).
Red; Intros a b; Case a; Case b; Simpl; Auto.
Qed.
Hints Resolve eqrZSym.

Theorem eqrZTrans: (transitive rZ eqRz).
Red; Auto.
Unfold eqRz; Intros x y z H'; Rewrite H'; Auto.
Qed.
Hints Resolve eqrZTrans.

Definition rZltDec: (a, b:rZ){(rZlt a b)}+{(rZlt b a) \/ (eqRz a b)}.
Intros a b; Exact (rltDec (valRz a) (valRz b)).
Defined.

Definition rZltEDec: (a, b:rZ){(rZlt a b)}+{(rZlt b a)}+{(eqRz a b)}.
Intros a b; Exact (rltEDec (valRz a) (valRz b)); Auto.
Defined.

Theorem rZltEqComp:
  (a, b, c, d:
rZ) (rZlt a b) -> (eqRz a c) -> (eqRz b d) ->(rZlt c d).
Intros a b c d; Unfold rZlt eqRz; Case a; Case b; Case c; Case d; Simpl;
 Intros a' b' c' d' H'0 H'1 H'2; Try Rewrite <- H'1; Try Rewrite <- H'2; Auto.
Qed.

Theorem rZltDef2: (a, b:rZ) (rZlt a b) ->~ (eqRz a b).
Intros a b H; Unfold eqRz; Apply rltDef2; Auto.
Qed.
Hints Resolve rZltDef2.

Theorem rZltTrans: (transitive rZ rZlt).
Red.
Intros x y z H' H'0; Red; Apply rltTrans with y := (valRz y); Auto.
Qed.
Hints Resolve rZltTrans.

Theorem rZltNotRefl: (a:rZ)~ (rZlt a a).
Intros a; Unfold rZlt; Auto.
Qed.
Hints Resolve rZltNotRefl.

Theorem rZltAntiSym: (a, b:rZ) (rZlt a b) ->~ (rZlt b a).
Intros a b H'; Red; Intros H'0; Absurd (rZlt a a); Auto.
Apply rZltTrans with y := b; Auto.
Qed.
Hints Resolve rZltAntiSym.

Theorem NotEqComp: (a:rZ)~ a=(rZComp a).
Intros a; Case a; Red; Intros H'; Discriminate.
Qed.
Hints Resolve NotEqComp.

Theorem eqRzComp: (a:rZ)(eqRz a (rZComp a)).
Intros a; Case a; Auto.
Qed.
Hints Resolve eqRzComp.

Theorem valRzComp: (a:rZ)(valRz (rZComp a))=(valRz a).
Intros a; Case a; Auto.
Qed.

Theorem rZCompInvol: (a:rZ)a=(rZComp (rZComp a)).
Intros a; Case a; Simpl; Auto.
Qed.
Hints Resolve rZCompInvol.

Theorem rZCompEq: (a, b:rZ) (rZComp a)=(rZComp b) ->a=b.
Intros a b; Case a; Case b; Simpl; Auto; Intros a' b' H; Inversion H; Auto.
Qed.

Definition min: rZ -> rZ ->rZ :=
   [a, b:rZ]
      Cases (rZltDec a b) of
          (left _) => a
         | (right _) => b
      end.

Definition max: rZ -> rZ ->rZ :=
   [a, b:rZ]
      Cases (rZltDec a b) of
          (left _) => b
         | (right _) => a
      end.

Theorem minProp1: (a, b:rZ) (rZlt a b) ->(min a b)=a.
Intros a b; Unfold min; Case (rZltDec a b); Simpl; Auto.
Intros H'; Case H'; Intros H'0 H'1.
Absurd (rZlt b a); Auto.
Absurd (eqRz a b); Auto.
Qed.

Theorem minProp2: (a, b:rZ) (rZlt b a) ->(min a b)=b.
Intros a b; Unfold min; Case (rZltDec a b); Simpl; Auto.
Intros H'0 H'1; Absurd (rZlt b a); Auto.
Qed.

Theorem minProp3: (a, b:rZ) (rZlt a b) ->(min b a)=a.
Intros a b; Unfold min; Case (rZltDec b a); Simpl; Auto.
Intros H'0 H'1; Absurd (rZlt b a); Auto.
Qed.

Theorem minProp4: (a, b:rZ) (rZlt b a) ->(min b a)=b.
Intros a b; Unfold min; Case (rZltDec b a); Simpl; Auto.
Intros H'; Case H'; Intros H'0 H'1.
Absurd (rZlt b a); Auto.
Absurd (eqRz b a); Auto.
Qed.

Theorem minProp5: (a, b:rZ) (eqRz a b) ->(min a b)=b.
Intros a b; Unfold min; Case (rZltDec a b); Simpl; Auto.
Intros H'0 H'1; Absurd (eqRz a b); Auto.
Qed.

Theorem minProp6: (a, b:rZ) (eqRz a b) ->(min b a)=a.
Intros a b; Unfold min; Case (rZltDec b a); Simpl; Auto.
Intros H' H'0; Absurd (eqRz b a); Auto.
Qed.

Theorem maxProp1: (a, b:rZ) (rZlt a b) ->(max a b)=b.
Intros a b; Unfold max; Case (rZltDec a b); Simpl; Auto.
Intros H'; Case H'; Intros H'0 H'1.
Absurd (rZlt b a); Auto.
Absurd (eqRz a b); Auto.
Qed.

Theorem maxProp2: (a, b:rZ) (rZlt b a) ->(max a b)=a.
Intros a b; Unfold max; Case (rZltDec a b); Simpl; Auto.
Intros H'0 H'1; Absurd (rZlt b a); Auto.
Qed.

Theorem maxProp3: (a, b:rZ) (rZlt a b) ->(max b a)=b.
Intros a b; Unfold max; Case (rZltDec b a); Simpl; Auto.
Intros H'0 H'1; Absurd (rZlt b a); Auto.
Qed.

Theorem maxProp4: (a, b:rZ) (rZlt b a) ->(max b a)=a.
Intros a b; Unfold max; Case (rZltDec b a); Simpl; Auto.
Intros H'; Case H'; Intros H'0 H'1.
Absurd (rZlt b a); Auto.
Absurd (eqRz b a); Auto.
Qed.

Theorem maxProp5: (a, b:rZ) (eqRz a b) ->(max a b)=a.
Intros a b; Unfold max; Case (rZltDec a b); Simpl; Auto.
Intros H' H'0; Absurd (eqRz a b); Auto.
Qed.

Theorem maxProp6: (a, b:rZ) (eqRz a b) ->(max b a)=b.
Intros a b; Unfold max; Case (rZltDec b a); Simpl; Auto.
Intros H' H'0; Absurd (eqRz b a); Auto.
Qed.

Definition rZSignDec: (a, b:rZ){a=b}+{a=(rZComp b)}+{~ (eqRz a b)}.
Intros a b; Case a; Case b; Intros a' b'; Case (rNatDec a' b'); Simpl; Auto;
 Intros Eqa'b'.
Left; Left; Rewrite Eqa'b'; Auto.
Left; Right; Rewrite Eqa'b'; Auto.
Left; Right; Rewrite Eqa'b'; Auto.
Left; Left; Rewrite Eqa'b'; Auto.
Defined.

Definition liftRz :=
   [f:rNat ->
rZ] [a:rZ]
      Cases a of
          (rZPlus a') => (f a')
         | (rZMinus a') => (rZComp (f a'))
      end.

Definition samePol := [a:rZ] [b:rNat](liftRz [a:rNat](rZPlus b) a).

Definition rVlt := [a:rZ] [b:rNat](rlt (valRz a) b).

Theorem rVltrZComp: (a:rZ) (b:rNat) (rVlt a b) ->(rVlt (rZComp a) b).
Intros a b; Case a; Simpl; Auto.
Qed.
Hints Resolve rVltrZComp.

Definition samePolRz := [a, b:rZ](liftRz [c:rNat]b a).
Require Import PolyList.
Parameter rZList:rNat ->(list rNat).

Axiom rZListIn:(a, b:rNat) (rlt a b) ->(In a (rZList b)).

Axiom InrZList:(a, b:rNat) (In a (rZList b)) ->(rlt a b).

Definition mBL := [n, a, b:rNat](rlt b a) /\ (rlt a n).

Axiom mBLWf:(n:rNat)(well_founded rNat (
mBL n)).


05/07/100, 11:37