Identifier
F:nat-sumrangeif-congr-lt
Proof route
kernel-lean
External status
proved
Axiom footprint
Empty

Recorded description

If `p` and `q` agree at every index below `n`, and `f` and `g` do too, then `sumRangeIf p f n = sumRangeIf q g n`. HOW IT IS PROVED: induction on `n` with the four functions fixed, exactly `Nat.prodRangeIf_congr_lt`'s shape: the motive threads BOTH bounded-pointwise hypotheses, weakened from `Lt i (succ j)` to `Lt i j` for the recursive call and applied at `i = j` itself to rewrite the new top selector through a `Bool` transport followed by a `Nat` congruence. WHY IT IS BOUNDED: `Lt i n` rather than `countRange_congr`'s unconditional convention, matching `Nat.sumRange_congr_lt` and `Nat.prodRangeIf_congr_lt` -- a predicate or summand built from a partial operator typically agrees pointwise only WITHIN the range. WHY IT DID NOT EXIST: two prior lanes (ADR-1540, ADR-1544) both stopped at the same wall and both MEASURED it rather than guessing -- `examples/shape_search --name-like sumRangeIf` returns ABSENT in every prelude, against a `prodRangeIf` positive control returning 12 declarations. This lane re-ran that measurement on a freshly built binary (declarations=2092, so not a stale artifact reporting a false absence) and got the same two verdicts. `Kernel::axiom_footprint` is EMPTY. Admitted on the first attempt.

Formal statement
theorem Nat.sumRangeIf_congr_lt : ((x0 : ((x0 : AxNat) -> Bool)) -> ((x1 : ((x1 : AxNat) -> Bool)) -> ((x2 : ((x2 : AxNat) -> AxNat)) -> ((x3 : ((x3 : AxNat) -> AxNat)) -> ((x4 : AxNat) -> ((x5 : ((x5 : AxNat) -> ((x6 : AxNat.lt x5 x4) -> Eq.{1} Bool (x0 x5) (x1 x5)))) -> ((x6 : ((x6 : AxNat) -> ((x7 : AxNat.lt x6 x4) -> Eq.{1} AxNat (x2 x6) (x3 x6)))) -> Eq.{1} AxNat (AxNat.sumRange (fun (x7 : AxNat) => Bool.rec.{1} (fun (x8 : Bool) => AxNat) AxNat.zero (x2 x7) (x0 x7)) x4) (AxNat.sumRange (fun (x7 : AxNat) => Bool.rec.{1} (fun (x8 : Bool) => AxNat) AxNat.zero (x3 x7) (x1 x7)) x4))))))))

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. [generated] kernel theorem Nat. [generated] kernel theorem Nat. Current fact Sums agree when the decided mem A sum over a disjoint union spl
2 direct dependencies 2 direct dependents

Evidence

kernel-Nat.sumRangeIf_congr_lt

Kind
kernel-term
Status
checked

Supports: Nat.sumRangeIf_congr_lt 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 -- Nat.sumRangeIf_congr_lt 2>/dev/null | grep -cE '^Nat\.sumRangeIf_congr_lt[[:space:]]'
Evidence notes

Two independent failure modes, so the exit status depends on the finding rather than on the run completing: theorem_dependency_inventory exits non-zero when a NAMED filter matches nothing, and grep -c exits 1 printing 0 when the anchored line is absent. RUN WITH A NEGATIVE CONTROL and it was: the real name prints 1 with both pipeline stages at 0, a one-character typo prints 0 with both stages at 1. Anchored with [[:space:]], never \t -- in a scripted (GNU) grep \t is a literal t. grep -c rather than grep -q, which would SIGPIPE the producer under pipefail. --release is MANDATORY. Pass ONE name per invocation: this tool silently keeps only the FIRST name argument.

footprint-Nat.sumRangeIf_congr_lt

Kind
exhaustive-enumeration
Status
checked

Supports: axiom_footprint: [] -- the natural-number prelude's trusted surface is empty, which bounds Nat.sumRangeIf_congr_lt.

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

--require-axiom-free exits non-zero when the named prelude's trusted surface (Axiom + Opaque + Quotient) is not empty, and errors rather than silently passing for a prelude the run never built. A declaration cannot depend on a trusted declaration the environment does not contain, so an empty nat surface bounds every declaration in it. This is a whole-prelude bound, not a per-declaration measurement; the per-declaration figure is measured 0 by the axiom-footprint assertion in subset_sum_tests.rs.

numeric-Nat.sumRangeIf_congr_lt

Kind
exhaustive-enumeration
Status
checked

Supports: ADR-1552's check script sweeps this statement's arithmetic over 8450 (modulus, multiplier, bound) instances for the hypothesis-free rows, 519 coprime instances for the counting identity, and 399 coprime odd pairs plus all 240 ordered pairs of distinct odd primes below 60 for Eisenstein's lemma; the control table refutes eight wrong readings at named witnesses.

Checker command
python3 docs/research/09-decisions/adr-1552-eisenstein-checks.py
Evidence notes

Exit status depends on the finding: a claim that fails, or a control that behaves other than as recorded, exits 1. Verified by mutating the script itself in a scratch copy with one uniquely-named file per mutant (so the stale-__pycache__ trap cannot report the previous mutant's result): 16 of 16 mutations exit 1. Two recorded SURVIVORS, M9 and M10, are the argument order of the congruence and of `Even (F + N)` -- invisible to every numeric check and guarded only by the character-for-character type pins in subset_sum_tests.rs.

Provenance

{
  "date": "2026-09-02",
  "curation": "curated",
  "established_by": "axeyum-lean-kernel build_nat_prelude (crates/axeyum-lean-kernel/src/nat_prelude/subset_sum.rs)",
  "source": "formal.statement is taken verbatim from the kernel's own rendering (Kernel::render_lean of the admitted declaration type; the same string is pinned character for character in subset_sum_tests.rs). depends_on is the direct-theorem column of theorem_dependency_inventory intersected with this ledger's registered facts, so it is an INTERSECTION and not the full dependency set -- direct dependencies with no fact row are omitted. Nothing about the statement was hand transcribed; title, statement and the evidence notes were authored (lane eisenstein-3)."
}