kernel-Nat.add_choose_mul_factorial_mul_factorial
- Kind
- kernel-term
- Status
- checked
Supports: ∀ (i j : ℕ), (i + j).choose j * i.factorial * j.factorial = (i + j).factorial
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- add_choose_mul_factorial_mul_factorial 2>/dev/null | grep -Ec '^Nat\.add_choose_mul_factorial_mul_factorial[[:space:]]')" -ge 1 Evidence notes
`build_nat_prelude` admits `Nat.add_choose_mul_factorial_mul_factorial` through the trusted `Kernel::add_declaration` gate, declared in `nat_prelude/choose_factorial_add.rs` (a new module: the falling-factorial/choose bridge already in `desc_factorial.rs` gave `descFactorial(i+j,j) = j! * choose(i+j,j)`, but nothing tied `descFactorial` back to plain `factorial` by the complementary `i!` -- this module supplies exactly that missing piece by induction on `j`, then assembles the two). `nat_theorem_inventory`'s rendered type is `((x0 : AxNat) -> ((x1 : AxNat) -> Eq.{1} AxNat (AxNat.mul (AxNat.mul (AxNat.choose (AxNat.add x0 x1) x1) (AxNat.factorial x0)) (AxNat.factorial x1)) (AxNat.factorial (AxNat.add x0 x1))))`, matching this fact's `formal.statement`. `nat_theorem_inventory` exits non-zero for a name that does not exist, and the `grep -c` count (tested `-ge 1`, not piped into `grep -q`) requires the admitted declaration to actually be printed. Verified both ways: the real name greps to a count `-ge 1`; grepping a made-up name (`Nat.add_choose_mul_factorial_mul_factorial_bogus`) greps to `0`.