1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 01:54:21 +03:00
inform7/docs/if-module/3-rgn.html

574 lines
69 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Regions</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-17 14:40:57 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="index.html"><span class="selectedlink">if</span></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../multimedia-module/index.html">multimedia</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-04-14 19:56:54 +03:00
<!--Weave of 'Regions' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</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>Regions</b></li></ul><p class="purpose">A plugin providing support for grouping rooms together into named and nestable regions.</p>
2019-03-17 14:40:57 +02:00
<ul class="toc"><li><a href="3-rgn.html#SP1">&#167;1. Definitions</a></li><li><a href="3-rgn.html#SP5">&#167;5. Initialising</a></li><li><a href="3-rgn.html#SP6">&#167;6. Kinds</a></li><li><a href="3-rgn.html#SP11">&#167;11. Properties</a></li><li><a href="3-rgn.html#SP14">&#167;14. Assertions</a></li><li><a href="3-rgn.html#SP15">&#167;15. Relations</a></li><li><a href="3-rgn.html#SP19">&#167;19. Model completion</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The relation "R in S" behaves so differently for regions that we need to
define it separately, even though there's no difference in English syntax. So:
</p>
<pre class="display">
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_regional_containment</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. </b>"Region" is in fact one of the four top-level kinds in the standard I7
hierarchy, alongside thing, room and direction.
</p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">infs_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_map_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> a value property giving the region of a room</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_regional_found_in</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> an I6-only property used for implementation</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Every inference subject contains a pointer to its own unique copy of the
following minimal structure, though it will only be relevant for instances of
"room":
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">regions_data</span><span class="plain"> {</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">in_region</span><span class="plain">; </span><span class="comment"> smallest region containing me (rooms only)</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">in_region_set_at</span><span class="plain">; </span><span class="comment"> where this is decided</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">in_region_iname</span><span class="plain">; </span><span class="comment"> for testing regional containment found-ins</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">regions_data</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure regions_data is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Initialising. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Regions::start<button class="popup" onclick="togglePopup('usagePopup116')">...<span class="popuptext" id="usagePopup116">Usage of <b>PL::Regions::start</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_BASE_KIND_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP7">PL::Regions::regions_new_base_kind_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_SET_SUBKIND_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP8">PL::Regions::regions_set_subkind_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_SUBJECT_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP7">PL::Regions::regions_new_subject_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_PROPERTY_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP12">PL::Regions::regions_new_property_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_COMPLETE_MODEL</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP19">PL::Regions::regions_complete_model</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_MORE_SPECIFIC</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP10">PL::Regions::regions_more_specific</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_ESTIMATE_PROPERTY_USAGE</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP13">PL::Regions::regions_estimate_property_usage</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_INTERVENE_IN_ASSERTION</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP14">PL::Regions::regions_intervene_in_assertion</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NAME_TO_EARLY_INFS</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP15">PL::Regions::regions_name_to_early_infs</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_ADD_TO_WORLD_INDEX</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP21">PL::Regions::regions_add_to_World_index</a></span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">infs_region</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::new</span><span class="plain">(</span><span class="identifier">global_constants</span><span class="plain">,</span>
<span class="identifier">FUND_SUB</span><span class="plain">, </span><span class="identifier">NULL_GENERAL_POINTER</span><span class="plain">, </span><span class="identifier">LIKELY_CE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">regions_data</span><span class="plain"> *</span><span class="functiontext">PL::Regions::new_data<button class="popup" onclick="togglePopup('usagePopup117')">...<span class="popuptext" id="usagePopup117">Usage of <b>PL::Regions::new_data</b>:<br><a href="3-rgn.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">regions_data</span><span class="plain"> *</span><span class="identifier">rd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">regions_data</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">rd</span><span class="plain">-&gt;</span><span class="element">in_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rd</span><span class="plain">-&gt;</span><span class="element">in_region_set_at</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rd</span><span class="plain">-&gt;</span><span class="element">in_region_iname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rd</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Regions::found_in_iname<button class="popup" onclick="togglePopup('usagePopup118')">...<span class="popuptext" id="usagePopup118">Usage of <b>PL::Regions::found_in_iname</b>:<br><a href="3-rgn.html#SP19_2">&#167;19.2</a>, <a href="3-rgn.html#SP20">&#167;20</a></span></button></span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">in_region_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">in_region_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">REGION_FOUND_IN_FN_HL</span><span class="plain">, </span><span class="identifier">Instances::package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">in_region_iname</span><span class="plain">;</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Kinds. </b>This a kind name to do with regions which Inform provides special support
for; it recognises the English name when defined by the Standard Rules. (So
there is no need to translate this to other languages.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">kinds</span><span class="plain">&gt; ::=</span>
<span class="identifier">region</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_new_base_kind_notify<button class="popup" onclick="togglePopup('usagePopup119')">...<span class="popuptext" id="usagePopup119">Usage of <b>PL::Regions::regions_new_base_kind_notify</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">new_base</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">kinds</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">K_region</span><span class="plain"> = </span><span class="identifier">new_base</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>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_new_subject_notify<button class="popup" onclick="togglePopup('usagePopup120')">...<span class="popuptext" id="usagePopup120">Usage of <b>PL::Regions::regions_new_subject_notify</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">) {</span>
<span class="identifier">CREATE_PF_DATA</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">subj</span><span class="plain">, </span><span class="functiontext"><a href="3-rgn.html#SP5">PL::Regions::new_data</a></span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Region needs to be an abstract object, not a thing or a room, so:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_set_subkind_notify<button class="popup" onclick="togglePopup('usagePopup121')">...<span class="popuptext" id="usagePopup121">Usage of <b>PL::Regions::regions_set_subkind_notify</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">sub</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">super</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sub</span><span class="plain"> == </span><span class="identifier">K_region</span><span class="plain">) &amp;&amp; (</span><span class="identifier">super</span><span class="plain"> != </span><span class="identifier">K_object</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionAdrift</span><span class="plain">),</span>
2019-03-17 14:40:57 +02:00
<span class="string">"'region' is not allowed to be a kind of anything (other than "</span>
<span class="string">"'object')"</span><span class="plain">,</span>
<span class="string">"because it's too fundamental to the way Inform maps out the "</span>
<span class="string">"geography of the physical world."</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="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::object_is_a_region<button class="popup" onclick="togglePopup('usagePopup122')">...<span class="popuptext" id="usagePopup122">Usage of <b>PL::Regions::object_is_a_region</b>:<br><a href="3-rgn.html#SP18">&#167;18</a>, Spatial Model - <a href="3-sm.html#SP32_2">&#167;32.2</a><br>EPS Map - <a href="3-em.html#SP11">&#167;11</a>, <a href="3-em.html#SP22_4_1">&#167;22.4.1</a></span></button></span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Plugins::Manage::plugged_in</span><span class="plain">(</span><span class="identifier">regions_plugin</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">K_region</span><span class="plain">) &amp;&amp; (</span><span class="identifier">I</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Rooms are always more specific than regions; if region X is within
region Y, then X is more specific than Y; otherwise any two regions are
equally specific. (This is used in sorting rules by the specificity of their
domains.)
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_more_specific<button class="popup" onclick="togglePopup('usagePopup123')">...<span class="popuptext" id="usagePopup123">Usage of <b>PL::Regions::regions_more_specific</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I2</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r1</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r2</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I2</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">reg1</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">reg2</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I2</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">r1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">reg2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">reg1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">r2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">reg1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">reg2</span><span class="plain">)) {</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-sm.html#SP37">PL::Spatial::encloses</a></span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">I2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-sm.html#SP37">PL::Spatial::encloses</a></span><span class="plain">(</span><span class="identifier">I2</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Properties. </b>This is a property name to do with regions which Inform provides special
support for; it recognises the English name when it is defined by the
Standard Rules. (So there is no need to translate this to other languages.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">properties</span><span class="plain">&gt; ::=</span>
<span class="identifier">map</span><span class="plain"> </span><span class="identifier">region</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_new_property_notify<button class="popup" onclick="togglePopup('usagePopup124')">...<span class="popuptext" id="usagePopup124">Usage of <b>PL::Regions::regions_new_property_notify</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">properties</span><span class="plain">&gt;(</span><span class="identifier">prn</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain">))</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">P_map_region</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">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_estimate_property_usage<button class="popup" onclick="togglePopup('usagePopup125')">...<span class="popuptext" id="usagePopup125">Usage of <b>PL::Regions::regions_estimate_property_usage</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></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="reserved">int</span><span class="plain"> *</span><span class="identifier">words_used</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) *</span><span class="identifier">words_used</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<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="inwebparagraph"><a id="SP14"></a><b>&#167;14. Assertions. </b>The following doesn't really intervene at all: it simply produces two problem
messages which would have been less helpful if core Inform had produced them.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_intervene_in_assertion<button class="popup" onclick="togglePopup('usagePopup126')">...<span class="popuptext" id="usagePopup126">Usage of <b>PL::Regions::regions_intervene_in_assertion</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="identifier">COMMON_NOUN_NT</span><span class="plain">)) {</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">left_subject</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">right_kind</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">InferenceSubjects::is_an_object</span><span class="plain">(</span><span class="identifier">left_subject</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">right_kind</span><span class="plain"> == </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_region</span><span class="plain">))) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">left_object</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::as_object_instance</span><span class="plain">(</span><span class="identifier">left_subject</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">left_object</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain"> != </span><span class="identifier">Instances::get_creating_sentence</span><span class="plain">(</span><span class="identifier">left_object</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">left_object</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::subject_problem_at_sentence</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExistingRegion</span><span class="plain">),</span>
<span class="identifier">left_subject</span><span class="plain">,</span>
<span class="string">"(which I notice in another sentence) seems now to "</span>
<span class="string">"be declared as a new region"</span><span class="plain">,</span>
<span class="string">"which is suspect. Perhaps I have misinterpreted what was "</span>
<span class="string">"meant to be a new name for an old one?"</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">RELATIONSHIP_NT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_region</span><span class="plain">))) {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionRelated</span><span class="plain">),</span>
2019-03-17 14:40:57 +02:00
<span class="string">"a region cannot be given a specific location"</span><span class="plain">,</span>
<span class="string">"since it contains what may be many rooms, which may not be "</span>
<span class="string">"contiguous and could be scattered about all over. (Sometimes "</span>
<span class="string">"this problem arises because an ambiguous sentence like 'East "</span>
<span class="string">"of Eden is a region.' has been used: Inform reads that as "</span>
<span class="string">"saying that a nameless region lies to the east of the room "</span>
<span class="string">"'Eden'. The desired effect can be got using 'called' to stop "</span>
<span class="string">"Inform taking 'East of' literally: for instance, 'The Land of "</span>
<span class="string">"Nod is in a region called East of Eden.'"</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="inwebparagraph"><a id="SP15"></a><b>&#167;15. Relations. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_name_to_early_infs<button class="popup" onclick="togglePopup('usagePopup127')">...<span class="popuptext" id="usagePopup127">Usage of <b>PL::Regions::regions_name_to_early_infs</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">inference_subject</span><span class="plain"> **</span><span class="identifier">infs</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">kinds</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">K_region</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) *</span><span class="identifier">infs</span><span class="plain"> = </span><span class="identifier">infs_region</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="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Regions::create_relations<button class="popup" onclick="togglePopup('usagePopup128')">...<span class="popuptext" id="usagePopup128">Usage of <b>PL::Regions::create_relations</b>:<br>Spatial Relations - <a href="3-sr.html#SP3">&#167;3</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">R_regional_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::new_term</span><span class="plain">(</span><span class="identifier">infs_region</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">"region-contains"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in-region"</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">"TestRegionalContainment(*2,*1)"</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">REGIONAL_CONTAINMENT_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">BinaryPredicates::set_index_details</span><span class="plain">(</span><span class="identifier">R_regional_containment</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="string">"room/region"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>We intervene only in limited cases: X contains Y, X regionally contains Y,
or X incorporates Y; and only when X is a region. (This of course only
applies to the built-in spatial relationships; regions are entirely free
to participate in nonspatial relations.)
</p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::assert_relations<button class="popup" onclick="togglePopup('usagePopup129')">...<span class="popuptext" id="usagePopup129">Usage of <b>PL::Regions::assert_relations</b>:<br>Spatial Relations - <a href="3-sr.html#SP6_1">&#167;6.1</a></span></button></span><span class="plain">(</span><span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">relation</span><span class="plain">,</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I1</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">I0_is_region</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</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_region</span><span class="plain">)) </span><span class="identifier">I0_is_region</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">I1_is_region</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) </span><span class="identifier">I1_is_region</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I0_is_region</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_containment</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_regional_containment</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">You can only be declared as in one region</span> <span class="cwebmacronumber">17.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I1_is_region</span><span class="plain">) </span>&lt;<span class="cwebmacro">A region is being put inside a region</span> <span class="cwebmacronumber">17.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">A room is being put inside a region</span> <span class="cwebmacronumber">17.3</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionRelation</span><span class="plain">),</span>
2019-03-17 14:40:57 +02:00
<span class="string">"regions can only contain rooms"</span><span class="plain">,</span>
<span class="string">"and have no other relationships."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I1_is_region</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_containment</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_regional_containment</span><span class="plain">)) {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionRelation2</span><span class="plain">),</span>
2019-03-17 14:40:57 +02:00
<span class="string">"regions can only be contained in other regions"</span><span class="plain">,</span>
<span class="string">"and not for example in rooms."</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="inwebparagraph"><a id="SP17_1"></a><b>&#167;17.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">You can only be declared as in one region</span> <span class="cwebmacronumber">17.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-&gt;</span><span class="element">in_region</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-&gt;</span><span class="element">in_region</span><span class="plain"> != </span><span class="identifier">I0</span><span class="plain">)) {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionInTwoRegions</span><span class="plain">),</span>
2019-03-17 14:40:57 +02:00
<span class="string">"each region can only be declared to be inside a single "</span>
<span class="string">"other region"</span><span class="plain">,</span>
<span class="string">"since although regions can be placed inside each other, "</span>
<span class="string">"they are not permitted to overlap."</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>
2020-04-07 03:06:09 +03:00
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-&gt;</span><span class="element">in_region</span><span class="plain"> = </span><span class="identifier">I0</span><span class="plain">;</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-&gt;</span><span class="element">in_region_set_at</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="3-rgn.html#SP17">&#167;17</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP17_2"></a><b>&#167;17.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">A region is being put inside a region</span> <span class="cwebmacronumber">17.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">inner</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">outer</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">PARENTAGE_INF</span><span class="plain">, </span><span class="identifier">inner</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">, </span><span class="identifier">outer</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="3-rgn.html#SP17">&#167;17</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP17_3"></a><b>&#167;17.3. </b>Anything in or part of a region is necessarily a room, if it isn't known
to be a region already:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">A room is being put inside a region</span> <span class="cwebmacronumber">17.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">rm</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">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">Rvalues::from_instance</span><span class="plain">(</span><span class="identifier">I0</span><span class="plain">);</span>
<span class="identifier">Calculus::Propositions::Abstract::assert_kind_of_object</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">);</span>
<span class="identifier">World::Inferences::draw_property</span><span class="plain">(</span><span class="identifier">rm</span><span class="plain">, </span><span class="identifier">P_map_region</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="3-rgn.html#SP17">&#167;17</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>Note that because we use regular <code class="display"><span class="extract">PARENTAGE_INF</span></code> inferences to remember
that one region is inside another, it follows that the progenitor of a
region is either the next broadest region containing it, or else <code class="display"><span class="extract">NULL</span></code>.
</p>
<pre class="display">
<span class="identifier">instance</span><span class="plain"> *</span><span class="functiontext">PL::Regions::enclosing<button class="popup" onclick="togglePopup('usagePopup130')">...<span class="popuptext" id="usagePopup130">Usage of <b>PL::Regions::enclosing</b>:<br><a href="3-rgn.html#SP21">&#167;21</a>, Spatial Map - <a href="3-sm2.html#SP38">&#167;38</a>, <a href="3-sm2.html#SP42_1">&#167;42.1</a>, <a href="3-sm2.html#SP43_2">&#167;43.2</a><br>HTML Map - <a href="3-hm.html#SP6_2">&#167;6.2</a>, <a href="3-hm.html#SP13">&#167;13</a><br>EPS Map - <a href="3-em.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">reg</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-sm.html#SP15">PL::Spatial::object_is_a_room</a></span><span class="plain">(</span><span class="identifier">reg</span><span class="plain">)) </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">reg</span><span class="plain">)-&gt;</span><span class="element">in_region</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-rgn.html#SP9">PL::Regions::object_is_a_region</a></span><span class="plain">(</span><span class="identifier">reg</span><span class="plain">)) </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext"><a href="3-sm.html#SP30">PL::Spatial::progenitor</a></span><span class="plain">(</span><span class="identifier">reg</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-rgn.html#SP9">PL::Regions::object_is_a_region</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Model completion. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_complete_model<button class="popup" onclick="togglePopup('usagePopup131')">...<span class="popuptext" id="usagePopup131">Usage of <b>PL::Regions::regions_complete_model</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assert map-region properties of rooms and regions</span> <span class="cwebmacronumber">19.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assert regional-found-in properties of regions</span> <span class="cwebmacronumber">19.2</span>&gt;<span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<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="inwebparagraph"><a id="SP19_1"></a><b>&#167;19.1. </b>The following is needed in case somebody does something like this:
</p>
<blockquote>
<p>A desert room is a kind of room. The map region of a desert room is usually Sahara.</p>
</blockquote>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assert map-region properties of rooms and regions</span> <span class="cwebmacronumber">19.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">))) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">where</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="identifier">World::Inferences::get_prop_state_at</span><span class="plain">(</span>
<span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">P_map_region</span><span class="plain">, &amp;</span><span class="identifier">where</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">reg</span><span class="plain"> =</span>
<span class="identifier">Rvalues::to_object_instance</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">in_region</span><span class="plain"> = </span><span class="identifier">reg</span><span class="plain">;</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">in_region_set_at</span><span class="plain"> = </span><span class="identifier">where</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="3-rgn.html#SP19">&#167;19</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP19_2"></a><b>&#167;19.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assert regional-found-in properties of regions</span> <span class="cwebmacronumber">19.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">P_regional_found_in</span><span class="plain"> = </span><span class="identifier">Properties::Valued::new_nameless</span><span class="plain">(</span>
<span class="identifier">I</span><span class="string">"regional_found_in"</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">);</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext"><a href="3-rgn.html#SP5">PL::Regions::found_in_iname</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_regional_found_in</span><span class="plain">, </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">),</span>
<span class="identifier">Rvalues::from_iname</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">), </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="3-rgn.html#SP19">&#167;19</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b></p>
<pre class="display">
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Regions::write_regional_found_in_routines<button class="popup" onclick="togglePopup('usagePopup132')">...<span class="popuptext" id="usagePopup132">Usage of <b>PL::Regions::write_regional_found_in_routines</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext"><a href="3-rgn.html#SP5">PL::Regions::found_in_iname</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TESTREGIONALCONTAINMENT_HL</span><span class="plain">));</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOCATION_HL</span><span class="plain">));</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Instances::iname</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_add_to_World_index<button class="popup" onclick="togglePopup('usagePopup133')">...<span class="popuptext" id="usagePopup133">Usage of <b>PL::Regions::regions_add_to_World_index</b>:<br><a href="3-rgn.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">O</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">O</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">))) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext"><a href="3-rgn.html#SP18">PL::Regions::enclosing</a></span><span class="plain">(</span><span class="identifier">O</span><span class="plain">);</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">) </span><span class="functiontext"><a href="3-hm.html#SP12">PL::HTMLMap::colour_chip</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">O</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">O</span><span class="plain">)-&gt;</span><span class="element">in_region_set_at</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<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>
<hr class="tocbar">
<ul class="toc"><li><a href="3-bck.html">Back to 'Backdrops'</a></li><li><a href="3-tm.html">Continue with 'The Map'</a></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2020-04-14 19:56:54 +03:00
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>