The SMT-LIB standard never had support for multi-dimensional arrays. Z3 could process them, but they were not part of the standard. SMT-LIB 1.0 is a very restrictive format, that is why Z3 had several extensions for accommodating user needs. On the other hand, SMT-LIB 2.0 is a very rich input format and fixes the main issues users had with SMT-LIB 1.0. In Z3 4.x, when the logic is specified in the input file, Z3 tries to be compliant with the SMT-LIB 2.0 standard. When the set-logic
is removed, all Z3 specific extensions are enabled.
As you described, an array sorrt (Array I1 I2 R)
can be encoded as (Array I1 (Array I2 R))
.
Regarding performance, Z3 3.x and 4.x do not have performance improvements for the array theory. They have many improvements for bit-vectors, but they are not available when the problem mixes arrays and bit-vectors. A new array theory is in TODO list, but nobody in the Z3 team is currently working on that.