% $Id: env.mod,v 1.2 2004/10/18 03:37:42 leavens Exp leavens $
%
% Environments as in Watt's book "Programming Languages: Syntax and Semantics"
% (Prentice-Hall, 1991), section 3.3.1.
%
% AUTHOR: Gary T. Leavens

module env.

  local append (list A) -> (list A) -> (list A) -> o.

  %% ``find E I B'' succeeds if E records a binding of I to B.
  (find (bind I B) I B) :- !.
  (find (overlay Env1 Env2) I B) :- (find Env1 I B), !.
  (find (overlay Env1 Env2) I B) :- (find Env2 I B).
  
  %% ``range_env E L'' succeeds if L is a list containing all the bindings
  %% recorded in E.
  (range_env (bind I B) (B::nil)).
  (range_env (overlay Env1 Env2) L) :-
  	(range_env Env1 L1),
  	(range_env Env2 L2),
  	(append L1 L2 L).

  %% ``append L1 L2 L3'' succeeds if L3 is the concatenation
  %% of L1 followed by L2.
  append nil K K.
  append (X::L) K (X::M) :- append L K M.
