% An example of type annotated Prolog:
%
% built-in types and predicates for numbers and numeric expressions
%
type num.
suptype num > float.
suptype num > int.
type int.
type nat.
suptype int > negint.
suptype int > nat.
suptype nat > posint.
suptype nat > zero.
type zero --> 0.
type posint --> {X|(integer(X),X>0)}.
type negint --> {X|(integer(X),X<0)}.
type float --> {X|float(X)}.
% built-in predicates
pred integer(int).
pred float(float).
% arithmetic
type numexpr --> numexpr + numexpr ; % binary infix operators
numexpr - numexpr ;
numexpr * numexpr ;
numexpr / numexpr ;
+ num; % prefix operators
- num.
suptype numexpr > num.
pred num is numexpr. % built-in 'is'
pred numexpr =:= numexpr.
pred numexpr =\= numexpr.
pred numexpr < numexpr.
pred numexpr =< numexpr.
pred numexpr > numexpr.
pred numexpr > numexpr.