1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/core-module/12-ca.html
2020-04-15 23:49:59 +01:00

596 lines
61 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Compile Atoms</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<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>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="index.html"><span class="selectedlink">core</span></a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Compile Atoms' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</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>Compile Atoms</b></li></ul><p class="purpose">In this section, given an atom of a proposition we compile I6 code as required for any of three possible outcomes: (i) to test whether it is true, (ii) to make it henceforth true, or (iii) to make it henceforth false.</p>
<ul class="toc"><li><a href="12-ca.html#SP1">&#167;1. Definitions</a></li><li><a href="12-ca.html#SP5_1">&#167;5.1. Stage 1</a></li><li><a href="12-ca.html#SP5_2">&#167;5.2. Stage 2</a></li><li><a href="12-ca.html#SP6">&#167;6. Constructing the schema</a></li><li><a href="12-ca.html#SP8">&#167;8. An unannotated one</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>The compilation method is to look at the atom, work out a suitable I6
schema involving code to be applied to the one or two terms attaching to
the atom, and then expand this. In some circumstances, the process of
finding the schema will reveal that we need to apply it to different terms
from those originally found in the atom, however, so we also need to keep
track of that; and also of whether a condition is being regarded
negatively.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">annotated_i6_schema</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">schema</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">negate_schema</span><span class="plain">; </span><span class="comment"> true if atom is to be tested with the opposite parity</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">pt0</span><span class="plain">; </span><span class="comment"> terms on which the I6 schema is to be expanded</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">pt1</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">involves_action_variables</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">annotated_i6_schema</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure annotated_i6_schema is accessed in 6/bp, 6/tur, 12/ter, 12/qr, 15/tpr, 15/cr, 15/spr2 and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Some constants to enumerate the three cases of what we are to do. This
looks asymmetrical &mdash; shouldn't we also test to see whether an atom is false,
a fourth case?
</p>
<p class="inwebparagraph">The answer is that there's no need, since "test false" can be done by
compiling "test true" and applying the I7 negation operator <code class="display"><span class="extract">~~</span></code> to the
result. No similar trick can be used to combine making something
true or false into a single operation.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">TEST_ATOM_TASK</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">NOW_ATOM_TRUE_TASK</span><span class="plain"> </span><span class="constant">2</span>
<span class="definitionkeyword">define</span> <span class="constant">NOW_ATOM_FALSE_TASK</span><span class="plain"> </span><span class="constant">3</span>
</pre>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>For its internal purposes, Inform is sometimes able to compile atoms which
wouldn't be allowed in a typical use of "now" from the source text; so it
can suppress the following problem messages:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_C14CantChangeKind</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_C14ActionVarsPastTense</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>So, then:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Atoms::Compile::emit<button class="popup" onclick="togglePopup('usagePopup794')">...<span class="popuptext" id="usagePopup794">Usage of <b>Calculus::Atoms::Compile::emit</b>:<br>Deciding to Defer - <a href="12-dtd.html#SP11">&#167;11</a><br>Compile Deferred Propositions - <a href="12-cdp.html#SP2_1_6_1_2_3_2">&#167;2.1.6.1.2.3.2</a>, <a href="12-cdp.html#SP2_1_6_1_2_3_4">&#167;2.1.6.1.2.3.4</a></span></button></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">pcalc_prop</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">with_semicolon</span><span class="plain">) {</span>
<span class="identifier">value_holster</span><span class="plain"> </span><span class="identifier">VH</span><span class="plain"> = </span><span class="identifier">Holsters::new</span><span class="plain">(</span><span class="identifier">INTER_VAL_VHMODE</span><span class="plain">);</span>
<span class="functiontext"><a href="12-ca.html#SP5">Calculus::Atoms::Compile::compile</a></span><span class="plain">(&amp;</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">, </span><span class="identifier">with_semicolon</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Atoms::Compile::compile<button class="popup" onclick="togglePopup('usagePopup795')">...<span class="popuptext" id="usagePopup795">Usage of <b>Calculus::Atoms::Compile::compile</b>:<br>Deciding to Defer - <a href="12-dtd.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</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">pcalc_prop</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">with_semicolon</span><span class="plain">) {</span>
<span class="reserved">i6_schema</span><span class="plain"> </span><span class="identifier">sch</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="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="identifier">TEST_ATOM_TASK:</span><span class="plain"> </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PREDICATE_CALCULUS_WORKINGS</span><span class="plain">, </span><span class="string">"Compiling condition: $o\n"</span><span class="plain">, </span><span class="identifier">pl</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="identifier">NOW_ATOM_TRUE_TASK:</span><span class="plain"> </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PREDICATE_CALCULUS_WORKINGS</span><span class="plain">, </span><span class="string">"Compiling 'now': $o\n"</span><span class="plain">, </span><span class="identifier">pl</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="identifier">NOW_ATOM_FALSE_TASK:</span><span class="plain"> </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PREDICATE_CALCULUS_WORKINGS</span><span class="plain">, </span><span class="string">"Compiling 'now' false: $o\n"</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown compile task"</span><span class="plain">);</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Stage 1: make an annotated schema from the atom</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Stage 2: expand that schema to the output stream</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. Stage 1. </b></p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Stage 1: make an annotated schema from the atom</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">asch</span><span class="plain"> = </span><span class="functiontext"><a href="12-ca.html#SP6">Calculus::Atoms::Compile::i6_schema_of_atom</a></span><span class="plain">(&amp;</span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">, </span><span class="identifier">task</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">asch</span><span class="plain">.</span><span class="element">schema</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">problem_count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Issue a fallback problem message, since the schema-maker evidently didn't</span> <span class="cwebmacronumber">5.1.1</span>&gt;<span class="character">;</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Reject all discussion of the action variables in the past tense</span> <span class="cwebmacronumber">5.1.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_1_1"></a><b>&#167;5.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue a fallback problem message, since the schema-maker evidently didn't</span> <span class="cwebmacronumber">5.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed on task: $o\n"</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">task</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="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></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="string">"this is not a condition I am able to test"</span><span class="plain">,</span>
<span class="string">"or at any rate not during play."</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantForceRelation</span><span class="plain">),</span>
<span class="string">"this is not something I can make true with 'now'"</span><span class="plain">,</span>
<span class="string">"because it is too vague about the underlying cause which would "</span>
<span class="string">"need to be arranged."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP5_1">&#167;5.1</a>.</p>
<p class="inwebparagraph"><a id="SP5_1_2"></a><b>&#167;5.1.2. </b>This is in the user's own best interest.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Reject all discussion of the action variables in the past tense</span> <span class="cwebmacronumber">5.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">asch</span><span class="plain">.</span><span class="identifier">involves_action_variables</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="24-sf.html#SP12">Frames::used_for_past_tense</a></span><span class="plain">()) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">suppress_C14ActionVarsPastTense</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="identifier">problem_count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActionVarsPastTense</span><span class="plain">),</span>
<span class="string">"it is misleading to talk about the noun, the second noun "</span>
<span class="string">"or the person asked to do something in past tenses"</span><span class="plain">,</span>
<span class="string">"because in the past, those were different things and "</span>
<span class="string">"people, or may have been nothing at all. Writing "</span>
<span class="string">"'if the noun has been unlocked' tends not to do what we "</span>
<span class="string">"might hope because the value of 'noun' changes every turn. "</span>
<span class="string">"So such conditions are not allowed, although to get around "</span>
<span class="string">"this we can instead write 'if we have unlocked the noun', "</span>
<span class="string">"which uses a special mechanism to remember everything which "</span>
<span class="string">"has happened to every object."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP5_1">&#167;5.1</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. Stage 2. </b>A valid I6 condition has to be bracketed, so we surround the output with
brackets if testing; and a valid I6 statement has to end with a semicolon,
so we terminate with that if making true or false.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Stage 2: expand that schema to the output stream</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">asch</span><span class="plain">.</span><span class="element">negate_schema</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">NOT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="plain">}</span>
<span class="functiontext"><a href="12-is.html#SP6">Calculus::Schemas::emit_expand_from_terms</a></span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">.</span><span class="element">schema</span><span class="plain">, &amp;(</span><span class="identifier">asch</span><span class="plain">.</span><span class="element">pt0</span><span class="plain">), &amp;(</span><span class="identifier">asch</span><span class="plain">.</span><span class="element">pt1</span><span class="plain">), </span><span class="identifier">with_semicolon</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">asch</span><span class="plain">.</span><span class="element">negate_schema</span><span class="plain">) {</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Constructing the schema. </b></p>
<pre class="display">
<span class="reserved">annotated_i6_schema</span><span class="plain"> </span><span class="functiontext">Calculus::Atoms::Compile::i6_schema_of_atom<button class="popup" onclick="togglePopup('usagePopup796')">...<span class="popuptext" id="usagePopup796">Usage of <b>Calculus::Atoms::Compile::i6_schema_of_atom</b>:<br><a href="12-ca.html#SP5_1">&#167;5.1</a></span></button></span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">pl</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">annotated_i6_schema</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">" "</span><span class="plain">); </span><span class="comment"> a non-NULL return in case problems occur</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">schema</span><span class="plain"> = </span><span class="identifier">sch</span><span class="plain">;</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">negate_schema</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">pt0</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0]; </span><span class="identifier">asch</span><span class="plain">.</span><span class="element">pt1</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[1];</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">involves_action_variables</span><span class="plain"> = </span><span class="functiontext"><a href="12-ca.html#SP7">Calculus::Atoms::Compile::atom_involves_action_variables</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="identifier">element</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLED_ATOM:</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make an annotated schema for a CALLED atom</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">KIND_ATOM:</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make an annotated schema for a KIND atom</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVERYWHERE_ATOM:</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make an annotated schema for an EVERYWHERE atom</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOWHERE_ATOM:</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make an annotated schema for a NOWHERE atom</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HERE_ATOM:</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make an annotated schema for a HERE atom</span> <span class="cwebmacronumber">6.5</span>&gt;<span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PREDICATE_ATOM:</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="identifier">arity</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span>&lt;<span class="cwebmacro">Make an annotated schema for a unary predicate</span> <span class="cwebmacronumber">6.6</span>&gt;<span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span>&lt;<span class="cwebmacro">Make an annotated schema for a binary predicate</span> <span class="cwebmacronumber">6.7</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">schema</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> signal that the atom cannot be compiled simply</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>We are now able to look at the different types of atom one at a time.
</p>
<p class="inwebparagraph">CALLED atoms cannot be asserted, and to test them, we simply copy the
value into the local variable of the given name. Note then that here
the I6 <code class="display"><span class="extract">=</span></code> (set equal) operator is being used in a condition context:
there's a good chance that the value set is non-zero (since all objects
and enumerated values are non-zero), but it isn't necessarily so &mdash;
in Inform it's legal to quantify over times and truth states, for
instance, where 0 is a legal I6 value. So we use the comma operator
to throw away the result of the assignment, and evaluate the condition
to <code class="display"><span class="extract">true</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for a CALLED atom</span> <span class="cwebmacronumber">6.1</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="identifier">TEST_ATOM_TASK:</span><span class="plain"> {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="functiontext"><a href="11-ap.html#SP17">Calculus::Atoms::CALLED_get_name</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">);</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"(%L=(*1), true)"</span><span class="plain">,</span>
<span class="functiontext"><a href="24-lv.html#SP31">LocalVariables::ensure_called_local</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">assert_kind</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">.</span><span class="element">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">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b>In any type-checked proposition, a <code class="display"><span class="extract">KIND</span></code> atom can only exist where it is
always at least sometimes true. In particular, if \(K\) is a kind of value, then
the atom \(K(v)\) can only exist where \(v\) is of that kind of value, so that the
atom is always true when tested. But if \(K\) is a kind of object, then \(K(O)\)
may occur in the proposition for any object \(O\), where \(O\) need not belong
to \(K\) at all: so there is something substantive to check, which we do using
the I6 <code class="display"><span class="extract">ofclass</span></code> operator.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for a KIND atom</span> <span class="cwebmacronumber">6.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="identifier">TEST_ATOM_TASK:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">assert_kind</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">))</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"*1 ofclass %n"</span><span class="plain">,</span>
<span class="functiontext"><a href="13-rsfk.html#SP3">Kinds::RunTime::I6_classname</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="identifier">assert_kind</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::get_construct</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">assert_kind</span><span class="plain">) == </span><span class="identifier">CON_list_of</span><span class="plain">) &amp;&amp; (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="constant">0</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"><a href="2-sq.html#SP3">Problems::quote_kind</a></span><span class="plain">(2, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">assert_kind</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantCheckListContents</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In %1, you use a list which might or might not match a "</span>
<span class="string">"definition requiring %2. But there's no efficient way to "</span>
<span class="string">"tell during play whether the list actually contains that, "</span>
<span class="string">"without laboriously checking every entry. Because "</span>
<span class="string">"in general this would be a bad idea, this usage is "</span>
<span class="string">"not allowed."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"true"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_TRUE_TASK:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_FALSE_TASK:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suppress_C14CantChangeKind</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="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantChangeKind</span><span class="plain">),</span>
<span class="string">"the kind of something is fixed"</span><span class="plain">,</span>
<span class="string">"and cannot be changed during play with a 'now'."</span><span class="plain">);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">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><span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b>An easy case. Note that <code class="display"><span class="extract">FoundEverywhere</span></code> is a template routine existing
to provide a common value of the I6 <code class="display"><span class="extract">found_in</span></code> property &mdash; common that is
to all backdrops which are currently everywhere.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for an EVERYWHERE atom</span> <span class="cwebmacronumber">6.3</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="identifier">TEST_ATOM_TASK:</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"BackdropEverywhere(*1)"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_TRUE_TASK:</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"MoveObject(*1, FoundEverywhere); MoveFloatingObjects();"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_FALSE_TASK:</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantChangeEverywhere</span><span class="plain">),</span>
<span class="string">"not being 'everywhere' is not something which can be changed "</span>
<span class="string">"during play using 'now'"</span><span class="plain">,</span>
<span class="string">"because it's not exact enough about what needs to be done."</span><span class="plain">);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">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">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. </b>And another.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for a NOWHERE atom</span> <span class="cwebmacronumber">6.4</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="identifier">TEST_ATOM_TASK:</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"LocationOf(*1) == nothing"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_TRUE_TASK:</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"RemoveFromPlay(*1);"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_FALSE_TASK:</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"MoveObject(*1, real_location, 1, false);"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_5"></a><b>&#167;6.5. </b>And another. (In fact, at present <code class="display"><span class="extract">HERE</span></code> atoms are never included in
propositions to be compiled, so this code is never used.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for a HERE atom</span> <span class="cwebmacronumber">6.5</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="identifier">TEST_ATOM_TASK:</span>
<span class="functiontext"><a href="12-is.html#SP4_1">Calculus::Schemas::modify</a></span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"LocationOf(*1) == location"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_TRUE_TASK:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOW_ATOM_FALSE_TASK:</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></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="string">"being 'here' is not something which can be changed during play"</span><span class="plain">,</span>
<span class="string">"so it cannot be brought about or cancelled out with 'now'."</span><span class="plain">);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">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">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_6"></a><b>&#167;6.6. </b>The last unary atom is an adjective, for which we hand over to the general
adjective apparatus.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for a unary predicate</span> <span class="cwebmacronumber">6.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">atask</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment"> redundant assignment to appease <code class="display"><span class="extract">gcc -O2</span></code></span>
<span class="identifier">adjective_usage</span><span class="plain"> *</span><span class="identifier">tr</span><span class="plain"> = </span><span class="identifier">RETRIEVE_POINTER_adjective_usage</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">predicate</span><span class="plain">);</span>
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">aph</span><span class="plain"> = </span><span class="identifier">AdjectiveUsages::get_aph</span><span class="plain">(</span><span class="identifier">tr</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">AdjectiveUsages::get_parity</span><span class="plain">(</span><span class="identifier">tr</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">asch</span><span class="plain">.</span><span class="element">negate_schema</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">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">constant</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">term_checked_as_kind</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">term_checked_as_kind</span><span class="plain"> = </span><span class="functiontext"><a href="14-sp.html#SP1">Specifications::to_kind</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">constant</span><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="identifier">TEST_ATOM_TASK:</span><span class="plain"> </span><span class="identifier">atask</span><span class="plain"> = </span><span class="constant">TEST_ADJECTIVE_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="identifier">NOW_ATOM_TRUE_TASK:</span><span class="plain"> </span><span class="identifier">atask</span><span class="plain"> = </span><span class="constant">NOW_ADJECTIVE_TRUE_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="identifier">NOW_ATOM_FALSE_TASK:</span><span class="plain"> </span><span class="identifier">atask</span><span class="plain"> = </span><span class="constant">NOW_ADJECTIVE_FALSE_TASK</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PREDICATE_CALCULUS_WORKINGS</span><span class="plain">, </span><span class="string">"Unary predicate: $o, on: $u\n"</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">term_checked_as_kind</span><span class="plain">);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">schema</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP28">Adjectives::Meanings::get_i6_schema</a></span><span class="plain">(</span><span class="identifier">aph</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">term_checked_as_kind</span><span class="plain">, </span><span class="identifier">atask</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_7"></a><b>&#167;6.7. </b>Delegation is similarly the art of compiling a BP:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make an annotated schema for a binary predicate</span> <span class="cwebmacronumber">6.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain"> = </span><span class="identifier">RETRIEVE_POINTER_binary_predicate</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">predicate</span><span class="plain">);</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp_to_assert</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Undo any functional simplification of the relation</span> <span class="cwebmacronumber">6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">schema</span><span class="plain"> = </span><span class="functiontext"><a href="6-bp.html#SP47">BinaryPredicates::get_i6_schema</a></span><span class="plain">(</span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">bp_to_assert</span><span class="plain">, &amp;</span><span class="identifier">asch</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_7_1"></a><b>&#167;6.7.1. </b>When a relation \(R(x, y)\) has been simplified to \(is(x, f_R(y))\)
or \(is(g_R(x), y)\), it can be tested but not asserted true or false;
we have to re-establish \(R(x, y)\) before we can proceed.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Undo any functional simplification of the relation</span> <span class="cwebmacronumber">6.7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">task</span><span class="plain"> != </span><span class="constant">TEST_ATOM_TASK</span><span class="plain">) &amp;&amp; (</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">R_equality</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">function</span><span class="plain">) {</span>
<span class="identifier">bp_to_assert</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">function</span><span class="plain">-&gt;</span><span class="element">bp</span><span class="plain">;</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">pt0</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[0].</span><span class="element">function</span><span class="plain">-&gt;</span><span class="element">fn_of</span><span class="plain">;</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">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[1].</span><span class="element">function</span><span class="plain">) {</span>
<span class="identifier">bp_to_assert</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[1].</span><span class="element">function</span><span class="plain">-&gt;</span><span class="element">bp</span><span class="plain">;</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">pt1</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[1].</span><span class="element">function</span><span class="plain">-&gt;</span><span class="element">fn_of</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp_to_assert</span><span class="plain"> == </span><span class="identifier">R_equality</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"contraction of predicate applied to equality"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp_to_assert</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">bp_to_assert</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="12-ca.html#SP6_7">&#167;6.7</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Atoms::Compile::atom_involves_action_variables<button class="popup" onclick="togglePopup('usagePopup797')">...<span class="popuptext" id="usagePopup797">Usage of <b>Calculus::Atoms::Compile::atom_involves_action_variables</b>:<br><a href="12-ca.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">arity</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">operand</span><span class="plain"> = </span><span class="functiontext"><a href="11-tr.html#SP7">Calculus::Terms::constant_underlying</a></span><span class="plain">(&amp;(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">terms</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PL::Actions::Patterns::is_an_action_variable</span><span class="plain">(</span><span class="identifier">operand</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="identifier">endif</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="inwebparagraph"><a id="SP8"></a><b>&#167;8. An unannotated one. </b></p>
<pre class="display">
<span class="reserved">annotated_i6_schema</span><span class="plain"> </span><span class="functiontext">Calculus::Atoms::Compile::blank_asch<button class="popup" onclick="togglePopup('usagePopup798')">...<span class="popuptext" id="usagePopup798">Usage of <b>Calculus::Atoms::Compile::blank_asch</b>:<br>Relations - <a href="6-rlt.html#SP15_2_2">&#167;15.2.2</a>, <a href="6-rlt.html#SP15_2_3">&#167;15.2.3</a>, <a href="6-rlt.html#SP15_2_4">&#167;15.2.4</a></span></button></span><span class="plain">(</span><span class="reserved">void</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">asch</span><span class="plain">.</span><span class="element">schema</span><span class="plain"> = </span><span class="functiontext"><a href="12-is.html#SP4">Calculus::Schemas::new</a></span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">negate_schema</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">pt0</span><span class="plain"> = </span><span class="functiontext"><a href="11-tr.html#SP4">Calculus::Terms::new_variable</a></span><span class="plain">(0);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">pt1</span><span class="plain"> = </span><span class="functiontext"><a href="11-tr.html#SP4">Calculus::Terms::new_variable</a></span><span class="plain">(0);</span>
<span class="identifier">asch</span><span class="plain">.</span><span class="element">involves_action_variables</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">asch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="12-is.html">Back to 'I6 Schemas'</a></li><li><a href="12-dtd.html">Continue with 'Deciding to Defer'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>
</main>
</body>
</html>