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

215 lines
20 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>15/ia</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '15/tpr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>The Provision Relation</b></li></ul><p class="purpose">To define the provision relation, which determines which properties can be held by which objects.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Initial stock</a></li><li><a href="#SP4">&#167;4. Second stock</a></li><li><a href="#SP5">&#167;5. Typechecking</a></li><li><a href="#SP6">&#167;6. Assertion</a></li><li><a href="#SP7">&#167;7. Compilation</a></li><li><a href="#SP8">&#167;8. Problem message text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>As we've seen, assertions assigning properties ("A scene has a time called
the expected duration") result in properties being created &mdash; here "expected
duration" &mdash; and then in suitable propositions being asserted as true.
</p>
<p class="inwebparagraph">These propositions are written in terms of the provision predicate: for
example, provision(scene, expected duration). This is the only way to
grant permission to hold a property within the world model.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_provision</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Initial stock. </b>There's just one relation of this kind, and it's hard-wired in.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::ProvisionRelation::REL_create_initial_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">R_provision</span><span class="plain"> =</span>
<span class="functiontext">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="constant">PROVISION_KBP</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="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">"provides"</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">Preform::Nonparsing::wording</span><span class="plain">(&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="identifier">names</span><span class="plain">&gt;, </span><span class="constant">PROVISION_RELATION_NAME</span><span class="plain">));</span>
<span class="functiontext">BinaryPredicates::set_index_details</span><span class="plain">(</span><span class="identifier">R_provision</span><span class="plain">, </span><span class="string">"value"</span><span class="plain">, </span><span class="string">"property"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::ProvisionRelation::REL_create_initial_stock is used in 6/bp (<a href="6-bp.html#SP45">&#167;45</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Second stock. </b>There is none, of course.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::ProvisionRelation::REL_create_second_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::ProvisionRelation::REL_create_second_stock is used in 6/bp (<a href="6-bp.html#SP46">&#167;46</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Typechecking. </b>Any property can in principle be assigned to any inference subject (as we'll
see in the next chapter), so there's really no restriction on the left term.
The right term, of course, has to be a property.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::ProvisionRelation::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">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="reserved">return</span><span class="plain"> </span><span class="identifier">ALWAYS_MATCH</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::Issue::tcp_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadProvides</span><span class="plain">), </span><span class="identifier">tck</span><span class="plain">,</span>
<span class="string">"that asks whether something provides something, and in Inform 'to provide' "</span>
<span class="string">"means that an object (or value) has a property attached - for instance, "</span>
<span class="string">"containers provide the property 'carrying capacity'. Here, though, we have "</span>
<span class="string">"%4 rather than the name of a property."</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">The function Properties::ProvisionRelation::REL_typecheck is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Assertion. </b>If we assert that, say, vehicles provide "colour", then we are implicitly
enabling adjectives like "green" or "blue" to apply to vehicles, so we
must make sure any such meanings are defined.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::ProvisionRelation::REL_assert</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec0</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs1</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec1</span><span class="plain">) {</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_property</span><span class="plain">(</span><span class="identifier">spec1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">infs0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">prn</span><span class="plain">)) {</span>
<span class="functiontext">World::Permissions::grant</span><span class="plain">(</span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Instances::update_adjectival_forms</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::ProvisionRelation::REL_assert is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Compilation. </b>Run-time is too late to change which objects provide what, so this relation
can't be changed at compile time.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::ProvisionRelation::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="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">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">-</span><span class="element">&gt;pt0</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="functiontext">Rvalues::to_property</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;pt1.constant</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</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="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>
&lt;<span class="cwebmacro">Compile an I6 run-time test of property provision</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span>
&lt;<span class="cwebmacro">Determine the result now, since we know already, and compile only the outcome</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</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="identifier">kind</span><span class="plain"> *</span><span class="identifier">PK</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">-</span><span class="element">&gt;pt1</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">PK</span><span class="plain">) == </span><span class="identifier">CON_property</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">Kinds::unary_construction_material</span><span class="plain">(</span><span class="identifier">PK</span><span class="plain">)))</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"WhetherProvides(*1, true, *2)"</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"WhetherProvides(*1, false, *2)"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::ProvisionRelation::REL_compile is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>Since type-checking for "object" is too weak to make it certain what kind
of object the left operand is, we can only test property provision at run-time:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Compile an I6 run-time test of property provision</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Properties::is_value_property</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">))</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"WhetherProvides(*1, false, *2)"</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"WhetherProvides(*1, true, *2)"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>For all other kinds, type-checking is strong enough that we can prove the
answer now.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Determine the result now, since we know already, and compile only the outcome</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">World::Permissions::find</span><span class="plain">(</span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">), </span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">))</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"true"</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">asch</span><span class="plain">-</span><span class="element">&gt;schema</span><span class="plain">, </span><span class="string">"false"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Problem message text. </b>Nothing special is needed here.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::ProvisionRelation::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::ProvisionRelation::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-ia.html">Back to 'Indefinite Appearance'</a></li><li><a href="15-ma.html">Continue with 'Measurement Adjectives'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>