kernel-Nat.prime_mul_eq_prime_sq_iff
- Kind
- kernel-term
- Status
- checked
Supports: ∀ {x y p : ℕ}, Nat.Prime p → x ≠ 1 → y ≠ 1 → (x * y = p ^ 2 ↔ x = p ∧ y = p)
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- prime_mul_eq_prime_sq_iff 2>/dev/null | /usr/bin/grep -Ec '^Nat\.prime_mul_eq_prime_sq_iff[[:space:]]')" -ge 1 Evidence notes
`build_nat_prelude` admits `Nat.prime_mul_eq_prime_sq_iff` 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_theorem_inventory` exits non-zero for a name that does not exist (verified against a fabricated name), and the anchored `grep -c` count (tested `-ge 1`, not piped into `grep -q`) requires the admitted declaration to actually be printed. Primality is spelled inline (`2 ≤ p ∧ ∀ c, c ∣ p → c = 1 ∨ c = p`, matching `prime_even_iff`/`euclid_lemma`'s own convention) rather than through a named `Nat.Prime` predicate, since this prelude has none -- this repository's established precedent for flipping a Mathlib `Nat.Prime` mirror. The proof itself is constructive: `x*y = p^2 = p*p` gives `p | x*y` (witness `p`), `euclid_lemma` splits into `p|x` or `p|y`, and each branch's divisor witness `k` (from `a = p*k`) satisfies `k*b = p` (`mul_assoc` + `mul_left_cancel_of_pos`), so `k`'s own primality clause forces `k=1` (giving both factors equal `p`) or `k=p` (forcing the OTHER factor to `1`, contradicting the corresponding `x != 1`/`y != 1` hypothesis).