6.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 functions are suitable for use with rewrite rules (see Conditional Rewrite Rules) or programming constructs (see Conditionals in Keyboard 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; see Set Operations using Vectors) 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.