А, все, разобрался, вот пример, почему нельзя:
Код:
PROCEDURE P (a: POINTER TO ARRAY OF A);
VAR c: POINTER TO RECORD (A) END;
BEGIN a[0] := c (*)
END P;
После P(b) фактический массив а^ имеет тип элемента B, что несовместимо по присваиванию в (*) и не может быть выявлено при компиляции.
Но что если сделать
PROCEDURE Q (IN a: ARRAY OF A);
При Q(b) фактический массив a^ по-прежнему имеет тип элемента В, что опять несовместимо по присваиванию; однако присваивание запрещено, поскольку исп режим IN. И дальше передать a[i] в качестве VAR и OUT параметра нельзя - получается, а[i] защищено и неизменно; изменяться могут только его поля, что не нарушает целостности, поскольку в любом фактическом a[i] есть все поля A.
Или все-таки есть контрпример или опровергающее рассуждение?