1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/12-ter.html
2019-04-22 15:42:10 +01:00

528 lines
57 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>11/tcp</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '12/ter' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>The Equality Relation</b></li></ul><p class="purpose">To define that prince among predicates, the equality relation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Initial stock</a></li><li><a href="#SP4">&#167;4. Second stock</a></li><li><a href="#SP5">&#167;5. Typechecking</a></li><li><a href="#SP7">&#167;7. Assertion</a></li><li><a href="#SP8">&#167;8. Compilation</a></li><li><a href="#SP9">&#167;9. Problem message text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This predicate expresses the meaning of a=b, and plays a very special role
in our calculus.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_equality</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">a_has_b_predicate</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Initial stock. </b>This relation is hard-wired in, and it is made in a slightly special way
since (alone among binary predicates) it has no distinct reversal.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::REL_create_initial_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">R_equality</span><span class="plain"> = </span><span class="functiontext">BinaryPredicates::make_equality</span><span class="plain">();</span>
<span class="functiontext">BinaryPredicates::set_index_details</span><span class="plain">(</span><span class="identifier">R_equality</span><span class="plain">, </span><span class="string">"value"</span><span class="plain">, </span><span class="string">"value"</span><span class="plain">);</span>
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">Preform::Nonparsing::merge</span><span class="plain">(&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">formal</span><span class="plain">&gt;, 0,</span>
<span class="identifier">Preform::Nonparsing::wording</span><span class="plain">(&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="identifier">names</span><span class="plain">&gt;, </span><span class="constant">EQUALITY_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">WordAssemblages::to_wording</span><span class="plain">(&amp;</span><span class="identifier">wa</span><span class="plain">);</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_binary_predicate</span><span class="plain">(</span><span class="identifier">R_equality</span><span class="plain">));</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">a_has_b_predicate</span><span class="plain"> =</span>
<span class="functiontext">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="constant">SPATIAL_KBP</span><span class="plain">,</span>
<span class="functiontext">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="functiontext">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"has"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-had-by"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">Preform::Nonparsing::wording</span><span class="plain">(&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="identifier">names</span><span class="plain">&gt;, </span><span class="constant">POSSESSION_RELATION_NAME</span><span class="plain">));</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::REL_create_initial_stock is used in 6/bp (<a href="6-bp.html#SP45">&#167;45</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Second stock. </b>There is none, of course.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::REL_create_second_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::REL_create_second_stock is used in 6/bp (<a href="6-bp.html#SP46">&#167;46</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Typechecking. </b>This is a very polymorphic relation, in that it can accept terms of almost
any kind.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::REL_typecheck</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">,</span>
<span class="identifier">kind</span><span class="plain"> **</span><span class="identifier">kinds_of_terms</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> **</span><span class="identifier">kinds_required</span><span class="plain">, </span><span class="reserved">tc_problem_kit</span><span class="plain"> *</span><span class="identifier">tck</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">MATCHING</span><span class="plain">, </span><span class="string">"Typecheck $u '==' $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">K_understanding</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">K_text</span><span class="plain">))) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">MATCHING</span><span class="plain">, </span><span class="string">"No!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Problems::Issue::tcp_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TextIsNotTopic</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"though they look the same, because both are written in double "</span>
<span class="string">"quotes, text values can't in fact be used as topics, so it's "</span>
<span class="string">"impossible to store this piece of text in that location."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NEVER_MATCH</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::typecheck_equality</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1]))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">K_object</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Properties::Conditions::name_can_coincide_with_property</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1])))</span>
&lt;<span class="cwebmacro">Apply rule for "is" applied to an object and a value</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">K_understanding</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">K_snippet</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">K_understanding</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">K_snippet</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">K_text</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">K_response</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">else</span>
&lt;<span class="cwebmacro">Allow comparison only where left domain and right domain are not disjoint</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::REL_typecheck is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>This case is only separated in order to provide a better problem message
for a fairly common mistake:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Apply rule for "is" applied to an object and a value</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::Conditions::get_coinciding_property</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tck</span><span class="plain">-</span><span class="element">&gt;log_to_I6_text</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Comparison of object with $u value\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">kinds_of_terms</span><span class="plain">[1]);</span>
<span class="functiontext">Problems::quote_kind</span><span class="plain">(4, </span><span class="identifier">kinds_of_terms</span><span class="plain">[1]);</span>
<span class="functiontext">Problems::Issue::tcp_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NonPropertyCompared</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"taken literally that says that an object is the same as a "</span>
<span class="string">"value. Maybe you intended to say that the object "</span>
<span class="string">"has a property - but right now %4 is not yet a property; if you "</span>
<span class="string">"want to use it as one, you'll need to say so. (You can turn a "</span>
<span class="string">"kind of value - say, 'colour' - into a property by writing - "</span>
<span class="string">"say - 'A thing has a colour.')"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NEVER_MATCH</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b>With comparisons there is no restriction on the two kinds except that they
must match each other; is(t, s) is allowed if K(t)⊆ K(s) or
vice versa. So rules and rulebooks are comparable, for instance, but numbers
and scenes are not.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Allow comparison only where left domain and right domain are not disjoint</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Calculus::Equality::both_terms_of_same_construction</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">CON_rule</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Calculus::Equality::both_terms_of_same_construction</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">CON_rulebook</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Calculus::Equality::both_terms_of_same_construction</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">CON_activity</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1]) == </span><span class="identifier">NEVER_MATCH</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">kinds_of_terms</span><span class="plain">[0]) == </span><span class="identifier">NEVER_MATCH</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tck</span><span class="plain">-</span><span class="element">&gt;log_to_I6_text</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Unable to compare $u with $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">kinds_of_terms</span><span class="plain">[0], </span><span class="identifier">kinds_of_terms</span><span class="plain">[1]);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">NEVER_MATCH_SAYING_WHY_NOT</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::both_terms_of_same_construction</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">k0</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">k1</span><span class="plain">, </span><span class="identifier">kind_constructor</span><span class="plain"> *</span><span class="identifier">cons</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">k0</span><span class="plain">) == </span><span class="identifier">cons</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">k1</span><span class="plain">) == </span><span class="identifier">cons</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::both_terms_of_same_construction is used in <a href="#SP5_2">&#167;5.2</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Assertion. </b>In general values differ, and cannot be equated by fiat. But an exception is
setting a global variable.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::REL_assert</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec0</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs1</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec1</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Lvalues::is_actual_NONLOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">)) {</span>
<span class="reserved">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_nonlocal_variable</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allowed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prevailing_mood</span><span class="plain"> != </span><span class="identifier">UNKNOWN_CE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">prevailing_mood</span><span class="plain"> != </span><span class="identifier">LIKELY_CE</span><span class="plain">))</span>
<span class="identifier">allowed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">NonlocalVariables::is_constant</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">CERTAIN_CE</span><span class="plain">))</span>
<span class="identifier">allowed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">allowed</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantQualifyVariableValues</span><span class="plain">),</span>
<span class="string">"a variable can only be given its value straightforwardly or "</span>
<span class="string">"qualified by 'usually'"</span><span class="plain">,</span>
<span class="string">"not with 'always', 'seldom' or 'never'."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">World::Inferences::draw_property</span><span class="plain">(</span>
<span class="functiontext">NonlocalVariables::get_knowledge</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">), </span><span class="identifier">P_variable_initial_value</span><span class="plain">, </span><span class="identifier">spec1</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::REL_assert is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Compilation. </b>Since we are compiling to I6, which is itself a C-level programming
language, it looks at first as if we can compile is into <code class="display"><span class="extract">==</span></code> when
testing equality and <code class="display"><span class="extract">=</span></code> when asserting it: thus
</p>
<blockquote>
<p>now the score is 10;</p>
</blockquote>
<blockquote>
<p>if the score is 10, ...</p>
</blockquote>
<p class="inwebparagraph">would compile to <code class="display"><span class="extract">score = 10;</span></code> and <code class="display"><span class="extract">if (score == 10) ...</span></code> respectively.
</p>
<p class="inwebparagraph">But there are three problems with this simplistic approach to "A is B".
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) Sometimes "now A is B" must set a property of A, which does not
change, rather than making A equal to B; and similarly for testing.
</li><li>(b) Sometimes A is reference to a value stored in some data structure
other than a local or global variable: for example, in "now entry 3 of
the passenger list is 208", where A is "entry 3 of the passenger list".
Access to this value is via I6 routines in the template, and the form of
what we compile has to be different depending on whether we are reading
or writing.
</li><li>(c) Sometimes the values in question are block values, that is, they are
stored as pointers to blocks of data on the heap at run-time. If we compile
"now T is X", where T is a text variable and X is some piece of text, we
cannot simply copy the pointers: T needs to hold a fresh, independent copy of
the text referred to by X.
</li></ul>
<p class="inwebparagraph">Problem (a) is easily detected by looking at the kinds of value of A and B.
To handle problems (b) and (c), we use a general framework in which the
schema is a function of both the storage class of A and the kinds of value
of both A and B.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::REL_compile</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">, </span><span class="reserved">annotated_i6_schema</span><span class="plain"> *</span><span class="identifier">asch</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">st</span><span class="plain">[2];</span>
<span class="identifier">st</span><span class="plain">[0] = </span><span class="functiontext">Calculus::Deferrals::Cinders::kind_of_value_of_term</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt0</span><span class="plain">);</span>
<span class="identifier">st</span><span class="plain">[1] = </span><span class="functiontext">Calculus::Deferrals::Cinders::kind_of_value_of_term</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0], </span><span class="identifier">K_object</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Properties::Conditions::name_can_coincide_with_property</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1])) &amp;&amp; (</span><span class="functiontext">Properties::Conditions::get_coinciding_property</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1])))</span>
&lt;<span class="cwebmacro">Handle the case of setting a property of A separately</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0], </span><span class="identifier">K_response</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1], </span><span class="identifier">K_text</span><span class="plain">)))</span>
&lt;<span class="cwebmacro">Handle the case of setting a response separately</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TEST_ATOM_TASK</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">st</span><span class="plain">[0]) &amp;&amp; (</span><span class="identifier">st</span><span class="plain">[1]))</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">,</span>
<span class="functiontext">Kinds::RunTime::interpret_test_equality</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0], </span><span class="identifier">st</span><span class="plain">[1]));</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$0 and $0; $u and $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, &amp;(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt0</span><span class="plain">), &amp;(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt1</span><span class="plain">), </span><span class="identifier">st</span><span class="plain">[0], </span><span class="identifier">st</span><span class="plain">[1]);</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantCompareValues</span><span class="plain">),</span>
<span class="string">"that would involve comparing things which don't mean "</span>
<span class="string">"anything to me"</span><span class="plain">,</span>
<span class="string">"so I'm lost."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOW_ATOM_FALSE_TASK</span><span class="plain">:</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOW_ATOM_TRUE_TASK</span><span class="plain">: {</span>
<span class="identifier">node_type_t</span><span class="plain"> </span><span class="identifier">storage_class</span><span class="plain"> = </span><span class="functiontext">Lvalues::get_storage_form</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt0.constant</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">storage_class</span><span class="plain"> == </span><span class="constant">UNKNOWN_NT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0]) == </span><span class="identifier">CON_property</span><span class="plain">))</span>
<span class="identifier">storage_class</span><span class="plain"> = </span><span class="constant">PROPERTY_VALUE_NT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::forbid_setting</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt1.term_checked_as_kind</span><span class="plain">)) {</span>
<span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Make a further check that kinds permit this assignment</span> <span class="cwebmacronumber">8.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">storage_class</span><span class="plain"> == </span><span class="constant">UNKNOWN_NT</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Issue problem message for being unable to set equal</span> <span class="cwebmacronumber">8.5</span>&gt;
<span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
&lt;<span class="cwebmacro">Exceptional case of setting the "player" global variable</span> <span class="cwebmacronumber">8.3</span>&gt;<span class="plain">;</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"%s"</span><span class="plain">,</span>
<span class="functiontext">Lvalues::interpret_store</span><span class="plain">(</span><span class="identifier">storage_class</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">[0], </span><span class="identifier">st</span><span class="plain">[1], 0));</span>
&lt;<span class="cwebmacro">Add kind-checking code for run-time checking</span> <span class="cwebmacronumber">8.6</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::REL_compile is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>So here is the exceptional case (a) mentioned above. Suppose we have:
</p>
<blockquote>
<p>if the lantern is bright, ...</p>
</blockquote>
<p class="inwebparagraph">where "bright" is one value of "luminance", which is both a kind of value
and also a property. We then want to test if the luminance property of the
lantern equals the constant value "bright"; and similarly for "now the
lantern is bright".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Handle the case of setting a property of A separately</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::Conditions::get_coinciding_property</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1]);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TEST_ATOM_TASK</span><span class="plain">:</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"*1.%n == *2"</span><span class="plain">, </span><span class="functiontext">Properties::iname</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOW_ATOM_FALSE_TASK</span><span class="plain">:</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOW_ATOM_TRUE_TASK</span><span class="plain">:</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"*1.%n = *2"</span><span class="plain">, </span><span class="functiontext">Properties::iname</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Handle the case of setting a response separately</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TEST_ATOM_TASK</span><span class="plain">:</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ResponseComparisonUnsafe</span><span class="plain">),</span>
<span class="string">"for complicated internal reasons this comparison isn't safe to perform"</span><span class="plain">,</span>
<span class="string">"and might give you a falsely negative result. To avoid what might "</span>
<span class="string">"be misleading, you aren't allowed to compare a response to text."</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOW_ATOM_FALSE_TASK</span><span class="plain">:</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOW_ATOM_TRUE_TASK</span><span class="plain">:</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"BlkValueCopy(ResponseTexts--&gt;((*1)-1), *^2)"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_3"></a><b>&#167;8.3. </b>A little bit of support within Inform to help the template layer.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Exceptional case of setting the "player" global variable</span> <span class="cwebmacronumber">8.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">nlv</span><span class="plain"> =</span>
<span class="functiontext">Lvalues::get_nonlocal_variable_if_any</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt0.constant</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">nlv</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">NonlocalVariables::must_be_constant</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">))) {</span>
<span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">exotica</span><span class="plain"> = </span><span class="functiontext">NonlocalVariables::get_write_schema</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">exotica</span><span class="plain">) {</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">exotica</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_4"></a><b>&#167;8.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make a further check that kinds permit this assignment</span> <span class="cwebmacronumber">8.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1], </span><span class="identifier">st</span><span class="plain">[0]) == </span><span class="identifier">NEVER_MATCH</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">dst</span><span class="plain">[2];</span>
<span class="identifier">dst</span><span class="plain">[0] = </span><span class="identifier">Kinds::dereference_properties</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0]);</span>
<span class="identifier">dst</span><span class="plain">[1] = </span><span class="identifier">Kinds::dereference_properties</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">dst</span><span class="plain">[1], </span><span class="identifier">dst</span><span class="plain">[0]) == </span><span class="identifier">NEVER_MATCH</span><span class="plain">) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="functiontext">Problems::quote_kind</span><span class="plain">(2, </span><span class="identifier">st</span><span class="plain">[1]);</span>
<span class="functiontext">Problems::quote_kind</span><span class="plain">(3, </span><span class="identifier">st</span><span class="plain">[0]);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In the line %1, you seem to be asking me to put %2 into %3, "</span>
<span class="string">"which can't safely be done."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_5"></a><b>&#167;8.5. </b>Rather than just returning <code class="display"><span class="extract">FALSE</span></code> for a generic problem message, we issue
one that's more helpfully specific and return <code class="display"><span class="extract">TRUE</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue problem message for being unable to set equal</span> <span class="cwebmacronumber">8.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::to_instance</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt0.constant</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt0.constant</span><span class="plain">), </span><span class="identifier">K_object</span><span class="plain">))</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantEquateValues</span><span class="plain">),</span>
<span class="string">"equality is not something I can change"</span><span class="plain">,</span>
<span class="string">"so either those are already the same or are different, and I "</span>
<span class="string">"can't alter matters."</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantChangeNamedConstant</span><span class="plain">),</span>
<span class="string">"I can't change that"</span><span class="plain">,</span>
<span class="string">"because it is a name for a constant value. Some named values, "</span>
<span class="string">"like 'the score', can be changed, because they were defined "</span>
<span class="string">"as values that vary. But others are fixed. If we write 'The "</span>
<span class="string">"oak tree can be sturdy, lightning-struck or leaning.', for "</span>
<span class="string">"instance, then 'sturdy' is a name for a value which is fixed, "</span>
<span class="string">"just as the number '7' is fixed."</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_6"></a><b>&#167;8.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add kind-checking code for run-time checking</span> <span class="cwebmacronumber">8.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[1], </span><span class="identifier">st</span><span class="plain">[0]) == </span><span class="identifier">SOMETIMES_MATCH</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0], </span><span class="identifier">K_object</span><span class="plain">))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">,</span>
<span class="string">"; if (~~(*1 ofclass %n)) RunTimeProblem(RTP_WRONGASSIGNEDKIND, *1, \</span><span class="plain">"</span><span class="string">*?\</span><span class="plain">"</span><span class="string">, \</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
<span class="functiontext">Kinds::RunTime::I6_classname</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">[0]));</span>
<span class="identifier">Kinds::Textual::write</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">[0]);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string">);"</span><span class="plain">);</span>
<span class="functiontext">Calculus::Schemas::append</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Problem message text. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Equality::REL_describe_for_problems</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Equality::REL_describe_for_problems is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 12: Use of Propositions.)</i></li><li><a href="12-qr.html">Continue with 'Quasinumeric Relations'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>