Artifact cd79c9ae98e7ed8b164248a54cb0a031e88a18a07da073b6eac1252a30423b5f:
- Executable file
r38/doc/manual/exprn.tex
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 9048) [annotate] [blame] [check-ins using] [more...]
- Executable file
r38/lisp/csl/r38.doc/exprn.tex
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 9048) [annotate] [blame] [check-ins using]
\chapter{Expressions} {\REDUCE} expressions\index{Expression} may be of several types and consist of sequences of numbers, variables, operators, left and right parentheses and commas. The most common types are as follows: \section{Scalar Expressions} \index{Scalar}Using the arithmetic operations {\tt + - * / \verb|^|} (power) and parentheses, scalar expressions are composed from numbers, ordinary ``scalar'' variables (identifiers), array names with subscripts, operator or procedure names with arguments and statement expressions. {\it Examples:} \begin{verbatim} x x^3 - 2*y/(2*z^2 - df(x,z)) (p^2 + m^2)^(1/2)*log (y/m) a(5) + b(i,q) \end{verbatim} The symbol ** may be used as an alternative to the caret symbol (\verb+^+) for forming powers, particularly in those systems that do not support a caret symbol. Statement expressions, usually in parentheses, can also form part of a scalar\index{Scalar} expression, as in the example \begin{verbatim} w + (c:=x+y) + z . \end{verbatim} When the algebraic value of an expression is needed, {\REDUCE} determines it, starting with the algebraic values of the parts, roughly as follows: Variables and operator symbols with an argument list have the algebraic values they were last assigned, or if never assigned stand for themselves. However, array elements have the algebraic values they were last assigned, or, if never assigned, are taken to be 0. Procedures are evaluated with the values of their actual parameters. In evaluating expressions, the standard rules of algebra are applied. Unfortunately, this algebraic evaluation of an expression is not as unambiguous as is numerical evaluation. This process is generally referred to as ``simplification''\index{Simplification} in the sense that the evaluation usually but not always produces a simplified form for the expression. There are many options available to the user for carrying out such simplification\index{Simplification}. If the user doesn't specify any method, the default method is used. The default evaluation of an expression involves expansion of the expression and collection of like terms, ordering of the terms, evaluation of derivatives and other functions and substitution for any expressions which have values assigned or declared (see assignments and {\tt LET} statements). In many cases, this is all that the user needs. The declarations by which the user can exercise some control over the way in which the evaluation is performed are explained in other sections. For example, if a real (floating point) number is encountered during evaluation, the system will normally convert it into a ratio of two integers. If the user wants to use real arithmetic, he can effect this by the command {\tt on rounded;}.\ttindex{ROUNDED} Other modes for coefficient arithmetic are described elsewhere. If an illegal action occurs during evaluation (such as division by zero) or functions are called with the wrong number of arguments, and so on, an appropriate error message is generated. % A list of such error messages is given in an appendix. \section{Integer Expressions} \index{Integer}These are expressions which, because of the values of the constants and variables in them, evaluate to whole numbers. {\it Examples:} \begin{verbatim} 2, 37 * 999, (x + 3)^2 - x^2 - 6*x \end{verbatim} are obviously integer expressions. \begin{verbatim} j + k - 2 * j^2 \end{verbatim} is an integer expression when {\tt J} and {\tt K} have values that are integers, or if not integers are such that ``the variables and fractions cancel out'', as in \begin{verbatim} k - 7/3 - j + 2/3 + 2*j^2. \end{verbatim} \section{Boolean Expressions} \label{sec-boolean} A boolean expression\index{Boolean} returns a truth value. In the algebraic mode of {\REDUCE}, boolean expressions have the syntactical form: \begin{verbatim} <expression> <relational operator> <expression> \end{verbatim} or \begin{verbatim} <boolean operator> (<arguments>) \end{verbatim} or \begin{verbatim} <boolean expression> <logical operator> <boolean expression>. \end{verbatim} Parentheses can also be used to control the precedence of expressions. In addition to the logical and relational operators defined earlier as infix operators, the following boolean operators are also defined:\\ \mbox{}\\ \ttindex{EVENP}\ttindex{FIXP}\ttindex{FREEOF}\ttindex{NUMBERP} \ttindex{ORDP}\ttindex{PRIMEP} {\renewcommand{\arraystretch}{2} \begin{tabular}{lp{\redboxwidth}} {\tt EVENP(U)} & determines if the number {\tt U} is even or not; \\ {\tt FIXP(U)} & determines if the expression {\tt U} is integer or not; \\ {\tt FREEOF(U,V)} & determines if the expression {\tt U} does not contain the kernel {\tt V} anywhere in its structure; \\ {\tt NUMBERP(U)} & determines if {\tt U} is a number or not; \\ {\tt ORDP(U,V)} & determines if {\tt U} is ordered ahead of {\tt V} by some canonical ordering (based on the expression structure and an internal ordering of identifiers); \\ {\tt PRIMEP(U)} & true if {\tt U} is a prime object, i.e., any object other than 0 and plus or minus 1 which is only exactly divisible by itself or a unit. \\ \end{tabular}} {\it Examples:} \begin{verbatim} j<1 x>0 or x=-2 numberp x fixp x and evenp x numberp x and x neq 0 \end{verbatim} Boolean expressions can only appear directly within {\tt IF}, {\tt FOR}, {\tt WHILE}, and {\tt UNTIL} statements, as described in other sections. Such expressions cannot be used in place of ordinary algebraic expressions, or assigned to a variable. NB: For those familiar with symbolic mode, the meaning of some of these operators is different in that mode. For example, {\tt NUMBERP} is true only for integers and reals in symbolic mode. When two or more boolean expressions are combined with {\tt AND}, they are evaluated one by one until a {\em false\/} expression is found. The rest are not evaluated. Thus \begin{verbatim} numberp x and numberp y and x>y \end{verbatim} does not attempt to make the {\tt x>y} comparison unless {\tt X} and {\tt Y} are both verified to be numbers. Similarly, evaluation of a sequence of boolean expressions connected by {\tt OR} stops as soon as a {\em true\/} expression is found. NB: In a boolean expression, and in a place where a boolean expression is expected, the algebraic value 0 is interpreted as {\em false}, while all other algebraic values are converted to {\em true}. So in algebraic mode a procedure can be written for direct usage in boolean expressions, returning say 1 or 0 as its value as in \begin{verbatim} procedure polynomialp(u,x); if den(u)=1 and deg(u,x)>=1 then 1 else 0; \end{verbatim} One can then use this in a boolean construct, such as \begin{verbatim} if polynomialp(q,z) and not polynomialp(q,y) then ... \end{verbatim} In addition, any procedure that does not have a defined return value (for example, a block without a {\tt RETURN} statement in it) has the boolean value {\em false}. \section{Equations} Equations\index{Equation} are a particular type of expression with the syntax \begin{verbatim} <expression> = <expression>. \end{verbatim} In addition to their role as boolean expressions, they can also be used as arguments to several operators (e.g., {\tt SOLVE}), and can be returned as values. Under normal circumstances, the right-hand-side of the equation is evaluated but not the left-hand-side. This also applies to any substitutions made by the {\tt SUB}\ttindex{SUB} operator. If both sides are to be evaluated, the switch {\tt EVALLHSEQP}\ttindex{EVALLHSEQP} should be turned on. To facilitate the handling of equations, two selectors, {\tt LHS} \ttindex{LHS} and {\tt RHS},\ttindex{RHS} which return the left- and right-hand sides of a equation\index{Equation} respectively, are provided. For example, \begin{verbatim} lhs(a+b=c) -> a+b and rhs(a+b=c) -> c. \end{verbatim} \section{Proper Statements as Expressions} Several kinds of proper statements\index{Proper statement} deliver an algebraic or numerical result of some kind, which can in turn be used as an expression or part of an expression. For example, an assignment statement itself has a value, namely the value assigned. So \begin{verbatim} 2 * (x := a+b) \end{verbatim} is equal to {\tt 2*(a+b)}, as well as having the ``side-effect''\index{Side effect} of assigning the value {\tt a+b} to {\tt X}. In context, \begin{verbatim} y := 2 * (x := a+b); \end{verbatim} sets {\tt X} to {\tt a+b} and {\tt Y} to {\tt 2*(a+b)}. The sections on the various proper statement\index{Proper statement} types indicate which of these statements are also useful as expressions.