Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Spaces.Pos.Require Import Spaces.Int.Core.Local Set Universe Minimization ToSet.LocalOpen Scope int_scope.(** ** Addition is commutative *)
n, m: Int
n + m = m + n
n, m: Int
n + m = m + n
p, p0: Pos
neg p + neg p0 = neg p0 + neg p
p, p0: Pos
pos p + pos p0 = pos p0 + pos p
p, p0: Pos
neg (p + p0)%pos = neg (p0 + p)%pos
p, p0: Pos
pos (p + p0) = pos (p0 + p)
all: apply ap, pos_add_comm.Defined.(** ** Zero is the additive identity. *)Definitionint_add_0_ln : 0 + n = n
:= 1.
n: Int
n + 0 = n
n: Int
n + 0 = n
bydestruct n.Defined.(** ** Multiplication by zero is zero *)Definitionint_mul_0_ln : 0 * n = 0
:= 1.
n: Int
n * 0 = 0
n: Int
n * 0 = 0
bydestruct n.Defined.(** ** One is the multiplicative identity *)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~0)%pos) b) =
int_succ_double (int_pos_sub (a~0)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~0)%pos) b) =
int_succ_double (int_pos_sub (a~0)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~0)%pos) b) =
int_succ_double (int_pos_sub (a~0)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~0)%pos) b) =
int_succ_double (int_pos_sub (a~0)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
int_pred_double
(int_double (int_pos_sub (pos_succ a) b)) =
int_succ_double (int_succ_double (int_pos_sub a b))
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
int_pred_double
(int_double (int_pos_sub (pos_succ a) b)) =
int_succ_double
(int_pred_double (int_pos_sub (pos_succ a) b))
bydestruct (int_pos_sub (pos_succ a) b).
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
int_pred_double
(int_pred_double (int_pos_sub (pos_succ a) b)) =
int_succ_double (int_double (int_pos_sub a b))
a: Pos IHa: forallb : Pos,
int_pred_double (int_pos_sub (pos_succ a) b) =
int_succ_double (int_pos_sub a b) b: Pos IHb: int_pred_double (int_pos_sub (pos_succ (a~1)%pos) b) =
int_succ_double (int_pos_sub (a~1)%pos b)
int_pred_double (int_succ_double (int_pos_sub a b)) =
int_succ_double (int_double (int_pos_sub a b))
bydestruct (int_pos_sub a b).Defined.(** ** Subtractions cancel sucessors. *)
a, b: Pos
int_pos_sub (pos_succ a) (pos_succ b) =
int_pos_sub a b
a, b: Pos
int_pos_sub (pos_succ a) (pos_succ b) =
int_pos_sub a b
a, b: Pos
int_pos_sub (a + 1)%pos (b + 1)%pos = int_pos_sub a b
forallab : Pos,
int_pos_sub (a + 1)%pos (b + 1)%pos = int_pos_sub a b
b: Pos bH: foralla : Pos,
int_pred (int_pos_sub a (b~0)%pos) =
int_pos_sub a (pos_succ (b~0)%pos)
(pos_pred_double b + 1 + 1)%pos =
pos_pred_double (pos_succ b)
b: Pos bH: foralla : Pos,
int_pred (int_pos_sub a (b~0)%pos) =
int_pos_sub a (pos_succ (b~0)%pos)
pos_succ (pos_succ (pos_pred_double b)) =
pos_pred_double (pos_succ b)
b: Pos bH: foralla : Pos,
int_pred (int_pos_sub a (b~0)%pos) =
int_pos_sub a (pos_succ (b~0)%pos)
pos_succ (b~0)%pos = pos_pred_double (pos_succ b)
b: Pos bH: foralla : Pos,
int_pred (int_pos_sub a (b~0)%pos) =
int_pos_sub a (pos_succ (b~0)%pos)
pos_succ (b~0)%pos = (b~1)%pos
trivial.
a: Pos aH: forallb : Pos,
(foralla : Pos,
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)) ->
int_pred (int_pos_sub a (pos_succ b)) =
int_pos_sub a (pos_succ (pos_succ b))
forallb : Pos,
(foralla : Pos,
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)) ->
int_pred (int_pos_sub (pos_succ a) (pos_succ b)) =
int_pos_sub (pos_succ a) (pos_succ (pos_succ b))
a: Pos aH: forallb : Pos,
(foralla : Pos,
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)) ->
int_pred (int_pos_sub a (pos_succ b)) =
int_pos_sub a (pos_succ (pos_succ b)) b: Pos bH: foralla : Pos,
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)
int_pred (int_pos_sub (pos_succ a) (pos_succ b)) =
int_pos_sub (pos_succ a) (pos_succ (pos_succ b))
a: Pos aH: forallb : Pos,
(foralla : Pos,
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)) ->
int_pred (int_pos_sub a (pos_succ b)) =
int_pos_sub a (pos_succ (pos_succ b)) b: Pos bH: foralla : Pos,
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)
apply bH.Defined.(** ** Negation of the predecessor is an involution. *)
x: Int
- int_pred (- int_pred x) = x
x: Int
- int_pred (- int_pred x) = x
x: Pos
pos_pred_double (pos_succ x) = (x~1)%pos
x: Pos
(pos_pred_double x + 1)%pos = (x~0)%pos
x: Pos
(pos_pred_double x + 1)%pos = (x~0)%pos
x: Pos
pos_succ (pos_pred_double x) = (x~0)%pos
apply pos_succ_pred_double.Defined.(** ** Predecessor of a sum is the sum with a predecessor *)
a, b: Int
int_pred (a + b) = a + int_pred b
a, b: Int
int_pred (a + b) = a + int_pred b
forallab : Int, int_pred (a + b) = a + int_pred b
a, b: Pos
int_pred (neg a + neg b) = neg a + int_pred (neg b)
a, b: Pos
int_pred (neg a + pos b) = neg a + int_pred (pos b)
a, b: Pos
int_pred (pos a + neg b) = pos a + int_pred (neg b)
a, b: Pos
int_pred (pos a + pos b) = pos a + int_pred (pos b)
a, b: Pos
int_pred (neg a + neg b) = neg a + int_pred (neg b)
a, b: Pos
(a + b + 1)%pos = (a + (b + 1))%pos
byrewrite pos_add_assoc.
a, b: Pos
int_pred (neg a + pos b) = neg a + int_pred (pos b)
b: Pos
foralla : Pos,
int_pred (neg a + pos b) = neg a + int_pred (pos b)
foralla : Pos,
int_pred (neg a + 1) = neg a + int_pred 1
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b)
foralla : Pos,
int_pred (neg a + pos (pos_succ b)) =
neg a + int_pred (pos (pos_succ b))
foralla : Pos,
int_pred (neg a + 1) = neg a + int_pred 1
intro a; exact (int_pred_succ (neg a)).
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b)
foralla : Pos,
int_pred (neg a + pos (pos_succ b)) =
neg a + int_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (neg a + pos (pos_succ b)) =
neg a + int_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (neg a + pos (b + 1%pos)) =
neg a + int_pred (pos (b + 1%pos))
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (neg a + pos (b + 1%pos)) = neg a + pos b
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (pos (b + 1%pos) + neg a) = neg a + pos b
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (int_pos_sub (b + 1)%pos a) = int_pos_sub b a
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (int_pos_sub (pos_succ b) a) =
int_pos_sub b a
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (- int_pos_sub a (pos_succ b)) =
int_pos_sub b a
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
int_pred (- int_pred (int_pos_sub a b)) =
int_pos_sub b a
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
- int_pred (- int_pred (int_pos_sub a b)) =
- int_pos_sub b a
b: Pos bH: foralla : Pos,
int_pred (neg a + pos b) =
neg a + int_pred (pos b) a: Pos
- int_pred (- int_pred (int_pos_sub a b)) =
int_pos_sub a b
apply int_negation_pred_negation_red.
a, b: Pos
int_pred (pos a + neg b) = pos a + int_pred (neg b)
a, b: Pos
int_pred (int_pos_sub a b) = int_pos_sub a (b + 1)%pos
a, b: Pos
int_pred (int_pos_sub a b) =
int_pos_sub a (pos_succ b)
apply int_pred_pos_sub_r.
a, b: Pos
int_pred (pos a + pos b) = pos a + int_pred (pos b)
b: Pos
foralla : Pos,
int_pred (pos a + pos b) = pos a + int_pred (pos b)
foralla : Pos,
int_pred (pos a + 1) = pos a + int_pred 1
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b)
foralla : Pos,
int_pred (pos a + pos (pos_succ b)) =
pos a + int_pred (pos (pos_succ b))
foralla : Pos,
int_pred (pos a + 1) = pos a + int_pred 1
intro a; exact (int_pred_succ (pos a)).
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b)
foralla : Pos,
int_pred (pos a + pos (pos_succ b)) =
pos a + int_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b) a: Pos
int_pred (pos a + pos (pos_succ b)) =
pos a + int_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b) a: Pos
int_pred (pos a + pos (b + 1%pos)) =
pos a + int_pred (pos (b + 1%pos))
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b) a: Pos
int_pred (pos a + pos (b + 1%pos)) = pos a + pos b
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b) a: Pos
match (a + b + 1)%pos with
| 1%pos => 0
| (p~0)%pos => pos (pos_pred_double p)
| (p~1)%pos => pos p~0end = pos (a + b)
b: Pos bH: foralla : Pos,
int_pred (pos a + pos b) =
pos a + int_pred (pos b) a: Pos
int_pred (int_succ (pos (a + b))) = pos a + pos b
apply int_pred_succ.Defined.(** ** Subtraction from a sum is the sum of a subtraction *)
a, b, c: Pos
int_pos_sub (a + b)%pos c = pos a + int_pos_sub b c
a, b, c: Pos
int_pos_sub (a + b)%pos c = pos a + int_pos_sub b c
forallcba : Pos,
int_pos_sub (a + b)%pos c = pos a + int_pos_sub b c
forallba : Pos,
int_pos_sub (a + b)%pos 1%pos =
pos a + int_pos_sub b 1%pos
c: Pos ch: forallba : Pos,
int_pos_sub (a + b)%pos c =
pos a + int_pos_sub b c
forallba : Pos,
int_pos_sub (a + b)%pos (pos_succ c) =
pos a + int_pos_sub b (pos_succ c)
forallba : Pos,
int_pos_sub (a + b)%pos 1%pos =
pos a + int_pos_sub b 1%pos
b, a: Pos
int_pos_sub (a + b)%pos 1%pos =
pos a + int_pos_sub b 1%pos
b, a: Pos
int_pred (pos a + pos b) = pos a + int_pred (pos b)
apply int_pred_add_r.
c: Pos ch: forallba : Pos,
int_pos_sub (a + b)%pos c =
pos a + int_pos_sub b c
forallba : Pos,
int_pos_sub (a + b)%pos (pos_succ c) =
pos a + int_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
int_pos_sub (a + b)%pos c =
pos a + int_pos_sub b c b, a: Pos
int_pos_sub (a + b)%pos (pos_succ c) =
pos a + int_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
int_pos_sub (a + b)%pos c =
pos a + int_pos_sub b c b, a: Pos
int_pred (int_pos_sub (a + b)%pos c) =
pos a + int_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
int_pos_sub (a + b)%pos c =
pos a + int_pos_sub b c b, a: Pos
int_pred (pos a + int_pos_sub b c) =
pos a + int_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
int_pos_sub (a + b)%pos c =
pos a + int_pos_sub b c b, a: Pos
int_pred (pos a + int_pos_sub b c) =
pos a + int_pred (int_pos_sub b c)
apply int_pred_add_r.Defined.(** An auxillary lemma used to prove associativity. *)
p: Pos n, m: Int
pos p + (n + m) = pos p + n + m
p: Pos n, m: Int
pos p + (n + m) = pos p + n + m
p, n, m: Pos
pos p + (neg n + neg m) = pos p + neg n + neg m
p, n: Pos
pos p + (neg n + 0) = pos p + neg n + 0
p, n, m: Pos
pos p + (neg n + pos m) = pos p + neg n + pos m
p, n, m: Pos
pos p + (pos n + neg m) = pos p + pos n + neg m
p, n, m: Pos
pos p + (pos n + pos m) = pos p + pos n + pos m
p, n, m: Pos
pos p + (neg n + neg m) = pos p + neg n + neg m
p, n, m: Pos
- int_pos_sub p (n + m)%pos =
- (int_pos_sub p n + neg m)
p, n, m: Pos
int_pos_sub (n + m)%pos p = int_pos_sub n p + - neg m
p, n, m: Pos
int_pos_sub (m + n)%pos p = - neg m + int_pos_sub n p
cbn; apply ap, pos_add_assoc.Defined.(** ** Associativity of addition *)
n, m, p: Int
n + (m + p) = n + m + p
n, m, p: Int
n + (m + p) = n + m + p
p0: Pos m, p: Int
neg p0 + (m + p) = neg p0 + m + p
m, p: Int
0 + (m + p) = 0 + m + p
p0: Pos m, p: Int
pos p0 + (m + p) = pos p0 + m + p
p0: Pos m, p: Int
neg p0 + (m + p) = neg p0 + m + p
p0: Pos m, p: Int
- (neg p0 + (m + p)) = - (neg p0 + m + p)
p0: Pos m, p: Int
- neg p0 + (- m + - p) = - neg p0 + - m + - p
apply int_add_assoc_pos.
m, p: Int
0 + (m + p) = 0 + m + p
trivial.
p0: Pos m, p: Int
pos p0 + (m + p) = pos p0 + m + p
apply int_add_assoc_pos.Defined.(** ** Relationship between [int_succ], [int_pred] and addition. *)
a, b: Int
int_succ a + b = int_succ (a + b)
a, b: Int
int_succ a + b = int_succ (a + b)
a, b: Int
a + (b + 1) = int_succ (a + b)
apply int_add_assoc.Defined.
a, b: Int
a + int_succ b = int_succ (a + b)
a, b: Int
a + int_succ b = int_succ (a + b)
apply int_add_assoc.Defined.
a, b: Int
int_pred a + b = int_pred (a + b)
a, b: Int
int_pred a + b = int_pred (a + b)
a, b: Int
a + (b + -1) = int_pred (a + b)
apply int_add_assoc.Defined.
a, b: Int
a + int_pred b = int_pred (a + b)
a, b: Int
a + int_pred b = int_pred (a + b)
apply int_add_assoc.Defined.(** ** Commutativity of multiplication *)
n, m: Int
n * m = m * n
n, m: Int
n * m = m * n
destruct n, m; cbn; tryreflexivity;
apply ap; apply pos_mul_comm.Defined.(** Distributivity of multiplication over addition *)
n, m, p: Pos
int_pos_sub n m * pos p =
int_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
int_pos_sub n m * pos p =
int_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
pos p * int_pos_sub n m =
int_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
pos p * int_pos_sub n m =
int_pos_sub (p * n)%pos (p * m)%pos
n, m: Pos
1 * int_pos_sub n m =
int_pos_sub (1 * n)%pos (1 * m)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
pos p~0 * int_pos_sub n m =
int_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
pos p~1 * int_pos_sub n m =
int_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m: Pos
1 * int_pos_sub n m =
int_pos_sub (1 * n)%pos (1 * m)%pos
n, m: Pos
1 * int_pos_sub n m = int_pos_sub n m
apply int_mul_1_l.
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
pos p~0 * int_pos_sub n m =
int_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
pos p~1 * int_pos_sub n m =
int_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
pos p~0 * int_pos_sub n m =
int_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg ((p * y')~0)%pos
| 0 => 0
| pos y' => pos (p * y')%pos~0end = int_double (int_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg ((p * y')~0)%pos
| 0 => 0
| pos y' => pos (p * y')%pos~0end = int_double (pos p * int_pos_sub n m)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos k:= int_pos_sub n m: Int
match k with
| neg y' => neg ((p * y')~0)%pos
| 0 => 0
| pos y' => pos (p * y')%pos~0end = int_double (pos p * k)
bydestruct k.
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
pos p~1 * int_pos_sub n m =
int_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
int_pos_sub (n + (p * n)~0)%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
pos n +
int_pos_sub ((p * n)~0)%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
pos n +
- int_pos_sub (m + (p * m)~0)%pos ((p * n)~0)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
pos n +
-
(pos m + int_pos_sub ((p * m)~0)%pos ((p * n)~0)%pos)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
pos n +
(- pos m +
- int_pos_sub ((p * m)~0)%pos ((p * n)~0)%pos)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
pos n +
(- pos m + int_pos_sub ((p * n)~0)%pos ((p * m)~0)%pos)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
pos n + - pos m +
int_pos_sub ((p * n)~0)%pos ((p * m)~0)%pos
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
int_pos_sub n m +
int_double (int_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end =
int_pos_sub n m + int_double (pos p * int_pos_sub n m)
n, m, p: Pos IHp: pos p * int_pos_sub n m = int_pos_sub (p * n)%pos (p * m)%pos k:= int_pos_sub n m: Int
match k with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + ((p * y')~0)%pos)
end = k + int_double (pos p * k)
bydestruct k.Defined.
n, m, p: Pos
int_pos_sub m n * neg p =
int_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
int_pos_sub m n * neg p =
int_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
neg p * int_pos_sub m n =
int_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
neg p * int_pos_sub m n =
int_pos_sub (p * n)%pos (p * m)%pos
n, m: Pos
-1 * int_pos_sub m n =
int_pos_sub (1 * n)%pos (1 * m)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
neg (p~0)%pos * int_pos_sub m n =
int_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
neg (p~1)%pos * int_pos_sub m n =
int_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m: Pos
-1 * int_pos_sub m n =
int_pos_sub (1 * n)%pos (1 * m)%pos
n, m: Pos
-1 * int_pos_sub m n = int_pos_sub n m
n, m: Pos
-1 * - int_pos_sub n m = int_pos_sub n m
bydestruct (int_pos_sub n m).
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
neg (p~0)%pos * int_pos_sub m n =
int_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
neg (p~1)%pos * int_pos_sub m n =
int_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
neg (p~0)%pos * int_pos_sub m n =
int_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg ((p * y')~0)%pos
end = int_double (int_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg ((p * y')~0)%pos
end = int_double (neg p * int_pos_sub m n)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match - int_pos_sub n m with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg ((p * y')~0)%pos
end = int_double (neg p * - int_pos_sub n m)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos k:= int_pos_sub n m: Int
match - k with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg ((p * y')~0)%pos
end = int_double (neg p * - k)
bydestruct k.
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
neg (p~1)%pos * int_pos_sub m n =
int_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
int_pos_sub (n + (p * n)~0)%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
pos n +
int_pos_sub ((p * n)~0)%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
pos n +
- int_pos_sub (m + (p * m)~0)%pos ((p * n)~0)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
pos n +
-
(pos m + int_pos_sub ((p * m)~0)%pos ((p * n)~0)%pos)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
pos n +
(- pos m +
- int_pos_sub ((p * m)~0)%pos ((p * n)~0)%pos)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
pos n +
(- pos m + int_pos_sub ((p * n)~0)%pos ((p * m)~0)%pos)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
pos n + - pos m +
int_pos_sub ((p * n)~0)%pos ((p * m)~0)%pos
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
int_pos_sub n m +
int_double (int_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
int_pos_sub n m + int_double (neg p * int_pos_sub m n)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos
match int_pos_sub m n with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
- int_pos_sub m n +
int_double (neg p * int_pos_sub m n)
n, m, p: Pos IHp: neg p * int_pos_sub m n = int_pos_sub (p * n)%pos (p * m)%pos k:= int_pos_sub m n: Int
match k with
| neg y' => pos (y' + ((p * y')~0)%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end = - k + int_double (neg p * k)
bydestruct k.Defined.
n, m, p: Int
(n + m) * p = n * p + m * p
n, m, p: Int
(n + m) * p = n * p + m * p
induction p; destruct n, m; cbn; trivial; try f_ap;
tryapply pos_mul_add_distr_r;
tryapply int_pos_sub_mul_neg;
tryapply int_pos_sub_mul_pos;
apply int_mul_0_r.Defined.