Identifier
F:nat-asc-factorial-zero
Proof route
kernel-lean
External status
proved
Axiom footprint
Empty

Recorded description

The rising (ascending) factorial of n with 0 factors equals 1.

Formal statement
theorem Nat.ascFactorial_zero : ((x0 : AxNat) -> Eq.{1} AxNat (AxNat.ascFactorial x0 AxNat.zero) (AxNat.succ AxNat.zero))

Dependencies

The graph shows direct ledger edges. Follow a node to open its artifact page.

Direct dependencies appear to the left. The current fact is in the center. Facts that depend directly on it appear to the right. Current fact Mathlib v4.30 source propositio ascFactorial(n, 1) = n ascFactorial(n, k+1) = (n+k) *
0 direct dependencies 3 direct dependents

Evidence

kernel-Nat.ascFactorial_zero

Kind
kernel-term
Status
checked

Supports: n.ascFactorial 0 = 1

Checker command
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- ascFactorial_zero 2>/dev/null | grep -Ec '^Nat\.ascFactorial_zero[[:space:]]')" -ge 1
Evidence notes

`build_nat_prelude` admits this theorem through the trusted `Kernel::add_declaration` gate, which re-checks the proof term against the stated type, so producing this row at all is a machine-checked proof. `Nat.ascFactorial` is declared by structural recursion on its SECOND argument via `NatOps::define_binary` (`nat_prelude/asc_factorial.rs`), mirroring `Nat.descFactorial` but climbing with `Nat.add` instead of descending with `Nat.sub`, so `ascFactorial n zero` iota-reduces to the base case, `1`, directly -- the proof is `Eq.refl`, no induction or case split. `nat_theorem_inventory` exits non-zero for a name that does not exist, and `grep -Ec` consumes the pipe and the count is tested, so the exit status depends on what the run found.

compute-Nat.ascFactorial_zero

Kind
kernel-term
Status
checked

Supports: the base case computes the right value at a concrete instance, not merely an opaque application

Checker command
cargo test -p axeyum-lean-kernel --lib nat_prelude::nat_prelude_tests::asc_factorial_evaluates_correctly
Evidence notes

`Kernel::def_eq` reduces `3.ascFactorial 0` directly (definition unfolding, no boundary theorem invoked) and confirms it is `1`, with negative reduction controls (`3.ascFactorial 2` must NOT be def-eq to the DESCENDING product `3*2 = 6`, nor to `3.descFactorial 2`) so the assertion cannot pass on a vacuous `def_eq` and specifically catches an `add`/`sub` copy-paste that would still type-check.

footprint-Nat.ascFactorial_zero

Kind
exhaustive-enumeration
Status
checked

Supports: axiom_footprint: [] -- the Nat prelude's trusted surface is empty

Checker command
cargo run -q -p axeyum-lean-kernel --example nat_axiom_inventory -- --require-axiom-free nat
Evidence notes

`nat_axiom_inventory --require-axiom-free nat` enumerates the built Nat environment and exits non-zero unless it admits no Axiom, Opaque or Quotient declaration. `Nat.ascFactorial` needed no fuel device: it is structural recursion on its second argument, exactly like `Nat.descFactorial`/`Nat.factorial`/`Nat.mul`, so nothing here was ever at risk of needing `WellFounded`/`Quot.sound`/`propext`. Measured 2026-08-28: `nat: axiom=0 opaque=0 quotient=0 total_trusted=0` with `Nat.ascFactorial` and its three theorems, and `Nat.multichoose` and its three theorems, all declared.

Provenance

{
  "date": "2026-08-28",
  "established_by": "axeyum-lean-kernel build_nat_prelude, lane nat-asc-multichoose",
  "source": "one of two definitional boundary equations `declare_asc_factorial` (`crates/axeyum-lean-kernel/src/nat_prelude/asc_factorial.rs`) admits alongside the `Nat.ascFactorial` definition"
}