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/6-er.html
2019-04-22 15:42:10 +01:00

191 lines
17 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>6/rlt</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 '6/er' 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#6">Chapter 6: Verbs</a></li><li><b>Explicit Relations</b></li></ul><p class="purpose">To draw inferences from the relations created explicitly by the source text.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Managing the BPs generated</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Managing the BPs generated. </b>The relations created in this section belong to the <code class="display"><span class="extract">EXPLICIT_KBP</span></code> family,
named so because their definitions are explicit in the source text. Initially,
there are none.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Relations::Explicit::REL_create_initial_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Relations::Explicit::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 Relations::Explicit::REL_create_initial_stock is used in 6/bp (<a href="6-bp.html#SP45">&#167;45</a>).</p>
<p class="endnote">The function Relations::Explicit::REL_create_second_stock is used in 6/bp (<a href="6-bp.html#SP46">&#167;46</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>They typecheck by the default rule only:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Relations::Explicit::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">return</span><span class="plain"> </span><span class="constant">DECLINE_TO_MATCH</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Relations::Explicit::REL_typecheck is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>They are asserted thus. Note that if we have a symmetric relation then we need
to behave as if B(y, x) had also been asserted whenever B(x, y) has, if
x!= y.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Relations::Explicit::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>
&lt;<span class="cwebmacro">Reject non-assertable relations</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">BinaryPredicates::store_dynamically</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">)) {</span>
<span class="functiontext">World::Inferences::draw_relation_spec</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">spec0</span><span class="plain">, </span><span class="identifier">spec1</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">infs0</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">infs1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Reject relationship with nothing</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">BinaryPredicates::allow_arbitrary_assertions</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">)) {</span>
<span class="functiontext">World::Inferences::draw_relation</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">infs1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">BinaryPredicates::get_form_of_relation</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">) == </span><span class="constant">Relation_Sym_VtoV</span><span class="plain">) &amp;&amp; (</span><span class="identifier">infs0</span><span class="plain"> != </span><span class="identifier">infs1</span><span class="plain">))</span>
<span class="functiontext">World::Inferences::draw_relation</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">infs1</span><span class="plain">, </span><span class="identifier">infs0</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">if</span><span class="plain"> (</span><span class="functiontext">BinaryPredicates::is_explicit_with_runtime_storage</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">)) {</span>
<span class="functiontext">Relations::Explicit::infer_property_based_relation</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">infs1</span><span class="plain">, </span><span class="identifier">infs0</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">BinaryPredicates::get_form_of_relation</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">) == </span><span class="constant">Relation_Sym_OtoO</span><span class="plain">) &amp;&amp; (</span><span class="identifier">infs0</span><span class="plain"> != </span><span class="identifier">infs1</span><span class="plain">))</span>
<span class="functiontext">Relations::Explicit::infer_property_based_relation</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">infs0</span><span class="plain">, </span><span class="identifier">infs1</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Relations::Explicit::REL_assert is used in 6/bp (<a href="6-bp.html#SP47">&#167;47</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>This is the point at which non-assertable relations are thrown out.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Reject non-assertable relations</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">BinaryPredicates::can_be_made_true_at_runtime</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Unassertable2</span><span class="plain">),</span>
<span class="string">"the relationship you describe is not exact enough"</span><span class="plain">,</span>
<span class="string">"so that I do not know how to make this assertion come true. "</span>
<span class="string">"For instance, saying 'The Study is adjacent to the Hallway.' "</span>
<span class="string">"is not good enough because I need to know in what direction: "</span>
<span class="string">"is it east of the Hallway, perhaps, or west?"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Reject relationship with nothing</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantRelateNothing</span><span class="plain">),</span>
<span class="string">"the relationship you describe seems to be with nothing"</span><span class="plain">,</span>
<span class="string">"which does not really make sense. 'Nothing' looks like a noun, "</span>
<span class="string">"but really Inform uses it to mean the absence of one, so it's "</span>
<span class="string">"against the rules to say something like 'Mr Cogito disputes nothing' "</span>
<span class="string">"to try to put 'Mr Cogito' and 'nothing' into a relationship."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>This routine converts the knowledge that R(ox, oy) into a single
inference. It can only be used for a simple subclass of the relations:
those which store <code class="display"><span class="extract">oy</span></code>, the only thing related to <code class="display"><span class="extract">ox</span></code>, in a given property
of <code class="display"><span class="extract">ox</span></code>. The beauty of this is that the "only thing related to" business
is then enforced by the inference mechanism, since an attempt to assert
both R(x,y) and R(x,z) will result in contradictory property value
inferences for y and z.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Relations::Explicit::infer_property_based_relation</span><span class="plain">(</span><span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">relation</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="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs1</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">BinaryPredicates::get_form_of_relation</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">) == </span><span class="constant">Relation_VtoO</span><span class="plain">) {</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">swap</span><span class="plain">=</span><span class="identifier">infs0</span><span class="plain">; </span><span class="identifier">infs0</span><span class="plain">=</span><span class="identifier">infs1</span><span class="plain">; </span><span class="identifier">infs1</span><span class="plain">=</span><span class="identifier">swap</span><span class="plain">;</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">BinaryPredicates::get_i6_storage_property</span><span class="plain">(</span><span class="identifier">relation</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">prn</span><span class="plain">, </span><span class="functiontext">InferenceSubjects::as_constant</span><span class="plain">(</span><span class="identifier">infs1</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Relations::Explicit::infer_property_based_relation is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </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">Relations::Explicit::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">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 Relations::Explicit::REL_compile 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. </b>Problem message text:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Relations::Explicit::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 Relations::Explicit::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="6-rlt.html">Back to 'Relations'</a></li><li><a href="6-tur.html">Continue with 'The Universal Relation'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>