sugar for creating types
Opened this issue · 3 comments
Imagine the following two type definitions in mavis:
:- multifile error:has_type/2.
error:has_type(even_integer, X) :-
0 is X mod 2.
error:has_type(north_american_country, X) :-
memberchk(X, [usa, canada, mexico]).
That's more verbose (and error prone) than I'd like. I'd prefer to write:
:- type even_integer ---> 0 is X mod 2.
:- type north_american_country ---> usa; canada; mexico.
The basic notation is similar to Mercury while allowing arbitrary type checks (such as even_integer
). This can be implemented with a relatively easy term_expansion/2
macro.
This one is derived from the delta type in my tiny patches project. It's similar to algebraic data types in other languages.
:- type delta ---> +(atom, positive_integer)
; <(positive_integer, oneof([space,tab]), positive_integer)
.
which should expand into
:- multifile error:has_type/2.
error:has_type(delta, +(A,B)) :-
error:has_type(A, atom),
error:has_type(B, positive_integer).
error:has_type(delta, <(A,B,C)) :-
error:has_type(positive_integer, A),
error:has_type(oneof([space,tab]), B),
error:has_type(positive_integer, C).
Make sure that our type syntax is very close to (if not identical with) the syntax used by Mercury and SWI-Prolog's CHR system.
This sugary syntax should automatically generate clauses for quickcheck:arbitrary/2
, if possible. In most circumstances it will be trivial to do so. We certainly don't want to maintain those definitions by hand if we can avoid it.