)abbrev domain OVAR OrderedVariableList
++ Description:
++ This domain implements ordered variables
OrderedVariableList(VariableList : List Symbol):
  Join(OrderedFinite, ConvertibleTo Symbol, ConvertibleTo InputForm,
       ConvertibleTo(Pattern(Float)), ConvertibleTo(Pattern(Integer)),
           Hashable) with
         variable : Symbol -> Union(%,"failed")
                ++ variable(s) returns a member of the variable set or failed
    == add
       VariableList := removeDuplicates VariableList
       Rep := PositiveInteger
       s1, s2 : %
       convert(s1) : Symbol == VariableList.((s1::Rep)::PositiveInteger)
       coerce(s1) : OutputForm == (convert(s1)@Symbol)::OutputForm
       convert(s1) : InputForm == convert(convert(s1)@Symbol)
       convert(s1) : Pattern(Integer) == convert(convert(s1)@Symbol)
       convert(s1) : Pattern(Float) == convert(convert(s1)@Symbol)
       index i   == i::%
       lookup j  == j :: Rep
       size ()   == #VariableList
       variable(exp : Symbol) ==
            for i in 1.. for exp2 in VariableList repeat
                if exp = exp2 then return i::PositiveInteger::%
            "failed"
       s1 < s2 == s2 <$Rep s1
       s1 = s2 == s1 =$Rep s2
       hashUpdate!(hs, s) == update!(hs, SXHASH(s)$Lisp)$HashState

)abbrev domain VARIABLE Variable
++ Description:
++ This domain implements variables
Variable(sym : Symbol) : Join(SetCategory, CoercibleTo Symbol) with
        coerce  : % -> Symbol
                ++ coerce(x) returns the symbol
        variable : () -> Symbol
                ++ variable() returns the symbol
    == add
        coerce(x : %) : Symbol     == sym
        coerce(x : %) : OutputForm == sym::OutputForm
        variable()             == sym
        x = y                  == true

)abbrev domain RULECOLD RuleCalled
++ Description:
++ This domain implements named rules
RuleCalled(f : Symbol) : SetCategory with
        name : % -> Symbol
                ++ name(x) returns the symbol
 == add
  name r                 == f
  coerce(r : %) : OutputForm == f::OutputForm
  x = y                  == true

)abbrev domain FUNCTION FunctionCalled
++ Description:
++ This domain implements named functions
FunctionCalled(f : Symbol) : SetCategory with
        name : % -> Symbol
                ++ name(x) returns the symbol
  == add
   name r                 == f
   coerce(r : %) : OutputForm == outputMapTran(f, r)$Lisp
   x = y                  == true

)abbrev domain ANON AnonymousFunction
++ Description:
++ This domain implements anonymous functions
AnonymousFunction() : SetCategory == add
    coerce(x : %) : OutputForm == outputTranAnon(x)$Lisp

--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
--All rights reserved.
--
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are
--met:
--
--    - Redistributions of source code must retain the above copyright
--      notice, this list of conditions and the following disclaimer.
--
--    - Redistributions in binary form must reproduce the above copyright
--      notice, this list of conditions and the following disclaimer in
--      the documentation and/or other materials provided with the
--      distribution.
--
--    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
--      names of its contributors may be used to endorse or promote products
--      derived from this software without specific prior written permission.
--
--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
