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