Built with Alectryon. 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.
From HoTT Require Import Basics.From HoTT Require Import Basics.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 *)
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.