Ada 中可能有不连续的子类型定义吗?

Is possible in Ada a discontinuous subtype definition?

假设我有以下常量来定义一个只接受其范围定义内的有效值的子类型:

type Unsigned_4_T is mod 2**4;

valid_1   : constant Unsigned_4_T := 0;
valid_2   : constant Unsigned_4_T := 1;
invalid_1 : constant Unsigned_4_T := 2;
valid_3   : constant Unsigned_4_T := 3;

现在,我想定义 Unsigned_4_T 的子类型 VALID_VALUES_T,它只接受使用常量 valid_1、valid_2 和valid_3.

我一直在尝试使用 Static_Predicate 来实现这一点,但是,当我声明一个所需子类型的变量并分配 invalid_1 值时,没有约束也没有编译错误,因为我预料到了。

AdaCore 编译器要求您启用断言以生成您需要的异常。使用 -gnata 标志编译您的程序。

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Exceptions; use Ada.Exceptions;
with System.Assertions; use System.Assertions;

procedure Main is
   type Unsigned is mod 2**4;
   subtype discontinuous is Unsigned with
     Static_Predicate => discontinuous in 0 | 1 | 3;
   Num : discontinuous;
begin
   for I in Unsigned'Range loop
      Num := I;
      Put_Line(Num'Image);
   end loop;
exception
   when E :Assert_Failure =>
      Put_Line("Invalid value assigned to Num: " & Exception_Message(E));
end Main;

程序的输出是:

    
 0
 1
Invalid value assigned to Num: Static_Predicate failed at main.adb:12