1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/core-module/15-spr2.html
2020-04-07 01:06:09 +01:00

444 lines
43 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>15/spr</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="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></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="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</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="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '15/spr2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Setting Property Relation</b></li></ul><p class="purpose">Each value property has an associated relation to set its value.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Initial stock</a></li><li><a href="#SP2">&#167;2. Subsequent creations</a></li><li><a href="#SP7">&#167;7. Second stock</a></li><li><a href="#SP9">&#167;9. Typechecking</a></li><li><a href="#SP10">&#167;10. Assertion</a></li><li><a href="#SP11">&#167;11. Compilation</a></li><li><a href="#SP13">&#167;13. Problem message text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Initial stock. </b>There is no initial stock of these, since there are no value properties yet
when Inform starts up.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::REL_create_initial_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 Properties::SettingRelations::REL_create_initial_stock is used in 6/bp (<a href="6-bp.html#SP45">&#167;45</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Subsequent creations. </b>Relations like this lead to a timing problem, because we have to create the
relation early enough that we can make sense of the sentences in the source
text; but at that early time, the properties haven't been created yet. We
therefore store the text of the property name (say, "weight") in
<code class="display"><span class="extract">property_pending_text</span></code> and come back to it later on.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Properties::SettingRelations::make_set_property_BP</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="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain"> = </span><span class="functiontext">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="constant">PROPERTY_SETTING_KBP</span><span class="plain">,</span>
<span class="functiontext">BinaryPredicates::new_term</span><span class="plain">(</span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_object</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">"set-property"</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">NULL</span><span class="plain">, </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">());</span>
<span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">reversal</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">bp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::make_set_property_BP is used in <a href="#SP6">&#167;6</a>, 6/nv (<a href="6-nv.html#SP14_1">&#167;14.1</a>), 15/vp (<a href="15-vp.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Meanwhile, we can't look up the BP with reference to the property, since
the property may not exist yet; we have to use the text of the name of the
property as a key, clumsy as that may seem.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Properties::SettingRelations::find_set_property_BP</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="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain">))</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">right_way_round</span><span class="plain">)</span>
<span class="reserved">return</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">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::find_set_property_BP is used in 15/vp (<a href="15-vp.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>...And now it's "later on". We fix these BPs in original-reversal pairs, so
that the two can never fall out of step.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::fix_property_bp</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">binary_predicate</span><span class="plain"> *</span><span class="identifier">bpr</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">reversal</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="identifier">bp</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">bpr</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">bp_created_at</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span><span class="comment">a problem was issued</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">set_property</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">; </span><span class="identifier">bpr</span><span class="plain">-&gt;</span><span class="element">set_property</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">right_way_round</span><span class="plain">) </span><span class="functiontext">Properties::SettingRelations::set_property_BP_schemas</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::set_property_BP_schemas</span><span class="plain">(</span><span class="identifier">bpr</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::fix_property_bp is used in <a href="#SP7">&#167;7</a>, 9/rk (<a href="9-rk.html#SP1_1">&#167;1.1</a>), 15/vp (<a href="15-vp.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>When properties are named as part of relation definitions, for instance, like so:
</p>
<blockquote>
<p>The verb to weigh (it weighs, they weigh, it is weighing) implies the weight property.</p>
</blockquote>
<p class="inwebparagraph">...then its name (in this case "weight") is required to pass:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">either</span><span class="plain">-</span><span class="identifier">or</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_RelationWithEitherOrProperty problem</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">value</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_RelationWithBadProperty problem</span> <span class="cwebmacronumber">5.2</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_RelationWithEitherOrProperty problem</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</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">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RelationWithEitherOrProperty</span><span class="plain">),</span>
<span class="string">"verbs can only set properties with values"</span><span class="plain">,</span>
<span class="string">"not either/or properties like this one."</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><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_RelationWithBadProperty problem</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</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">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RelationWithBadProperty</span><span class="plain">),</span>
<span class="string">"that doesn't seem to be a property"</span><span class="plain">,</span>
<span class="string">"perhaps because you haven't defined it yet?"</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>No such funny business is necessary for a nameless property created within
Inform:
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Properties::SettingRelations::make_set_nameless_property_BP</span><span class="plain">(</span><span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</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="functiontext">Properties::SettingRelations::make_set_property_BP</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">);</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bpr</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">reversal</span><span class="plain">;</span>
<span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">set_property</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">; </span><span class="identifier">bpr</span><span class="plain">-&gt;</span><span class="element">set_property</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
<span class="functiontext">Properties::SettingRelations::set_property_BP_schemas</span><span class="plain">(</span><span class="identifier">bp</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">bp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::make_set_nameless_property_BP is used in 15/vp (<a href="15-vp.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Second stock. </b>The following is called after all properties have been created, making it
the perfect opportunity to go over all of the property-setting BPs:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::REL_create_second_stock</span><span class="plain">(</span><span class="reserved">void</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">LOOP_OVER</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="reserved">binary_predicate</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">property_pending_text</span><span class="plain">))</span>
<span class="functiontext">Properties::SettingRelations::fix_property_bp</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::REL_create_second_stock is used in 6/bp (<a href="6-bp.html#SP46">&#167;46</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Note that we read and write to the property directly, without asking the
template layer to check if the given object has permission to possess that
property. We can afford to do this because type-checking at compile time
guarantees that it does have permission, and as a result we gain some speed
and simplicity.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::set_property_BP_schemas</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">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">) {</span>
<span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">test_function</span><span class="plain"> =</span>
<span class="functiontext">Calculus::Schemas::new</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="identifier">bp</span><span class="plain">-&gt;</span><span class="element">make_true_function</span><span class="plain"> =</span>
<span class="functiontext">Calculus::Schemas::new</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="functiontext">BinaryPredicates::set_term_domain</span><span class="plain">(&amp;(</span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">term_details</span><span class="plain">[1]),</span>
<span class="functiontext">Properties::Valued::kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::set_property_BP_schemas is used in <a href="#SP4">&#167;4</a>, <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Typechecking. </b>Suppose we are setting property P of subject S to value V. Then the setting
relation has terms S and V. To pass typechecking, we require that V be
valid for the kind of value stored in P, and that S have a kind a value
allowing it to possess properties in general. But we don't require
that it possesses this one.
</p>
<p class="inwebparagraph">This is because we can't know whether it does or not until model completion,
much later on, because we don't necessarily know the kind of value of S.
It might be an object which will eventually be deduced to be a room, for
instance, but hasn't been yet.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::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="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">set_property</span><span class="plain">;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">val_kind</span><span class="plain"> = </span><span class="functiontext">Properties::Valued::kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Require the value to be type-safe for storage in the property</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Require the subject to be able to have properties</span> <span class="cwebmacronumber">9.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 Properties::SettingRelations::REL_typecheck is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b>The following lets just a few type-unsafe cases fall through the net. It's
superficially attractive to reject them here, but (a) that would result in
less specific problem messages which can be issued later on, notably for
the "opposite" property of directions; and (b) we must be careful because
in assertion traverse 2 not every object yet has its final kind &mdash; for
many implicitly created objects, they have yet to be declared as room,
container and supporter.
</p>
<p class="inwebparagraph">As a result, type-unsafe property assertions do occur, and these have to
be caught later on Inform's run.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Require the value to be type-safe for storage in the property</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">safe</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">compatible</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">val_kind</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compatible</span><span class="plain"> == </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">) </span><span class="identifier">safe</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">compatible</span><span class="plain"> == </span><span class="identifier">SOMETIMES_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">val_kind</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">safe</span><span class="plain"> = </span><span class="identifier">TRUE</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">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">val_kind</span><span class="plain">, </span><span class="identifier">K_direction</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">val_kind</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">val_kind</span><span class="plain">, </span><span class="identifier">K_container</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">val_kind</span><span class="plain">, </span><span class="identifier">K_supporter</span><span class="plain">))) </span><span class="identifier">safe</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">safe</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Property value given as $u not $u\n"</span><span class="plain">, </span><span class="identifier">kinds_of_terms</span><span class="plain">[1], </span><span class="identifier">val_kind</span><span class="plain">);</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::quote_kind</span><span class="plain">(5, </span><span class="identifier">val_kind</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">kinds_of_terms</span><span class="plain">[1]) == </span><span class="identifier">CON_property</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_PropertiesEquated</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"that seems to say that two different properties are the same - "</span>
<span class="string">"like saying 'The indefinite article is the printed name': that "</span>
<span class="string">"might be true for some things, some of the time, but it makes no "</span>
<span class="string">"sense in a general statement like this one."</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">prn</span><span class="plain"> == </span><span class="identifier">NULL</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_UnknownPropertyType</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"that tries to set the value of an unknown property to %4."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Problems::quote_property</span><span class="plain">(6, </span><span class="identifier">prn</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_PropertyType</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"that tries to set the value of the '%6' property to %4 - which "</span>
<span class="string">"must be wrong because this property has to be %5."</span><span class="plain">);</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="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_2"></a><b>&#167;9.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Require the subject to be able to have properties</span> <span class="cwebmacronumber">9.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Behaviour::has_properties</span><span class="plain">(</span><span class="identifier">kinds_of_terms</span><span class="plain">[0]) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Property value for impossible domain $u\n"</span><span class="plain">, </span><span class="identifier">kinds_of_terms</span><span class="plain">[0]);</span>
<span class="functiontext">Problems::quote_kind</span><span class="plain">(4, </span><span class="identifier">kinds_of_terms</span><span class="plain">[0]);</span>
<span class="functiontext">Problems::quote_property</span><span class="plain">(5, </span><span class="identifier">prn</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">BelievedImpossible</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"that tries to set the property '%5' for %4. Values of that kind "</span>
<span class="string">"are not allowed to have properties. (Some kinds of value are, "</span>
<span class="string">"some aren't - see the Kinds index for details. It's a matter "</span>
<span class="string">"of what is practical in terms of how much memory is needed.)"</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="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Assertion. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::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="functiontext">World::Inferences::draw_property</span><span class="plain">(</span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">set_property</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::REL_assert is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Compilation. </b>We need do nothing special: these relations can be compiled from their schemas.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::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">K</span><span class="plain"> = </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">-&gt;</span><span class="element">pt0</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">K</span><span class="plain">, </span><span class="identifier">K_object</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="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">set_property</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="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-&gt;</span><span class="element">schema</span><span class="plain">,</span>
<span class="string">"GProperty(%k, *1, %n) == *2"</span><span class="plain">, </span><span class="identifier">K</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">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="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="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-&gt;</span><span class="element">schema</span><span class="plain">,</span>
<span class="string">"WriteGProperty(%k, *1, %n, *2)"</span><span class="plain">, </span><span class="identifier">K</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">break</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::SettingRelations::REL_compile is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::bp_sets_a_property</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">if</span><span class="plain"> ((</span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">set_property</span><span class="plain">) || (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">-&gt;</span><span class="element">property_pending_text</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 Properties::SettingRelations::bp_sets_a_property is used in 9/ma (<a href="9-ma.html#SP3_3_34_3">&#167;3.3.34.3</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Problem message text. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::SettingRelations::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 Properties::SettingRelations::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><a href="15-spr.html">Back to 'Same Property Relation'</a></li><li><a href="15-pov.html">Continue with 'Properties of Values'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>