kernel-Nat.add_choose
- Kind
- kernel-term
- Status
- checked
Supports: ∀ (i j : ℕ), (i + j).choose j = (i + j).factorial / (i.factorial * j.factorial)
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- add_choose 2>/dev/null | /usr/bin/grep -Ec '^Nat\.add_choose[[:space:]]')" -ge 1 Evidence notes
`build_nat_prelude` admits `Nat.add_choose` through the trusted `Kernel::add_declaration` gate, declared in new module `nat_prelude/add_choose_div.rs`. It is the division-normal form of the already-proved `Nat.add_choose_mul_factorial_mul_factorial` (`(i+j).choose j * i! * j! = (i+j)!`, `F:ml430-nat-add-choose-mul-factorial-mul-factorial-26ba01ef`): converted to `(i+j).choose j = (i+j)! / (i! * j!)` by the standard "exact factor divided back out" route (a `div_eq_of_mul_eq` helper, copied per this crate's per-file local-helper convention -- the same technique `coprime_lemmas.rs`/`lcm_gcd_lemmas.rs` already use for other targets), with the divisor's positivity (`Le 1 (i! * j!)`) from `one_le_factorial` on each factor plus `one_le_mul`. `nat_theorem_inventory`'s rendered type is `((x0 : AxNat) -> ((x1 : AxNat) -> Eq.{1} AxNat (AxNat.choose (AxNat.add x0 x1) x1) (AxNat.div (AxNat.factorial (AxNat.add x0 x1)) (AxNat.mul (AxNat.factorial x0) (AxNat.factorial x1)))))`, matching this fact's `formal.statement`. The grep anchor `^Nat\.add_choose[[:space:]]` is deliberately anchored so it does not also match `Nat.add_choose_mul_factorial_mul_factorial` (verified: the same command against the un-anchored substring returns 2, against this exact anchored pattern returns 1); the `-ge 1` count-based test (not `grep -q`) requires the admitted declaration to actually be printed, and grepping a made-up name (`Nat.add_choose_bogus`) greps to `0`.