-- Demonstrates defining subtypes using static and dynamic predicates
-- Must enable assertions with -gnata compiler flag for it to work correctly:
-- gnatmake -gnata predicates.adb
pragma ada_2012;
pragma assertion_policy(check);
with ada.integer_text_io; use ada.integer_text_io;
with ada.float_text_io; use ada.float_text_io;
with ada.text_io; use ada.text_io;
with ada.exceptions; use ada.exceptions;
procedure predicates is
subtype smallfloat is float
with static_predicate => 0.0 < smallfloat and smallfloat < 1.0;
subtype smallint is integer range 1 .. 20;
subtype smallprime is smallint
with static_predicate => smallprime in 2 | 3 | 5 | 7 | 11| 13 | 17 | 19;
subtype even is smallint
with dynamic_predicate => even mod 2 = 0;
ev: even;
fl: smallfloat;
begin
for j in smallint loop
if j in even then
put_line(j'img & "=even.");
else
put_line(j'img & "=odd.");
end if;
end loop;
for j in smallprime loop
put_line(j'img);
end loop;
loop
begin
put("Enter even: ");
get(ev);
put_line(ev'img);
put("Enter smallfloat: ");
get(fl);
put(fl); new_line;
exception
when e:others =>
put_line("Error");
put_line(exception_name(e));
put_line(exception_message(e));
end;
end loop;
end predicates;