1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/3-sr.html

410 lines
48 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/sm</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 '3/sr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">if</a></li><li><a href="index.html#3">Chapter 3: Space and Time</a></li><li><b>Spatial Relations</b></li></ul><p class="purpose">A continuation of the Spatial plugin which defines the binary predicates corresponding to basic spatial relationships.</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>So this section of code is all about the following:
</p>
<pre class="display">
<span class="comment">fundamental spatial relationships</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_containment</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_support</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_incorporation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_carrying</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_holding</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_wearing</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">room_containment_predicate</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="comment">indirect spatial relationships</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_visibility</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_touchability</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_concealment</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_enclosure</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>These relations are all hard-wired in.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::SpatialRelations::REL_create_initial_stock</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Make built-in spatial relationships</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Make built-in indirect spatial relationships</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">PL::MapDirections::create_relations</span><span class="plain">();</span>
<span class="functiontext">PL::Regions::create_relations</span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::SpatialRelations::REL_create_initial_stock appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>Containment, support, incorporation, carrying, holding, wearing and
possession. The "loop parent optimisation" is explained elsewhere, but
the basic idea is that given a fixed y you can search for all x such
that B(x, y) by looking at the object-tree children of y at run-time.
On a large work of IF, this cuts the number of cases to check by a factor
of 100 or more. (But it can't be used for component parts, since those are
not stored in the I6 object tree; nor for the holding relation, since that's
a union of the others, and therefore includes incorporation.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make built-in spatial relationships</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">R_containment</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</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">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"ContainerOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">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">"contains"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-in"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MoveObject(*2,*1)"</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="identifier">CONTAINMENT_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_containment</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_proviso</span><span class="plain"> = </span><span class="string">"ContainerOf"</span><span class="plain">;</span>
<span class="identifier">R_containment</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_ranger</span><span class="plain"> = </span><span class="string">"TestContainmentRange"</span><span class="plain">;</span>
<span class="identifier">BinaryPredicates::set_index_details</span><span class="plain">(</span><span class="identifier">R_containment</span><span class="plain">, </span><span class="string">"container/room"</span><span class="plain">, </span><span class="string">"thing"</span><span class="plain">);</span>
<span class="identifier">R_support</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">infs_supporter</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"SupporterOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"supports"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-on"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MoveObject(*2,*1)"</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="identifier">SUPPORT_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_support</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_proviso</span><span class="plain"> = </span><span class="string">"SupporterOf"</span><span class="plain">;</span>
<span class="identifier">R_incorporation</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"(*1.component_parent)"</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"incorporates"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-part-of"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MakePart(*2,*1)"</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="identifier">INCORPORATION_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_carrying</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">infs_person</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"CarrierOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"carries"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-carried-by"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MoveObject(*2,*1)"</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="identifier">CARRYING_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_carrying</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_proviso</span><span class="plain"> = </span><span class="string">"CarrierOf"</span><span class="plain">;</span>
<span class="identifier">R_holding</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">infs_person</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"HolderOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"holds"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-held-by"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MoveObject(*2,*1)"</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="identifier">HOLDING_RELATION_NAME</span><span class="plain">));</span>
<span class="comment">can't be optimised, because parts are also held</span>
<span class="identifier">R_wearing</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">infs_person</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"WearerOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"wears"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-worn-by"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"WearObject(*2,*1)"</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="identifier">WEARING_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_wearing</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_proviso</span><span class="plain"> = </span><span class="string">"WearerOf"</span><span class="plain">;</span>
<span class="identifier">a_has_b_predicate</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</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">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"OwnerOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">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">"has"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-had-by"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MoveObject(*2,*1)"</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="identifier">POSSESSION_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">a_has_b_predicate</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_proviso</span><span class="plain"> = </span><span class="string">"OwnerOf"</span><span class="plain">;</span>
<span class="identifier">BinaryPredicates::set_index_details</span><span class="plain">(</span><span class="identifier">a_has_b_predicate</span><span class="plain">, </span><span class="string">"person"</span><span class="plain">, </span><span class="string">"thing"</span><span class="plain">);</span>
<span class="identifier">room_containment_predicate</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::full_new_term</span><span class="plain">(</span><span class="identifier">infs_room</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"LocationOf(*1)"</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"is-room-of"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-in-room"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"MoveObject(*2,*1)"</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="identifier">ROOM_CONTAINMENT_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">room_containment_predicate</span><span class="plain">-&gt;</span><span class="identifier">loop_parent_optimisation_proviso</span><span class="plain"> = </span><span class="string">"LocationOf"</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>Visibility, touchability, concealment and enclosure: all relations which
can be tested at run-time, but which can't be asserted or made true or false.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make built-in indirect spatial relationships</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">R_visibility</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"can-see"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"can-be-seen-by"</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">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"TestVisibility(*1,*2)"</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="identifier">VISIBILITY_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_touchability</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"can-touch"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"can-be-touched-by"</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">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"TestTouchability(*1,*2)"</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="identifier">TOUCHABILITY_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_concealment</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_thing</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"conceals"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-concealed-by"</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">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"TestConcealment(*1,*2)"</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="identifier">CONCEALMENT_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">R_enclosure</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">)),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">)),</span>
<span class="identifier">I</span><span class="string">"encloses"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"is-enclosed-by"</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">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"IndirectlyContains(*1,*2)"</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="identifier">ENCLOSURE_RELATION_NAME</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. Second stock. </b>There is none &mdash; this is a family of relations which is all built in.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::SpatialRelations::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 PL::SpatialRelations::REL_create_second_stock appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Typechecking. </b>No special rules apply.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::SpatialRelations::REL_typecheck</span><span class="plain">(</span><span class="identifier">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="identifier">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="identifier">DECLINE_TO_MATCH</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::SpatialRelations::REL_typecheck appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Assertion. </b>"In" requires delicate handling, because of the way that English uses it
sometimes transitively and sometimes not. "The passport is in the desk",
"The passport is in the Dining Room" and "The passport is in Venezuela"
place the same object in a container, a room or a region respectively.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::SpatialRelations::REL_assert</span><span class="plain">(</span><span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">,</span>
<span class="identifier">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="identifier">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="identifier">instance</span><span class="plain"> *</span><span class="identifier">I0</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::as_object_instance</span><span class="plain">(</span><span class="identifier">infs0</span><span class="plain">),</span>
<span class="plain">*</span><span class="identifier">I1</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::as_object_instance</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="identifier">I0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">I1</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I1</span><span class="plain"> == </span><span class="identifier">I0</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_MiseEnAbyme</span><span class="plain">),</span>
<span class="string">"this asks to put something inside itself"</span><span class="plain">,</span>
<span class="string">"like saying 'the bottle is in the bottle'."</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>
&lt;<span class="cwebmacro">Offer our dependent plugins a chance to assert the relation instead</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">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>
&lt;<span class="cwebmacro">Issue a problem message for an unassertable indirect spatial relation</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">)))</span>
&lt;<span class="cwebmacro">Issue a problem message for trying to subdivide a room</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Draw inferences using only the standard Spatial conventions</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">R_wearing</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Assert the worn and wearable properties</span> <span class="cwebmacronumber">6.5</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">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 PL::SpatialRelations::REL_assert appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>Note that Backdrops needs to take priority over Regions here; the case of
putting a backdrop inside a region clearly has to be implemented in some
way which isn't symmetrical between the two, and this way round is cleanest.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Offer our dependent plugins a chance to assert the relation instead</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Backdrops::assert_relations</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">I1</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">if</span><span class="plain"> (</span><span class="functiontext">PL::MapDirections::assert_relations</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">I1</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">if</span><span class="plain"> (</span><span class="functiontext">PL::Regions::assert_relations</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">I1</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="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b>This is the point at which non-assertable relations are thrown out.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue a problem message for an unassertable indirect spatial relation</span> <span class="cwebmacronumber">6.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_Unassertable</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b>People sometimes try, a little hopefully, to subdivide rooms. Alas for them.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Issue a problem message for trying to subdivide a room</span> <span class="cwebmacronumber">6.3</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_PartOfRoom</span><span class="plain">),</span>
<span class="string">"this asks to make something a part of a room"</span><span class="plain">,</span>
<span class="string">"when only things are allowed to have parts."</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="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. </b>So we can forget about the complications of backdrops and regions now.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Draw inferences using only the standard Spatial conventions</span> <span class="cwebmacronumber">6.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">item</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">);</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I0</span><span class="plain">);</span>
<span class="identifier">World::Inferences::draw</span><span class="plain">(</span><span class="constant">PART_OF_INF</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">)?</span><span class="identifier">CERTAIN_CE</span><span class="plain">:</span><span class="identifier">IMPOSSIBLE_CE</span><span class="plain">,</span>
<span class="identifier">loc</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bp</span><span class="plain"> == </span><span class="identifier">R_containment</span><span class="plain">)</span>
<span class="identifier">World::Inferences::draw</span><span class="plain">(</span><span class="constant">CONTAINS_THINGS_INF</span><span class="plain">, </span><span class="identifier">loc</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">World::Inferences::draw</span><span class="plain">(</span><span class="constant">PARENTAGE_INF</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">, </span><span class="identifier">loc</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">World::Inferences::draw</span><span class="plain">(</span><span class="constant">IS_ROOM_INF</span><span class="plain">, </span><span class="identifier">item</span><span class="plain">, </span><span class="identifier">IMPOSSIBLE_CE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_5"></a><b>&#167;6.5. </b>If something is being worn, it needs to have the I7 either/or property
"wearable" and also the I6-only attribute <code class="display"><span class="extract">worn</span></code>. (Arguably Clothing ought
to be a plugin of its own, but the compiler needs to do hardly anything
special to make it work, so this doesn't seem worth the trouble.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assert the worn and wearable properties</span> <span class="cwebmacronumber">6.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">item</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P_wearable</span><span class="plain">)</span>
<span class="identifier">World::Inferences::draw_property</span><span class="plain">(</span><span class="identifier">item</span><span class="plain">, </span><span class="identifier">P_wearable</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P_worn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">P_worn</span><span class="plain"> = </span><span class="identifier">Properties::EitherOr::new_nameless</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"worn"</span><span class="plain">);</span>
<span class="identifier">Properties::EitherOr::implement_as_attribute</span><span class="plain">(</span><span class="identifier">P_worn</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">World::Inferences::draw_property</span><span class="plain">(</span><span class="identifier">item</span><span class="plain">, </span><span class="identifier">P_worn</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. 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">PL::SpatialRelations::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="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">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 PL::SpatialRelations::REL_compile appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Problem message text. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::SpatialRelations::REL_describe_for_problems</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">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 PL::SpatialRelations::REL_describe_for_problems appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-sm.html">Back to 'Spatial Model'</a></li><li><a href="3-tp.html">Continue with 'The Player'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>