rat-rank-nullity-1
- Kind
- kernel-term
- Status
- checked
Supports: `Rat.rank_nullity` is a checked `Declaration::Theorem` with an EMPTY axiom footprint in all four preludes carrying the rationals, AND its admitted type renders with the conclusion `AxNat.add (Rat.rankCols x0 x1 x2) (Rat.nullity x0 x1 x2) = x2`. The checker greps the RENDERED TYPE and not only the name, so it fails not just on a deletion or a rename but on the statement changing while the name survives -- for instance a version bounding the sum by `x1` (the row count) instead of `x2`, which would be a different and false theorem.
out=$(target/release/examples/kernel_declaration_projection 2>/dev/null | grep -cE '^(rat|creal|complex|cpoint)[[:space:]]+theorem[[:space:]]+Rat\.rank_nullity[[:space:]]+0[[:space:]].*AxNat\.add \(Rat\.rankCols x0 x1 x2\) \(Rat\.nullity x0 x1 x2\)\) x2\)\)\)$' 2>&1) && test "$(printf "%s\n" "$out" | grep -cE '^4$')" = 1 Evidence notes
Run 2026-09-02: the projection lists exactly four rows (rat, creal, complex, cpoint) matching name, kind `theorem`, axiom count `0` and the full rendered conclusion; the checker requires the count to be exactly 4 and exits 1 otherwise. `scripts/new-fact.py` verified the pattern fails on mutated output before this file was written. The anchor is the rendered CONCLUSION rather than the whole type because the binder prefix is shared by every three-argument matrix theorem in the family and would not discriminate.