123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- \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. \\
- \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.
|