@@ -1,1710 +1,1710 @@ -\section{Syntax} - -\begin{Command}[semicolon]{;} -The semicolon is a statement delimiter, indicating results are to be printed -when used in interactive mode. - -\begin{Examples} -(x+1)**2; & X^{2} + 2*X + 1 \\ -df(x**2 + 1,x); & 2*X -\end{Examples} - -\begin{Comments} -Entering a \key{Return} without a semicolon or dollar sign results in a -prompt on the following line. A semicolon or dollar sign can be -added at this point to execute the statement. In interactive mode, a -statement that is ended with a semicolon and \key{Return} has its results -printed on the screen. - -Inside a group statement \name{<<}\ldots\name{>>} -or a \name{begin}\ldots\name{end} block, a -semicolon or dollar sign separates individual REDUCE statements. Since -results are not printed from a block without a specific \name{return} -statement, there is no difference between using the semicolon or dollar -sign. In a group statement, the last value produced is the value -returned by the group statement. Thus, if a semicolon or dollar sign is -placed between the last statement and the ending brackets, the group -statement returns the value 0 or {\em nil}, rather than the value of the -last statement. -\end{Comments} -\end{Command} - - -\begin{Command}[dollar]{$} -The dollar sign is a statement delimiter, indicating results are not to be -printed when used in interactive mode. - -\begin{Examples} - -(x+1)**2$ & -\explanationo{The workspace is set to $x^{2} + 2x + 1$ - but nothing shows on the screen} \\ -ws; & X^{2} + 2*X + 1 -\end{Examples} - -\begin{Comments} -Entering a \key{Return} without a semicolon or dollar sign results in a -prompt on the following line. A semicolon or dollar sign can -be added at this point to execute the statement. In interactive mode, a -statement that ends with a dollar sign \name{\$} and a \key{Return} is -executed, but the results not printed. - -Inside a \nameref{group} statement \name{<<}\ldots\name{>>} -or a \name{begin}\ldots\name{end} \nameref{block}, a -semicolon or dollar sign separates individual REDUCE statements. Since -results are not printed from a \nameref{block} without a specific -\nameref{return} -statement, there is no difference between using the semicolon or dollar -sign. - -In a group statement, the last value produced is the value returned by the -group statement. Thus, if a semicolon or dollar sign is placed between the -last statement and the ending brackets, the group statement returns the -value 0 or {\em nil}, rather than the value of the last statement. - -\end{Comments} -\end{Command} - -\begin{Command}[percent]{%} -The percent sign is used to precede comments; everything from a percent -to the end of the line is ignored. - -\begin{Examples} - -df(x**3 + y,x);\% This is a comment \key{Return} & 3*X^{2} \\ -int(3*x**2,x) \%This is a comment; \key{Return} \\ - -\explanation{A prompt is given, waiting for the semicolon that was not -detected in the comment} -\end{Examples} - -\begin{Comments} -Statement delimiters \name{;} and \name{\$} are not detected between a -percent sign and the end of the line. -\end{Comments} -\end{Command} - - -% \begin{Operator}[ampersand]{&} -% -% ***** To be added ***** -% -% \end{Operator} -% -% -\begin{Operator}[dot]{.} -\index{list} -The . (dot) infix binary operator adds a new item to the beginning of an -existing \nameref{list}. In high energy physics expressions, -it can also be used -to represent the scalar product of two Lorentz four-vectors. - -\begin{Syntax} -\meta{item} \name{.} \meta{list} -\end{Syntax} - -\meta{item} can be any REDUCE scalar expression, including a list; -\meta{list} must be a \nameref{list} to avoid producing an error message. -The dot operator is right associative. - -\begin{Examples} - -liss := a . \{\}; & LISS := \{A\} \\ -liss := b . liss; & LISS := \{B,A\} \\ -newliss := liss . liss; & NEWLISS := \{\{B,A\},B,A\} \\ -firstlis := a . b . \{c\}; & FIRSTLIS := \{A,B,C\} \\ -secondlis := x . y . \{z\}; & SECONDLIS := \{X,Y,Z\} \\ -for i := 1:3 sum part(firstlis,i)*part(secondlis,i); - & A*X + B*Y + C*Z -\end{Examples} -\end{Operator} - - -\begin{Operator}[assign]{:=} -\index{assign} -The \name{:=} is the assignment operator, assigning the value on the right-hand -side to the identifier or other valid expression on the left-hand side. - -\begin{Syntax} - \meta{restricted\_expression} \name{:=} \meta{expression} -\end{Syntax} - -\meta{restricted\_expression} is ordinarily a single identifier, though simple -expressions may be used (see Comments below). \meta{expression} is any -valid REDUCE expression. If \meta{expression} is a \nameref{matrix} -identifier, then -\meta{restricted\_expression} can be a matrix identifier (redimensioned if -necessary) which has each element set to the corresponding elements -of the identifier on the right-hand side. - -\begin{Examples} -a := x**2 + 1; & A := X^{2} + 1 \\ -a; & X^{2} + 1 \\ -first := second := third; & FIRST := SECOND := THIRD \\ -first; & THIRD \\ -second; & THIRD \\ -b := for i := 1:5 product i; & B := 120 \\ -b; & 120 \\ -w + (c := x + 3) + z; & W + X + Z + 3 \\ -c; & X + 3 \\ -y + b := c; & Y + B := C \\ -y; & - (B - C) -\end{Examples} - -\begin{Comments} -The assignment operator is right associative, as shown in the second and -third examples. A string of such assignments has all but the last -item set to the value of the last item. Embedding an assignment statement -in another expression has the side effect of making the assignment, as well -as causing the given replacement in the expression. - -Assignments of values to expressions rather than simple identifiers (such as in -the last example above) can also be done, subject to the following remarks: -\begin{itemize} - -\item[(i)] -If the left-hand side is an identifier, an operator, or a power, the -substitution rule is added to the rule table. - -\item[(ii)] -If the operators \name{- + /} appear on the left-hand side, all but the first -term of the expression is moved to the right-hand side. - -\item[(iii)] -If the operator \name{*} appears on the left-hand side, any constant terms are -moved to the right-hand side, but the symbolic factors remain. -\end{itemize} - -Assignment is valid for \nameref{array} elements, but not for entire arrays. -The assignment operator can also be used to attach functionality to operators. - -A recursive construction such as \name{a := a + b} is allowed, but when -\name{a} is referenced again, the process of resubstitution continues -until the expression stack overflows (you get an error message). -Recursive assignments can be done safely inside controlled loop -expressions, such as \nameref{for}\ldots or \nameref{repeat}\ldots\name{until}. - -\end{Comments} -\end{Operator} - - -\begin{Operator}[equalsign]{=} -The \name{=} operator is a prefix or infix equality comparison operator. - -\begin{Syntax} - \name{=}\(\meta{expression}\name{,}\meta{expression}\) - or - \meta{expression} \name{=} \meta{expression} -\end{Syntax} - -\meta{expression} can be any REDUCE scalar expression. - -\begin{Examples} -a := 4; & A := 4 \\ -if =(a,10) then write "yes" else write "no"; - & no \\ -b := c; & B := C \\ -if b = c then write "yes" else write "no"; - & yes \\ -on rounded; \\ -if 4.0 = 4 then write "yes" else write "no"; - & yes -\end{Examples} - -\begin{Comments} -This logical equality operator can only be used inside a conditional -statement, such as \nameref{if}\ldots\name{then}\ldots\name{else} -or \nameref{repeat}\ldots\name{until}. In other places the equal -sign establishes an algebraic object of type \nameref{equation}. - -\end{Comments} -\end{Operator} - - -\begin{Operator}[replace]{=>} - -The \name{=>} operator is a binary operator used in \ref{rule} lists to -denote replacements. - -\begin{Examples} -operator f; \\ -let f(x) => x^2; \\ -f(x); & x^{2} -\end{Examples} -\end{Operator} - - -\begin{Operator}[plussign]{+} -The \name{+} operator is a prefix or infix n-ary addition operator. - -\begin{Syntax} -\meta{expression} \{ \name{+}\meta{expression}\}\repeated - -{\em or} \name{+}\(\meta{expression} \{,\meta{expression}\}\repeated\) -\end{Syntax} - -\meta{expression} may be any valid REDUCE expression. - -\begin{Examples} -x**4 + 4*x**2 + 17*x + 1; & X^{4} + 4*X^{2} + 17*X + 1 \\ -14 + 15 + x; & X + 29 \\ -+(1,2,3,4,5); & 15 -\end{Examples} - -\begin{Comments} -\name{+} is also valid as an addition operator for \nameref{matrix} variables -that are of the same dimensions and for \nameref{equation}s. -\end{Comments} -\end{Operator} - - -\begin{Operator}[minussign]{-} -The \name{-} operator is a prefix or infix binary subtraction operator, as well -as the unary minus operator. - -\begin{Syntax} -\meta{expression} \name{-} \meta{expression} -or \name{-}\(\meta{expression},\meta{expression}\) -\end{Syntax} - -\meta{expression} may be any valid REDUCE expression. - -\begin{Examples} -15 - 4; & 11 \\ -x*(-5); & - 5*X \\ -a - b - 15; & A - B - 15 \\ --(a,4); & A - 4 -\end{Examples} - -\begin{Comments} -The subtraction operator is left associative, so that a - b - c is equivalent -to (a - b) - c, as shown in the third example. The subtraction operator is -also valid with \nameref{matrix} expressions of the correct dimensions -and with \nameref{equation}s. -\end{Comments} -\end{Operator} - - -\begin{Operator}[asterisk]{*} -The \name{*} operator is a prefix or infix n-ary multiplication operator. - -\begin{Syntax} -\meta{expression} \{ \name{*} \meta{expression}\}\repeated - - or \name{*}\(\meta{expression} \{,\meta{expression}\}\repeated\) -\end{Syntax} - -\meta{expression} may be any valid REDUCE expression. - -\begin{Examples} -15*3; & 45 \\ -24*x*yvalue*2; & 48*X*YVALUE \\ -*(6,x); & 6*X \\ -on rounded; \\ -3*1.5*x*x*x; & 4.5*X^{3} \\ -off rounded; \\ -2x**2; & 2*X^{2} -\end{Examples} - -\begin{Comments} -REDUCE assumes you are using an implicit multiplication operator when an -identifier is preceded by a number, as shown in the last line above. Since -no valid identifiers can begin with numbers, there is no ambiguity in -making this assumption. - -The multiplication operator is also valid with \nameref{matrix} expressions -of the -proper dimensions: matrices \IFTEX{$A$}{A} and \IFTEX{$B$}{B} -can be multiplied if -\IFTEX{$A$}{A} is \IFTEX{$n \times m$}{n x m} and \IFTEX{$B$}{B} is -\IFTEX{$m \times p$}{m x p}. Matrices and \nameref{equation}s can also be -multiplied by scalars: the -result is as if each element was multiplied by the scalar. -\end{Comments} -\end{Operator} - - -\begin{Operator}[slash]{/} -The \name{/} operator is a prefix or infix binary division operator or -prefix unary \nameref{recip}rocal operator. - -\begin{Syntax} -\meta{expression}\name{/}\meta{expression} {\em or} - \name{/}\meta{expression} - -or \name{/}\(\meta{expression},\meta{expression}\) -\end{Syntax} - -\meta{expression} may be any valid REDUCE expression. - -\begin{Examples} -20/5; & 4 \\ -100/6; & \rfrac{50}{3} \\ -16/2/x; & \rfrac{8}{X} \\ -/b; & \rfrac{1}{B} \\ -/(y,5); & \rfrac{Y}{5} \\ -on rounded; \\ -35/4; & 8.75 \\ -/20; & 0.05 -\end{Examples} - -\begin{Comments} -The division operator is left associative, so that \name{a/b/c} is equivalent -to \name{(a/b)/c}. The division operator is also valid with square -\nameref{matrix} expressions of the same dimensions: With \IFTEX{$A$}{A} and -\IFTEX{$B$}{B} both \IFTEX{$n \times n$}{n x n} matrices and \IFTEX{$B$}{B} -invertible, \IFTEX{$A/B$}{A/B} is -given by \IFTEX{$A \times B^{-1}$}{A*B^{-1}}. -Division of a matrix by a scalar is defined, with the results being the -division of each element of the matrix by the scalar. Division of a -scalar by a matrix is defined if the matrix is invertible, and has the -effect of multiplying the scalar by the inverse of the matrix. When -\name{/} is used as a reciprocal operator for a matrix, the inverse of -the matrix is returned if it exists. -\end{Comments} -\end{Operator} - - -\begin{Operator}[power]{**} -The \name{**} operator is a prefix or infix binary exponentiation operator. - -\begin{Syntax} -\meta{expression} \name{**}\meta{expression} - or \name{**}\(\meta{expression},\meta{expression}\) -\end{Syntax} - -\meta{expression} may be any valid REDUCE expression. - -\begin{Examples} -x**15; & X^{15} \\ -x**y**z; & X^{Y*Z} \\ -x**(y**z); & X^{Y^{Z}} \\ - **(y,4); & Y^{4} \\ -on rounded; \\ -2**pi; & 8.82497782708 -\end{Examples} - -\begin{Comments} -The exponentiation operator is left associative, so that \name{a**b**c} is -equivalent to \name{(a**b)**c}, as shown in the second example. Note -that this is {\em not} \name{a**(b**c)}, which would be right associative. - -When \nameref{nat} is on (the default), REDUCE output produces raised -exponents, as shown. The symbol \name{^}, which is the upper-case 6 on -most keyboards, may be used in the place of \name{**}. - -A square \nameref{matrix} may also be raised to positive and negative powers -with the exponentiation operator (negative powers require the matrix to be -invertible). Scalar expressions and \nameref{equation}s may be raised to -fractional and floating-point powers. -\end{Comments} -\end{Operator} - -\begin{Operator}[caret]{^} -The \name{^} operator is a prefix or infix binary exponentiation operator. -It is equivalent to \nameref{power} or **. - -\begin{Syntax} -\meta{expression} \name{^}\meta{expression} - or \name{^}\(\meta{expression},\meta{expression}\) -\end{Syntax} - -\meta{expression} may be any valid REDUCE expression. - -\begin{Examples} -x^15; & X^{15} \\ -x^y^z; & X^{Y*Z} \\ -x^(y^z); & X^{Y^{Z}} \\ -^(y,4); & Y^{4} \\ -on rounded; \\ -2^pi; & 8.82497782708 -\end{Examples} - -\begin{Comments} -The exponentiation operator is left associative, so that \name{a^b^c} is -equivalent to \name{(a^b)^c}, as shown in the second example. Note -that this is \meta{not} \name{a^(b^c)}, which would be right associative. - -When \nameref{nat} is on (the default), REDUCE output produces raised -exponents, as shown. - -A square \nameref{matrix} may also be raised to positive -and negative powers with -the exponentiation operator (negative powers require the matrix to be -invertible). Scalar expressions and \nameref{equation}s -may be raised to fractional and floating-point powers. -\end{Comments} -\end{Operator} - - - -\begin{Operator}[geqsign]{>=} -\name{>=} is an infix binary comparison operator, which returns {\em true} if -its first argument is greater than or equal to its second argument. - -\begin{Syntax} -\meta{expression} \name{>=} \meta{expression} -\end{Syntax} - -\meta{expression} must evaluate to an integer or floating-point number. - -\begin{Examples} -if (3 >= 2) then yes; & yes \\ -a := 15; & A := 15 \\ -if a >= 20 then big else small; - & small \\ -\end{Examples} - -\begin{Comments} - -The binary comparison operators can only be used for comparisons between -numbers or variables that evaluate to numbers. The truth values returned -by such a comparison can only be used inside programming constructs, such -as \nameref{if}\ldots\name{then}\ldots\name{else} -or \nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}. -\end{Comments} -\end{Operator} - - -\begin{Operator}[greater]{>} -The \name{>} is an infix binary comparison operator that returns -{\em true} if its first argument is strictly greater than its second. - -\begin{Syntax} -\meta{expression} \name{>} \meta{expression} -\end{Syntax} - -\meta{expression} must evaluate to a number, e.g., integer, rational or -floating point number. - -\begin{Examples} -on rounded; \\ -if 3.0 > 3 then write "different" else write "same"; & same \\ -off rounded; \\ -a := 20; & A := 20 \\ -if a > 20 then write "bigger" else write "not bigger"; & not bigger \\ -\end{Examples} - -\begin{Comments} -The binary comparison operators can only be used for comparisons between -numbers or variables that evaluate to numbers. The truth values returned -by such a comparison can only be used inside programming constructs, such -as \nameref{if}\ldots\name{then}\ldots\name{else} or -\nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}. -\end{Comments} -\end{Operator} - - -\begin{Operator}[leqsign]{<=} -\name{<=} is an infix binary comparison operator that returns -{\em true} if its first argument is less than or equal to its second argument. - -\begin{Syntax} -\meta{expression} \name{<=} \meta{expression} -\end{Syntax} - -\meta{expression} must evaluate to a number, e.g., integer, rational or -floating point number. - -\begin{Examples} -a := 10; & A := 10 \\ -if a <= 10 then true; & true -\end{Examples} - -\begin{Comments} - -The binary comparison operators can only be used for comparisons between -numbers or variables that evaluate to numbers. The truth values returned -by such a comparison can only be used inside programming constructs, such -as \nameref{if}\ldots\name{then}\ldots\name{else} or -\nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}. -\end{Comments} -\end{Operator} - - -\begin{Operator}[less]{<} -\name{<} is an infix binary logical comparison operator that -returns {\em true} if its first argument is strictly less than its second -argument. - -\begin{Syntax} -\meta{expression} \name{<} \meta{expression} -\end{Syntax} - -\meta{expression} must evaluate to a number, e.g., integer, rational or -floating point number. - -\begin{Examples} -f := -3; & F := -3 \\ -if f < -3 then write "yes" else write "no"; & no -\end{Examples} - -\begin{Comments} -The binary comparison operators can only be used for comparisons between -numbers or variables that evaluate to numbers. The truth values returned -by such a comparison can only be used inside programming constructs, such -as \nameref{if}\ldots\name{then}\ldots\name{else} -or \nameref{repeat}\ldots\name{until} or -\nameref{while}\ldots\name{do}. -\end{Comments} -\end{Operator} - -\begin{Operator}[tilde]{~} -The \name{~} is used as a unary prefix operator in the left-hand -sides of \nameref{rule}s to mark \nameref{free variable}s. A double tilde -marks an optional \nameref{free variable}. -\end{Operator} - - -\begin{Command}[group]{<<} -The \name{<<}\ldots\name{>>} command is a group statement, -used to group statements -together where REDUCE expects a single statement. - -%%%INCONSISTENT??? \name{or} -\begin{Syntax} -\name{<<}\meta{statement}\{; \meta{statement} \name{or} - \$\meta{statement}\}\optional \name{>>} -\end{Syntax} - -\meta{statement} may be any valid REDUCE statement or expression. - -\begin{Examples} -a := 2; & A := 2 \\ -if a < 5 then <>; & 12 \\ -<>; - & \rfrac{C^{2} + 90*C + 202}{225} -\end{Examples} - -\begin{Comments} -The value returned from a group statement is the value of the last -individual statement executed inside it. Note that when a semicolon is -placed between the last statement and the closing brackets, 0 or -{\em nil} is returned. Group statements are often used in the -consequence portions of \nameref{if}\ldots\name{then}, -\nameref{repeat}\ldots\name{until}, and -\nameref{while}\ldots\name{do} -clauses. They may also be used in interactive -operation to execute several statements at one time. Statements inside -the group statement are separated by semicolons or dollar signs. - -\end{Comments} -\end{Command} - - -\begin{Operator}{AND} -The \name{and} binary logical operator returns {\em true} if both of its -arguments are {\em true}. - -\begin{Syntax} -\meta{logical\_expression} \name{and} \meta{logical\_expression} -\end{Syntax} - -\meta{logical\_expression} must evaluate to {\em true} or {\em nil}. - -\begin{Examples} -a := 12; & A := 12 \\ -if numberp a and a < 15 then write a**2 else write "no"; - & 144 \\ -clear a; \\ -if numberp a and a < 15 then write a**2 else write "no"; - & no -\end{Examples} - -\begin{Comments} -Logical operators can only be used inside conditional statements, such as -\nameref{while}\ldots\name{do} or -\nameref{if}\ldots\name{then}\ldots\name{else}. \name{and} examines each of -its arguments in order, and quits, returning {\em nil}, on finding an -argument that is not {\em true}. An error results if it is used in other -contexts. - -\name{and} is left associative: \name{x and y and z} is equivalent to -\name{(x and y) and z}. -\end{Comments} -\end{Operator} - - -\begin{Command}{BEGIN} -\name{begin} is used to start a \nameref{block} statement, which is closed with -\name{end}. - -\begin{Syntax} -\name{begin} \meta{statement}\{\name{;} \meta{statement}\}\optional \ \name{end} -\end{Syntax} - -\meta{statement} is any valid REDUCE statement. - -\begin{Examples} -begin for i := 1:3 do write i end; & -\begin{multilineoutput}{1cm} -1 -2 -3 -\end{multilineoutput} \\ -begin scalar n;n:=1;b:=for i:=1:4 product(x-i);return n end; - & 1 \\ -b; & - X^{4} - 10*X^{3} + 35*X^{2} - 50*X + 24 -\end{Examples} - -\begin{Comments} -A \name{begin}\ldots\name{end} block can do actions (such as \name{write}), but -does not -return a value unless instructed to by a \nameref{return} statement, which must -be the last statement executed in the block. It is unnecessary to insert -a semicolon before the \name{end}. - -Local variables, if any, are declared in the first statement immediately -after \name{begin}, and may be defined as \name{scalar, integer,} or -\name{real}. \nameref{array} variables declared -within a \name{begin}\ldots\name{end} block -are global in every case, and \nameref{let} statements have global -effects. A \nameref{let} statement involving a formal parameter affects -the calling parameter that corresponds to it. \nameref{let} statements -involving local variables make global assignments, overwriting outside -variables by the same name or creating them if they do not exist. You -can use this feature to affect global variables from procedures, but be -careful that you do not do it inadvertently. - -\end{Comments} -\end{Command} - - -\begin{Command}{block} -A \name{block} is a sequence of statements enclosed by -commands \nameref{begin} and \nameref{end}. - -\begin{Syntax} -\name{begin} \meta{statement}\{\name{;} \meta{statement}\}\optional \ \name{end} -\end{Syntax} -For more details see \nameref{begin}. -\end{Command} - - -\begin{Command}{COMMENT} -Beginning with the word \name{comment}, all text until the next statement -terminator (\name{;} or \name{\$}) is ignored. - -\begin{Examples} - -x := a**2 comment--a is the velocity of the particle;; - & X := A^{2} -\end{Examples} - -\begin{Comments} -Note that the first semicolon ends the comment and the second one -terminates the original REDUCE statement. - -Multiple-line comments are often needed in interactive files. The -\name{comment} command allows a normal-looking text to accompany the -REDUCE statements in the file. -\end{Comments} -\end{Command} - - -\begin{Operator}{CONS} -The \name{cons} operator adds a new element to the beginning of a -\nameref{list}. Its -operation is identical to the symbol \nameref{dot} (dot). It can be used -infix or prefix. - -\begin{Syntax} -\name{cons}\(\meta{item},\meta{list}\) or \meta{item} \name{cons} \meta{list} -\end{Syntax} - -\meta{item} can be any REDUCE scalar expression, including a list; \meta{list} -must be a list. - -\begin{Examples} - -liss := cons(a,{b}); & \{A,B\} \\ - -liss := c cons liss; & \{C,A,B\} \\ - -newliss := for each y in liss collect cons(y,list x); - & NEWLISS := \{\{C,X\},\{A,X\},\{B,X\}\} \\ - -for each y in newliss sum (first y)*(second y); - & X*(A + B + C) -\end{Examples} - -\begin{Comments} -If you want to use \name{cons} to put together two elements into a new list, -you must make the second one into a list with curly brackets or the \name{list} -command. You can also start with an empty list created by \name{\{\}}. - -The \name{cons} operator is right associative: \name{a cons b cons c} is valid -if \name{c} is a list; \name{b} need not be a list. The list produced is -\name{\{a,b,c\}}. - -\end{Comments} -\end{Operator} - - -\begin{Command}{END} -The command \name{end} has two main uses: -\begin{itemize} -\item[(i)] -as the ending of a \nameref{begin}\ldots\name{end} \nameref{block}; and -\item[(ii)] -to end input from a file. -\end{itemize} - -\begin{Comments} -In a \name{begin}\ldots\name{end} \nameref{block}, there need not be a delimiter -(\name{;} or \name{\$}) before the \name{end}, though there must be one -after it, or a right bracket matching an earlier left bracket. - -Files to be read into REDUCE should end with \name{end;}, which must be -preceded by a semicolon (usually the last character of the previous line). -The additional semicolon avoids problems with mistakes in the files. If -you have suspended file operation by answering \name{n} to a \name{pause} -command, you are still, technically speaking, ``in" the file. Use -\name{end} to exit the file. - -An \name{end} at the top level of a program is ignored. -\end{Comments} -\end{Command} - - -\begin{Type}{EQUATION} -\index{equation}\index{equal}\index{arithmetic} -An \name{equation} is an expression where two algebraic expressions -are connected by the (infix) operator \nameref{equal} or by \nameindex{=}. -For access to the components of an \name{equation} the operators -\nameref{lhs}, \nameref{rhs} or \nameref{part} can be used. The -evaluation of the left-hand side of an \name{equation} is controlled -by the switch \nameref{evallhseqp}, while the right-hand side is -evaluated unconditionally. When an \name{equation} is part of a -logical expression, e.g. in a \nameref{if} or \nameref{while} statement, -the equation is evaluated by subtracting both sides can comparing -the result with zero. - -Equations occur in many contexts, e.g. as arguments of the \nameref{sub} -operator and in the arguments and the results -of the operator \nameref{solve}. An equation can be member of a \nameref{list} -and you may assign an equation to a variable. Elementary arithmetic is supported -for equations: if \nameref{evallhseqp} is on, you may add and subtract -equations, and you can combine an equation with a scalar expression by -addition, subtraction, multiplication, division and raise an equation -to a power. -\begin{Examples} -on evallhseqp;\\ -u:=x+y=1$\\ -v:=2x-y=0$\\ -2*u-v; & - 3*y=-2\\ -ws/3; & y=\rfrac{2}{3}\\ -\end{Examples} -Important: the equation must occur in the leftmost term of such an expression. -For other operations, e.g. taking function values of both sides, use the -\nameref{map} operator. - -\end{Type} - -\begin{Operator}{FIRST} -\index{list}\index{decomposition} -The \name{first} operator returns the first element of a \nameref{list}. -\begin{Syntax} -\name{first}\(\meta{list}\) or \name{first} \meta{list} -\end{Syntax} - -\meta{list} must be a non-empty list to avoid an error message. - -\begin{Examples} -alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\ -first alist; & A \\ -blist := \{x,y,\{ww,aa,qq\},z\}; & BLIST := \{X,Y,\{WW,AA,QQ\},Z\} \\ -first third blist; & WW -\end{Examples} -\end{Operator} - - -\begin{Command}{FOR} -\index{loop} -The \name{for} command is used for iterative loops. There are many -possible forms it can take. -\begin{INFO} -{ -\begin{verbatim} - / \ - / |STEP UNTIL| \ - |:=| || -FOR| | : | | - | \ / | - |EACH IN | - \ / - - where ::= DO|PRODUCT|SUM|COLLECT|JOIN. -\end{verbatim} -} -\end{INFO} -\begin{TEX} -\begin{Syntax} - \name{for} - \begin{alternative} - \meta{var} \name{:=} \meta{start} \name{:} \meta{stop}\\ - \meta{var} \name{:=} \meta{start} \name{step} \meta{inc} - \name{until} \meta{stop}\\ - \name{each} \meta{var} \name{in} \meta{list} - \end{alternative} - \begin{alternative} - \name{collect}\\ - \name{do}\\ - \name{join}\\ - \name{product}\\ - \name{sum} - \end{alternative} - \meta{expression} -\end{Syntax} -\end{TEX} - -\meta{var} can be any valid REDUCE identifier except \name{t} or -\name{nil}, \meta{inc}, \meta{start} and \meta{stop} can be any expression -that evaluates to a positive or negative integer. \meta{list} must be a -valid \nameref{list} structure. -The action taken must be one of the actions shown -above, each of which is followed by a single REDUCE expression, statement -or a \nameref{group} (\name{<<}\ldots\name{>>}) or \nameref{block} -(\nameref{begin}\ldots\nameref{end}) statement. - -\begin{Examples} -for i := 1:10 sum i; - & 55 \\ -for a := -2 step 3 until 6 product a; - & -8 \\ -a := 3; & A := 3 \\ -for iter := 4:a do write iter; \\ -m := 0; & M := 0 \\ -for s := 10 step -1 until 3 do <>; \\ -m; & 520 \\ -for each x in {q,r,s} sum x**2; & Q^{2} + R^{2} + S^{2} \\ -for i := 1:4 collect 1/i; - & \{1,\rfrac{1}{2},\rfrac{1}{3},\rfrac{1}{4}\} \\ -for i := 1:3 join list solve(x**2 + i*x + 1,x); - & \begin{multilineoutput}{5cm} -\{\{X= -\rfrac{SQRT(3)*I + 1}{2}, - X= -\rfrac{SQRT(3)*I - 1}{2}\} - \{X=-1\}, - \{X= - \rfrac{SQRT(5) + 3}{2},X=\rfrac{SQRT(5) - 3}{2}\}\} -\end{multilineoutput} -\end{Examples} - -\begin{Comments} -The behavior of each of the five action words follows: - -\begin{TEX} -\begin{center} -\begin{tabular}{|l|p{5cm}|p{5cm}|} -\hline -\multicolumn{3}{|c|}{Action Word Behavior}\\ -\hline -\multicolumn{1}{|c|}{Keyword} & - \multicolumn{1}{c|}{Argument Type} & \multicolumn{1}{c|}{Action} \\ -\hline -do & statement, command, group or block & -Evaluates its argument once for each iteration of the loop, not saving -results \\ -collect & expression, statement, command, group, block, list & -Evaluates its argument once for each iteration of the loop, storing the results -in a list which is returned by the \verb|for| statement when done \\ -join & list or an operator which produces a list & -Evaluates its argument once for each iteration of the loop, appending the -elements in each individual result list onto the overall result list \\ -product & expression, statement, command, -\nameref{group} or \nameref{block} & -Evaluates its argument once for each iteration of the loop, multiplying the -results together and returning the overall product \\ -sum & expression, statement, command, group or block & -Evaluates its argument once for each iteration of the loop, adding the results -together and returning the overall sum\\ -\hline -\end{tabular} -\end{center} -\end{TEX} -\begin{INFO} -{\begin{verbatim} - Action Word Behavior -Keyword Argument Type Action - do statement, command, group Evaluates its argument once - or block for each iteration of the loop, - not saving results -collect expression, statement, Evaluates its argument once for - command, group, block, list each iteration of the loop, - storing the results in a list - which is returned by the for - statement when done - join list or an operator which Evaluates its argument once for - produces a list each iteration of the loop, - appending the elements in each - individual result list onto the - overall result list -product expression, statement, Evaluates its argument once for - command, group or block each iteration of the loop, - multiplying the results together - and returning the overall product - sum expression, statement, Evaluates its argument once for - command, group or block each iteration of the loop, - adding the results together and - returning the overall sum -\end{verbatim} } -\end{INFO} - -For number-driven \name{for} statements, if the ending limit is smaller -than the beginning limit (larger in the case of negative steps) the action -statement is not executed at all. The iterative variable is local to the -\name{for} statement, and does not affect the value of an identifier with -the same name. For list-driven \name{for} statements, if the list is -empty, the action statement is not executed, but no error occurs. - -You can use nested \name{for} statements, with the inner \name{for} -statement after the action keyword. You must make sure that your inner -statement returns an expression that the outer statement can handle. -\end{Comments} -\end{Command} - - -\begin{Command}{FOREACH} -\index{loop} -\name{foreach} is a synonym for the \name{for each} variant of the -\nameref{for} construct. It is designed to iterate down a list, and an -error will occur if a list is not used. The use of \name{for each} is -preferred to \name{foreach}. - -\begin{Syntax} -\name{foreach} \meta{variable} in \meta{list} \meta{action} \meta{expression} \\ - where \meta{action} ::= \name{do | product | sum | collect | join} -\end{Syntax} - -\begin{Examples} -foreach x in {q,r,s} sum x**2; & Q^{2} + R^{2} + S^{2} -\end{Examples} - -\end{Command} - - -\begin{Operator}{GEQ} -The \name{geq} operator is a binary infix or prefix logical operator. It -returns true if its first argument is greater than or equal to its second -argument. As an infix operator it is identical with \name{>=}. -\begin{Syntax} -\name{geq}\(\meta{expression},\meta{expression}\) or \meta{expression} -\name{geq} \meta{expression} -\end{Syntax} - -\meta{expression} can be any valid REDUCE expression that evaluates to a -number. - -\begin{Examples} -a := 20; & A := 20 \\ -if geq(a,25) then write "big" else write "small"; - & small \\ -if a geq 20 then write "big" else write "small"; - & big \\ -if (a geq 18) then write "big" else write "small"; - & big -\end{Examples} - -\begin{Comments} -Logical operators can only be used in conditional statements such as \\ -\nameref{if}\ldots\name{then}\ldots\name{else} or -\nameref{repeat}\ldots\name{until}. -\end{Comments} -\end{Operator} - - -\begin{Command}{GOTO} -Inside a \name{begin}\ldots\name{end} \nameref{block}, \name{goto}, or -preferably, \name{go to}, transfers flow of control to a labeled statement. -\begin{Syntax} -\name{go to} \meta{labeled_statement} or \name{goto} \meta{labeled_statement} -\end{Syntax} -\meta{labeled_statement} is of the form \meta{label} \name{:}\meta{statement} - -\begin{Examples} -\begin{multilineinput} - procedure dumb(a); - begin scalar q; - go to lab; - q := df(a**2 - sin(a),a); - write q; - lab: return a - end; -\end{multilineinput} & DUMB \\ - -dumb(17); & 17 -\end{Examples} - -\begin{Comments} -\name{go to} can only be used inside a \name{begin}\ldots\name{end} -\nameref{block}, and inside -the block only statements at the top level can be labeled, not ones inside -\name{<<}\ldots\name{>>}, \nameref{while}\ldots\name{do}, etc. -\end{Comments} -\end{Command} - - -\begin{Operator}{GREATERP} -The \name{greaterp} logical operator returns true if its first argument is -strictly greater than its second argument. As an infix operator it is -identical with \name{>}. -\begin{Syntax} -\name{greaterp}\(\meta{expression},\meta{expression}\) or \meta{expression} -\name{greaterp} \meta{expression} -\end{Syntax} - -\meta{expression} can be any valid REDUCE expression that evaluates to a -number. - -\begin{Examples} - -a := 20; & A := 20 \\ -if greaterp(a,25) then write "big" else write "small"; - & small \\ -if a greaterp 20 then write "big" else write "small"; - & small \\ -if (a greaterp 18) then write "big" else write "small"; - & big -\end{Examples} - -\begin{Comments} -Logical operators can only be used in conditional statements such as \\ -\nameref{if}\ldots\name{then}\ldots\name{else} -or \nameref{repeat}\ldots\nameref{while}. -\end{Comments} -\end{Operator} - - -\begin{Command}{IF} -The \name{if} command is a conditional statement that executes a statement -if a condition is true, and optionally another statement if it is not. -\begin{Syntax} -\name{if} \meta{condition} \name{then} \meta{statement} -\ \&option\(\name{else}\ \meta{statement}\) -\end{Syntax} - -\meta{condition} must be a logical or comparison operator that evaluates to -a \nameref{boolean value}. -\meta{statement} must be a single REDUCE statement or a -\nameref{group} (\name{<<}\ldots\name{>>}) or -\nameref{block} (\name{begin}\ldots\name{end}) statement. - -\begin{Examples} -if x = 5 then a := b+c else a := d+f; - & D + F \\ -x := 9; & X := 9 \\ -if numberp x and x<20 then y := sqrt(x) else write "illegal"; - & 3 \\ -clear x; \\ -if numberp x and x<20 then y := sqrt(x) else write "illegal"; - & illegal \\ -x := 12; & X := 12 \\ -a := if x < 5 then 100 else 150; - & A := 150 \\ -b := u**(if x < 10 then 2); - & B := 1 \\ -bb := u**(if x > 10 then 2); - & BB := U^{2} -\end{Examples} - -\begin{Comments} -An \name{if} statement may be used inside an assignment statement and sets -its value depending on the conditions, or used anywhere else an -expression would be valid, as shown in the last example. If there is no -\nameindex{else} clause, the value is 0 if a number is expected, and nothing -otherwise. - -The \name{else} clause may be left out if no action is to be taken if the -condition is false. - -The condition may be a compound conditional statement using \nameref{and} or -\nameref{or}. If a non-conditional statement, such as a constant, is used by -accident, it is assumed to have value {\em true}. - -Be sure to use \nameref{group} or \nameref{block} statements after -\nameindex{then} or \name{else}. - -The \name{if} operator is right associative. The following constructions are -examples: -\begin{itemize} -\item[(1)] -\begin{Syntax} -\name{if} \meta{condition} \name{then} \name{if} \meta{condition} \name{then} - \meta{action} \name{else} \meta{action} -\end{Syntax} -%\end{itemize} - -which is equivalent to -\begin{Syntax} -\name{if} \meta{condition} \name{then} \(\name{if}\ \meta{condition} -\ \name{then}\ \meta{action}\ \name{else}\ \meta{action}\); -\end{Syntax} -%\begin{itemize} - -\item[(2)] -\begin{Syntax} -\name{if} \meta{condition} \name{then} \meta{action} \name{else if} - \meta{condition} \name{then} \meta{action} \name{else} \meta{action} -\end{Syntax} -which is equivalent to -\begin{Syntax} -\name{if}\ \meta{condition} \name{then} \meta{action} \name{else} \\ - \(\name{if}\ \meta{condition}\ \name{then}\ \meta{action} -\ \name{else}\ \meta{action}\). -\end{Syntax} -\end{itemize} -\end{Comments} -\end{Command} - - -\begin{Operator}{LIST} -\index{list} -The \name{list} operator constructs a list from its arguments. -\begin{Syntax} -\name{list}\(\meta{item} \{,\meta{item}\}\optional\) or - \name{list}\(\) to construct an empty list. -\end{Syntax} - -\meta{item} can be any REDUCE scalar expression, including another list. -Left and right curly brackets can also be used instead of the operator -\name{list} to construct a list. - -\begin{Examples} -liss := list(c,b,c,\{xx,yy\},3x**2+7x+3,df(sin(2*x),x)); - & LISS := \{C,B,C,\{XX,YY\},3*X^{2} + 7*X + 3,2*COS(2*X)\} \\ -length liss; & 6 \\ -liss := \{c,b,c,\{xx,yy\},3x**2+7x+3,df(sin(2*x),x)\}; - & LISS := \{C,B,C,\{XX,YY\},3*X^{2} + 7*X + 3,2*COS(2*X)\} \\ -emptylis := list(); & EMPTYLIS := \{\} \\ -a . emptylis; & \{A\} -\end{Examples} - -\begin{Comments} -Lists are ordered, hierarchical structures. The elements stay where you -put them, and only change position in the list if you specifically change -them. Lists can have nested sublists to any (reasonable) level. The -\nameref{part} operator can be used to access elements anywhere within a list -hierarchy. The \nameref{length} operator counts the -number of top-level elements -of its list argument; elements that are themselves lists still only -count as one element. -\end{Comments} -\end{Operator} - - -\begin{Operator}{OR} -The \name{or} binary logical operator returns {\it true} if either one or -both of its arguments is {\it true}. -\begin{Syntax} -\meta{logical expression} \name{or} \meta{logical expression} -\end{Syntax} - -\meta{logical expression} must evaluate to {\it true} or {\it nil}. - -\begin{Examples} -a := 10; & A := 10 \\ -\begin{multilineinput} -if a<0 or a>140 then write "not a valid human age" else - write "age = ",a; -\end{multilineinput} \\ -& age = 10 \\ -a := 200; & A := 200 \\ -if a < 0 or a > 140 then write "not a valid human age"; - & not a valid human age -\end{Examples} - -\begin{Comments} -The \name{or} operator is left associative: \name{x or y or z} is equivalent to -\name{(x or y)} \name{or z}. - -Logical operators can only be used in conditional expressions, such as \\ -\nameref{if}\ldots\name{then}\ldots\name{else} -and \nameref{while}\ldots\name{do}. -\name{or} evaluates its arguments in order and quits, returning {\it true}, -on finding the first {\it true} statement. -\end{Comments} -\end{Operator} - - -\begin{Command}{PROCEDURE} -The \name{procedure} command allows you to define a mathematical operation as a -function with arguments. -\begin{Syntax} -\&\meta{option} \name{procedure} \meta{identifier} - \(\meta{arg}\{,\meta{arg}\}\repeated\)\name{;}\meta{body} -\end{Syntax} - -The \meta{option} may be \nameref{algebraic} or \nameref{symbolic}, -indicating the -mode under which the procedure is executed, or \nameref{real} or -\nameref{integer}, indicating the type of answer expected. The default is -algebraic. Real or integer procedures are subtypes of algebraic -procedures; type-checking is done on the results of integer procedures, but -not on real procedures (in the current REDUCE release). \meta{identifier} -may be any valid REDUCE identifier that is not already a procedure name, -operator, \nameref{array} or \nameref{matrix}. -\meta{arg} is a formal parameter that may be any -valid REDUCE identifier. \meta{body} is a single statement (a \nameref{group} -or \nameref{block} statement may be used) with the desired activities in it. - -\begin{Examples} -\begin{multilineinput} -procedure fac(n); - if not (fixp(n) and n>=0) - then rederr "Choose nonneg. integer only" - else for i := 0:n-1 product i+1; -\end{multilineinput} - & FAC \\ -fac(0); & 1 \\ -fac(5); & 120 \\ -fac(-5); & ***** choose nonneg. integer only -\end{Examples} - -\begin{Comments} -Procedures are automatically declared as operators upon definition. When -REDUCE has parsed the procedure definition and successfully converted it to -a form for its own use, it prints the name of the procedure. Procedure -definitions cannot be nested. Procedures can call other procedures, or can -recursively call themselves. Procedure identifiers can be cleared as you -would clear an operator. Unlike \nameref{let} statements, new definitions -under the same procedure name replace the previous definitions completely. - -Be careful not to use the name of a system operator for your own procedure. -REDUCE may or may not give you a warning message. If you redefine a system -operator in your own procedure, the original function of the system operator -is lost for the remainder of the REDUCE session. - -Procedures may have none, one, or more than one parameter. A REDUCE -parameter is a formal parameter only; the use of {\it x} as a parameter in -a \name{procedure} definition has no connection with a value of {\it x} in -the REDUCE session, and the results of calling a procedure have no effect -on the value of {\it x}. If a procedure is {\it called} with {\it x} as a -parameter, the current value of {\it x} is used as specified in the -computation, but is not changed outside the procedure. -Making an assignment statement by \name{:=} with a -formal parameter on the left-hand side only changes the value of the -calling parameter within the procedure. - -Using a \nameref{let} statement inside a procedure always changes the value -globally: a \name{let} with a formal parameter makes the change to the calling -parameter. \name{let} statements cannot be made on local variables inside -\nameref{begin}\ldots\name{end} \nameref{block}\name{s}. -When \nameref{clear} statements are used on formal -parameters, the calling variables associated with them are cleared globally too. -The use of \name{let} or \name{clear} statements inside procedures -should be done with extreme caution. - -Arrays and operators may be used as parameters to procedures. The body of the -procedure can contain statements that appropriately manipulate these -arguments. Changes are made to values of the calling arrays or operators. -Simple expressions can also be used as arguments, in the place of scalar -variables. Matrices may {\it not} be used as arguments to procedures. - -A procedure that has no parameters is called by the procedure name, -immediately followed by empty parentheses. The empty parentheses may be left -out when writing a procedure with no parameters, but must appear in a call of -the procedure. If this is a nuisance to you, use a \nameref{let} statement on -the name of the procedure (i.e., \name{let noargs = noargs()}) after which -you can call the procedure by just its name. - -Procedures that have a single argument can leave out the parentheses around -it both in the definition and procedure call. (You can use the parentheses if -you wish.) Procedures with more than one argument must use parentheses, with -the arguments separated by commas. - -Procedures often have a \name{begin}\ldots\name{end} block in them. Inside the -block, local variables are declared using \name{scalar}, \name{real} or -\name{integer} declarations. -The declarations must be made immediately after the word -\name{begin}, and if more than one type of declaration is made, they are -separated by semicolons. REDUCE currently does no type checking on local -variables; \name{real} and \name{integer} are treated just like \name{scalar}. -Actions take place as specified in the statements inside the block statement. -Any identifiers that are not formal parameters or local variables are treated -as global variables, and activities involving these identifiers are global in -effect. - -If a return value is desired from a procedure call, a specific -\nameref{return} command must be the last statement executed before exiting -from the procedure. If no \name{return} is used, a procedure returns a -zero or no value. - -Procedures are often written in a file using an editor, then the file -is input using the command \nameref{in}. This method allows easy changes in -development, and also allows you to load the named procedures whenever -you like, by loading the files that contain them. -\end{Comments} -\end{Command} - - -\begin{Command}{REPEAT} -\index{loop} -The \nameref{repeat} command causes repeated execution of a statement -\nameindex{until} -the given condition is found to be true. The statement is always executed -at least once. -\begin{Syntax} -\name{repeat} \meta{statement} \name{until} \meta{condition} -\end{Syntax} - -\meta{statement} can be a single statement, \nameref{group} statement, or -a \name{begin}\ldots\name{end} \nameref{block}. \meta{condition} must be -a logical operator that evaluates to {\it true} or {\it nil}. - -\begin{Examples} -<> until m = 0>>; - & \begin{multilineoutput}{6cm} -400*X -300*X -200*X -100*X -\end{multilineoutput}\\ - -<> until m <= 0>>; - & -1 - -\end{Examples} -\begin{Comments} -\name{repeat} must always be followed by an \name{until} with a condition. -Be careful not to generate an infinite loop with a condition that is never -true. In the second example, if the condition had been \name{m = 0}, it -would never have been true since \name{m} already had value -2 when the -condition was first evaluated. -\end{Comments} -\end{Command} - - -\begin{Operator}{REST} -\index{list}\index{decomposition} -The \name{rest} operator returns a \nameref{list} containing all but the first -element of the list it is given. -\begin{Syntax} -\name{rest}\(\meta{list}\) or \name{rest} \meta{list} - - -\end{Syntax} -\meta{list} must be a non-empty list, but need not have more than one element. - -\begin{Examples} -alist := {a,b,c,d}; & ALIST := \{A,B,C,D\}; \\ -rest alist; & \{B,C,D\} \\ -blist := {x,y,{aa,bb,cc},z}; & BLIST := \{X,Y,\{AA,BB,CC\},Z\} \\ -second rest blist; & \{AA,BB,CC\} \\ -clist := {c}; & CLIST := C \\ -rest clist; & \{\} -\end{Examples} - -\end{Operator} - - -\begin{Command}{RETURN} -The \name{return} command causes a value to be returned from inside a -\name{begin}\ldots\name{end} \nameref{block}. -\begin{TEX} -\begin{Syntax} -\name{begin} \meta{statements} \name{return} \meta{\&option(expression)} - \name{end} -\end{Syntax} -\end{TEX} -\begin{INFO} -{\begin{Syntax} -\name{begin} \meta{statements} \name{return} \meta{(expression)} - \name{end} -\end{Syntax} -}\end{INFO} - -\meta{statements} can be any valid REDUCE statements. The value of -\meta{expression} is returned. - -\begin{Examples} -begin write "yes"; return a end; & -\begin{multilineoutput}{5cm} -yes -A -\end{multilineoutput}\\ -\begin{multilineinput} -procedure dumb(a); - begin if numberp(a) then return a else return 10 end; -\end{multilineinput} - & DUMB \\ -dumb(x); & 10 \\ -dumb(-5); & -5 \\ -\begin{multilineinput} -procedure dumb2(a); - begin c := a**2 + 2*a + 1; d := 17; c*d; return end; -\end{multilineinput} & DUMB2 \\ -dumb2(4); \\ -c; & 25 \\ -d; & 17 -\end{Examples} - -\begin{Comments} -Note in \name{dumb2} above that the assignments were made as requested, but -the product \name{c*d} cannot be accessed. Changing the procedure to read -\name{return c*d} would remedy this problem. - -The \name{return} statement is always the last statement executed before -leaving the block. If \name{return} has no argument, the block is exited but -no value is returned. A block statement does not need a \name{return} ; -the statements inside terminate in their normal fashion without one. -In that case no value is returned, although the specified actions inside the -block take place. - -The \name{return} command can be used inside \name{<<}\ldots\name{>>} -\nameref{group} statements and -\nameref{if}\ldots\name{then}\ldots\name{else} commands that -are inside \name{begin}\ldots\name{end} \nameref{block}s. -It is not valid in these constructions that are not inside -a \name{begin}\ldots\name{end} - block. It is not valid inside \nameref{for}, -\nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do} - loops in any construction. To force early termination from loops, the -\name{go to}(\nameref{goto}) command must be used. -When you use nested block statements, a -\name{return} from an inner block exits returning a value to the next-outermost -block, rather than all the way to the outside. -\end{Comments} -\end{Command} - - -\begin{Operator}{REVERSE} -\index{list} -The \name{reverse} operator returns a \nameref{list} that is the reverse of the -list it is given. -\begin{Syntax} -\name{reverse}\(\meta{list}\) or \name{reverse} \meta{list} -\end{Syntax} - -\meta{list} must be a \nameref{list}. - -\begin{Examples} -aa := \{c,b,a,\{x**2,z**3\},y\}; & AA := \{C,B,A,\{X^{2},Z^{3}\},Y\} \\ -reverse aa; & \{Y,\{X^{2},Z^{3}\},A,B,C\} \\ -reverse(q . reverse aa); & \{C,B,A,\{X^{2},Z^{3}\},Y,Q\} -\end{Examples} - -\begin{Comments} -\name{reverse} and \nameref{cons} can be used together to add a new element to -the end of a list (\name{.} adds its new element to the beginning). The -\name{reverse} operator uses a noticeable amount of system resources, -especially if the list is long. If you are doing much heavy-duty list -manipulation, you should probably design your algorithms to avoid much -reversing of lists. A moderate amount of list reversing is no problem. -\end{Comments} -\end{Operator} - - -\begin{Type}{RULE} -\index{rule}\index{rule list} -A \name{rule} is an instruction to replace an algebraic expression -or a part of an expression by another one. -\begin{Syntax} -\meta{lhs} => \meta{rhs} or -\meta{lhs} => \meta{rhs} \name{when} \meta{cond} -\end{Syntax} -\meta{lhs} is an algebraic expression used as search pattern and -\meta{rhs} is an algebraic expression which replaces matches of -\meta{rhs}. \name{=>} is the operator \nameref{replace}. - -\meta{lhs} can contain \nameref{free variable}s which are -symbols preceded by a tilde \nameindex{~} in their leftmost position -in \meta{lhs}. -A double tilde marks an \nameref{optional free variable}. -If a rule has a \name{when} \meta{cond} -part it will fire only if the evaluation of \meta{cond} has a -result \nameref{true}. \meta{cond} may contain references to -free variables of \meta{lhs}. - -Rules can be collected in a \nameref{list} which then forms a -\nameindex{rule list}. \name{Rule lists} can be used to collect -algebraic knowledge for a specific evaluation context. - -\name{Rules} and \name{rule lists} are globally activated and -deactivated by \nameref{let}, \nameref{forall}, \nameref{clearrules}. -For a single evaluation they can be locally activate by \nameref{where}. -The active rules for an operator can be visualized by \nameref{showrules}. - -\begin{Examples} -operator f,g,h; \\ -let f(x) => x^2; \\ -f(x); & x^{2}\\ -g_rules:={g(~n,~x)=>h(n/2,x) when evenp n,\\ -g(~n,~x)=>h((1-n)/2,x) when not evenp n}$\\ -let g_rules;\\ -g(3,x); & h(-1,x) -\end{Examples} - -\end{Type} - -\begin{Type}{Free Variable} -\index{variable} -A variable preceded by a tilde is considered as \name{free variable} -and stands for an arbitrary part in an algebraic form during -pattern matching. Free variables occur in the left-hand sides -of \nameref{rule}s, in the side relations for \nameref{compact} -and in the first arguments of \nameref{map} and \nameref{select} -calls. See \nameref{rule} for examples. - -In rules also \nameref{optional free variable}s may occur. -\end{Type} - -\begin{Type}{Optional Free Variable} -\index{variable} -A variable preceded by a double tilde is considered as -\name{optional free variable} -and stands for an arbitrary part part in an algebraic form during -pattern matching. In contrast to ordinary \nameref{free variable}s -an operator pattern with an \name{optional free variable} -matches also if the operand for the variable is missing. In such -a case the variable is bound to a neutral value. -Optional free variables can be used as - - term in a sum: set to 0 if missing, - - factor in a product: set to 1 if missing, - - exponent: set to 1 if missing - -\begin{Examples} - sin(~~u + ~~n * pi) => sin(u) when evenp u; -\end{Examples} - -Optional free variables are allowed only in the left-hand sides -of \nameref{rule}s. -\end{Type} - -\begin{Operator}{SECOND} -\index{list}\index{decomposition} -The \name{second} operator returns the second element of a list. -\begin{Syntax} -\name{second}\(\meta{list}\) or \name{second} \meta{list} - - -\end{Syntax} - -\meta{list} must be a list with at least two elements, to avoid an error -message. - -\begin{Examples} -alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\ -second alist; & B \\ -blist := \{x,\{aa,bb,cc\},z\}; & BLIST := \{X,\{AA,BB,CC\},Z\} \\ -second second blist; & BB -\end{Examples} -\end{Operator} - - -\begin{Operator}{SET} -\index{assign} -The \name{set} operator is used for assignments when you want both sides of -the assignment statement to be evaluated. -%%% INCONSISTENT??? hyphen after restricted -\begin{Syntax} -\name{set}\(\meta{restricted\_expression},\meta{expression}\) -\end{Syntax} - -\meta{expression} can be any REDUCE expression; \meta{restricted\_expression} -must be an identifier or an expression that evaluates to an identifier. - -\begin{Examples} -a := y; & A := Y \\ -set(a,sin(x^2)); & SIN(X^{2}) \\ -a; & SIN(X^{2}) \\ -y; & SIN(X^{2}) \\ -a := b + c; & A := B + C \\ -set(a-c,z); & Z \\ -b; & Z -\end{Examples} - -\begin{Comments} -Using an \nameref{array} or \nameref{matrix} reference as the first -argument to \name{set} has -the result of setting the {\it contents} of the designated element to -\name{set}'s second argument. You should be careful to avoid unwanted -side effects when you use this facility. -\end{Comments} -\end{Operator} - - -\begin{Operator}{SETQ} -\index{assign} -The \name{setq} operator is an infix or prefix binary assignment operator. -It is identical to \name{:=}. -\begin{Syntax} -\name{setq}\(\meta{restricted\_expression},\meta{expression}\) or \\ -\meta{restricted\_expression} \name{setq} \meta{expression} -\end{Syntax} - -\meta{restricted expression} is ordinarily a single identifier, though -simple expressions may be used (see Comments below). \meta{expression} can -be any valid REDUCE expression. If \meta{expression} is a \nameref{matrix} -identifier, then \meta{restricted\_expression} can be a matrix identifier -(redimensioned if necessary), which has each element set to the -corresponding elements of the identifier on the right-hand side. - -\begin{Examples} -setq(b,6); & B := 6 \\ -c setq sin(x); & C := SIN(X) \\ -w + setq(c,x+3) + z; & W + X + Z + 3 \\ -c; & X + 3 \\ -setq(a1 + a2,25); & A1 + A2 := 25 \\ -a1; & - (A2 - 25) -\end{Examples} -\begin{Comments} -Embedding a \name{setq} statement in an expression has the side effect of making -the assignment, as shown in the third example above. - -Assignments are generally done for identifiers, but may be done for simple -expressions as well, subject to the following remarks: -\begin{itemize} - -\item[(i)] -If the left-hand side is an identifier, an operator, or a power, the rule -is added to the rule table. - -\item[(ii)] -If the operators \name{- + /} appear on the left-hand side, all but the first -term of the expression is moved to the right-hand side. - -\item[(iii)] -If the operator \name{*} appears on the left-hand side, any constant terms are -moved to the right-hand side, but the symbolic factors remain. -\end{itemize} - -Be careful not to make a recursive \name{setq} assignment that is not -controlled inside a loop statement. The process of resubstitution -continues until you get a stack overflow message. \name{setq} can be used -to attach functionality to operators, as the \name{:=} does. -\end{Comments} -\end{Operator} - - -\begin{Operator}{THIRD} -\index{list}\index{decomposition} -The \name{third} operator returns the third item of a \nameref{list}. -\begin{Syntax} -\name{third}\(\meta{list}\) or \name{third} \meta{list} - -\end{Syntax} - - -\meta{list} must be a list containing at least three items to avoid an error -message. - -\begin{Examples} -alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\ -third alist; & C \\ -blist := \{x,\{aa,bb,cc\},y,z\}; & BLIST := \{X,\{AA,BB,CC\},Y,Z\}; \\ -third second blist; & CC \\ -third blist; & Y -\end{Examples} - -\end{Operator} - -\begin{Operator}{WHEN} -\index{rule} -The \name{when} operator is used inside a \name{rule} to make the -execution of the rule depend on a boolean condition which is -evaluated at execution time. For the use see \nameref{rule}. -\end{Operator} - +\section{Syntax} + +\begin{Command}[semicolon]{;} +The semicolon is a statement delimiter, indicating results are to be printed +when used in interactive mode. + +\begin{Examples} +(x+1)**2; & X^{2} + 2*X + 1 \\ +df(x**2 + 1,x); & 2*X +\end{Examples} + +\begin{Comments} +Entering a \key{Return} without a semicolon or dollar sign results in a +prompt on the following line. A semicolon or dollar sign can be +added at this point to execute the statement. In interactive mode, a +statement that is ended with a semicolon and \key{Return} has its results +printed on the screen. + +Inside a group statement \name{<<}\ldots\name{>>} +or a \name{begin}\ldots\name{end} block, a +semicolon or dollar sign separates individual REDUCE statements. Since +results are not printed from a block without a specific \name{return} +statement, there is no difference between using the semicolon or dollar +sign. In a group statement, the last value produced is the value +returned by the group statement. Thus, if a semicolon or dollar sign is +placed between the last statement and the ending brackets, the group +statement returns the value 0 or {\em nil}, rather than the value of the +last statement. +\end{Comments} +\end{Command} + + +\begin{Command}[dollar]{$} +The dollar sign is a statement delimiter, indicating results are not to be +printed when used in interactive mode. + +\begin{Examples} + +(x+1)**2$ & +\explanationo{The workspace is set to $x^{2} + 2x + 1$ + but nothing shows on the screen} \\ +ws; & X^{2} + 2*X + 1 +\end{Examples} + +\begin{Comments} +Entering a \key{Return} without a semicolon or dollar sign results in a +prompt on the following line. A semicolon or dollar sign can +be added at this point to execute the statement. In interactive mode, a +statement that ends with a dollar sign \name{\$} and a \key{Return} is +executed, but the results not printed. + +Inside a \nameref{group} statement \name{<<}\ldots\name{>>} +or a \name{begin}\ldots\name{end} \nameref{block}, a +semicolon or dollar sign separates individual REDUCE statements. Since +results are not printed from a \nameref{block} without a specific +\nameref{return} +statement, there is no difference between using the semicolon or dollar +sign. + +In a group statement, the last value produced is the value returned by the +group statement. Thus, if a semicolon or dollar sign is placed between the +last statement and the ending brackets, the group statement returns the +value 0 or {\em nil}, rather than the value of the last statement. + +\end{Comments} +\end{Command} + +\begin{Command}[percent]{%} +The percent sign is used to precede comments; everything from a percent +to the end of the line is ignored. + +\begin{Examples} + +df(x**3 + y,x);\% This is a comment \key{Return} & 3*X^{2} \\ +int(3*x**2,x) \%This is a comment; \key{Return} \\ + +\explanation{A prompt is given, waiting for the semicolon that was not +detected in the comment} +\end{Examples} + +\begin{Comments} +Statement delimiters \name{;} and \name{\$} are not detected between a +percent sign and the end of the line. +\end{Comments} +\end{Command} + + +% \begin{Operator}[ampersand]{&} +% +% ***** To be added ***** +% +% \end{Operator} +% +% +\begin{Operator}[dot]{.} +\index{list} +The . (dot) infix binary operator adds a new item to the beginning of an +existing \nameref{list}. In high energy physics expressions, +it can also be used +to represent the scalar product of two Lorentz four-vectors. + +\begin{Syntax} +\meta{item} \name{.} \meta{list} +\end{Syntax} + +\meta{item} can be any REDUCE scalar expression, including a list; +\meta{list} must be a \nameref{list} to avoid producing an error message. +The dot operator is right associative. + +\begin{Examples} + +liss := a . \{\}; & LISS := \{A\} \\ +liss := b . liss; & LISS := \{B,A\} \\ +newliss := liss . liss; & NEWLISS := \{\{B,A\},B,A\} \\ +firstlis := a . b . \{c\}; & FIRSTLIS := \{A,B,C\} \\ +secondlis := x . y . \{z\}; & SECONDLIS := \{X,Y,Z\} \\ +for i := 1:3 sum part(firstlis,i)*part(secondlis,i); + & A*X + B*Y + C*Z +\end{Examples} +\end{Operator} + + +\begin{Operator}[assign]{:=} +\index{assign} +The \name{:=} is the assignment operator, assigning the value on the right-hand +side to the identifier or other valid expression on the left-hand side. + +\begin{Syntax} + \meta{restricted\_expression} \name{:=} \meta{expression} +\end{Syntax} + +\meta{restricted\_expression} is ordinarily a single identifier, though simple +expressions may be used (see Comments below). \meta{expression} is any +valid REDUCE expression. If \meta{expression} is a \nameref{matrix} +identifier, then +\meta{restricted\_expression} can be a matrix identifier (redimensioned if +necessary) which has each element set to the corresponding elements +of the identifier on the right-hand side. + +\begin{Examples} +a := x**2 + 1; & A := X^{2} + 1 \\ +a; & X^{2} + 1 \\ +first := second := third; & FIRST := SECOND := THIRD \\ +first; & THIRD \\ +second; & THIRD \\ +b := for i := 1:5 product i; & B := 120 \\ +b; & 120 \\ +w + (c := x + 3) + z; & W + X + Z + 3 \\ +c; & X + 3 \\ +y + b := c; & Y + B := C \\ +y; & - (B - C) +\end{Examples} + +\begin{Comments} +The assignment operator is right associative, as shown in the second and +third examples. A string of such assignments has all but the last +item set to the value of the last item. Embedding an assignment statement +in another expression has the side effect of making the assignment, as well +as causing the given replacement in the expression. + +Assignments of values to expressions rather than simple identifiers (such as in +the last example above) can also be done, subject to the following remarks: +\begin{itemize} + +\item[(i)] +If the left-hand side is an identifier, an operator, or a power, the +substitution rule is added to the rule table. + +\item[(ii)] +If the operators \name{- + /} appear on the left-hand side, all but the first +term of the expression is moved to the right-hand side. + +\item[(iii)] +If the operator \name{*} appears on the left-hand side, any constant terms are +moved to the right-hand side, but the symbolic factors remain. +\end{itemize} + +Assignment is valid for \nameref{array} elements, but not for entire arrays. +The assignment operator can also be used to attach functionality to operators. + +A recursive construction such as \name{a := a + b} is allowed, but when +\name{a} is referenced again, the process of resubstitution continues +until the expression stack overflows (you get an error message). +Recursive assignments can be done safely inside controlled loop +expressions, such as \nameref{for}\ldots or \nameref{repeat}\ldots\name{until}. + +\end{Comments} +\end{Operator} + + +\begin{Operator}[equalsign]{=} +The \name{=} operator is a prefix or infix equality comparison operator. + +\begin{Syntax} + \name{=}\(\meta{expression}\name{,}\meta{expression}\) + or + \meta{expression} \name{=} \meta{expression} +\end{Syntax} + +\meta{expression} can be any REDUCE scalar expression. + +\begin{Examples} +a := 4; & A := 4 \\ +if =(a,10) then write "yes" else write "no"; + & no \\ +b := c; & B := C \\ +if b = c then write "yes" else write "no"; + & yes \\ +on rounded; \\ +if 4.0 = 4 then write "yes" else write "no"; + & yes +\end{Examples} + +\begin{Comments} +This logical equality operator can only be used inside a conditional +statement, such as \nameref{if}\ldots\name{then}\ldots\name{else} +or \nameref{repeat}\ldots\name{until}. In other places the equal +sign establishes an algebraic object of type \nameref{equation}. + +\end{Comments} +\end{Operator} + + +\begin{Operator}[replace]{=>} + +The \name{=>} operator is a binary operator used in \ref{rule} lists to +denote replacements. + +\begin{Examples} +operator f; \\ +let f(x) => x^2; \\ +f(x); & x^{2} +\end{Examples} +\end{Operator} + + +\begin{Operator}[plussign]{+} +The \name{+} operator is a prefix or infix n-ary addition operator. + +\begin{Syntax} +\meta{expression} \{ \name{+}\meta{expression}\}\repeated + +{\em or} \name{+}\(\meta{expression} \{,\meta{expression}\}\repeated\) +\end{Syntax} + +\meta{expression} may be any valid REDUCE expression. + +\begin{Examples} +x**4 + 4*x**2 + 17*x + 1; & X^{4} + 4*X^{2} + 17*X + 1 \\ +14 + 15 + x; & X + 29 \\ ++(1,2,3,4,5); & 15 +\end{Examples} + +\begin{Comments} +\name{+} is also valid as an addition operator for \nameref{matrix} variables +that are of the same dimensions and for \nameref{equation}s. +\end{Comments} +\end{Operator} + + +\begin{Operator}[minussign]{-} +The \name{-} operator is a prefix or infix binary subtraction operator, as well +as the unary minus operator. + +\begin{Syntax} +\meta{expression} \name{-} \meta{expression} +or \name{-}\(\meta{expression},\meta{expression}\) +\end{Syntax} + +\meta{expression} may be any valid REDUCE expression. + +\begin{Examples} +15 - 4; & 11 \\ +x*(-5); & - 5*X \\ +a - b - 15; & A - B - 15 \\ +-(a,4); & A - 4 +\end{Examples} + +\begin{Comments} +The subtraction operator is left associative, so that a - b - c is equivalent +to (a - b) - c, as shown in the third example. The subtraction operator is +also valid with \nameref{matrix} expressions of the correct dimensions +and with \nameref{equation}s. +\end{Comments} +\end{Operator} + + +\begin{Operator}[asterisk]{*} +The \name{*} operator is a prefix or infix n-ary multiplication operator. + +\begin{Syntax} +\meta{expression} \{ \name{*} \meta{expression}\}\repeated + + or \name{*}\(\meta{expression} \{,\meta{expression}\}\repeated\) +\end{Syntax} + +\meta{expression} may be any valid REDUCE expression. + +\begin{Examples} +15*3; & 45 \\ +24*x*yvalue*2; & 48*X*YVALUE \\ +*(6,x); & 6*X \\ +on rounded; \\ +3*1.5*x*x*x; & 4.5*X^{3} \\ +off rounded; \\ +2x**2; & 2*X^{2} +\end{Examples} + +\begin{Comments} +REDUCE assumes you are using an implicit multiplication operator when an +identifier is preceded by a number, as shown in the last line above. Since +no valid identifiers can begin with numbers, there is no ambiguity in +making this assumption. + +The multiplication operator is also valid with \nameref{matrix} expressions +of the +proper dimensions: matrices \IFTEX{$A$}{A} and \IFTEX{$B$}{B} +can be multiplied if +\IFTEX{$A$}{A} is \IFTEX{$n \times m$}{n x m} and \IFTEX{$B$}{B} is +\IFTEX{$m \times p$}{m x p}. Matrices and \nameref{equation}s can also be +multiplied by scalars: the +result is as if each element was multiplied by the scalar. +\end{Comments} +\end{Operator} + + +\begin{Operator}[slash]{/} +The \name{/} operator is a prefix or infix binary division operator or +prefix unary \nameref{recip}rocal operator. + +\begin{Syntax} +\meta{expression}\name{/}\meta{expression} {\em or} + \name{/}\meta{expression} + +or \name{/}\(\meta{expression},\meta{expression}\) +\end{Syntax} + +\meta{expression} may be any valid REDUCE expression. + +\begin{Examples} +20/5; & 4 \\ +100/6; & \rfrac{50}{3} \\ +16/2/x; & \rfrac{8}{X} \\ +/b; & \rfrac{1}{B} \\ +/(y,5); & \rfrac{Y}{5} \\ +on rounded; \\ +35/4; & 8.75 \\ +/20; & 0.05 +\end{Examples} + +\begin{Comments} +The division operator is left associative, so that \name{a/b/c} is equivalent +to \name{(a/b)/c}. The division operator is also valid with square +\nameref{matrix} expressions of the same dimensions: With \IFTEX{$A$}{A} and +\IFTEX{$B$}{B} both \IFTEX{$n \times n$}{n x n} matrices and \IFTEX{$B$}{B} +invertible, \IFTEX{$A/B$}{A/B} is +given by \IFTEX{$A \times B^{-1}$}{A*B^{-1}}. +Division of a matrix by a scalar is defined, with the results being the +division of each element of the matrix by the scalar. Division of a +scalar by a matrix is defined if the matrix is invertible, and has the +effect of multiplying the scalar by the inverse of the matrix. When +\name{/} is used as a reciprocal operator for a matrix, the inverse of +the matrix is returned if it exists. +\end{Comments} +\end{Operator} + + +\begin{Operator}[power]{**} +The \name{**} operator is a prefix or infix binary exponentiation operator. + +\begin{Syntax} +\meta{expression} \name{**}\meta{expression} + or \name{**}\(\meta{expression},\meta{expression}\) +\end{Syntax} + +\meta{expression} may be any valid REDUCE expression. + +\begin{Examples} +x**15; & X^{15} \\ +x**y**z; & X^{Y*Z} \\ +x**(y**z); & X^{Y^{Z}} \\ + **(y,4); & Y^{4} \\ +on rounded; \\ +2**pi; & 8.82497782708 +\end{Examples} + +\begin{Comments} +The exponentiation operator is left associative, so that \name{a**b**c} is +equivalent to \name{(a**b)**c}, as shown in the second example. Note +that this is {\em not} \name{a**(b**c)}, which would be right associative. + +When \nameref{nat} is on (the default), REDUCE output produces raised +exponents, as shown. The symbol \name{^}, which is the upper-case 6 on +most keyboards, may be used in the place of \name{**}. + +A square \nameref{matrix} may also be raised to positive and negative powers +with the exponentiation operator (negative powers require the matrix to be +invertible). Scalar expressions and \nameref{equation}s may be raised to +fractional and floating-point powers. +\end{Comments} +\end{Operator} + +\begin{Operator}[caret]{^} +The \name{^} operator is a prefix or infix binary exponentiation operator. +It is equivalent to \nameref{power} or **. + +\begin{Syntax} +\meta{expression} \name{^}\meta{expression} + or \name{^}\(\meta{expression},\meta{expression}\) +\end{Syntax} + +\meta{expression} may be any valid REDUCE expression. + +\begin{Examples} +x^15; & X^{15} \\ +x^y^z; & X^{Y*Z} \\ +x^(y^z); & X^{Y^{Z}} \\ +^(y,4); & Y^{4} \\ +on rounded; \\ +2^pi; & 8.82497782708 +\end{Examples} + +\begin{Comments} +The exponentiation operator is left associative, so that \name{a^b^c} is +equivalent to \name{(a^b)^c}, as shown in the second example. Note +that this is \meta{not} \name{a^(b^c)}, which would be right associative. + +When \nameref{nat} is on (the default), REDUCE output produces raised +exponents, as shown. + +A square \nameref{matrix} may also be raised to positive +and negative powers with +the exponentiation operator (negative powers require the matrix to be +invertible). Scalar expressions and \nameref{equation}s +may be raised to fractional and floating-point powers. +\end{Comments} +\end{Operator} + + + +\begin{Operator}[geqsign]{>=} +\name{>=} is an infix binary comparison operator, which returns {\em true} if +its first argument is greater than or equal to its second argument. + +\begin{Syntax} +\meta{expression} \name{>=} \meta{expression} +\end{Syntax} + +\meta{expression} must evaluate to an integer or floating-point number. + +\begin{Examples} +if (3 >= 2) then yes; & yes \\ +a := 15; & A := 15 \\ +if a >= 20 then big else small; + & small \\ +\end{Examples} + +\begin{Comments} + +The binary comparison operators can only be used for comparisons between +numbers or variables that evaluate to numbers. The truth values returned +by such a comparison can only be used inside programming constructs, such +as \nameref{if}\ldots\name{then}\ldots\name{else} +or \nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}. +\end{Comments} +\end{Operator} + + +\begin{Operator}[greater]{>} +The \name{>} is an infix binary comparison operator that returns +{\em true} if its first argument is strictly greater than its second. + +\begin{Syntax} +\meta{expression} \name{>} \meta{expression} +\end{Syntax} + +\meta{expression} must evaluate to a number, e.g., integer, rational or +floating point number. + +\begin{Examples} +on rounded; \\ +if 3.0 > 3 then write "different" else write "same"; & same \\ +off rounded; \\ +a := 20; & A := 20 \\ +if a > 20 then write "bigger" else write "not bigger"; & not bigger \\ +\end{Examples} + +\begin{Comments} +The binary comparison operators can only be used for comparisons between +numbers or variables that evaluate to numbers. The truth values returned +by such a comparison can only be used inside programming constructs, such +as \nameref{if}\ldots\name{then}\ldots\name{else} or +\nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}. +\end{Comments} +\end{Operator} + + +\begin{Operator}[leqsign]{<=} +\name{<=} is an infix binary comparison operator that returns +{\em true} if its first argument is less than or equal to its second argument. + +\begin{Syntax} +\meta{expression} \name{<=} \meta{expression} +\end{Syntax} + +\meta{expression} must evaluate to a number, e.g., integer, rational or +floating point number. + +\begin{Examples} +a := 10; & A := 10 \\ +if a <= 10 then true; & true +\end{Examples} + +\begin{Comments} + +The binary comparison operators can only be used for comparisons between +numbers or variables that evaluate to numbers. The truth values returned +by such a comparison can only be used inside programming constructs, such +as \nameref{if}\ldots\name{then}\ldots\name{else} or +\nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}. +\end{Comments} +\end{Operator} + + +\begin{Operator}[less]{<} +\name{<} is an infix binary logical comparison operator that +returns {\em true} if its first argument is strictly less than its second +argument. + +\begin{Syntax} +\meta{expression} \name{<} \meta{expression} +\end{Syntax} + +\meta{expression} must evaluate to a number, e.g., integer, rational or +floating point number. + +\begin{Examples} +f := -3; & F := -3 \\ +if f < -3 then write "yes" else write "no"; & no +\end{Examples} + +\begin{Comments} +The binary comparison operators can only be used for comparisons between +numbers or variables that evaluate to numbers. The truth values returned +by such a comparison can only be used inside programming constructs, such +as \nameref{if}\ldots\name{then}\ldots\name{else} +or \nameref{repeat}\ldots\name{until} or +\nameref{while}\ldots\name{do}. +\end{Comments} +\end{Operator} + +\begin{Operator}[tilde]{~} +The \name{~} is used as a unary prefix operator in the left-hand +sides of \nameref{rule}s to mark \nameref{free variable}s. A double tilde +marks an optional \nameref{free variable}. +\end{Operator} + + +\begin{Command}[group]{<<} +The \name{<<}\ldots\name{>>} command is a group statement, +used to group statements +together where REDUCE expects a single statement. + +%%%INCONSISTENT??? \name{or} +\begin{Syntax} +\name{<<}\meta{statement}\{; \meta{statement} \name{or} + \$\meta{statement}\}\optional \name{>>} +\end{Syntax} + +\meta{statement} may be any valid REDUCE statement or expression. + +\begin{Examples} +a := 2; & A := 2 \\ +if a < 5 then <>; & 12 \\ +<>; + & \rfrac{C^{2} + 90*C + 202}{225} +\end{Examples} + +\begin{Comments} +The value returned from a group statement is the value of the last +individual statement executed inside it. Note that when a semicolon is +placed between the last statement and the closing brackets, 0 or +{\em nil} is returned. Group statements are often used in the +consequence portions of \nameref{if}\ldots\name{then}, +\nameref{repeat}\ldots\name{until}, and +\nameref{while}\ldots\name{do} +clauses. They may also be used in interactive +operation to execute several statements at one time. Statements inside +the group statement are separated by semicolons or dollar signs. + +\end{Comments} +\end{Command} + + +\begin{Operator}{AND} +The \name{and} binary logical operator returns {\em true} if both of its +arguments are {\em true}. + +\begin{Syntax} +\meta{logical\_expression} \name{and} \meta{logical\_expression} +\end{Syntax} + +\meta{logical\_expression} must evaluate to {\em true} or {\em nil}. + +\begin{Examples} +a := 12; & A := 12 \\ +if numberp a and a < 15 then write a**2 else write "no"; + & 144 \\ +clear a; \\ +if numberp a and a < 15 then write a**2 else write "no"; + & no +\end{Examples} + +\begin{Comments} +Logical operators can only be used inside conditional statements, such as +\nameref{while}\ldots\name{do} or +\nameref{if}\ldots\name{then}\ldots\name{else}. \name{and} examines each of +its arguments in order, and quits, returning {\em nil}, on finding an +argument that is not {\em true}. An error results if it is used in other +contexts. + +\name{and} is left associative: \name{x and y and z} is equivalent to +\name{(x and y) and z}. +\end{Comments} +\end{Operator} + + +\begin{Command}{BEGIN} +\name{begin} is used to start a \nameref{block} statement, which is closed with +\name{end}. + +\begin{Syntax} +\name{begin} \meta{statement}\{\name{;} \meta{statement}\}\optional \ \name{end} +\end{Syntax} + +\meta{statement} is any valid REDUCE statement. + +\begin{Examples} +begin for i := 1:3 do write i end; & +\begin{multilineoutput}{1cm} +1 +2 +3 +\end{multilineoutput} \\ +begin scalar n;n:=1;b:=for i:=1:4 product(x-i);return n end; + & 1 \\ +b; & + X^{4} - 10*X^{3} + 35*X^{2} - 50*X + 24 +\end{Examples} + +\begin{Comments} +A \name{begin}\ldots\name{end} block can do actions (such as \name{write}), but +does not +return a value unless instructed to by a \nameref{return} statement, which must +be the last statement executed in the block. It is unnecessary to insert +a semicolon before the \name{end}. + +Local variables, if any, are declared in the first statement immediately +after \name{begin}, and may be defined as \name{scalar, integer,} or +\name{real}. \nameref{array} variables declared +within a \name{begin}\ldots\name{end} block +are global in every case, and \nameref{let} statements have global +effects. A \nameref{let} statement involving a formal parameter affects +the calling parameter that corresponds to it. \nameref{let} statements +involving local variables make global assignments, overwriting outside +variables by the same name or creating them if they do not exist. You +can use this feature to affect global variables from procedures, but be +careful that you do not do it inadvertently. + +\end{Comments} +\end{Command} + + +\begin{Command}{block} +A \name{block} is a sequence of statements enclosed by +commands \nameref{begin} and \nameref{end}. + +\begin{Syntax} +\name{begin} \meta{statement}\{\name{;} \meta{statement}\}\optional \ \name{end} +\end{Syntax} +For more details see \nameref{begin}. +\end{Command} + + +\begin{Command}{COMMENT} +Beginning with the word \name{comment}, all text until the next statement +terminator (\name{;} or \name{\$}) is ignored. + +\begin{Examples} + +x := a**2 comment--a is the velocity of the particle;; + & X := A^{2} +\end{Examples} + +\begin{Comments} +Note that the first semicolon ends the comment and the second one +terminates the original REDUCE statement. + +Multiple-line comments are often needed in interactive files. The +\name{comment} command allows a normal-looking text to accompany the +REDUCE statements in the file. +\end{Comments} +\end{Command} + + +\begin{Operator}{CONS} +The \name{cons} operator adds a new element to the beginning of a +\nameref{list}. Its +operation is identical to the symbol \nameref{dot} (dot). It can be used +infix or prefix. + +\begin{Syntax} +\name{cons}\(\meta{item},\meta{list}\) or \meta{item} \name{cons} \meta{list} +\end{Syntax} + +\meta{item} can be any REDUCE scalar expression, including a list; \meta{list} +must be a list. + +\begin{Examples} + +liss := cons(a,{b}); & \{A,B\} \\ + +liss := c cons liss; & \{C,A,B\} \\ + +newliss := for each y in liss collect cons(y,list x); + & NEWLISS := \{\{C,X\},\{A,X\},\{B,X\}\} \\ + +for each y in newliss sum (first y)*(second y); + & X*(A + B + C) +\end{Examples} + +\begin{Comments} +If you want to use \name{cons} to put together two elements into a new list, +you must make the second one into a list with curly brackets or the \name{list} +command. You can also start with an empty list created by \name{\{\}}. + +The \name{cons} operator is right associative: \name{a cons b cons c} is valid +if \name{c} is a list; \name{b} need not be a list. The list produced is +\name{\{a,b,c\}}. + +\end{Comments} +\end{Operator} + + +\begin{Command}{END} +The command \name{end} has two main uses: +\begin{itemize} +\item[(i)] +as the ending of a \nameref{begin}\ldots\name{end} \nameref{block}; and +\item[(ii)] +to end input from a file. +\end{itemize} + +\begin{Comments} +In a \name{begin}\ldots\name{end} \nameref{block}, there need not be a delimiter +(\name{;} or \name{\$}) before the \name{end}, though there must be one +after it, or a right bracket matching an earlier left bracket. + +Files to be read into REDUCE should end with \name{end;}, which must be +preceded by a semicolon (usually the last character of the previous line). +The additional semicolon avoids problems with mistakes in the files. If +you have suspended file operation by answering \name{n} to a \name{pause} +command, you are still, technically speaking, ``in" the file. Use +\name{end} to exit the file. + +An \name{end} at the top level of a program is ignored. +\end{Comments} +\end{Command} + + +\begin{Type}{EQUATION} +\index{equation}\index{equal}\index{arithmetic} +An \name{equation} is an expression where two algebraic expressions +are connected by the (infix) operator \nameref{equal} or by \nameindex{=}. +For access to the components of an \name{equation} the operators +\nameref{lhs}, \nameref{rhs} or \nameref{part} can be used. The +evaluation of the left-hand side of an \name{equation} is controlled +by the switch \nameref{evallhseqp}, while the right-hand side is +evaluated unconditionally. When an \name{equation} is part of a +logical expression, e.g. in a \nameref{if} or \nameref{while} statement, +the equation is evaluated by subtracting both sides can comparing +the result with zero. + +Equations occur in many contexts, e.g. as arguments of the \nameref{sub} +operator and in the arguments and the results +of the operator \nameref{solve}. An equation can be member of a \nameref{list} +and you may assign an equation to a variable. Elementary arithmetic is supported +for equations: if \nameref{evallhseqp} is on, you may add and subtract +equations, and you can combine an equation with a scalar expression by +addition, subtraction, multiplication, division and raise an equation +to a power. +\begin{Examples} +on evallhseqp;\\ +u:=x+y=1$\\ +v:=2x-y=0$\\ +2*u-v; & - 3*y=-2\\ +ws/3; & y=\rfrac{2}{3}\\ +\end{Examples} +Important: the equation must occur in the leftmost term of such an expression. +For other operations, e.g. taking function values of both sides, use the +\nameref{map} operator. + +\end{Type} + +\begin{Operator}{FIRST} +\index{list}\index{decomposition} +The \name{first} operator returns the first element of a \nameref{list}. +\begin{Syntax} +\name{first}\(\meta{list}\) or \name{first} \meta{list} +\end{Syntax} + +\meta{list} must be a non-empty list to avoid an error message. + +\begin{Examples} +alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\ +first alist; & A \\ +blist := \{x,y,\{ww,aa,qq\},z\}; & BLIST := \{X,Y,\{WW,AA,QQ\},Z\} \\ +first third blist; & WW +\end{Examples} +\end{Operator} + + +\begin{Command}{FOR} +\index{loop} +The \name{for} command is used for iterative loops. There are many +possible forms it can take. +\begin{INFO} +{ +\begin{verbatim} + / \ + / |STEP UNTIL| \ + |:=| || +FOR| | : | | + | \ / | + |EACH IN | + \ / + + where ::= DO|PRODUCT|SUM|COLLECT|JOIN. +\end{verbatim} +} +\end{INFO} +\begin{TEX} +\begin{Syntax} + \name{for} + \begin{alternative} + \meta{var} \name{:=} \meta{start} \name{:} \meta{stop}\\ + \meta{var} \name{:=} \meta{start} \name{step} \meta{inc} + \name{until} \meta{stop}\\ + \name{each} \meta{var} \name{in} \meta{list} + \end{alternative} + \begin{alternative} + \name{collect}\\ + \name{do}\\ + \name{join}\\ + \name{product}\\ + \name{sum} + \end{alternative} + \meta{expression} +\end{Syntax} +\end{TEX} + +\meta{var} can be any valid REDUCE identifier except \name{t} or +\name{nil}, \meta{inc}, \meta{start} and \meta{stop} can be any expression +that evaluates to a positive or negative integer. \meta{list} must be a +valid \nameref{list} structure. +The action taken must be one of the actions shown +above, each of which is followed by a single REDUCE expression, statement +or a \nameref{group} (\name{<<}\ldots\name{>>}) or \nameref{block} +(\nameref{begin}\ldots\nameref{end}) statement. + +\begin{Examples} +for i := 1:10 sum i; + & 55 \\ +for a := -2 step 3 until 6 product a; + & -8 \\ +a := 3; & A := 3 \\ +for iter := 4:a do write iter; \\ +m := 0; & M := 0 \\ +for s := 10 step -1 until 3 do <>; \\ +m; & 520 \\ +for each x in {q,r,s} sum x**2; & Q^{2} + R^{2} + S^{2} \\ +for i := 1:4 collect 1/i; + & \{1,\rfrac{1}{2},\rfrac{1}{3},\rfrac{1}{4}\} \\ +for i := 1:3 join list solve(x**2 + i*x + 1,x); + & \begin{multilineoutput}{5cm} +\{\{X= -\rfrac{SQRT(3)*I + 1}{2}, + X= -\rfrac{SQRT(3)*I - 1}{2}\} + \{X=-1\}, + \{X= - \rfrac{SQRT(5) + 3}{2},X=\rfrac{SQRT(5) - 3}{2}\}\} +\end{multilineoutput} +\end{Examples} + +\begin{Comments} +The behavior of each of the five action words follows: + +\begin{TEX} +\begin{center} +\begin{tabular}{|l|p{5cm}|p{5cm}|} +\hline +\multicolumn{3}{|c|}{Action Word Behavior}\\ +\hline +\multicolumn{1}{|c|}{Keyword} & + \multicolumn{1}{c|}{Argument Type} & \multicolumn{1}{c|}{Action} \\ +\hline +do & statement, command, group or block & +Evaluates its argument once for each iteration of the loop, not saving +results \\ +collect & expression, statement, command, group, block, list & +Evaluates its argument once for each iteration of the loop, storing the results +in a list which is returned by the \verb|for| statement when done \\ +join & list or an operator which produces a list & +Evaluates its argument once for each iteration of the loop, appending the +elements in each individual result list onto the overall result list \\ +product & expression, statement, command, +\nameref{group} or \nameref{block} & +Evaluates its argument once for each iteration of the loop, multiplying the +results together and returning the overall product \\ +sum & expression, statement, command, group or block & +Evaluates its argument once for each iteration of the loop, adding the results +together and returning the overall sum\\ +\hline +\end{tabular} +\end{center} +\end{TEX} +\begin{INFO} +{\begin{verbatim} + Action Word Behavior +Keyword Argument Type Action + do statement, command, group Evaluates its argument once + or block for each iteration of the loop, + not saving results +collect expression, statement, Evaluates its argument once for + command, group, block, list each iteration of the loop, + storing the results in a list + which is returned by the for + statement when done + join list or an operator which Evaluates its argument once for + produces a list each iteration of the loop, + appending the elements in each + individual result list onto the + overall result list +product expression, statement, Evaluates its argument once for + command, group or block each iteration of the loop, + multiplying the results together + and returning the overall product + sum expression, statement, Evaluates its argument once for + command, group or block each iteration of the loop, + adding the results together and + returning the overall sum +\end{verbatim} } +\end{INFO} + +For number-driven \name{for} statements, if the ending limit is smaller +than the beginning limit (larger in the case of negative steps) the action +statement is not executed at all. The iterative variable is local to the +\name{for} statement, and does not affect the value of an identifier with +the same name. For list-driven \name{for} statements, if the list is +empty, the action statement is not executed, but no error occurs. + +You can use nested \name{for} statements, with the inner \name{for} +statement after the action keyword. You must make sure that your inner +statement returns an expression that the outer statement can handle. +\end{Comments} +\end{Command} + + +\begin{Command}{FOREACH} +\index{loop} +\name{foreach} is a synonym for the \name{for each} variant of the +\nameref{for} construct. It is designed to iterate down a list, and an +error will occur if a list is not used. The use of \name{for each} is +preferred to \name{foreach}. + +\begin{Syntax} +\name{foreach} \meta{variable} in \meta{list} \meta{action} \meta{expression} \\ + where \meta{action} ::= \name{do | product | sum | collect | join} +\end{Syntax} + +\begin{Examples} +foreach x in {q,r,s} sum x**2; & Q^{2} + R^{2} + S^{2} +\end{Examples} + +\end{Command} + + +\begin{Operator}{GEQ} +The \name{geq} operator is a binary infix or prefix logical operator. It +returns true if its first argument is greater than or equal to its second +argument. As an infix operator it is identical with \name{>=}. +\begin{Syntax} +\name{geq}\(\meta{expression},\meta{expression}\) or \meta{expression} +\name{geq} \meta{expression} +\end{Syntax} + +\meta{expression} can be any valid REDUCE expression that evaluates to a +number. + +\begin{Examples} +a := 20; & A := 20 \\ +if geq(a,25) then write "big" else write "small"; + & small \\ +if a geq 20 then write "big" else write "small"; + & big \\ +if (a geq 18) then write "big" else write "small"; + & big +\end{Examples} + +\begin{Comments} +Logical operators can only be used in conditional statements such as \\ +\nameref{if}\ldots\name{then}\ldots\name{else} or +\nameref{repeat}\ldots\name{until}. +\end{Comments} +\end{Operator} + + +\begin{Command}{GOTO} +Inside a \name{begin}\ldots\name{end} \nameref{block}, \name{goto}, or +preferably, \name{go to}, transfers flow of control to a labeled statement. +\begin{Syntax} +\name{go to} \meta{labeled_statement} or \name{goto} \meta{labeled_statement} +\end{Syntax} +\meta{labeled_statement} is of the form \meta{label} \name{:}\meta{statement} + +\begin{Examples} +\begin{multilineinput} + procedure dumb(a); + begin scalar q; + go to lab; + q := df(a**2 - sin(a),a); + write q; + lab: return a + end; +\end{multilineinput} & DUMB \\ + +dumb(17); & 17 +\end{Examples} + +\begin{Comments} +\name{go to} can only be used inside a \name{begin}\ldots\name{end} +\nameref{block}, and inside +the block only statements at the top level can be labeled, not ones inside +\name{<<}\ldots\name{>>}, \nameref{while}\ldots\name{do}, etc. +\end{Comments} +\end{Command} + + +\begin{Operator}{GREATERP} +The \name{greaterp} logical operator returns true if its first argument is +strictly greater than its second argument. As an infix operator it is +identical with \name{>}. +\begin{Syntax} +\name{greaterp}\(\meta{expression},\meta{expression}\) or \meta{expression} +\name{greaterp} \meta{expression} +\end{Syntax} + +\meta{expression} can be any valid REDUCE expression that evaluates to a +number. + +\begin{Examples} + +a := 20; & A := 20 \\ +if greaterp(a,25) then write "big" else write "small"; + & small \\ +if a greaterp 20 then write "big" else write "small"; + & small \\ +if (a greaterp 18) then write "big" else write "small"; + & big +\end{Examples} + +\begin{Comments} +Logical operators can only be used in conditional statements such as \\ +\nameref{if}\ldots\name{then}\ldots\name{else} +or \nameref{repeat}\ldots\nameref{while}. +\end{Comments} +\end{Operator} + + +\begin{Command}{IF} +The \name{if} command is a conditional statement that executes a statement +if a condition is true, and optionally another statement if it is not. +\begin{Syntax} +\name{if} \meta{condition} \name{then} \meta{statement} +\ \&option\(\name{else}\ \meta{statement}\) +\end{Syntax} + +\meta{condition} must be a logical or comparison operator that evaluates to +a \nameref{boolean value}. +\meta{statement} must be a single REDUCE statement or a +\nameref{group} (\name{<<}\ldots\name{>>}) or +\nameref{block} (\name{begin}\ldots\name{end}) statement. + +\begin{Examples} +if x = 5 then a := b+c else a := d+f; + & D + F \\ +x := 9; & X := 9 \\ +if numberp x and x<20 then y := sqrt(x) else write "illegal"; + & 3 \\ +clear x; \\ +if numberp x and x<20 then y := sqrt(x) else write "illegal"; + & illegal \\ +x := 12; & X := 12 \\ +a := if x < 5 then 100 else 150; + & A := 150 \\ +b := u**(if x < 10 then 2); + & B := 1 \\ +bb := u**(if x > 10 then 2); + & BB := U^{2} +\end{Examples} + +\begin{Comments} +An \name{if} statement may be used inside an assignment statement and sets +its value depending on the conditions, or used anywhere else an +expression would be valid, as shown in the last example. If there is no +\nameindex{else} clause, the value is 0 if a number is expected, and nothing +otherwise. + +The \name{else} clause may be left out if no action is to be taken if the +condition is false. + +The condition may be a compound conditional statement using \nameref{and} or +\nameref{or}. If a non-conditional statement, such as a constant, is used by +accident, it is assumed to have value {\em true}. + +Be sure to use \nameref{group} or \nameref{block} statements after +\nameindex{then} or \name{else}. + +The \name{if} operator is right associative. The following constructions are +examples: +\begin{itemize} +\item[(1)] +\begin{Syntax} +\name{if} \meta{condition} \name{then} \name{if} \meta{condition} \name{then} + \meta{action} \name{else} \meta{action} +\end{Syntax} +%\end{itemize} + +which is equivalent to +\begin{Syntax} +\name{if} \meta{condition} \name{then} \(\name{if}\ \meta{condition} +\ \name{then}\ \meta{action}\ \name{else}\ \meta{action}\); +\end{Syntax} +%\begin{itemize} + +\item[(2)] +\begin{Syntax} +\name{if} \meta{condition} \name{then} \meta{action} \name{else if} + \meta{condition} \name{then} \meta{action} \name{else} \meta{action} +\end{Syntax} +which is equivalent to +\begin{Syntax} +\name{if}\ \meta{condition} \name{then} \meta{action} \name{else} \\ + \(\name{if}\ \meta{condition}\ \name{then}\ \meta{action} +\ \name{else}\ \meta{action}\). +\end{Syntax} +\end{itemize} +\end{Comments} +\end{Command} + + +\begin{Operator}{LIST} +\index{list} +The \name{list} operator constructs a list from its arguments. +\begin{Syntax} +\name{list}\(\meta{item} \{,\meta{item}\}\optional\) or + \name{list}\(\) to construct an empty list. +\end{Syntax} + +\meta{item} can be any REDUCE scalar expression, including another list. +Left and right curly brackets can also be used instead of the operator +\name{list} to construct a list. + +\begin{Examples} +liss := list(c,b,c,\{xx,yy\},3x**2+7x+3,df(sin(2*x),x)); + & LISS := \{C,B,C,\{XX,YY\},3*X^{2} + 7*X + 3,2*COS(2*X)\} \\ +length liss; & 6 \\ +liss := \{c,b,c,\{xx,yy\},3x**2+7x+3,df(sin(2*x),x)\}; + & LISS := \{C,B,C,\{XX,YY\},3*X^{2} + 7*X + 3,2*COS(2*X)\} \\ +emptylis := list(); & EMPTYLIS := \{\} \\ +a . emptylis; & \{A\} +\end{Examples} + +\begin{Comments} +Lists are ordered, hierarchical structures. The elements stay where you +put them, and only change position in the list if you specifically change +them. Lists can have nested sublists to any (reasonable) level. The +\nameref{part} operator can be used to access elements anywhere within a list +hierarchy. The \nameref{length} operator counts the +number of top-level elements +of its list argument; elements that are themselves lists still only +count as one element. +\end{Comments} +\end{Operator} + + +\begin{Operator}{OR} +The \name{or} binary logical operator returns {\it true} if either one or +both of its arguments is {\it true}. +\begin{Syntax} +\meta{logical expression} \name{or} \meta{logical expression} +\end{Syntax} + +\meta{logical expression} must evaluate to {\it true} or {\it nil}. + +\begin{Examples} +a := 10; & A := 10 \\ +\begin{multilineinput} +if a<0 or a>140 then write "not a valid human age" else + write "age = ",a; +\end{multilineinput} \\ +& age = 10 \\ +a := 200; & A := 200 \\ +if a < 0 or a > 140 then write "not a valid human age"; + & not a valid human age +\end{Examples} + +\begin{Comments} +The \name{or} operator is left associative: \name{x or y or z} is equivalent to +\name{(x or y)} \name{or z}. + +Logical operators can only be used in conditional expressions, such as \\ +\nameref{if}\ldots\name{then}\ldots\name{else} +and \nameref{while}\ldots\name{do}. +\name{or} evaluates its arguments in order and quits, returning {\it true}, +on finding the first {\it true} statement. +\end{Comments} +\end{Operator} + + +\begin{Command}{PROCEDURE} +The \name{procedure} command allows you to define a mathematical operation as a +function with arguments. +\begin{Syntax} +\&\meta{option} \name{procedure} \meta{identifier} + \(\meta{arg}\{,\meta{arg}\}\repeated\)\name{;}\meta{body} +\end{Syntax} + +The \meta{option} may be \nameref{algebraic} or \nameref{symbolic}, +indicating the +mode under which the procedure is executed, or \nameref{real} or +\nameref{integer}, indicating the type of answer expected. The default is +algebraic. Real or integer procedures are subtypes of algebraic +procedures; type-checking is done on the results of integer procedures, but +not on real procedures (in the current REDUCE release). \meta{identifier} +may be any valid REDUCE identifier that is not already a procedure name, +operator, \nameref{array} or \nameref{matrix}. +\meta{arg} is a formal parameter that may be any +valid REDUCE identifier. \meta{body} is a single statement (a \nameref{group} +or \nameref{block} statement may be used) with the desired activities in it. + +\begin{Examples} +\begin{multilineinput} +procedure fac(n); + if not (fixp(n) and n>=0) + then rederr "Choose nonneg. integer only" + else for i := 0:n-1 product i+1; +\end{multilineinput} + & FAC \\ +fac(0); & 1 \\ +fac(5); & 120 \\ +fac(-5); & ***** choose nonneg. integer only +\end{Examples} + +\begin{Comments} +Procedures are automatically declared as operators upon definition. When +REDUCE has parsed the procedure definition and successfully converted it to +a form for its own use, it prints the name of the procedure. Procedure +definitions cannot be nested. Procedures can call other procedures, or can +recursively call themselves. Procedure identifiers can be cleared as you +would clear an operator. Unlike \nameref{let} statements, new definitions +under the same procedure name replace the previous definitions completely. + +Be careful not to use the name of a system operator for your own procedure. +REDUCE may or may not give you a warning message. If you redefine a system +operator in your own procedure, the original function of the system operator +is lost for the remainder of the REDUCE session. + +Procedures may have none, one, or more than one parameter. A REDUCE +parameter is a formal parameter only; the use of {\it x} as a parameter in +a \name{procedure} definition has no connection with a value of {\it x} in +the REDUCE session, and the results of calling a procedure have no effect +on the value of {\it x}. If a procedure is {\it called} with {\it x} as a +parameter, the current value of {\it x} is used as specified in the +computation, but is not changed outside the procedure. +Making an assignment statement by \name{:=} with a +formal parameter on the left-hand side only changes the value of the +calling parameter within the procedure. + +Using a \nameref{let} statement inside a procedure always changes the value +globally: a \name{let} with a formal parameter makes the change to the calling +parameter. \name{let} statements cannot be made on local variables inside +\nameref{begin}\ldots\name{end} \nameref{block}\name{s}. +When \nameref{clear} statements are used on formal +parameters, the calling variables associated with them are cleared globally too. +The use of \name{let} or \name{clear} statements inside procedures +should be done with extreme caution. + +Arrays and operators may be used as parameters to procedures. The body of the +procedure can contain statements that appropriately manipulate these +arguments. Changes are made to values of the calling arrays or operators. +Simple expressions can also be used as arguments, in the place of scalar +variables. Matrices may {\it not} be used as arguments to procedures. + +A procedure that has no parameters is called by the procedure name, +immediately followed by empty parentheses. The empty parentheses may be left +out when writing a procedure with no parameters, but must appear in a call of +the procedure. If this is a nuisance to you, use a \nameref{let} statement on +the name of the procedure (i.e., \name{let noargs = noargs()}) after which +you can call the procedure by just its name. + +Procedures that have a single argument can leave out the parentheses around +it both in the definition and procedure call. (You can use the parentheses if +you wish.) Procedures with more than one argument must use parentheses, with +the arguments separated by commas. + +Procedures often have a \name{begin}\ldots\name{end} block in them. Inside the +block, local variables are declared using \name{scalar}, \name{real} or +\name{integer} declarations. +The declarations must be made immediately after the word +\name{begin}, and if more than one type of declaration is made, they are +separated by semicolons. REDUCE currently does no type checking on local +variables; \name{real} and \name{integer} are treated just like \name{scalar}. +Actions take place as specified in the statements inside the block statement. +Any identifiers that are not formal parameters or local variables are treated +as global variables, and activities involving these identifiers are global in +effect. + +If a return value is desired from a procedure call, a specific +\nameref{return} command must be the last statement executed before exiting +from the procedure. If no \name{return} is used, a procedure returns a +zero or no value. + +Procedures are often written in a file using an editor, then the file +is input using the command \nameref{in}. This method allows easy changes in +development, and also allows you to load the named procedures whenever +you like, by loading the files that contain them. +\end{Comments} +\end{Command} + + +\begin{Command}{REPEAT} +\index{loop} +The \nameref{repeat} command causes repeated execution of a statement +\nameindex{until} +the given condition is found to be true. The statement is always executed +at least once. +\begin{Syntax} +\name{repeat} \meta{statement} \name{until} \meta{condition} +\end{Syntax} + +\meta{statement} can be a single statement, \nameref{group} statement, or +a \name{begin}\ldots\name{end} \nameref{block}. \meta{condition} must be +a logical operator that evaluates to {\it true} or {\it nil}. + +\begin{Examples} +<> until m = 0>>; + & \begin{multilineoutput}{6cm} +400*X +300*X +200*X +100*X +\end{multilineoutput}\\ + +<> until m <= 0>>; + & -1 + +\end{Examples} +\begin{Comments} +\name{repeat} must always be followed by an \name{until} with a condition. +Be careful not to generate an infinite loop with a condition that is never +true. In the second example, if the condition had been \name{m = 0}, it +would never have been true since \name{m} already had value -2 when the +condition was first evaluated. +\end{Comments} +\end{Command} + + +\begin{Operator}{REST} +\index{list}\index{decomposition} +The \name{rest} operator returns a \nameref{list} containing all but the first +element of the list it is given. +\begin{Syntax} +\name{rest}\(\meta{list}\) or \name{rest} \meta{list} + + +\end{Syntax} +\meta{list} must be a non-empty list, but need not have more than one element. + +\begin{Examples} +alist := {a,b,c,d}; & ALIST := \{A,B,C,D\}; \\ +rest alist; & \{B,C,D\} \\ +blist := {x,y,{aa,bb,cc},z}; & BLIST := \{X,Y,\{AA,BB,CC\},Z\} \\ +second rest blist; & \{AA,BB,CC\} \\ +clist := {c}; & CLIST := C \\ +rest clist; & \{\} +\end{Examples} + +\end{Operator} + + +\begin{Command}{RETURN} +The \name{return} command causes a value to be returned from inside a +\name{begin}\ldots\name{end} \nameref{block}. +\begin{TEX} +\begin{Syntax} +\name{begin} \meta{statements} \name{return} \meta{\&option(expression)} + \name{end} +\end{Syntax} +\end{TEX} +\begin{INFO} +{\begin{Syntax} +\name{begin} \meta{statements} \name{return} \meta{(expression)} + \name{end} +\end{Syntax} +}\end{INFO} + +\meta{statements} can be any valid REDUCE statements. The value of +\meta{expression} is returned. + +\begin{Examples} +begin write "yes"; return a end; & +\begin{multilineoutput}{5cm} +yes +A +\end{multilineoutput}\\ +\begin{multilineinput} +procedure dumb(a); + begin if numberp(a) then return a else return 10 end; +\end{multilineinput} + & DUMB \\ +dumb(x); & 10 \\ +dumb(-5); & -5 \\ +\begin{multilineinput} +procedure dumb2(a); + begin c := a**2 + 2*a + 1; d := 17; c*d; return end; +\end{multilineinput} & DUMB2 \\ +dumb2(4); \\ +c; & 25 \\ +d; & 17 +\end{Examples} + +\begin{Comments} +Note in \name{dumb2} above that the assignments were made as requested, but +the product \name{c*d} cannot be accessed. Changing the procedure to read +\name{return c*d} would remedy this problem. + +The \name{return} statement is always the last statement executed before +leaving the block. If \name{return} has no argument, the block is exited but +no value is returned. A block statement does not need a \name{return} ; +the statements inside terminate in their normal fashion without one. +In that case no value is returned, although the specified actions inside the +block take place. + +The \name{return} command can be used inside \name{<<}\ldots\name{>>} +\nameref{group} statements and +\nameref{if}\ldots\name{then}\ldots\name{else} commands that +are inside \name{begin}\ldots\name{end} \nameref{block}s. +It is not valid in these constructions that are not inside +a \name{begin}\ldots\name{end} + block. It is not valid inside \nameref{for}, +\nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do} + loops in any construction. To force early termination from loops, the +\name{go to}(\nameref{goto}) command must be used. +When you use nested block statements, a +\name{return} from an inner block exits returning a value to the next-outermost +block, rather than all the way to the outside. +\end{Comments} +\end{Command} + + +\begin{Operator}{REVERSE} +\index{list} +The \name{reverse} operator returns a \nameref{list} that is the reverse of the +list it is given. +\begin{Syntax} +\name{reverse}\(\meta{list}\) or \name{reverse} \meta{list} +\end{Syntax} + +\meta{list} must be a \nameref{list}. + +\begin{Examples} +aa := \{c,b,a,\{x**2,z**3\},y\}; & AA := \{C,B,A,\{X^{2},Z^{3}\},Y\} \\ +reverse aa; & \{Y,\{X^{2},Z^{3}\},A,B,C\} \\ +reverse(q . reverse aa); & \{C,B,A,\{X^{2},Z^{3}\},Y,Q\} +\end{Examples} + +\begin{Comments} +\name{reverse} and \nameref{cons} can be used together to add a new element to +the end of a list (\name{.} adds its new element to the beginning). The +\name{reverse} operator uses a noticeable amount of system resources, +especially if the list is long. If you are doing much heavy-duty list +manipulation, you should probably design your algorithms to avoid much +reversing of lists. A moderate amount of list reversing is no problem. +\end{Comments} +\end{Operator} + + +\begin{Type}{RULE} +\index{rule}\index{rule list} +A \name{rule} is an instruction to replace an algebraic expression +or a part of an expression by another one. +\begin{Syntax} +\meta{lhs} => \meta{rhs} or +\meta{lhs} => \meta{rhs} \name{when} \meta{cond} +\end{Syntax} +\meta{lhs} is an algebraic expression used as search pattern and +\meta{rhs} is an algebraic expression which replaces matches of +\meta{rhs}. \name{=>} is the operator \nameref{replace}. + +\meta{lhs} can contain \nameref{free variable}s which are +symbols preceded by a tilde \nameindex{~} in their leftmost position +in \meta{lhs}. +A double tilde marks an \nameref{optional free variable}. +If a rule has a \name{when} \meta{cond} +part it will fire only if the evaluation of \meta{cond} has a +result \nameref{true}. \meta{cond} may contain references to +free variables of \meta{lhs}. + +Rules can be collected in a \nameref{list} which then forms a +\nameindex{rule list}. \name{Rule lists} can be used to collect +algebraic knowledge for a specific evaluation context. + +\name{Rules} and \name{rule lists} are globally activated and +deactivated by \nameref{let}, \nameref{forall}, \nameref{clearrules}. +For a single evaluation they can be locally activate by \nameref{where}. +The active rules for an operator can be visualized by \nameref{showrules}. + +\begin{Examples} +operator f,g,h; \\ +let f(x) => x^2; \\ +f(x); & x^{2}\\ +g_rules:={g(~n,~x)=>h(n/2,x) when evenp n,\\ +g(~n,~x)=>h((1-n)/2,x) when not evenp n}$\\ +let g_rules;\\ +g(3,x); & h(-1,x) +\end{Examples} + +\end{Type} + +\begin{Type}{Free Variable} +\index{variable} +A variable preceded by a tilde is considered as \name{free variable} +and stands for an arbitrary part in an algebraic form during +pattern matching. Free variables occur in the left-hand sides +of \nameref{rule}s, in the side relations for \nameref{compact} +and in the first arguments of \nameref{map} and \nameref{select} +calls. See \nameref{rule} for examples. + +In rules also \nameref{optional free variable}s may occur. +\end{Type} + +\begin{Type}{Optional Free Variable} +\index{variable} +A variable preceded by a double tilde is considered as +\name{optional free variable} +and stands for an arbitrary part part in an algebraic form during +pattern matching. In contrast to ordinary \nameref{free variable}s +an operator pattern with an \name{optional free variable} +matches also if the operand for the variable is missing. In such +a case the variable is bound to a neutral value. +Optional free variables can be used as + + term in a sum: set to 0 if missing, + + factor in a product: set to 1 if missing, + + exponent: set to 1 if missing + +\begin{Examples} + sin(~~u + ~~n * pi) => sin(u) when evenp u; +\end{Examples} + +Optional free variables are allowed only in the left-hand sides +of \nameref{rule}s. +\end{Type} + +\begin{Operator}{SECOND} +\index{list}\index{decomposition} +The \name{second} operator returns the second element of a list. +\begin{Syntax} +\name{second}\(\meta{list}\) or \name{second} \meta{list} + + +\end{Syntax} + +\meta{list} must be a list with at least two elements, to avoid an error +message. + +\begin{Examples} +alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\ +second alist; & B \\ +blist := \{x,\{aa,bb,cc\},z\}; & BLIST := \{X,\{AA,BB,CC\},Z\} \\ +second second blist; & BB +\end{Examples} +\end{Operator} + + +\begin{Operator}{SET} +\index{assign} +The \name{set} operator is used for assignments when you want both sides of +the assignment statement to be evaluated. +%%% INCONSISTENT??? hyphen after restricted +\begin{Syntax} +\name{set}\(\meta{restricted\_expression},\meta{expression}\) +\end{Syntax} + +\meta{expression} can be any REDUCE expression; \meta{restricted\_expression} +must be an identifier or an expression that evaluates to an identifier. + +\begin{Examples} +a := y; & A := Y \\ +set(a,sin(x^2)); & SIN(X^{2}) \\ +a; & SIN(X^{2}) \\ +y; & SIN(X^{2}) \\ +a := b + c; & A := B + C \\ +set(a-c,z); & Z \\ +b; & Z +\end{Examples} + +\begin{Comments} +Using an \nameref{array} or \nameref{matrix} reference as the first +argument to \name{set} has +the result of setting the {\it contents} of the designated element to +\name{set}'s second argument. You should be careful to avoid unwanted +side effects when you use this facility. +\end{Comments} +\end{Operator} + + +\begin{Operator}{SETQ} +\index{assign} +The \name{setq} operator is an infix or prefix binary assignment operator. +It is identical to \name{:=}. +\begin{Syntax} +\name{setq}\(\meta{restricted\_expression},\meta{expression}\) or \\ +\meta{restricted\_expression} \name{setq} \meta{expression} +\end{Syntax} + +\meta{restricted expression} is ordinarily a single identifier, though +simple expressions may be used (see Comments below). \meta{expression} can +be any valid REDUCE expression. If \meta{expression} is a \nameref{matrix} +identifier, then \meta{restricted\_expression} can be a matrix identifier +(redimensioned if necessary), which has each element set to the +corresponding elements of the identifier on the right-hand side. + +\begin{Examples} +setq(b,6); & B := 6 \\ +c setq sin(x); & C := SIN(X) \\ +w + setq(c,x+3) + z; & W + X + Z + 3 \\ +c; & X + 3 \\ +setq(a1 + a2,25); & A1 + A2 := 25 \\ +a1; & - (A2 - 25) +\end{Examples} +\begin{Comments} +Embedding a \name{setq} statement in an expression has the side effect of making +the assignment, as shown in the third example above. + +Assignments are generally done for identifiers, but may be done for simple +expressions as well, subject to the following remarks: +\begin{itemize} + +\item[(i)] +If the left-hand side is an identifier, an operator, or a power, the rule +is added to the rule table. + +\item[(ii)] +If the operators \name{- + /} appear on the left-hand side, all but the first +term of the expression is moved to the right-hand side. + +\item[(iii)] +If the operator \name{*} appears on the left-hand side, any constant terms are +moved to the right-hand side, but the symbolic factors remain. +\end{itemize} + +Be careful not to make a recursive \name{setq} assignment that is not +controlled inside a loop statement. The process of resubstitution +continues until you get a stack overflow message. \name{setq} can be used +to attach functionality to operators, as the \name{:=} does. +\end{Comments} +\end{Operator} + + +\begin{Operator}{THIRD} +\index{list}\index{decomposition} +The \name{third} operator returns the third item of a \nameref{list}. +\begin{Syntax} +\name{third}\(\meta{list}\) or \name{third} \meta{list} + +\end{Syntax} + + +\meta{list} must be a list containing at least three items to avoid an error +message. + +\begin{Examples} +alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\ +third alist; & C \\ +blist := \{x,\{aa,bb,cc\},y,z\}; & BLIST := \{X,\{AA,BB,CC\},Y,Z\}; \\ +third second blist; & CC \\ +third blist; & Y +\end{Examples} + +\end{Operator} + +\begin{Operator}{WHEN} +\index{rule} +The \name{when} operator is used inside a \name{rule} to make the +execution of the rule depend on a boolean condition which is +evaluated at execution time. For the use see \nameref{rule}. +\end{Operator} +