types.pl 912 Bytes
% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============

% -- type(NODE, TYPE) ---------------------------------------------------------
%
% type/2: Extract type from AST node.

type(var(_,T,_,_), T) :- type(T).
type(lit(_,T),     T) :- type(T).
type(id(_,T),      T) :- type(T).

type(lit(E,array(T)), array(T)) :- type(E, T).
type(lit(_,T), T) :- type(T).

type([], _).
type([E|Es], T) :- type(E, T), type(Es, T).

% -- type(TYPE) ---------------------------------------------------------------
%
% type/1: generate or test valid types.

type(int).			% integer
type(int(_L,_U)).		% integer interval
type(float).			% floating point
type(float(_L,_U)).		% floating point interval
type(string).			% string
type(array(T,1,_U)) :- type(T).	% array of type

% bound(lb,T,LB)
% bound(ub,T,UB)

bound(lb,int(LB,_UB),LB).
bound(lb,int,1).

bound(ub,int(_LB,UB),UB).
bound(ub,int,999).		% FIXME