Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.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.BinInt.Core.Local Set Universe Minimization ToSet.LocalOpen Scope binint_scope.(** ** Addition is commutative *)
n, m: BinInt
n + m = m + n
n, m: BinInt
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. *)Definitionbinint_add_0_ln : 0 + n = n
:= 1.
n: BinInt
n + 0 = n
n: BinInt
n + 0 = n
bydestruct n.Defined.(** ** Multiplication by zero is zero *)Definitionbinint_mul_0_ln : 0 * n = 0
:= 1.
n: BinInt
n * 0 = 0
n: BinInt
n * 0 = 0
bydestruct n.Defined.(** ** One is the multiplicative identity *)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~0%pos) b) =
binint_succ_double (binint_pos_sub a~0%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~0%pos) b) =
binint_succ_double (binint_pos_sub a~0%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~0%pos) b) =
binint_succ_double (binint_pos_sub a~0%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~0%pos) b) =
binint_succ_double (binint_pos_sub a~0%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
binint_pred_double
(binint_double (binint_pos_sub (pos_succ a) b)) =
binint_succ_double
(binint_succ_double (binint_pos_sub a b))
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
binint_pred_double
(binint_double (binint_pos_sub (pos_succ a) b)) =
binint_succ_double
(binint_pred_double (binint_pos_sub (pos_succ a) b))
bydestruct (binint_pos_sub (pos_succ a) b).
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
binint_pred_double
(binint_pred_double (binint_pos_sub (pos_succ a) b)) =
binint_succ_double
(binint_double (binint_pos_sub a b))
a: Pos IHa: forallb : Pos,
binint_pred_double (binint_pos_sub (pos_succ a) b) =
binint_succ_double (binint_pos_sub a b) b: Pos IHb: binint_pred_double (binint_pos_sub (pos_succ a~1%pos) b) =
binint_succ_double (binint_pos_sub a~1%pos b)
binint_pred_double
(binint_succ_double (binint_pos_sub a b)) =
binint_succ_double
(binint_double (binint_pos_sub a b))
bydestruct (binint_pos_sub a b).Defined.(** ** Subtractions cancel successors. *)
a, b: Pos
binint_pos_sub (pos_succ a) (pos_succ b) =
binint_pos_sub a b
a, b: Pos
binint_pos_sub (pos_succ a) (pos_succ b) =
binint_pos_sub a b
a, b: Pos
binint_pos_sub (a + 1)%pos (b + 1)%pos =
binint_pos_sub a b
forallab : Pos,
binint_pos_sub (a + 1)%pos (b + 1)%pos =
binint_pos_sub a b
b: Pos bH: foralla : Pos,
binint_pred (binint_pos_sub a b~0%pos) =
binint_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,
binint_pred (binint_pos_sub a b~0%pos) =
binint_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,
binint_pred (binint_pos_sub a b~0%pos) =
binint_pos_sub a (pos_succ b~0%pos)
pos_succ b~0%pos = pos_pred_double (pos_succ b)
b: Pos bH: foralla : Pos,
binint_pred (binint_pos_sub a b~0%pos) =
binint_pos_sub a (pos_succ b~0%pos)
pos_succ b~0%pos = b~1%pos
trivial.
a: Pos aH: forallb : Pos,
(foralla : Pos,
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)) ->
binint_pred (binint_pos_sub a (pos_succ b)) =
binint_pos_sub a (pos_succ (pos_succ b))
forallb : Pos,
(foralla : Pos,
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)) ->
binint_pred (binint_pos_sub (pos_succ a) (pos_succ b)) =
binint_pos_sub (pos_succ a) (pos_succ (pos_succ b))
a: Pos aH: forallb : Pos,
(foralla : Pos,
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)) ->
binint_pred (binint_pos_sub a (pos_succ b)) =
binint_pos_sub a (pos_succ (pos_succ b)) b: Pos bH: foralla : Pos,
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)
binint_pred (binint_pos_sub (pos_succ a) (pos_succ b)) =
binint_pos_sub (pos_succ a) (pos_succ (pos_succ b))
a: Pos aH: forallb : Pos,
(foralla : Pos,
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)) ->
binint_pred (binint_pos_sub a (pos_succ b)) =
binint_pos_sub a (pos_succ (pos_succ b)) b: Pos bH: foralla : Pos,
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)
apply bH.Defined.(** ** Negation of the predecessor is an involution. *)
x: BinInt
- binint_pred (- binint_pred x) = x
x: BinInt
- binint_pred (- binint_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: BinInt
binint_pred (a + b) = a + binint_pred b
a, b: BinInt
binint_pred (a + b) = a + binint_pred b
forallab : BinInt,
binint_pred (a + b) = a + binint_pred b
a, b: Pos
binint_pred (neg a + neg b) =
neg a + binint_pred (neg b)
a, b: Pos
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b)
a, b: Pos
binint_pred (pos a + neg b) =
pos a + binint_pred (neg b)
a, b: Pos
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b)
a, b: Pos
binint_pred (neg a + neg b) =
neg a + binint_pred (neg b)
a, b: Pos
(a + b + 1)%pos = (a + (b + 1))%pos
byrewrite pos_add_assoc.
a, b: Pos
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b)
b: Pos
foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b)
foralla : Pos,
binint_pred (neg a + 1) = neg a + binint_pred 1
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b)
foralla : Pos,
binint_pred (neg a + pos (pos_succ b)) =
neg a + binint_pred (pos (pos_succ b))
foralla : Pos,
binint_pred (neg a + 1) = neg a + binint_pred 1
intro a; exact (binint_pred_succ (neg a)).
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b)
foralla : Pos,
binint_pred (neg a + pos (pos_succ b)) =
neg a + binint_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (neg a + pos (pos_succ b)) =
neg a + binint_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (neg a + pos (b + 1%pos)) =
neg a + binint_pred (pos (b + 1%pos))
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (neg a + pos (b + 1%pos)) = neg a + pos b
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (pos (b + 1%pos) + neg a) = neg a + pos b
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (binint_pos_sub (b + 1)%pos a) =
binint_pos_sub b a
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (binint_pos_sub (pos_succ b) a) =
binint_pos_sub b a
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (- binint_pos_sub a (pos_succ b)) =
binint_pos_sub b a
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
binint_pred (- binint_pred (binint_pos_sub a b)) =
binint_pos_sub b a
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
- binint_pred (- binint_pred (binint_pos_sub a b)) =
- binint_pos_sub b a
b: Pos bH: foralla : Pos,
binint_pred (neg a + pos b) =
neg a + binint_pred (pos b) a: Pos
- binint_pred (- binint_pred (binint_pos_sub a b)) =
binint_pos_sub a b
apply binint_negation_pred_negation_red.
a, b: Pos
binint_pred (pos a + neg b) =
pos a + binint_pred (neg b)
a, b: Pos
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (b + 1)%pos
a, b: Pos
binint_pred (binint_pos_sub a b) =
binint_pos_sub a (pos_succ b)
apply binint_pred_pos_sub_r.
a, b: Pos
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b)
b: Pos
foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b)
foralla : Pos,
binint_pred (pos a + 1) = pos a + binint_pred 1
b: Pos bH: foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b)
foralla : Pos,
binint_pred (pos a + pos (pos_succ b)) =
pos a + binint_pred (pos (pos_succ b))
foralla : Pos,
binint_pred (pos a + 1) = pos a + binint_pred 1
intro a; exact (binint_pred_succ (pos a)).
b: Pos bH: foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b)
foralla : Pos,
binint_pred (pos a + pos (pos_succ b)) =
pos a + binint_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b) a: Pos
binint_pred (pos a + pos (pos_succ b)) =
pos a + binint_pred (pos (pos_succ b))
b: Pos bH: foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b) a: Pos
binint_pred (pos a + pos (b + 1%pos)) =
pos a + binint_pred (pos (b + 1%pos))
b: Pos bH: foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b) a: Pos
binint_pred (pos a + pos (b + 1%pos)) = pos a + pos b
b: Pos bH: foralla : Pos,
binint_pred (pos a + pos b) =
pos a + binint_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,
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b) a: Pos
binint_pred (binint_succ (pos (a + b))) =
pos a + pos b
apply binint_pred_succ.Defined.(** ** Subtraction from a sum is the sum of a subtraction *)
a, b, c: Pos
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c
a, b, c: Pos
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c
forallcba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c
forallba : Pos,
binint_pos_sub (a + b)%pos 1%pos =
pos a + binint_pos_sub b 1%pos
c: Pos ch: forallba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c
forallba : Pos,
binint_pos_sub (a + b)%pos (pos_succ c) =
pos a + binint_pos_sub b (pos_succ c)
forallba : Pos,
binint_pos_sub (a + b)%pos 1%pos =
pos a + binint_pos_sub b 1%pos
b, a: Pos
binint_pos_sub (a + b)%pos 1%pos =
pos a + binint_pos_sub b 1%pos
b, a: Pos
binint_pred (pos a + pos b) =
pos a + binint_pred (pos b)
apply binint_pred_add_r.
c: Pos ch: forallba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c
forallba : Pos,
binint_pos_sub (a + b)%pos (pos_succ c) =
pos a + binint_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c b, a: Pos
binint_pos_sub (a + b)%pos (pos_succ c) =
pos a + binint_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c b, a: Pos
binint_pred (binint_pos_sub (a + b)%pos c) =
pos a + binint_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c b, a: Pos
binint_pred (pos a + binint_pos_sub b c) =
pos a + binint_pos_sub b (pos_succ c)
c: Pos ch: forallba : Pos,
binint_pos_sub (a + b)%pos c =
pos a + binint_pos_sub b c b, a: Pos
binint_pred (pos a + binint_pos_sub b c) =
pos a + binint_pred (binint_pos_sub b c)
apply binint_pred_add_r.Defined.(** An auxiliary lemma used to prove associativity. *)
p: Pos n, m: BinInt
pos p + (n + m) = pos p + n + m
p: Pos n, m: BinInt
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
- binint_pos_sub p (n + m)%pos =
- (binint_pos_sub p n + neg m)
p, n, m: Pos
binint_pos_sub (n + m)%pos p =
binint_pos_sub n p + - neg m
p, n, m: Pos
binint_pos_sub (m + n)%pos p =
- neg m + binint_pos_sub n p
cbn; apply ap, pos_add_assoc.Defined.(** ** Associativity of addition *)
n, m, p: BinInt
n + (m + p) = n + m + p
n, m, p: BinInt
n + (m + p) = n + m + p
p0: Pos m, p: BinInt
neg p0 + (m + p) = neg p0 + m + p
m, p: BinInt
0 + (m + p) = 0 + m + p
p0: Pos m, p: BinInt
pos p0 + (m + p) = pos p0 + m + p
p0: Pos m, p: BinInt
neg p0 + (m + p) = neg p0 + m + p
p0: Pos m, p: BinInt
- (neg p0 + (m + p)) = - (neg p0 + m + p)
p0: Pos m, p: BinInt
- neg p0 + (- m + - p) = - neg p0 + - m + - p
apply binint_add_assoc_pos.
m, p: BinInt
0 + (m + p) = 0 + m + p
trivial.
p0: Pos m, p: BinInt
pos p0 + (m + p) = pos p0 + m + p
apply binint_add_assoc_pos.Defined.(** ** Relationship between [int_succ], [int_pred] and addition. *)
a, b: BinInt
binint_succ a + b = binint_succ (a + b)
a, b: BinInt
binint_succ a + b = binint_succ (a + b)
a, b: BinInt
a + (b + 1) = binint_succ (a + b)
apply binint_add_assoc.Defined.
a, b: BinInt
a + binint_succ b = binint_succ (a + b)
a, b: BinInt
a + binint_succ b = binint_succ (a + b)
apply binint_add_assoc.Defined.
a, b: BinInt
binint_pred a + b = binint_pred (a + b)
a, b: BinInt
binint_pred a + b = binint_pred (a + b)
a, b: BinInt
a + (b + -1) = binint_pred (a + b)
apply binint_add_assoc.Defined.
a, b: BinInt
a + binint_pred b = binint_pred (a + b)
a, b: BinInt
a + binint_pred b = binint_pred (a + b)
apply binint_add_assoc.Defined.(** ** Commutativity of multiplication *)
n, m: BinInt
n * m = m * n
n, m: BinInt
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
binint_pos_sub n m * pos p =
binint_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
binint_pos_sub n m * pos p =
binint_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
pos p * binint_pos_sub n m =
binint_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
pos p * binint_pos_sub n m =
binint_pos_sub (p * n)%pos (p * m)%pos
n, m: Pos
1 * binint_pos_sub n m =
binint_pos_sub (1 * n)%pos (1 * m)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
pos p~0 * binint_pos_sub n m =
binint_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
pos p~1 * binint_pos_sub n m =
binint_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m: Pos
1 * binint_pos_sub n m =
binint_pos_sub (1 * n)%pos (1 * m)%pos
n, m: Pos
1 * binint_pos_sub n m = binint_pos_sub n m
apply binint_mul_1_l.
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
pos p~0 * binint_pos_sub n m =
binint_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
pos p~1 * binint_pos_sub n m =
binint_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
pos p~0 * binint_pos_sub n m =
binint_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub n m with
| neg y' => neg (p * y')~0%pos
| 0 => 0
| pos y' => pos (p * y')%pos~0end =
binint_double (binint_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub n m with
| neg y' => neg (p * y')~0%pos
| 0 => 0
| pos y' => pos (p * y')%pos~0end = binint_double (pos p * binint_pos_sub n m)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos k:= binint_pos_sub n m: BinInt
match k with
| neg y' => neg (p * y')~0%pos
| 0 => 0
| pos y' => pos (p * y')%pos~0end = binint_double (pos p * k)
bydestruct k.
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
pos p~1 * binint_pos_sub n m =
binint_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + (p * y')~0%pos)
end =
binint_pos_sub (n + (p * n)~0)%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
binint_pos_sub (p * n)~0%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
- binint_pos_sub (m + (p * m)~0)%pos (p * n)~0%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 + binint_pos_sub (p * m)~0%pos (p * n)~0%pos)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
- binint_pos_sub (p * m)~0%pos (p * n)~0%pos)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 + binint_pos_sub (p * n)~0%pos (p * m)~0%pos)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
binint_pos_sub (p * n)~0%pos (p * m)~0%pos
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + (p * y')~0%pos)
end =
binint_pos_sub n m +
binint_double (binint_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub n m with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + (p * y')~0%pos)
end =
binint_pos_sub n m +
binint_double (pos p * binint_pos_sub n m)
n, m, p: Pos IHp: pos p * binint_pos_sub n m = binint_pos_sub (p * n)%pos (p * m)%pos k:= binint_pos_sub n m: BinInt
match k with
| neg y' => neg (y' + (p * y')~0)%pos
| 0 => 0
| pos y' => pos (y' + (p * y')~0%pos)
end = k + binint_double (pos p * k)
bydestruct k.Defined.
n, m, p: Pos
binint_pos_sub m n * neg p =
binint_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
binint_pos_sub m n * neg p =
binint_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
neg p * binint_pos_sub m n =
binint_pos_sub (n * p)%pos (m * p)%pos
n, m, p: Pos
neg p * binint_pos_sub m n =
binint_pos_sub (p * n)%pos (p * m)%pos
n, m: Pos
-1 * binint_pos_sub m n =
binint_pos_sub (1 * n)%pos (1 * m)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
neg p~0%pos * binint_pos_sub m n =
binint_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
neg p~1%pos * binint_pos_sub m n =
binint_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m: Pos
-1 * binint_pos_sub m n =
binint_pos_sub (1 * n)%pos (1 * m)%pos
n, m: Pos
-1 * binint_pos_sub m n = binint_pos_sub n m
n, m: Pos
-1 * - binint_pos_sub n m = binint_pos_sub n m
bydestruct (binint_pos_sub n m).
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
neg p~0%pos * binint_pos_sub m n =
binint_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
neg p~1%pos * binint_pos_sub m n =
binint_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
neg p~0%pos * binint_pos_sub m n =
binint_pos_sub (p~0 * n)%pos (p~0 * m)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub m n with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg (p * y')~0%pos
end =
binint_double (binint_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub m n with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg (p * y')~0%pos
end = binint_double (neg p * binint_pos_sub m n)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match - binint_pos_sub n m with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg (p * y')~0%pos
end = binint_double (neg p * - binint_pos_sub n m)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos k:= binint_pos_sub n m: BinInt
match - k with
| neg y' => pos (p * y')%pos~0
| 0 => 0
| pos y' => neg (p * y')~0%pos
end = binint_double (neg p * - k)
bydestruct k.
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
neg p~1%pos * binint_pos_sub m n =
binint_pos_sub (p~1 * n)%pos (p~1 * m)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub m n with
| neg y' => pos (y' + (p * y')~0%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
binint_pos_sub (n + (p * n)~0)%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
binint_pos_sub (p * n)~0%pos (m + (p * m)~0)%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
- binint_pos_sub (m + (p * m)~0)%pos (p * n)~0%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 + binint_pos_sub (p * m)~0%pos (p * n)~0%pos)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
- binint_pos_sub (p * m)~0%pos (p * n)~0%pos)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 + binint_pos_sub (p * n)~0%pos (p * m)~0%pos)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_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 +
binint_pos_sub (p * n)~0%pos (p * m)~0%pos
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub m n with
| neg y' => pos (y' + (p * y')~0%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
binint_pos_sub n m +
binint_double (binint_pos_sub (p * n)%pos (p * m)%pos)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub m n with
| neg y' => pos (y' + (p * y')~0%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
binint_pos_sub n m +
binint_double (neg p * binint_pos_sub m n)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos
match binint_pos_sub m n with
| neg y' => pos (y' + (p * y')~0%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end =
- binint_pos_sub m n +
binint_double (neg p * binint_pos_sub m n)
n, m, p: Pos IHp: neg p * binint_pos_sub m n = binint_pos_sub (p * n)%pos (p * m)%pos k:= binint_pos_sub m n: BinInt
match k with
| neg y' => pos (y' + (p * y')~0%pos)
| 0 => 0
| pos y' => neg (y' + (p * y')~0)%pos
end = - k + binint_double (neg p * k)
bydestruct k.Defined.
n, m, p: BinInt
(n + m) * p = n * p + m * p
n, m, p: BinInt
(n + m) * p = n * p + m * p
induction p; destruct n, m; cbn; trivial; try f_ap;
tryapply pos_mul_add_distr_r;
tryapply binint_pos_sub_mul_neg;
tryapply binint_pos_sub_mul_pos;
apply binint_mul_0_r.Defined.