<p>The two main <em>boolean</em> values are <code class="keyw">true</code> and <code class="keyw">false</code>. They stand for the <em>logical</em> values of the same name. They appear as values of the conditions in <code class="keyw">if</code>-statements and <code class="keyw">while</code>-loops. Booleans are also important as return values of <em>filters</em> (see <a href="chap13_mj.html#X84EFA4C07D4277BB"><span class="RefLink">13.2</span></a>) such as <code class="func">IsFinite</code> (<a href="chap30_mj.html#X808A4061809A6E67"><span class="RefLink">30.4-2</span></a>) and <code class="func">IsBool</code> (<a href="chap20_mj.html#X7D58580284CF7894"><span class="RefLink">20.1-1</span></a>). Note that it is a convention that the name of a function that returns <code class="keyw">true</code> or <code class="keyw">false</code> according to the outcome, starts with <code class="code">Is</code>.</p>
<p>For technical reasons, also the value <code class="keyw">fail</code> (see <a href="chap20_mj.html#X85E648AA8414F303"><span class="RefLink">20.2</span></a>) is regarded as a boolean.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ fail</code></td><td class="tdright">( global variable )</td></tr></table></div>
<p>The value <code class="keyw">fail</code> is used to indicate situations when an operation could not be performed for the given arguments, either because of shortcomings of the arguments or because of restrictions in the implementation or computability. So for example <code class="func">Position</code> (<a href="chap21_mj.html#X79975EC6783B4293"><span class="RefLink">21.16-1</span></a>) will return <code class="keyw">fail</code> if the point searched for is not in the list.</p>
<p><code class="keyw">fail</code> is simply an object that is different from every other object than itself.</p>
<p>For technical reasons, <code class="keyw">fail</code> is a boolean value. But note that <code class="keyw">fail</code> cannot be used to form boolean expressions with <code class="keyw">and</code>, <code class="keyw">or</code>, and <code class="keyw">not</code> (see <a href="chap20_mj.html#X79AD41A185FD7213"><span class="RefLink">20.4</span></a> below), and <code class="keyw">fail</code> cannot appear in boolean lists (see Chapter <a href="chap22_mj.html#X7AC531DD79B6938E"><spanclass="RefLink">22</span></a>).</p>
<p>The equality operator <code class="code">=</code> evaluates to <code class="keyw">true</code> if the two boolean values <var class="Arg">bool1</var> and <var class="Arg">bool2</var> are equal, i.e., both are <code class="keyw">true</code> or both are <code class="keyw">false</code> or both <code class="keyw">fail</code>, and <code class="keyw">false</code> otherwise. The inequality operator <code class="code"><></code> evaluates to <code class="keyw">true</code> if the two boolean values <var class="Arg">bool1</var>, <var class="Arg">bool2</var> are different, and <code class="keyw">false</code> otherwise. This operation is also called the <em>exclusive or</em>, because its value is <code class="keyw">true</code> if exactly one of <var class="Arg">bool1</var> or <var class="Arg">bool2</var> is <code class="keyw">true</code>.</p>
<p>You can compare boolean values with objects of other types. Of course they are never equal.</p>
<p>The ordering of boolean values is defined by <code class="keyw">true</code> <code class="code"><</code> <code class="keyw">false</code> <code class="code"><</code> <code class="keyw">fail</code>. For the comparison of booleans with other <strong class="pkg">GAP</strong> objects, see Section <a href="chap4_mj.html#X7A274A1F8553B7E6"><span class="RefLink">4.13</span></a>.</p>
<p>The logical operator <code class="keyw">or</code> evaluates to <code class="keyw">true</code> if at least one of the two boolean operands <var class="Arg">bool1</var> and <var class="Arg">bool2</var> is <code class="keyw">true</code>, and to <code class="keyw">false</code> otherwise.</p>
<p><code class="keyw">or</code> first evaluates <var class="Arg">bool1</var>. If the value is neither <code class="keyw">true</code> nor <code class="keyw">false</code> an error is signalled. If the value is <code class="keyw">true</code>, then <code class="keyw">or</code> returns <code class="keyw">true</code> <em>without</em> evaluating <var class="Arg">bool2</var>. If the value is <code class="keyw">false</code>, then <code class="keyw">or</code> evaluates <var class="Arg">bool2</var>. Again, if the value is neither <code class="keyw">true</code> nor <code class="keyw">false</code> an error is signalled. Otherwise <code class="keyw">or</code> returns the value of <var class="Arg">bool2</var>. This <em>short-circuited</em> evaluation is important if the value of <var class="Arg">bool1</var> is <code class="keyw">true</code> and evaluation of <var class="Arg">bool2</var> would take much time or cause an error.</p>
<p><code class="keyw">or</code> is associative, i.e., it is allowed to write <var class="Arg">b1</var> <code class="keyw">or</code> <var class="Arg">b2</var> <code class="keyw">or</code> <var class="Arg">b3</var>, which is interpreted as (<var class="Arg">b1</var> <code class="keyw">or</code> <var class="Arg">b2</var>) <code class="keyw">or</code> <var class="Arg">b3</var>. <code class="keyw">or</code> has the lowest precedence of the logical operators. All logical operators have lower precedence than the comparison operators <code class="code">=</code>, <code class="code"><</code>, <code class="keyw">in</code>, etc.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">true or false;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">false or false;</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">i := -1;; l := [1,2,3];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">if i <= 0 or l[i] = false then # this does not cause an error,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Print("aha\n"); fi; # because `l[i]' is not evaluated
aha
</pre></div>
<p>The logical operator <code class="keyw">and</code> evaluates to <code class="keyw">true</code> if both boolean operands <var class="Arg">bool1</var>, <var class="Arg">bool2</var> are <code class="keyw">true</code>, and to <code class="keyw">false</code> otherwise.</p>
<p><code class="keyw">and</code> first evaluates <var class="Arg">bool1</var>. If the value is neither <code class="keyw">true</code> nor <code class="keyw">false</code> an error is signalled. If the value is <code class="keyw">false</code>, then <code class="keyw">and</code> returns <code class="keyw">false</code> <em>without</em> evaluating <var class="Arg">bool2</var>. If the value is <code class="keyw">true</code>, then <code class="keyw">and</code> evaluates <var class="Arg">bool2</var>. Again, if the value is neither <code class="keyw">true</code> nor <code class="keyw">false</code> an error is signalled. Otherwise <code class="keyw">and</code> returns the value of <var class="Arg">bool2</var>. This <em>short-circuited</em> evaluation is important if the value of <var class="Arg">bool1</var> is <code class="keyw">false</code> and evaluation of <var class="Arg">bool2</var> would take much time or cause an error.</p>
<p><code class="keyw">and</code> is associative, i.e., it is allowed to write <var class="Arg">b1</var> <code class="keyw">and</code> <var class="Arg">b2</var> <code class="keyw">and</code> <var class="Arg">b3</var>, which is interpreted as (<var class="Arg">b1</var> <code class="keyw">and</code> <var class="Arg">b2</var>) <code class="keyw">and</code> <var class="Arg">b3</var>. <code class="keyw">and</code> has higher precedence than the logical <code class="keyw">or</code> operator, but lower than the unary logical <code class="keyw">not</code> operator. All logical operators have lower precedence than the comparison operators <code class="code">=</code>, <code class="code"><</code>, <code class="keyw">in</code>, etc.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">true and false;</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">true and true;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">false and 17; # does not cause error, because 17 is never looked at</span>
false
</pre></div>
<p><code class="keyw">and</code> can also be applied to filters. It returns a filter that when applied to some argument <var class="Arg">x</var>, tests <var class="Arg">fil1</var><span class="SimpleMath">\((x)\)</span> <code class="keyw">and</code> <var class="Arg">fil2</var><span class="SimpleMath">\((x)\)</span>.</p>
<p>The logical operator <code class="keyw">not</code> returns <code class="keyw">true</code> if the boolean value <var class="Arg">bool</var> is <code class="keyw">false</code>, and <code class="keyw">true</code> otherwise. An error is signalled if <var class="Arg">bool</var> does not evaluate to <code class="keyw">true</code> or <code class="keyw">false</code>.</p>
<p><code class="keyw">not</code> has higher precedence than the other logical operators, <code class="keyw">or</code> and <code class="keyw">and</code>. All logical operators have lower precedence than the comparison operators <code class="code">=</code>, <code class="code"><</code>, <code class="keyw">in</code>, etc.</p>
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.