mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
1130 lines
225 KiB
HTML
1130 lines
225 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Relations Template</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<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>
|
|
<nav role="navigation">
|
|
<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>
|
|
<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>
|
|
</ul><h2>Extensions</h2><ul>
|
|
<li><a href="../basic_inform/index.html">basic_inform</a></li>
|
|
<li><a href="../standard_rules/index.html">standard_rules</a></li>
|
|
</ul><h2>Kits</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">BasicInformKit</span></a></li>
|
|
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
|
|
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
|
|
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
|
|
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Relations Template' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Relations Template</b></li></ul><p class="purpose">To manage run-time storage for relations between objects, and to find routes through relations and the map.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Relation Records</a></li><li><a href="#SP2">§2. Valency Adjectives</a></li><li><a href="#SP3">§3. One To One Relations</a></li><li><a href="#SP4">§4. Symmetric One To One Relations</a></li><li><a href="#SP5">§5. Various To Various Relations</a></li><li><a href="#SP6">§6. Equivalence Relations</a></li><li><a href="#SP7">§7. Show Various to Various</a></li><li><a href="#SP8">§8. Show One to One</a></li><li><a href="#SP9">§9. Show Reversed One to One</a></li><li><a href="#SP10">§10. Show Equivalence</a></li><li><a href="#SP11">§11. Relation Emptying</a></li><li><a href="#SP12">§12. Relation Route-Finding</a></li><li><a href="#SP13">§13. One To Various Route-Finding</a></li><li><a href="#SP14">§14. Various To One Route-Finding</a></li><li><a href="#SP15">§15. Slow Various To Various Route-Finding</a></li><li><a href="#SP16">§16. Fast Various To Various Route-Finding</a></li><li><a href="#SP17">§17. Iterating Relations</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Relation Records. </b>See "RelationKind.i6t" for further explanation.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RR_NAME</span><span class="plain"> </span><span class="constant">5</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RR_PERMISSIONS</span><span class="plain"> </span><span class="constant">6</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RR_STORAGE</span><span class="plain"> </span><span class="constant">7</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RR_KIND</span><span class="plain"> </span><span class="constant">8</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RR_HANDLER</span><span class="plain"> </span><span class="constant">9</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RR_DESCRIPTION</span><span class="plain"> </span><span class="constant">10</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Valency Adjectives. </b>These are defined in the Standard Rules; the following routines must either
|
|
test the state (if <code class="display"><span class="extract">set</span></code> is negative), or change the state to <code class="display"><span class="extract">set</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VALENCY_MASK</span><span class="plain"> = </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">+</span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">+</span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">+</span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="plain">[ </span><span class="identifier">RELATION_TY_EquivalenceAdjective</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain"> </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">perms</span><span class="plain"> </span><span class="identifier">state</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">;</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">) </span><span class="identifier">state</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain">)) {</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">RlnSetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain">);</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RELS_SET_VALENCY</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">VALENCY_MASK</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="string">"*** Can't change this to an equivalence relation ***"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RELATION_TY_SymmetricAdjective</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain"> </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">perms</span><span class="plain"> </span><span class="identifier">state</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">;</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">) </span><span class="identifier">state</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain">)) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">;</span>
|
|
<span class="identifier">RlnSetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain">);</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RELS_SET_VALENCY</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">VALENCY_MASK</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="string">"*** Can't change this to a symmetric relation ***"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RELATION_TY_OToOAdjective</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain"> </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">perms</span><span class="plain"> </span><span class="identifier">state</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & (</span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">+</span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) == </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">+</span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">state</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">RlnSetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain">);</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RELS_SET_VALENCY</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">VALENCY_MASK</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="string">"*** Can't change this to a one-to-one relation ***"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RELATION_TY_OToVAdjective</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain"> </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">perms</span><span class="plain"> </span><span class="identifier">state</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">;</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & (</span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">+</span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) == </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">) </span><span class="identifier">state</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">RlnSetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain">);</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RELS_SET_VALENCY</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">VALENCY_MASK</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="string">"*** Can't change this to a one-to-various relation ***"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RELATION_TY_VToOAdjective</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain"> </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">perms</span><span class="plain"> </span><span class="identifier">state</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">;</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & (</span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">+</span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) == </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">state</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_SYMMETRIC</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_EQUIVALENCE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">RlnSetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain">);</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RELS_SET_VALENCY</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">VALENCY_MASK</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="string">"*** Can't change this to a various-to-one relation ***"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RELATION_TY_VToVAdjective</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain"> </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">perms</span><span class="plain"> </span><span class="identifier">state</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">;</span>
|
|
<span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & (</span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">+</span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">state</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> - </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">set</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">state</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_X_UNIQUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">perms</span><span class="plain"> = </span><span class="identifier">perms</span><span class="plain"> + </span><span class="identifier">RELS_Y_UNIQUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">RlnSetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain">);</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">RELS_SET_VALENCY</span><span class="plain">, </span><span class="identifier">perms</span><span class="plain"> & </span><span class="identifier">VALENCY_MASK</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="string">"*** Can't change this to a various-to-various relation ***"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. One To One Relations. </b>We provide routines to assert a 1-to-1 relation true, or to assert it false.
|
|
The relation <code class="display"><span class="extract">rel</span></code> is represented by a property number, and the property in
|
|
question is used to store the fact of a relationship: \(O_1\sim O_2\) if and
|
|
only if <code class="display"><span class="extract">O1.rel == O2</span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">There is no routine to test a 1-to-1 relation, since the predicate calculus
|
|
code in Inform simplifies propositions which test these into direct looking up
|
|
of the property relation.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_Now1to1</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">ol</span><span class="plain">; </span><span class="comment">Assert 1-1 true</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">) </span><span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">ol</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ol</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> == </span><span class="identifier">obj2</span><span class="plain">) </span><span class="identifier">ol</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowN1toV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain">; </span><span class="comment">Assert 1-1 false</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> == </span><span class="identifier">obj2</span><span class="plain">)) </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_Now1to1V</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">ol</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">; </span><span class="comment">Assert 1-1 true</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">) {</span>
|
|
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ol</span><span class="plain">=1: </span><span class="identifier">ol</span><span class="plain"><=</span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">ol</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">ol</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">obj2</span><span class="plain">)</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">ol</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">) </span><span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowN1toVV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">; </span><span class="comment">Assert 1-1 false</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain">) && (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">obj2</span><span class="plain">))</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Symmetric One To One Relations. </b>Here the relation is used for both objects: \(O_1\sim O_2\) if and only if
|
|
both <code class="display"><span class="extract">O1.relation_property == O2</span></code> and <code class="display"><span class="extract">O2.relation_property == O1</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowS1to1</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain">; </span><span class="comment">Assert symmetric 1-1 true</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">) { (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">).</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">) { (</span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">).</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; }</span>
|
|
<span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">; </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowSN1to1</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain">; </span><span class="comment">Assert symmetric 1-1 false</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> == </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowS1to1V</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">; </span><span class="comment">Assert symmetric 1-1 true</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">))</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">), </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">))</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">), </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowSN1to1V</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">; </span><span class="comment">Assert symmetric 1-1 false</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">obj2</span><span class="plain">) {</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Various To Various Relations. </b>Here the relation is represented by an array holding its metadata. Each
|
|
object in the domain of the relation provides two properties, holding its
|
|
left index and its right index. The index is its position in the left or
|
|
right domain. For instance, suppose we relate things to doors, and there
|
|
are five things in the world, two of which are doors; then the left
|
|
indexes will range from 0 to 4, while the right indexes will range from
|
|
0 to 1. It's very likely that the doors will have different left and
|
|
right indexes. (If the relation relates a given kind to itself, say
|
|
doors to doors, then left and right indexes will always be equal.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">It is possible for either the left or right domain set to be an enumerated
|
|
kind of value, where the I6 representation of values is 1, 2, 3, ..., \(N\),
|
|
where there are \(N\) possibilities. In that case we obtain the index
|
|
simply by subtracting 1 in order to begin from 0. We mark the domain set
|
|
as being a KOV rather than a kind of object by storing 0 instead of a
|
|
property in the relevant part of the relation metadata: note that 0 is
|
|
not a valid property number.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The structure for a relation consists of eight <code class="display"><span class="extract">--></span></code> words, followed by a
|
|
bitmap in which we store 16 bits in each <code class="display"><span class="extract">--></span></code> word. (Yes, this is wasteful
|
|
in Glulx, where <code class="display"><span class="extract">--></span></code> words store 32 bits, but memory is not in short supply
|
|
in Glulx and the total cost of relations is in practice small; we prefer
|
|
to keep all the code involved simple.) The structure is precompiled by the
|
|
Inform compiler: we do not create new ones on the fly.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">In the case of a symmetric various to various relation, we could in theory
|
|
save memory once again by storing only the lower triangle of the bitmap,
|
|
but the time and complexity overhead are not worth it. When asserting that
|
|
\(O_1\sim O_2\) for a symmetric V-to-V, we also automatically assert that
|
|
\(O_2\sim O_1\), thus maintaining the bitmap as a symmetric matrix; but in
|
|
reading the bitmap, we look only at the lower triangle. This costs a little
|
|
time, but has the advantage of allowing the route-finding routine for
|
|
V-to-V to use the same code for symmetric and asymmetric relations.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">If this all seems rather suboptimally programmed in order to reduce code
|
|
complexity, I can only say that careless drafts here were the source of
|
|
some extremely difficult bugs to find.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_LEFT_DOMAIN_SIZE</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_LEFT_PRINTING_ROUTINE</span><span class="plain"> = </span><span class="constant">4</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_RIGHT_PRINTING_ROUTINE</span><span class="plain"> = </span><span class="constant">5</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> = </span><span class="constant">6</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">VTOVS_CACHE</span><span class="plain"> = </span><span class="constant">7</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowVtoV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain"> </span><span class="identifier">pr2</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="identifier">vtov_structure</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && (</span><span class="identifier">obj2</span><span class="plain"> ~= </span><span class="identifier">obj1</span><span class="plain">)) { </span><span class="identifier">Relation_NowVtoV</span><span class="plain">(</span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="reserved">false</span><span class="plain">); }</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; </span><span class="comment">Mark any cache as broken</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)) </span><span class="identifier">i1</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_IMPREL</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i1</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">-1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">)) </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">pr2</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_IMPREL</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">-1;</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">*(</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</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="identifier">IncreasingPowersOfTwo_TB</span><span class="plain">-->(</span><span class="identifier">pr</span><span class="plain">%16);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">/16 + </span><span class="constant">8</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">pr</span><span class="plain"> = (</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">pr</span><span class="plain">) | </span><span class="identifier">i1</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowNVtoV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain"> </span><span class="identifier">pr2</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="identifier">vtov_structure</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && (</span><span class="identifier">obj2</span><span class="plain"> ~= </span><span class="identifier">obj1</span><span class="plain">)) { </span><span class="identifier">Relation_NowNVtoV</span><span class="plain">(</span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="reserved">false</span><span class="plain">); }</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; </span><span class="comment">Mark any cache as broken</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)) </span><span class="identifier">i1</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_IMPREL</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i1</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">-1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">)) </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">pr2</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_IMPREL</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">-1;</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">*(</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</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="identifier">IncreasingPowersOfTwo_TB</span><span class="plain">-->(</span><span class="identifier">pr</span><span class="plain">%16);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">/16 + </span><span class="constant">8</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">pr</span><span class="plain">) & </span><span class="identifier">i1</span><span class="plain">) </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">pr</span><span class="plain"> - </span><span class="identifier">i1</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_TestVtoV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain"> </span><span class="identifier">pr2</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="identifier">vtov_structure</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && (</span><span class="identifier">obj2</span><span class="plain"> > </span><span class="identifier">obj1</span><span class="plain">)) { </span><span class="identifier">sym</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">; </span><span class="identifier">obj1</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">; </span><span class="identifier">obj2</span><span class="plain"> = </span><span class="identifier">sym</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)) </span><span class="identifier">i1</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_IMPREL</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">); </span><span class="reserved">rfalse</span><span class="plain">; }</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i1</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">-1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) && (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">)) </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">pr2</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_IMPREL</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">); </span><span class="reserved">rfalse</span><span class="plain">; }</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i2</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">-1;</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">i1</span><span class="plain">*(</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</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="identifier">IncreasingPowersOfTwo_TB</span><span class="plain">-->(</span><span class="identifier">pr</span><span class="plain">%16);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">/16 + </span><span class="constant">8</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">pr</span><span class="plain">) & </span><span class="identifier">i1</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Equivalence Relations. </b>For every equivalence relation there is a corresponding function \(f\) such
|
|
that \(x\sim y\) if and only if \(f(x)=f(y)\), where \(f(x)\) is a number identifying
|
|
the equivalence class of \(x\). Rather than inefficiently storing a large
|
|
relation bitmap (and then having a very complicated time updating it to
|
|
keep the relation transitive), we store \(f\): that is, for every object in
|
|
the domain set, there is a property <code class="display"><span class="extract">prop</span></code> such that <code class="display"><span class="extract">O.prop</span></code> is the value
|
|
\(f(O)\).
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowEquiv</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">big</span><span class="plain"> </span><span class="identifier">little</span><span class="plain">;</span>
|
|
<span class="identifier">big</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">; </span><span class="identifier">little</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">big</span><span class="plain"> == </span><span class="identifier">little</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">big</span><span class="plain"> < </span><span class="identifier">little</span><span class="plain">) { </span><span class="identifier">little</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">; </span><span class="identifier">big</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">; }</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> == </span><span class="identifier">big</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">little</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowNEquiv</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">old</span><span class="plain"> </span><span class="identifier">new</span><span class="plain">;</span>
|
|
<span class="identifier">old</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">; </span><span class="identifier">new</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">old</span><span class="plain"> ~= </span><span class="identifier">new</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">new</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> > </span><span class="identifier">new</span><span class="plain">) </span><span class="identifier">new</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="identifier">new</span><span class="plain">++;</span>
|
|
<span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">new</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowEquivV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">big</span><span class="plain"> </span><span class="identifier">little</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">big</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="identifier">little</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">big</span><span class="plain"> == </span><span class="identifier">little</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">big</span><span class="plain"> < </span><span class="identifier">little</span><span class="plain">) {</span>
|
|
<span class="identifier">little</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="identifier">big</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1: </span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">n</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">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">big</span><span class="plain">)</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">little</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">Relation_NowNEquivV</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">old</span><span class="plain"> </span><span class="identifier">new</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">old</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="identifier">new</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">old</span><span class="plain"> ~= </span><span class="identifier">new</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">new</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1: </span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">n</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">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) > </span><span class="identifier">new</span><span class="plain">)</span>
|
|
<span class="identifier">new</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="identifier">new</span><span class="plain">++;</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">new</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Show Various to Various. </b>The rest of the code for relations has no use except for debugging: it
|
|
implements the RELATIONS testing command. Speed is unimportant here.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_ShowVtoV</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain"> </span><span class="identifier">proutine1</span><span class="plain"> </span><span class="identifier">proutine2</span><span class="plain"> </span><span class="identifier">vtov_structure</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">proutine1</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_PRINTING_ROUTINE</span><span class="plain">;</span>
|
|
<span class="identifier">proutine2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_PRINTING_ROUTINE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> && </span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)</span>
|
|
<span class="plain"> </span><span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && </span><span class="identifier">obj2</span><span class="plain"> > </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">, (</span><span class="identifier">The</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" <=> "</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">obj2</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain"> }</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> && (</span><span class="identifier">pr2</span><span class="plain">==0)) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)</span>
|
|
<span class="plain"> </span><span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1:</span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</span><span class="plain">:</span><span class="identifier">obj2</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">, (</span><span class="identifier">The</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">, </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="identifier">proutine2</span><span class="plain">.</span><span class="identifier">call</span><span class="plain">(</span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain"> }</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pr</span><span class="plain">==0) && (</span><span class="identifier">pr2</span><span class="plain">)) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1:</span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">-->2:</span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="plain"> </span><span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="identifier">proutine1</span><span class="plain">.</span><span class="identifier">call</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">, (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">obj2</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain"> }</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1:</span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">-->2:</span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="plain"> </span><span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1:</span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</span><span class="plain">:</span><span class="identifier">obj2</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="identifier">proutine1</span><span class="plain">.</span><span class="identifier">call</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="identifier">proutine2</span><span class="plain">.</span><span class="identifier">call</span><span class="plain">(</span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain"> }</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Show One to One. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_ShowOtoO</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain">;</span>
|
|
<span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">0</span><span class="plain">); </span><span class="comment">Kind of left term</span>
|
|
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="identifier">obj2</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && </span><span class="identifier">obj2</span><span class="plain"> < </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">, (</span><span class="identifier">The</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" == "</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">obj2</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++) {</span>
|
|
<span class="identifier">obj2</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && </span><span class="identifier">obj2</span><span class="plain"> < </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" == "</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Show Reversed One to One. </b>There's no such kind of relation as this: but the same code used to show
|
|
1-to-1 relations is also used to show various-to-1 relations, since the
|
|
storage is the same. To show 1-to-various relations, we need a transposed
|
|
form of the same code in which left and right are exchanged: this is it.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_RShowOtoO</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">t1</span><span class="plain"> </span><span class="identifier">t2</span><span class="plain"> </span><span class="identifier">N1</span><span class="plain"> </span><span class="identifier">N2</span><span class="plain">;</span>
|
|
<span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">t1</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">0</span><span class="plain">); </span><span class="comment">Kind of left term</span>
|
|
<span class="identifier">t2</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">1</span><span class="plain">); </span><span class="comment">Kind of right term</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t2</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t1</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> ~= </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">, (</span><span class="identifier">The</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">obj2</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">N1</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">t1</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N1</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> ~= </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">; </span><span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t1</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">obj2</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">N2</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t1</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1: </span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">N2</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) ~= </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">, (</span><span class="identifier">The</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">N1</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">t1</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N1</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1: </span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">N2</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) ~= </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">; </span><span class="identifier">x</span><span class="plain">=1; }</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t1</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" >=> "</span><span class="plain">;</span>
|
|
<span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Show Equivalence. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">RSE_Flip</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">); </span><span class="identifier">x</span><span class="plain"> = -</span><span class="identifier">x</span><span class="plain">;</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">[ </span><span class="identifier">RSE_Set</span><span class="plain"> </span><span class="identifier">KOV</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">KOV</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">[ </span><span class="identifier">Relation_ShowEquiv</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> </span><span class="identifier">somegroups</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_DESCRIPTION</span><span class="plain">), </span><span class="string">":^"</span><span class="plain">;</span>
|
|
<span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">0</span><span class="plain">); </span><span class="comment">Kind of left term</span>
|
|
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = -(</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) </span><span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> ~</span><span class="identifier">workflag2</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> == </span><span class="identifier">v</span><span class="plain">) {</span>
|
|
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">;</span>
|
|
<span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = -</span><span class="identifier">v</span><span class="plain">;</span>
|
|
<span class="identifier">c</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">c</span><span class="plain">>1) {</span>
|
|
<span class="identifier">somegroups</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" { "</span><span class="plain">;</span>
|
|
<span class="identifier">WriteListOfMarkedObjects</span><span class="plain">(</span><span class="identifier">ENGLISH_BIT</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" }^"</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">v</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) </span><span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> ~</span><span class="identifier">workflag2</span><span class="plain">;</span>
|
|
<span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">c</span><span class="plain">++; </span><span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">somegroups</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" and "</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">4</span><span class="plain">) { </span><span class="identifier">WriteListOfMarkedObjects</span><span class="plain">(</span><span class="identifier">ENGLISH_BIT</span><span class="plain">); </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" in"</span><span class="plain">; }</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" a"</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" single-member group"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"s"</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = -(</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="comment">A slower method, since we have less efficient storage:</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain"> <= </span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="identifier">RSE_Flip</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain"> <= </span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RSE_Set</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">)) {</span>
|
|
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain"> <= </span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">v</span><span class="plain">)</span>
|
|
<span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">>1) {</span>
|
|
<span class="identifier">somegroups</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" {"</span><span class="plain">;</span>
|
|
<span class="identifier">d</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain"> <= </span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">v</span><span class="plain">) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">; </span><span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> < </span><span class="identifier">c</span><span class="plain">-1) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">","</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="identifier">RSE_Flip</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="identifier">d</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"}^"</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) </span><span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> ~</span><span class="identifier">workflag2</span><span class="plain">;</span>
|
|
<span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain"> <= </span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RSE_Set</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">)) </span><span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">somegroups</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" and "</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"a"</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" single-member group"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"s"</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain"> <= </span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RSE_Set</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">))</span>
|
|
<span class="identifier">RSE_Flip</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Relation Emptying. </b>These routines, mercifully a little simpler, define the adjective "empty" as
|
|
it applied to relations. Each routine has to forcibly empty the relation if
|
|
the clear flag is set, and in any case return either true or false to say
|
|
whether the relation is empty at the end of the call. For relations in groups,
|
|
"empty" is understood to mean that each object relates only to itself.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Relation_EmptyOtoO</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">clear</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">t1</span><span class="plain"> </span><span class="identifier">t2</span><span class="plain"> </span><span class="identifier">N1</span><span class="plain"> </span><span class="identifier">N2</span><span class="plain">;</span>
|
|
<span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">t1</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">0</span><span class="plain">); </span><span class="comment">Kind of left term</span>
|
|
<span class="identifier">t2</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">1</span><span class="plain">); </span><span class="comment">Kind of right term</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t2</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="identifier">obj1</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1: </span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">N2</span><span class="plain">: </span><span class="identifier">obj2</span><span class="plain">++) {</span>
|
|
<span class="identifier">obj1</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">t2</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</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">t1</span><span class="plain"> ~= </span><span class="identifier">t2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t1</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) {</span>
|
|
<span class="identifier">obj2</span><span class="plain"> = </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N2</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++) {</span>
|
|
<span class="identifier">obj2</span><span class="plain"> = </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t1</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">t1</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">[ </span><span class="identifier">Relation_EmptyEquiv</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">clear</span>
|
|
<span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">;</span>
|
|
<span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_KIND</span><span class="plain">), </span><span class="constant">0</span><span class="plain">); </span><span class="comment">Kind of left term</span>
|
|
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">KOVDomainSize</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) {</span>
|
|
<span class="identifier">v</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="identifier">t</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> = </span><span class="identifier">v</span><span class="plain">++;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="identifier">WriteGProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">++);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj1</span><span class="plain"> < </span><span class="identifier">obj2</span><span class="plain">) && (</span><span class="identifier">obj1</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain"> == </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">))</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=</span><span class="identifier">obj1</span><span class="plain">+1: </span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">N</span><span class="plain">: </span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">) == </span><span class="identifier">GProperty</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">relation_property</span><span class="plain">))</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">[ </span><span class="identifier">Relation_EmptyVtoV</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">sym</span><span class="plain"> </span><span class="identifier">clear</span><span class="plain"> </span><span class="identifier">vtov_structure</span><span class="plain"> </span><span class="identifier">obj1</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain"> </span><span class="identifier">proutine1</span><span class="plain"> </span><span class="identifier">proutine2</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">proutine1</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_PRINTING_ROUTINE</span><span class="plain">;</span>
|
|
<span class="identifier">proutine2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_PRINTING_ROUTINE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> && </span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sym</span><span class="plain"> && </span><span class="identifier">obj2</span><span class="plain"> > </span><span class="identifier">obj1</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">Relation_NowNVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">sym</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> && (</span><span class="identifier">pr2</span><span class="plain">==0)) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1:</span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</span><span class="plain">:</span><span class="identifier">obj2</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">Relation_NowNVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">sym</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pr</span><span class="plain">==0) && (</span><span class="identifier">pr2</span><span class="plain">)) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1:</span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">-->2:</span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">Relation_NowNVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">sym</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj1</span><span class="plain">=1:</span><span class="identifier">obj1</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">-->2:</span><span class="identifier">obj1</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain">=1:</span><span class="identifier">obj2</span><span class="plain"><=</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_DOMAIN_SIZE</span><span class="plain">:</span><span class="identifier">obj2</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clear</span><span class="plain">) </span><span class="identifier">Relation_NowNVtoV</span><span class="plain">(</span><span class="identifier">obj1</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">, </span><span class="identifier">sym</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Relation Route-Finding. </b>The general problem we have to solve here is: given \(x, y\in D\), where \(\sim\)
|
|
is a relation on a domain set \(D\) of objects,
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(i) find the smallest \(n\) such that there exist \(x = r_1\sim r_2\sim ...\sim
|
|
r_n = y\in D\( such that \)r_i\sim r_{i+1}\(, or determine that no such \)n\( exists,
|
|
and if so
|
|
</li><li>(ii) find a value of \(r_2\) in such a "route" between \(x\) and \(y\), or
|
|
set \(r_2=0\) if \(x=y\) so that \(n=1\).
|
|
</li></ul>
|
|
<p class="inwebparagraph">While in general a relation can have different left and right domains (a
|
|
relation between doors and rooms, say), route-finding on those relations is
|
|
unlikely to be very useful, so is discouraged. (In the case of doors and
|
|
rooms, a route could never be longer than 1 step, since no object is both a
|
|
door and a room, for instance.) The "fast" V-to-V algorithm requires \(D\)
|
|
to have the same left and right domains; Inform compiles the memory caches for
|
|
V-to-V relations to force any cases with different domains into using the
|
|
"slow" algorithm.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">MAX_ROUTE_LENGTH</span></code> is used simply as a sanity check to prevent hangs if
|
|
something should go wrong, for instance if the property of a 1-to-V
|
|
relation has been modified by some third-party code in such a way that
|
|
it loses its defining invariant.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">MAX_ROUTE_LENGTH</span><span class="plain"> = </span><span class="identifier">ICOUNT_OBJECT</span><span class="plain"> + </span><span class="constant">32</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RelationRouteTo</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> == </span><span class="reserved">nothing</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="reserved">to</span><span class="plain"> == </span><span class="reserved">nothing</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">relation</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</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">from</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">to</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</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="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> == </span><span class="reserved">to</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_PERMISSIONS</span><span class="plain">)) & </span><span class="identifier">RELS_ROUTE_FIND</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_ROUTELESS</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="identifier">handler</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_HANDLER</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RELS_ROUTE_FIND_COUNT</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">handler</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RELS_ROUTE_FIND</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RelFollowVector</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">obj</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">rv</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">obj</span><span class="plain"> ~= </span><span class="reserved">to</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">MAX_ROUTE_LENGTH</span><span class="plain">)) { </span><span class="identifier">i</span><span class="plain">++; </span><span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain">; }</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. One To Various Route-Finding. </b>Here we can immediately determine, given \(y\), the unique \(y'\) such that
|
|
\(y'\sim y\), so finding a path from \(x\) to \(y\) is a matter of following the
|
|
only path leading to \(y\) and seeing if it ever passed through \(x\); thus the
|
|
running time is \(O(n)\), where \(n\) is the size of the domain. It would be
|
|
pointless to cache this.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that we can assume here that \(x\neq y\), or rather, that <code class="display"><span class="extract">from ~= to</span></code>,
|
|
because that case has already been taken care of.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">OtoVRelRouteTo</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">previous</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="reserved">to</span><span class="plain">) && (</span><span class="reserved">to</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) && (</span><span class="reserved">to</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">)) {</span>
|
|
<span class="identifier">previous</span><span class="plain"> = </span><span class="reserved">to</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="identifier">previous</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> = </span><span class="reserved">to</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">previous</span><span class="plain"> == </span><span class="identifier">from</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">to</span><span class="plain">;</span>
|
|
<span class="reserved">to</span><span class="plain"> = </span><span class="identifier">previous</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Various To One Route-Finding. </b>This time the simplifying assumption is that, given \(x\), we can immediately
|
|
determine the unique \(x'\) such that \(x\sim x'\), so it suffices to follow
|
|
the only path forwards from \(x\) and see if it ever reaches \(y\). The routine
|
|
is not quite a mirror image of the one above, because both have the same
|
|
return requirements: we have to ensure that the <code class="display"><span class="extract">vector</span></code> properties lay out
|
|
the path, and also return the next step after \(x\).
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VtoORelRouteTo</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">next</span><span class="plain"> </span><span class="identifier">start</span><span class="plain">;</span>
|
|
<span class="identifier">start</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">relation_property</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">)) {</span>
|
|
<span class="identifier">next</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">relation_property</span><span class="plain">;</span>
|
|
<span class="identifier">from</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> = </span><span class="identifier">next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">next</span><span class="plain"> == </span><span class="reserved">to</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">start</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain">;</span>
|
|
<span class="identifier">from</span><span class="plain"> = </span><span class="identifier">next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Slow Various To Various Route-Finding. </b>Now there are no simplifying assumptions and the problem is essentially the
|
|
same as the one solved for route-finding in the map, above. Once again we
|
|
present two different algorithms: first, a form of Prim's algorithm for
|
|
minimal spanning trees. Note that, whereas this algorithm was not always
|
|
so "slow" for the map — because of the fairly low vertex degrees involved,
|
|
i.e., because most rooms had few connections to other rooms — here the
|
|
relation might well be almost complete, with almost all the objects related
|
|
to each other, and then the algorithm will indeed be "slow". So it is
|
|
likely that the "fast" algorithm will always be better, if the memory
|
|
can be spared for it.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We use the fast algorithm for a given relation if and only if the Inform compiler
|
|
has allocated the necessary cache memory; the two use options above, for
|
|
map route-finding, don't control this.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VtoVRelRouteTo</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">obj2</span><span class="plain"> </span><span class="identifier">related</span><span class="plain"> </span><span class="identifier">progressed</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">vtov_structure</span><span class="plain">;</span>
|
|
<span class="identifier">vtov_structure</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_CACHE</span><span class="plain">)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FastVtoVRelRouteTo</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">, </span><span class="identifier">count</span><span class="plain">);</span>
|
|
<span class="identifier">left_ix</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="identifier">pr2</span><span class="plain"> = </span><span class="identifier">vtov_structure</span><span class="plain">--></span><span class="identifier">VTOVS_RIGHT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain"> && </span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">vector</span><span class="plain">) </span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">to</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="reserved">true</span><span class="plain">) {</span>
|
|
<span class="identifier">progressed</span><span class="plain"> = </span><span class="reserved">false</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain"> && </span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain"> && </span><span class="identifier">obj2</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">pr2</span><span class="plain"> && </span><span class="identifier">obj2</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">obj2</span><span class="plain">)) {</span>
|
|
<span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> = </span><span class="identifier">obj2</span><span class="plain"> | </span><span class="identifier">WORD_HIGHBIT</span><span class="plain">;</span>
|
|
<span class="identifier">progressed</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain"> && </span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> &~ </span><span class="identifier">WORD_HIGHBIT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">progressed</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">obj</span><span class="plain"> ~= </span><span class="reserved">to</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">MAX_ROUTE_LENGTH</span><span class="plain">)) { </span><span class="identifier">i</span><span class="plain">++; </span><span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain">; }</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">vector</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Fast Various To Various Route-Finding. </b>Now, as above, a form of the Floyd-Warshall algorithm. The matrix is here
|
|
stored in the cache of memory pointed to in the V-to-V relation structure.
|
|
We are unable to combine \(a_{ij}\) and \(d_{ij}\) into a single cell of
|
|
memory, so in fact we store two separate matrices: one for \(a_{ij}\)
|
|
(this is <code class="display"><span class="extract">cache</span></code> below), the other for \(n_{ij}\), where \(n_{ij}\) is the
|
|
next object in the shortest path from \(O_i\) to \(O_j\) (this is <code class="display"><span class="extract">cache2</span></code>
|
|
below).
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Where \(n<256\) a shortest path must be such that \(a_{ij}\leq 255\), so can
|
|
be stored in a single byte, and we similarly store \(n_{ij}\) as the index
|
|
of the object rather than the object value itself: the index ranges from
|
|
0 to \(n-1\), so that \(0\leq n_{ij} < 255\) and we can use \(n_{ij} = 255\)
|
|
as a sentinel value meaning "no path". Although the reconversion of
|
|
\(n_{ij}\) back into a valid object value takes a little time, it is only
|
|
\(O(n)\), and of course we know \(n\) is relatively small; and in this way
|
|
we reduce the storage overhead to only \(n^2\) bytes.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Where \(n\geq 256\), we resign ourselves to storing two words for each pair
|
|
\((i,j)\), making \(2n^2\) bytes of storage on the Z-machine and \(4n^2\) bytes
|
|
of storage on Glulx, but lookup of a cached result is slightly faster.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">FastVtoVRelRouteTo</span><span class="plain"> </span><span class="identifier">relation</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">count</span>
|
|
<span class="identifier">domainsize</span><span class="plain"> </span><span class="identifier">cache</span><span class="plain"> </span><span class="identifier">cache2</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain"> </span><span class="identifier">ox</span><span class="plain"> </span><span class="identifier">oy</span><span class="plain"> </span><span class="identifier">oj</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain"> </span><span class="identifier">axy</span><span class="plain"> </span><span class="identifier">axj</span><span class="plain"> </span><span class="identifier">ayj</span><span class="plain">;</span>
|
|
<span class="identifier">domainsize</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)-->2; </span><span class="comment">Number of left instances</span>
|
|
<span class="identifier">left_ix</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_LEFT_INDEX_PROP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">) && (</span><span class="reserved">to</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">domainsize</span><span class="plain"> < </span><span class="constant">256</span><span class="plain">) {</span>
|
|
<span class="identifier">cache</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_CACHE</span><span class="plain">;</span>
|
|
<span class="identifier">cache2</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain"> + </span><span class="identifier">domainsize</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> == </span><span class="reserved">true</span><span class="plain">) {</span>
|
|
<span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> = </span><span class="reserved">false</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">oy</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">ox</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">oy</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">ox</span><span class="plain">)) {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = ((</span><span class="identifier">oy</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="identifier">ox</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="identifier">cache</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">cache2</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain"> = </span><span class="identifier">ox</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = ((</span><span class="identifier">oy</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="identifier">ox</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="identifier">cache</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">cache2</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain"> = </span><span class="constant">255</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">oy</span><span class="plain">=0: </span><span class="identifier">oy</span><span class="plain"><</span><span class="identifier">domainsize</span><span class="plain">: </span><span class="identifier">oy</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ox</span><span class="plain">=0: </span><span class="identifier">ox</span><span class="plain"><</span><span class="identifier">domainsize</span><span class="plain">: </span><span class="identifier">ox</span><span class="plain">++) {</span>
|
|
<span class="identifier">axy</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">->(</span><span class="identifier">ox</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oy</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">axy</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">oj</span><span class="plain">=0: </span><span class="identifier">oj</span><span class="plain"><</span><span class="identifier">domainsize</span><span class="plain">: </span><span class="identifier">oj</span><span class="plain">++) {</span>
|
|
<span class="identifier">ayj</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">->(</span><span class="identifier">oy</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oj</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ayj</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = </span><span class="identifier">ox</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oj</span><span class="plain">;</span>
|
|
<span class="identifier">axj</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">axj</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">axy</span><span class="plain"> + </span><span class="identifier">ayj</span><span class="plain"> < </span><span class="identifier">axj</span><span class="plain">)) {</span>
|
|
<span class="identifier">cache</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain"> = (</span><span class="identifier">axy</span><span class="plain"> + </span><span class="identifier">ayj</span><span class="plain">);</span>
|
|
<span class="identifier">cache2</span><span class="plain">-></span><span class="identifier">offset</span><span class="plain"> = </span><span class="identifier">cache2</span><span class="plain">->(</span><span class="identifier">ox</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oy</span><span class="plain">);</span>
|
|
<span class="plain">}</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">count</span><span class="plain">) {</span>
|
|
<span class="identifier">count</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">->((</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="reserved">to</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">oy</span><span class="plain"> = </span><span class="identifier">cache2</span><span class="plain">->((</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="reserved">to</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oy</span><span class="plain"> < </span><span class="constant">255</span><span class="plain">)</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">ox</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ox</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain"> == </span><span class="identifier">oy</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">ox</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">cache</span><span class="plain"> = </span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_CACHE</span><span class="plain">;</span>
|
|
<span class="identifier">cache2</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain"> + </span><span class="identifier">WORDSIZE</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> == </span><span class="reserved">true</span><span class="plain">) {</span>
|
|
<span class="identifier">RlnGetF</span><span class="plain">(</span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">RR_STORAGE</span><span class="plain">)--></span><span class="identifier">VTOVS_CACHE_BROKEN</span><span class="plain"> = </span><span class="reserved">false</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">oy</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">ox</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">left_ix</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Relation_TestVtoV</span><span class="plain">(</span><span class="identifier">oy</span><span class="plain">, </span><span class="identifier">relation</span><span class="plain">, </span><span class="identifier">ox</span><span class="plain">)) {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = ((</span><span class="identifier">oy</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="identifier">ox</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="identifier">cache</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">cache2</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain"> = </span><span class="identifier">ox</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = ((</span><span class="identifier">oy</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="identifier">ox</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="identifier">cache</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">cache2</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">oy</span><span class="plain">=0: </span><span class="identifier">oy</span><span class="plain"><</span><span class="identifier">domainsize</span><span class="plain">: </span><span class="identifier">oy</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ox</span><span class="plain">=0: </span><span class="identifier">ox</span><span class="plain"><</span><span class="identifier">domainsize</span><span class="plain">: </span><span class="identifier">ox</span><span class="plain">++) {</span>
|
|
<span class="identifier">axy</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">-->(</span><span class="identifier">ox</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oy</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">axy</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">oj</span><span class="plain">=0: </span><span class="identifier">oj</span><span class="plain"><</span><span class="identifier">domainsize</span><span class="plain">: </span><span class="identifier">oj</span><span class="plain">++) {</span>
|
|
<span class="identifier">ayj</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">-->(</span><span class="identifier">oy</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oj</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ayj</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = </span><span class="identifier">ox</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oj</span><span class="plain">;</span>
|
|
<span class="identifier">axj</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">axj</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">axy</span><span class="plain"> + </span><span class="identifier">ayj</span><span class="plain"> < </span><span class="identifier">axj</span><span class="plain">)) {</span>
|
|
<span class="identifier">cache</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain"> = (</span><span class="identifier">axy</span><span class="plain"> + </span><span class="identifier">ayj</span><span class="plain">);</span>
|
|
<span class="identifier">cache2</span><span class="plain">--></span><span class="identifier">offset</span><span class="plain"> = </span><span class="identifier">cache2</span><span class="plain">-->(</span><span class="identifier">ox</span><span class="plain">*</span><span class="identifier">domainsize</span><span class="plain"> + </span><span class="identifier">oy</span><span class="plain">);</span>
|
|
<span class="plain">}</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">count</span><span class="plain">) {</span>
|
|
<span class="identifier">count</span><span class="plain"> = </span><span class="identifier">cache</span><span class="plain">-->((</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="reserved">to</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">cache2</span><span class="plain">-->((</span><span class="identifier">from</span><span class="plain">.</span><span class="identifier">left_ix</span><span class="plain">)*</span><span class="identifier">domainsize</span><span class="plain"> + (</span><span class="reserved">to</span><span class="plain">.</span><span class="identifier">left_ix</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">count</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Iterating Relations. </b>The following is provided to make it possible to run an I6 routine on each
|
|
relation in turn. (Each right-way-round relation, at any rate.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-rlt.html">Back to 'Relation Kind Template'</a></li><li><a href="S-rtp.html">Continue with 'RTP Template'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
MathJax = {
|
|
tex: {
|
|
inlineMath: '$', '$'], ['\\(', '\\)'
|
|
},
|
|
svg: {
|
|
fontCache: 'global'
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
|
|
</script>
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|