You do not have to be able to count to know two rows are the same size. Put them side by side and match them one to one. If nobody is left standing on either side, the rows are the same size. This is older than counting and it is what counting is for.
Neither row is longer than the other — that is all “the same size” says. And if one row is longer, something is left standing on its side, and the number left standing is the difference:
On the table. A row of stones and a row of cups, one stone to a cup. Then count only what is left over.
The marks III and the numeral 3 name the same row. One is shorter to write. Adding one mark makes the name go up by one, every time, forever — one_more. That is the whole of counting.
12 and 21 are written with the same two marks and are not the same number. Nothing in the marks says so. The place says so. Reading a two-digit numeral is so many tens and so many ones.
Two different two-digit numerals never name the same number. Reading is never ambiguous. This is not obvious and it is not free: it holds because the digits are smaller than ten.
And it is not about ten. no_collision_in_any_base holds for any bundling size, so long as no digit reaches the size you bundle at. Ten is a fact about hands; this is the fact underneath it.
The file imports nothing. On a machine with only the Lean toolchain and no library at all:
About a second. The nine lines it prints are the report kept beside it, and tools/axiom_gate.py is what reads them.
sorryAx. A clean axiom report is not a reading of the statement: per R20, a theorem can assume its conclusion and still report clean. Follow the link before citing one as evidence.