Identifier
F:complex-factorquotient-succ-eq
Proof route
kernel-lean
External status
proved
Axiom footprint
Empty

Recorded description

For c, a, n, k with k < n: factorQuotient c a (n+1) k is Equiv to factorQuotient c a n k plus the correction term pow(a, n-k) * c(n+1) -- the correction Complex.hornerFromTop_diag_eq_polyEval's own doc names as the reason a naive induction reusing the smaller factorQuotient wholesale does not work, made precise and proved. This turns out to need NO fresh induction at all: once k < n gives n-k a successor shape (Nat.succ j, via succ_pred_of_pos + le_of_lt_succ from the PUBLIC nat prelude -- deliberately not the module-private nat_prelude::choose::sub_succ_of_lt, which proves the identical fact but is not reachable across the module boundary, so this re-derives it from public building blocks), a public Nat.succ_sub_of_le-style reindexing puts (n+1)-k at the same successor-of-successor shape, and BOTH sides reduce (one Nat.rec iota-step each) to hornerFromTop c a (n+1) (j+1) and hornerFromTop c a n j respectively -- at which point Complex.hornerFromTop_succ_succ (an Eq.refl fact, proved before this theorem existed) IS the correction term, verbatim.

Formal statement
theorem Complex.factorQuotient_succ_eq : ((x0 : ((x0 : AxNat) -> Complex)) -> ((x1 : Complex) -> ((x2 : AxNat) -> ((x3 : AxNat) -> ((x4 : AxNat.lt x3 x2) -> Complex.Equiv (Complex.factorQuotient x0 x1 (AxNat.succ x2) x3) (Complex.add (Complex.factorQuotient x0 x1 x2 x3) (Complex.mul (Complex.pow x1 (AxNat.sub x2 x3)) (x0 (AxNat.succ x2)))))))))

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. Addition on the constructed com CReal.Equiv-lifted equivalence Complex.Equiv is symmetric Complex.Equiv is transitive hornerFromTop's recursive step: [generated] kernel theorem Nat. <= on the naturals is transitiv [generated] kernel theorem Nat. Current fact
12 direct dependencies 0 direct dependents Graph shows the first 8 on each side.

Evidence

kernel-Complex.factorQuotient_succ_eq

Kind
kernel-term
Status
checked

Supports: Complex.factorQuotient_succ_eq is admitted by the trusted kernel gate with the type recorded in formal.statement.

Checker command
cargo run -q --release -p axeyum-lean-kernel --example theorem_dependency_inventory -- factorQuotient_succ_eq 2>/dev/null | grep -cE '^Complex\.factorQuotient_succ_eq[[:space:]]'
Evidence notes

build_complex_prelude admits Complex.factorQuotient_succ_eq through the trusted Kernel::add_declaration gate. theorem_dependency_inventory exits non-zero for a named filter matching nothing; grep -c asserts the exact tab-anchored line. --release is MANDATORY: this tool also builds creal/complex/cpoint, which overflow the default debug thread stack.

footprint-Complex.factorQuotient_succ_eq

Kind
exhaustive-enumeration
Status
checked

Supports: axiom_footprint: [] -- the complex prelude's trusted surface is empty, which bounds Complex.factorQuotient_succ_eq

Checker command
cargo run -q --release -p axeyum-lean-kernel --example nat_axiom_inventory -- --include-constructed --require-axiom-free complex
Evidence notes

Re-measured on this tree: complex: axiom=0 opaque=0 quotient=0 total_trusted=0, exits 0 printing 'ok: complex trusted surface = 0'. That bounds every declaration in the complex environment, including Complex.factorQuotient_succ_eq, since a declaration cannot depend on a trusted declaration the environment does not contain. --require-axiom-free <name> errors for a prelude never built by this run rather than silently passing on zero rows. --release is MANDATORY here.

Provenance

{
  "date": "2026-08-27",
  "established_by": "axeyum-lean-kernel build_complex_prelude (crates/axeyum-lean-kernel/src/complex/poly.rs, declare_factor_quotient_succ_eq)",
  "source": "canonical type read via kernel_declaration_projection's own UNFILTERED emit mode (cargo run -q --release -p axeyum-lean-kernel --example kernel_declaration_projection, no --require-declaration flag), which prints, per constructed prelude, one TSV row per declaration whose last field is kernel.render_lean(declaration.ty()) -- the same Kernel::render_lean canonical form nat_theorem_inventory prints, just not filtered to Declaration::Theorem. That output was piped to a scratchpad file and the exact row for this declaration's own prelude label was extracted and injected here programmatically (a Python script reading the TSV, never hand-transcribed); direct theorem dependencies were cross-read from the same run's direct_theorems column (field 6) and matched against the ledger's own registered kernel_theorem/formal.statement names to populate depends_on. No new probe binary was written for this batch; crates/ source was not touched to produce this batch."
}