mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 16:44:21 +03:00
191 lines
17 KiB
HTML
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">★</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">§1. Managing the BPs generated</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§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">§46</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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">§47</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§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>
|
|
|
|
<<span class="cwebmacro">Reject non-assertable relations</span> <span class="cwebmacronumber">3.1</span>><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><<span class="cwebmacro">Reject relationship with nothing</span> <span class="cwebmacronumber">3.2</span>><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">) && (</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">) && (</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">§47</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_1"></a><b>§3.1. </b>This is the point at which non-assertable relations are thrown out.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Reject non-assertable relations</span> <span class="cwebmacronumber">3.1</span>> =
|
|
</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">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_2"></a><b>§3.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Reject relationship with nothing</span> <span class="cwebmacronumber">3.2</span>> =
|
|
</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">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§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">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§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">§47</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">§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>
|
|
|