calc: Functions for Declarations

 
 7.6.3 Functions for Declarations
 --------------------------------
 
 Calc has a set of functions for accessing the current declarations in a
 convenient manner.  These functions return 1 if the argument can be
 shown to have the specified property, or 0 if the argument can be shown
 _not_ to have that property; otherwise they are left unevaluated.  These
DONTPRINTYET  Rewrite Rules::) or programming constructs (SeeConditionals in
 Macros).  They can be entered only using algebraic notation.  *NoteDONTPRINTYET  Rewrite Rules::) or programming constructs (SeeConditionals in
 Macros).  They can be entered only using algebraic notation.  See
 Logical Operations, for functions that perform other tests not related
 to declarations.
 
    For example, ‘dint(17)’ returns 1 because 17 is an integer, as do
 ‘dint(n)’ and ‘dint(2 n - 3)’ if ‘n’ has been declared ‘int’, but
 ‘dint(2.5)’ and ‘dint(n + 0.5)’ return 0.  Calc consults knowledge of
 its own built-in functions as well as your own declarations:
 ‘dint(floor(x))’ returns 1.
 
    The ‘dint’ function checks if its argument is an integer.  The
 ‘dnatnum’ function checks if its argument is a natural number, i.e., a
 nonnegative integer.  The ‘dnumint’ function checks if its argument is
 numerically an integer, i.e., either an integer or an integer-valued
 float.  Note that these and the other data type functions also accept
 vectors or matrices composed of suitable elements, and that real
 infinities ‘inf’ and ‘-inf’ are considered to be integers for the
 purposes of these functions.
 
    The ‘drat’ function checks if its argument is rational, i.e., an
 integer or fraction.  Infinities count as rational, but intervals and
 error forms do not.
 
    The ‘dreal’ function checks if its argument is real.  This includes
 integers, fractions, floats, real error forms, and intervals.
 
    The ‘dimag’ function checks if its argument is imaginary, i.e., is
 mathematically equal to a real number times ‘i’.
 
    The ‘dpos’ function checks for positive (but nonzero) reals.  The
 ‘dneg’ function checks for negative reals.  The ‘dnonneg’ function
 checks for nonnegative reals, i.e., reals greater than or equal to zero.
 Note that Calc’s algebraic simplifications, which are effectively
 applied to all conditions in rewrite rules, can simplify an expression
 like ‘x > 0’ to 1 or 0 using ‘dpos’.  So the actual functions ‘dpos’,
 ‘dneg’, and ‘dnonneg’ are rarely necessary.
 
    The ‘dnonzero’ function checks that its argument is nonzero.  This
 includes all nonzero real or complex numbers, all intervals that do not
 include zero, all nonzero modulo forms, vectors all of whose elements
 are nonzero, and variables or formulas whose values can be deduced to be
 nonzero.  It does not include error forms, since they represent values
 which could be anything including zero.  (This is also the set of
 objects considered “true” in conditional contexts.)
 
    The ‘deven’ function returns 1 if its argument is known to be an even
 integer (or integer-valued float); it returns 0 if its argument is known
 not to be even (because it is known to be odd or a non-integer).  Calc’s
 algebraic simplifications use this to simplify a test of the form ‘x % 2
 = 0’.  There is also an analogous ‘dodd’ function.
 
    The ‘drange’ function returns a set (an interval or a vector of
 intervals and/or numbers; SeeSet Operations) that describes the set
 of possible values of its argument.  If the argument is a variable or a
 function with a declaration, the range is copied from the declaration.
 Otherwise, the possible signs of the expression are determined using a
 method similar to ‘dpos’, etc., and a suitable set like ‘[0 .. inf]’ is
 returned.  If the expression is not provably real, the ‘drange’ function
 remains unevaluated.
 
    The ‘dscalar’ function returns 1 if its argument is provably scalar,
 or 0 if its argument is provably non-scalar.  It is left unevaluated if
 this cannot be determined.  (If Matrix mode or Scalar mode is in effect,
 this function returns 1 or 0, respectively, if it has no other
 information.)  When Calc interprets a condition (say, in a rewrite rule)
 it considers an unevaluated formula to be “false.” Thus, ‘dscalar(a)’ is
 “true” only if ‘a’ is provably scalar, and ‘!dscalar(a)’ is “true” only
 if ‘a’ is provably non-scalar; both are “false” if there is insufficient
 information to tell.