exception Unbound_Variable;;

let empty : Domains.environment =
  [];;

let extend_with_binding (variable : Domains.variable)
                        (value : Domains.value)
                        (environment : Domains.environment)
                        : Domains.environment =
  (variable, value) :: environment;;

let extend_with_environment (lower_precedence_environment : Domains.environment)
                            (higher_precedence_environment : Domains.environment)
                            : Domains.environment =
  List.append higher_precedence_environment lower_precedence_environment;;

let rec lookup (variable : Domains.variable)
               (environment : Domains.environment)
               : Domains.value =
  match environment with
    | [] ->
      raise Unbound_Variable
    | (first_variable, first_value) :: rest ->
      if variable = first_variable then
        first_value
      else
        lookup variable rest;;
