kernel-Nat.totient_prime_pow
- Kind
- kernel-term
- Status
- checked
Supports: totient(p^(j+1)) = p^(j+1) - p^j under primality, with the whole rendered type pinned.
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- totient_prime_pow 2>/dev/null | tr '\t' ' ' | grep -Fc 'Nat.totient_prime_pow 5 ((x0 : AxNat) -> ((x1 : AxNat) -> ((x2 : And (AxNat.le (AxNat.succ (AxNat.succ AxNat.zero)) x0) (((x2 : AxNat) -> ((x3 : AxNat.dvd x2 x0) -> Or (Eq.{1} AxNat x2 (AxNat.succ AxNat.zero)) (Eq.{1} AxNat x2 x0))))) -> Eq.{1} AxNat (AxNat.totient (AxNat.pow x0 (AxNat.succ x1))) (AxNat.sub (AxNat.pow x0 (AxNat.succ x1)) (AxNat.pow x0 x1)))))')" -ge 1 Evidence notes
The grep pins the WHOLE rendered type, not the name. The kernel re-derives the type from the proof term and so refuses a FALSE theorem, but it cannot notice a statement that is weaker or transposed, and this one has both kinds of neighbour. `nat_theorem_inventory` exits non-zero for a name that does not exist, and `grep -Fc` consumes the whole pipe with the count then tested, rather than `grep -q`, which would SIGPIPE the producer under pipefail. Measured 2026-08-30: `nat_theorem_inventory` consumes only ONE name argument -- given two names in either order it reports on the LAST one only -- so exactly one is passed here. The primality hypothesis is quoted verbatim in its inline spelling (`2 <= p` and the divisor dichotomy) because this prelude has no `Prime` predicate to name, and because dropping or weakening it makes the statement FALSE rather than merely weaker -- the Rust test pins that with a composite base-4 control where the two sides compute to 2 and 3 and are asserted NOT def_eq. The exponent is pinned as `AxNat.succ x1` on the left and `x1` on the right: writing both as `x1` would be the k = 0 case, which is false (totient(1) = 1, not 1 - 1 = 0).