kernel-Nat.log_eq_one_iff
- Kind
- kernel-term
- Status
- checked
Supports: ∀ {b n : ℕ}, Nat.log b n = 1 ↔ n < b * b ∧ 1 < b ∧ b ≤ n
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- log_eq_one_iff 2>/dev/null | grep -Ec '^Nat\.log_eq_one_iff[[:space:]]')" -ge 1 Evidence notes
`build_nat_prelude` admits `Nat.log_eq_one_iff` through the trusted `Kernel::add_declaration` gate (declared in `nat_prelude/log_clog_mirrors.rs`'s `declare_log_eq_one_iff`, lane `nat-mirror-residue`) -- `F:ml430-nat-log-eq-one-iff-63d772fb`'s (`Nat.log_eq_one_iff'`) exact core (`log_eq_one_derive_base_le_n`, `log_eq_one_derive_sq_bound`, `log_eq_one_of_bounds`; see that fact's evidence for the full route), repackaged into Mathlib's STRONGER hypothesis set: `mpr` is given `1 < b` directly (no need for `derive_one_lt_base_from_bounds`) and `mp` additionally derives `1 < b` as an explicit output via `derive_one_lt_base_from_log_eq_one` (if `b <= 1`, `log_of_left_le_one` gives `Eq (log b n) 0` at this `n`, contradicting `Eq (log b n) 1` via `succ_ne_zero`) -- the SAME derivation `Nat.log_eq_one_iff'`'s `mp` needs anyway as an internal tool before it can even call `log_eq_one_derive_sq_bound`, just also surfaced here as part of the conclusion. `nat_theorem_inventory`'s rendered type for `Nat.log_eq_one_iff` is `(x0:AxNat)->(x1:AxNat)->Iff (Eq (log x0 x1) (succ zero)) (And (Lt x1 (mul x0 x0)) (And (Lt (succ zero) x0) (Le x0 x1)))`, matching this fact's `formal.statement` verbatim (`x0`=b, `x1`=n, nested `And` matching the `n < b*b \u2227 (1 < b \u2227 b \u2264 n)` right-associated form). `nat_theorem_inventory` exits non-zero for a name that does not exist (verified against `log_eq_one_iff_xxxx`: `error: no Nat theorem matches ...`, count 0), and the `grep -c` count (tested `-ge 1`, not piped into `grep -q`) requires the admitted declaration to actually be printed. Note the substring hazard: `log_eq_one_iff` is a PREFIX of `log_eq_one_iff'`, so the query argument returns BOTH rows -- the anchored `grep -Ec '^Nat\.log_eq_one_iff[[:space:]]'` (whitespace after the exact name, not after the prime) is what discriminates the unprimed row from its primed sibling.