TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)
Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE
Не, не то же самое. Тип PROCEDURE не имеет возвращаемого типа. Так что без явной рекурсии такой тип ну никак не описать.
С сигнатурами, кстати, тоже все интересно:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
ProcType2 = PROCEDURE(p: ProcType2): ProcType2;
Так вот. Я могу представить себе реализацию компилятора, в которой подобные рекурсивные определения работают без дополнительных приседаний (на момент анализа идентификатора типа возвращаемого значения в скопе уже есть (недоопределнный) тип "ProcType1", на который можно получить ссылку - все компилируется).
Но вот для анализа совместимости сигнатур ProcType1 и ProcType2 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.