A Dynamic_Predicate should do the trick:
type Some_Array is array (Natural range <>) of Integer with
Dynamic_Predicate => Some_Array'First = 0;
You can also add a precondition to the function. However there will a few cases where the compiler won’t catch violations at compile time.
That sounds a lot like premature optimisation. Trust the optimiser to optimise array access.
2** is not needed. Ada can provide modulus types with any range. I use unconventional modulus types in my PI Ada Tutorial. The compiler takes care of it.