-- 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;