~/bend-docscommunity

proofs/math/natural/fact.bend checks

raw source on the hub · import bend-collections-laws-containers@1.0.0.0/proofs/math/natural/fact.bend as Fact

8 imports
import Base
import ../../lib/nat.bend as N
import ../../lib/logic.bend as L
import ../../lib/lemmas/proofs/nat_algebra.bend as A
import ../../../src/math/natural.bend as M
import ./arith.bend as R
import ./lcm.bend as LC
import ../../../spec/math/natural.bend as S

Definitions

def mul_left_comm source · line 20 · raw

@+x:Nat -> @+a:Nat -> @+f:Nat -> {Nat.mul(Nat.mul(x, a), f) == Nat.mul(a, Nat.mul(x, f)) : Nat}

(x a) f == a (x f)

def factorial_go source · line 25 · raw

@+n:Nat -> @+acc:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.factorial_go(n, acc) == Nat.mul(acc, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(n)) : Nat}

def factorial_ok source · line 33 · raw

@+n:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.factorial(n) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(n) : Nat}

factorial(n) == n!

def pos_mul source · line 36 · raw

@+p:Nat -> @+f:Nat -> @+h:{Nat.is_lt(0n, f) == True{} : Bool} -> {Nat.is_lt(0n, Nat.mul(1n+p, f)) == True{} : Bool}

def factorial_pos source · line 44 · raw

@+n:Nat -> {Nat.is_lt(0n, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(n)) == True{} : Bool}

0 < n! (Mathlib Nat.factorial_pos)

def desc_succ source · line 54 · raw

@+m:Nat -> @+j:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(1n+m, 1n+j) == Nat.mul(1n+m, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(m, j)) : Nat}

(1+m).desc(1+j) == (1+m) * m.desc(j) (Mathlib Nat.succ_descFactorial_succ)

def desc_front source · line 63 · raw

@+m:Nat -> @+j:Nat -> {Nat.mul(m, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(Nat.sub(m, 1n), j)) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(m, 1n+j) : Nat}

m * (m - 1).desc(j) == m.desc(1+j), the order perm multiplies in

def perm_go source · line 71 · raw

@+k:Nat -> @+m:Nat -> @+acc:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.perm_go(k, m, acc) == Nat.mul(acc, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(m, k)) : Nat}

def perm_ok source · line 81 · raw

@+n:Nat -> @+k:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.perm(n, k) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(n, k) : Nat}

perm(n, k) == n.descFactorial(k)

def desc_self source · line 85 · raw

@+n:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(n, n) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(n) : Nat}

n.desc(n) == n! (Mathlib Nat.descFactorial_self)

def sub_lt_succ source · line 93 · raw

@+n:Nat -> @+j:Nat -> @+h:{Nat.is_lt(j, n) == True{} : Bool} -> {Nat.sub(n, j) == 1n+Nat.sub(n, 1n+j) : Nat}

j < n gives n - j == 1 + (n - (1 + j))

def factorial_mul_desc source · line 103 · raw

@+n:Nat -> @+k:Nat -> @+h:{Nat.is_le(k, n) == True{} : Bool} -> {Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(Nat.sub(n, k)), 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(n, k)) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(n) : Nat}

(n - k)! * n.desc(k) == n! (Mathlib Nat.factorial_mul_descFactorial)

def choose_zero_right source · line 121 · raw

@+n:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, 0n) == 1n : Nat}

def choose_one_right source · line 129 · raw

@+n:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, 1n) == n : Nat}

C(n, 1) == n

def succ_mul_choose source · line 138 · raw

@+n:Nat -> @+k:Nat -> {Nat.mul(1n+n, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k)) == Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(1n+n, 1n+k), 1n+k) : Nat}

(n + 1) C(n, k) == C(n + 1, k + 1) (k + 1) (Mathlib Nat.add_one_mul_choose_eq)

def mul_sub_left source · line 164 · raw

@+a:Nat -> @+x:Nat -> @+y:Nat -> {Nat.mul(a, Nat.sub(x, y)) == Nat.sub(Nat.mul(a, x), Nat.mul(a, y)) : Nat}

a (x - y) == a x - a y

def choose_succ_right source · line 171 · raw

@+n:Nat -> @+k:Nat -> {Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, 1n+k), 1n+k) == Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k), Nat.sub(n, k)) : Nat}

C(n, k + 1) (k + 1) == C(n, k) (n - k) (Mathlib Nat.choose_succ_right_eq)

def choose_mul_factorial source · line 182 · raw

@+n:Nat -> @+k:Nat -> {Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k), 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(k)) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.desc(n, k) : Nat}

C(n, k) k! == n.desc(k) (Mathlib Nat.descFactorial_eq_factorial_mul_choose)

def choose_eq_zero source · line 195 · raw

@+n:Nat -> @+k:Nat -> @+h:{Nat.is_lt(n, k) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k) == 0n : Nat}

n < k gives C(n, k) == 0 (Mathlib Nat.choose_eq_zero_of_lt)

def pos_pos source · line 205 · raw

@+a:Nat -> @+b:Nat -> @+ha:{Nat.is_lt(0n, a) == True{} : Bool} -> @+hb:{Nat.is_lt(0n, b) == True{} : Bool} -> {Nat.is_lt(0n, Nat.mul(a, b)) == True{} : Bool}

def choose_mul_facts source · line 213 · raw

@+n:Nat -> @+k:Nat -> @+h:{Nat.is_le(k, n) == True{} : Bool} -> {Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k), Nat.mul(0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(k), 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(Nat.sub(n, k)))) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.factorial(n) : Nat}

C(n, k) (k! (n - k)!) == n! (Mathlib Nat.choose_mul_factorial_mul_factorial)

def sub_sub_self source · line 220 · raw

@+n:Nat -> @+k:Nat -> @+h:{Nat.is_le(k, n) == True{} : Bool} -> {Nat.sub(n, Nat.sub(n, k)) == k : Nat}

n - (n - k) == k for k <= n

def sub_le_self source · line 226 · raw

@+n:Nat -> @+k:Nat -> {Nat.is_le(Nat.sub(n, k), n) == True{} : Bool}

def choose_symm source · line 237 · raw

@+n:Nat -> @+k:Nat -> @+h:{Nat.is_le(k, n) == True{} : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, Nat.sub(n, k)) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k) : Nat}

C(n, n - k) == C(n, k) (Mathlib Nat.choose_symm)

def comb_go source · line 251 · raw

@+j:Nat -> @+n:Nat -> @+i:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.comb_go(j, n, i, 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, i)) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, Nat.add(i, j)) : Nat}

every r_i is C(n, i), so each division is exact

def comb_min source · line 261 · raw

@+n:Nat -> @+k:Nat -> @+hk:{Nat.is_le(k, n) == True{} : Bool} -> @+b:Bool -> @+hb:{Nat.is_lt(k, Nat.sub(n, k)) == b : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, Nat.min(k, Nat.sub(n, k))) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k) : Nat}

def comb_small source · line 268 · raw

@+n:Nat -> @+k:Nat -> @+b:Bool -> @+hb:{Nat.is_lt(n, k) == b : Bool} -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.comb_small(n, k, b) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k) : Nat}

def comb_ok source · line 278 · raw

@+n:Nat -> @+k:Nat -> {0x5c489f5d9646d7cc9aa3dd8137e9dc07/src/math/natural.comb(n, k) == 0x5c489f5d9646d7cc9aa3dd8137e9dc07/spec/math/natural.choose(n, k) : Nat}

comb(n, k) == C(n, k)