<A NAME=FORALL>
<TITLE>FORALL</TITLE></A>
<b><a href=r37_idx.html>INDEX</a></b><p><p>
<B>FORALL</B> _ _ _ _ _ _ _ _ _ _ _ _ <B>command</B><P>
<P>
<P>
<P>
The <em>forall</em> or (preferably) <em>for all</em> command is used as a
modifier for
<A HREF=r37_0199.html>let</A> statements, indicating the universal applicability
of the rule, with possible qualifications.
<P> <H3>
syntax: </H3>
<P>
<P>
<em>for all</em><identifier>{,<identifier>}* <em>let</em>
<let statement>
<P>
<P>
or
<P>
<P>
<em>for all</em><identifier>{,<identifier>}*
<em>such that</em> <condition> <em>let</em> <let statement>
<P>
<P>
<P>
<identifier> may be any valid REDUCE identifier, <let statement>
can be an operator, a product or power, or a group or block statement.
<condition> must be a logical or comparison operator returning true or
false.
<P>
<P>
<P> <H3>
examples: </H3>
<P><PRE><TT>
for all x let f(x) = sin(x**2);
Declare F operator ? (Y or N)
y
f(a);
2
SIN(A )
operator pos;
for all x such that x>=0 let pos(x) = sqrt(x + 1);
pos(5);
SQRT(6)
pos(-5);
POS(-5)
clear pos;
pos(5);
Declare POS operator ? (Y or N)
for all a such that numberp a let x**a = 1;
x**4;
1
clear x**a;
*** X**A not found
for all a clear x**a;
x**4;
1
for all a such that numberp a clear x**a;
x**4;
4
X
</TT></PRE><P>Substitution rules defined by <em>for all</em> or <em>for
all</em>...<em>such that</em> commands that involve products or powers are
cleared by reproducing the command, with exactly the same variable names
used, up to but not including the equal sign, with
<A HREF=r37_0189.html>clear</A>
replacing <em>let</em>, as shown in the last example. Other substitutions
involving variables or operator names can be cleared with just the name,
like any other variable.
<P>
<P>
The
<A HREF=r37_0205.html>match</A> command can also be used in product and power su
bstitutions.
The syntax of its use and clearing is exactly like <em>let</em>. A <em>match
</em>
substitution only replaces the term if it is exactly like the pattern, for
example <em>match x**5 = 1</em> replaces only terms of <em>x**5</em> and not
terms of higher powers.
<P>
<P>
It is easier to declare your potential operator before defining the
<em>for all</em> rule, since the system will ask you to declare it an
operator anyway. Names of declared arrays or matrices or scalar
variables are invalid as operator names, to avoid ambiguity. Either
<em>for all</em>...<em>let</em> statements or procedures are often used to defin
e
operators. One difference is that procedures implement ``call by value"
meaning that assignments involving their formal parameters do not change
the calling variables that replace them. If you use assignment statements
on the formal parameters in a <em>for all</em>...<em>let</em> statement, the
effects are seen in the calling variables. Be careful not to redefine a
system operator unless you mean it: the statement <em>for all x let
sin(x)=0;</em> has exactly that effect, and the usual definition for sin(x) has
been lost for the remainder of the REDUCE session. <P>
<P>
<P>
<P>