Se pueden definir records que tengan parámetros discriminantes, que son componentes del propio record que pueden usarse para condicionar la existencia o características de otros componentes. Un record con partes variantes (variant_part) tiene diferentes componentes en función del valor de del discriminante (discreto) que se utilice para discriminar la parte variante.
known_discriminant_part ::= (discriminant_specification {; discriminant_specification}) discriminant_specification ::= defining_identifier_list : [null_exclusion] subtype_mark [:= expression] | defining_identifier_list : access_definition [:= expression] variant_part ::= case discriminant_direct_name is variant {variant} end case; variant ::= when discrete_choice_list => component_list discrete_choice_list ::= discrete_choice {| discrete_choice} discrete_choice ::= expression | discrete_range | others discrete_range ::= discrete_subtype_indication | rango
type Matriz_Base is array (Integer range <>, Integer range <>) of Float;
-- Record con dos discriminantes (Filas y Columnas) type Matriz (Filas, Columnas: Positive) is record Valores : Matriz_Base (1 .. Filas, 1 .. Columnas); end Matriz;
type Figura is (Rectángulo, Círculo); -- Record con parte variante type Polígono (Forma : Figura) is record -- Forma es el discriminante Pos_X, Pos_Y: Float; case Forma is -- Parte variante when Rectángulo => Base, Altura: Float; when Círculo => Radio : Float; end case; end record;