kernel-Nat.add_div_of_dvd_add_add_one
- Kind
- kernel-term
- Status
- checked
Supports: ∀ {c a b : ℕ}, c ∣ a + b + 1 → (a + b) / c = a / c + b / c
test "$(cargo run -q -p axeyum-lean-kernel --example nat_theorem_inventory -- add_div_of_dvd_add_add_one 2>/dev/null | grep -Ec '^Nat\.add_div_of_dvd_add_add_one[[:space:]]')" -ge 1 Evidence notes
`build_nat_prelude` admits `Nat.add_div_of_dvd_add_add_one` through the trusted `Kernel::add_declaration` gate (declared in `nat_prelude/div_mod_lemmas.rs`'s `declare_add_div_of_dvd_add_add_one`, the ninth `ml430` add/div/mod mirror -- the eight in `declare_add_div_mod_shift_family` left this one open, per `docs/plan/status/283-nat-div-mod-family.md`). Route (see the module doc for the full derivation): decompose `a=c*qa+ra`, `b=c*qb+rb` via `div_mod_exec`; case-split `ra+rb+1` against `c` (`lt_or_ge`) -- below `c` this is already a valid `divMod` decomposition of `a+b+1` and comparing it against the `dvd`-witness relation (remainder `0`) via `div_mod_unique` forces `ra+rb+1=0`, refuted by `succ_ne_zero`; at or above `c`, subtracting `c` once (`sub_add_cancel`) gives a remainder `r'` bounded `<c` (via `ra<c`, `rb<c`, `le_of_succ_le_succ`/`add_le_add_left`/`add_le_add_right`/`le_trans`), and comparing THAT decomposition against the same `dvd`-witness relation forces `r'=0`, i.e. `ra+rb+1=c` exactly, pinning `ra+rb=c-1<c` -- which makes `(qa+qb, ra+rb)` a valid `divMod` decomposition of `a+b` itself, closed against `div_mod_exec`'s own decomposition of `a+b` via one more `div_mod_unique`. `nat_theorem_inventory`'s rendered type for `Nat.add_div_of_dvd_add_add_one` is `(x0:AxNat)->(x1:AxNat)->(x2:AxNat)->(x3:AxNat.dvd x0 (AxNat.add (AxNat.add x1 x2) (AxNat.succ AxNat.zero)))->Eq (AxNat.div (AxNat.add x1 x2) x0) (AxNat.add (AxNat.div x1 x0) (AxNat.div x2 x0))`, matching this fact's `formal.statement` verbatim (`x0`=c, `x1`=a, `x2`=b). `nat_theorem_inventory` exits non-zero for a name that does not exist (verified against `add_div_of_dvd_add_add_one_bogus`, count 0), and the `grep -c` count (tested `-ge 1`, not piped into `grep -q`) requires the admitted declaration to actually be printed.