semantic.pl 1.82 KB
% == No, Emacs this is -*-Prolog-*- code, not what you thought... =============

sa_names(fzn(preds(IP), vars(IV), constrs(IC), SOLVE),
	 fzn(preds(OP), vars(OV), constrs(OC), SOLVE, ST)) :-
    sa_n_traverse(IP, OP, ST),  % predicates
    sa_n_traverse(IV, OV, ST),	% variables
    sa_n_traverse(IC, OC, ST).  % constraints

% -----------------------------------------------------------------------------

sa_n_traverse([], [], _ST) :- !.
sa_n_traverse([N|Ns], [NN|NNs], ST) :-
    sa_n(N, NN, ST), !,
    sa_n_traverse(Ns, NNs, ST).
sa_n_traverse([_|Ns], NNs, ST) :- !, % ignore failing nodes (beware!)
    sa_n_traverse(Ns, NNs, ST).

sa_n_traverse(N, NN, ST) :- sa_n(N, NN, ST). % non-list case

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
% sa_n(AST_N_IN, AST_N_OUT, ST)
%
% handle all AST cases:
%  var(N,T,I,A)        - variable declaration
%  lit(V,T)            - literal with type
%  

sa_n(var(N,T,I,A), V, ST) :-
    sa_attribs(A, AX, ST),
    sa_n_traverse(I, NI, ST),	% parse initializer
    V=var(N,T,NI,AX),		% new AST node becomes ST entry value
    st_insert(ST, N, V).

sa_n(lit(E,array(T)), lit(NE, array(T)), ST) :-
    sa_n_traverse(E, NE, ST).
sa_n(lit(E,int), lit(E,int), _ST).
sa_n(lit(E,float), lit(E,float), _ST).
sa_n(lit(E,string), lit(E,string), _ST).

sa_n(id(N), V, ST) :- st_lookup(ST, N, V), !.
sa_n(id(N), V, ST) :- V=id(N,_), % type as yet unknown
		      st_insert(ST, N, V).

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sa_attribs([A|As], [NA|NAs], ST) :-
    sa_attrib(A, NA, ST), !,
    sa_attribs(As, NAs, ST).
sa_attribs([_|As], NAs, ST) :-	% ignore unknown attributes
    sa_attribs(As, NAs, ST).
sa_attribs([], [], _).


sa_attrib(id(output_var), output, _).

% -----------------------------------------------------------------------------