mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
3047 lines
315 KiB
HTML
3047 lines
315 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>9/tc</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="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html"><b>compiler tools</b></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>Compiler Webs</h2>
|
|
<ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul>
|
|
<h2>Inbuild Modules</h2>
|
|
<ul>
|
|
<li><a href="../inbuild-module/index.html">inbuild</a></li>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
</ul>
|
|
<h2>Inform7 Modules</h2>
|
|
<ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul>
|
|
<h2>Inter Modules</h2>
|
|
<ul>
|
|
<li><a href="../inter-module/index.html">inter</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of '9/ma' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#9">Chapter 9: The A-Parser</a></li><li><b>Make Assertions</b></li></ul><p class="purpose">To read assertion sentences, sort them according to a detailed grammatical classification and take the primary actions necessary either to generate problem messages, or to infer information.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. The Matrix</a></li><li><a href="#SP3">§3. Splitting into cases</a></li><li><a href="#SP3_3_1">§3.3.1. Case 1</a></li><li><a href="#SP3_3_2">§3.3.2. Case 2</a></li><li><a href="#SP3_3_3">§3.3.3. Case 3</a></li><li><a href="#SP3_3_4">§3.3.4. Case 4</a></li><li><a href="#SP3_3_5">§3.3.5. Case 5</a></li><li><a href="#SP3_3_6">§3.3.6. Case 6</a></li><li><a href="#SP3_3_7">§3.3.7. Case 7</a></li><li><a href="#SP3_3_8">§3.3.8. Case 8. "A is a kind of B"</a></li><li><a href="#SP3_3_9">§3.3.9. Case 9</a></li><li><a href="#SP3_3_10">§3.3.10. Case 10</a></li><li><a href="#SP3_3_11">§3.3.11. Case 11. This is a catch-all sort of error</a></li><li><a href="#SP3_3_12">§3.3.12. Case 12</a></li><li><a href="#SP3_3_13">§3.3.13. Case 13</a></li><li><a href="#SP3_3_14">§3.3.14. Case 14</a></li><li><a href="#SP3_3_15">§3.3.15. Case 15</a></li><li><a href="#SP3_3_16">§3.3.16. Case 16</a></li><li><a href="#SP3_3_17">§3.3.17. Case 17</a></li><li><a href="#SP3_3_18">§3.3.18. Case 18</a></li><li><a href="#SP3_3_19">§3.3.19. Case 19</a></li><li><a href="#SP3_3_20">§3.3.20. Case 20</a></li><li><a href="#SP3_3_21">§3.3.21. Case 21</a></li><li><a href="#SP3_3_22">§3.3.22. Case 22</a></li><li><a href="#SP3_3_23">§3.3.23. Case 23</a></li><li><a href="#SP3_3_24">§3.3.24. Case 24</a></li><li><a href="#SP3_3_25">§3.3.25. Case 25</a></li><li><a href="#SP3_3_26">§3.3.26. Case 26</a></li><li><a href="#SP3_3_27">§3.3.27. Case 27</a></li><li><a href="#SP3_3_28">§3.3.28. Case 28</a></li><li><a href="#SP3_3_29">§3.3.29. Case 29</a></li><li><a href="#SP3_3_30">§3.3.30. Case 30</a></li><li><a href="#SP3_3_31">§3.3.31. Case 31</a></li><li><a href="#SP3_3_32">§3.3.32. Case 32</a></li><li><a href="#SP3_3_33">§3.3.33. Case 33</a></li><li><a href="#SP3_3_34">§3.3.34. Case 34</a></li><li><a href="#SP3_3_35">§3.3.35. Case 35</a></li><li><a href="#SP3_3_36">§3.3.36. Case 36</a></li><li><a href="#SP3_3_37">§3.3.37. Case 37</a></li><li><a href="#SP3_3_38">§3.3.38. Case 38</a></li><li><a href="#SP3_3_39">§3.3.39. Case 39</a></li><li><a href="#SP3_3_40">§3.3.40. Case 40</a></li><li><a href="#SP3_3_41">§3.3.41. Case 41</a></li><li><a href="#SP3_3_42">§3.3.42. Case 42</a></li><li><a href="#SP7">§7. Instantiation of related kinds</a></li><li><a href="#SP8">§8. Adjective list trees</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. The Matrix. </b>So assertion sentences such as:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The lion is supported by the marble plinth.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">have now been parsed to a tree form, in which the two clauses being equated
|
|
("the lion" and "supported by the marble plinth") are each represented
|
|
by subtrees, which we will call <code class="display"><span class="extract">px</span></code> and <code class="display"><span class="extract">py</span></code>. All references have been
|
|
resolved, that is, we have identified what objects and values are referred
|
|
to, creating new items if necessary. Now we must take action.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">What we do depends in the first instance on the node types of the head nodes of
|
|
the <code class="display"><span class="extract">px</span></code> and <code class="display"><span class="extract">py</span></code> subtrees. We want to be sure that we completely understand
|
|
this process and that no possibilities escape notice; we therefore use a matrix
|
|
of possible cases, as follows. <code class="display"><span class="extract">py</span></code> specifies the row and <code class="display"><span class="extract">px</span></code> the column.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The record size of this matrix in Inform's history is 15* 15 with
|
|
58 numbered cases, but today there are "only" 42 cases in a 12* 12
|
|
grid. The cases are numbered upwards from 1, contiguously. There is no
|
|
significance to their ordering so far as the program's working is concerned;
|
|
but they are arranged in what seemed the best systematic way to group like
|
|
with like, by numbering from the top left to bottom right, and within each
|
|
cross-diagonal numbering from the centre outwards. The cases generally
|
|
increase in difficulty, with elementary syntax at the top left and quite
|
|
tricky semantics at the bottom right.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">ASSERTION_MATRIX_DIM</span><span class="plain"> </span><span class="constant">12</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">matrix_entry</span><span class="plain"> {</span>
|
|
<span class="identifier">node_type_t</span><span class="plain"> </span><span class="identifier">row_node_type</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cases</span><span class="plain">[</span><span class="constant">ASSERTION_MATRIX_DIM</span><span class="plain">];</span>
|
|
<span class="plain">} </span><span class="reserved">matrix_entry</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">matrix_entry</span><span class="plain"> </span><span class="identifier">assertion_matrix</span><span class="plain">[</span><span class="constant">ASSERTION_MATRIX_DIM</span><span class="plain">] = {</span>
|
|
<span class="plain"> </span><span class="comment">A, W, XY, K, A, PL, A, A, R, E, CN, PN</span>
|
|
<span class="plain">{ </span><span class="identifier">AND_NT</span><span class="plain">, { </span><span class="constant">1</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="constant">1</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="identifier">WITH_NT</span><span class="plain">, { </span><span class="constant">3</span><span class="plain">, </span><span class="constant">4</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">14</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="constant">3</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="constant">X_OF_Y_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">6</span><span class="plain">, </span><span class="constant">7</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">7</span><span class="plain">, </span><span class="constant">7</span><span class="plain">, </span><span class="constant">7</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">23</span><span class="plain">, </span><span class="constant">7</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="identifier">KIND_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">8</span><span class="plain">, </span><span class="constant">8</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="constant">ALLOWED_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">10</span><span class="plain">, </span><span class="constant">10</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">10</span><span class="plain">, </span><span class="constant">10</span><span class="plain">, </span><span class="constant">10</span><span class="plain">, </span><span class="constant">10</span><span class="plain">, </span><span class="constant">25</span><span class="plain">, </span><span class="constant">25</span><span class="plain">, </span><span class="constant">25</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="identifier">PROPERTY_LIST_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">11</span><span class="plain">, </span><span class="constant">12</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">18</span><span class="plain">, </span><span class="constant">22</span><span class="plain">, </span><span class="constant">19</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">18</span><span class="plain">, </span><span class="constant">18</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="constant">ADJECTIVE_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">13</span><span class="plain">, </span><span class="constant">12</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">22</span><span class="plain">, </span><span class="constant">22</span><span class="plain">, </span><span class="constant">24</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">29</span><span class="plain">, </span><span class="constant">29</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="constant">ACTION_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">11</span><span class="plain">, </span><span class="constant">19</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">19</span><span class="plain">, </span><span class="constant">19</span><span class="plain">, </span><span class="constant">27</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">32</span><span class="plain">, </span><span class="constant">32</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="identifier">RELATIONSHIP_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">15</span><span class="plain">, </span><span class="constant">21</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">42</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">28</span><span class="plain">, </span><span class="constant">31</span><span class="plain">, </span><span class="constant">34</span><span class="plain">, </span><span class="constant">36</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="constant">EVERY_NT</span><span class="plain">, { </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">33</span><span class="plain">, </span><span class="constant">17</span><span class="plain">, </span><span class="constant">17</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">11</span><span class="plain">, </span><span class="constant">12</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">18</span><span class="plain">, </span><span class="constant">30</span><span class="plain">, </span><span class="constant">19</span><span class="plain">, </span><span class="constant">35</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">38</span><span class="plain">, </span><span class="constant">39</span><span class="plain"> } },</span>
|
|
<span class="plain">{ </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">, { </span><span class="constant">5</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="constant">26</span><span class="plain">, </span><span class="constant">12</span><span class="plain">, </span><span class="constant">9</span><span class="plain">, </span><span class="constant">18</span><span class="plain">, </span><span class="constant">30</span><span class="plain">, </span><span class="constant">19</span><span class="plain">, </span><span class="constant">37</span><span class="plain">, </span><span class="constant">16</span><span class="plain">, </span><span class="constant">40</span><span class="plain">, </span><span class="constant">41</span><span class="plain"> } } };</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure matrix_entry is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The following routine simply looks up which of the cases the current pair
|
|
of <code class="display"><span class="extract">px</span></code> and <code class="display"><span class="extract">py</span></code> falls into. Speed is not very important here.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::which_assertion_case</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">px</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"make assertion with px NULL"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">py</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"make assertion with py NULL"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">ParseTreeUsage::allow_in_assertions</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">ParseTreeUsage::allow_in_assertions</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"make assertion with improper nodes"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">=-1, </span><span class="identifier">y</span><span class="plain">=-1;</span>
|
|
<span class="identifier">node_type_t</span><span class="plain"> </span><span class="identifier">wx</span><span class="plain"> = </span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">wy</span><span class="plain"> = </span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="constant">ASSERTION_MATRIX_DIM</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">assertion_matrix</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">row_node_type</span><span class="plain"> == </span><span class="identifier">wx</span><span class="plain">) </span><span class="identifier">x</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">assertion_matrix</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">row_node_type</span><span class="plain"> == </span><span class="identifier">wy</span><span class="plain">) </span><span class="identifier">y</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">x</span><span class="plain"><0) || (</span><span class="identifier">y</span><span class="plain"><0)) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"make assertion with node type not in matrix"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">assertion_matrix</span><span class="plain">[</span><span class="identifier">y</span><span class="plain">].</span><span class="element">cases</span><span class="plain">[</span><span class="identifier">x</span><span class="plain">];</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::which_assertion_case is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Splitting into cases. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG_INDENT</span><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive_inner</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">LOG_OUTDENT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::make_assertion_recursive_inner</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">See if any plugin wants to intervene in this assertion</span> <span class="cwebmacronumber">3.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><<span class="cwebmacro">Reject three forms of assertion</span> <span class="cwebmacronumber">3.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">INITIALLY_CE</span><span class="plain">) </span><span class="identifier">prevailing_mood</span><span class="plain"> = </span><span class="identifier">LIKELY_CE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ma_case</span><span class="plain"> = </span><span class="functiontext">Assertions::Maker::which_assertion_case</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ASSERTIONS</span><span class="plain">, </span><span class="string">"[%W/$N] =%d [%W/$N]\n"</span><span class="plain">,</span>
|
|
<span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">ma_case</span><span class="plain">,</span>
|
|
<span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">), </span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
|
|
<<span class="cwebmacro">Split the assertion-handler into cases</span> <span class="cwebmacronumber">3.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::make_assertion_recursive is used in <a href="#SP3_3_1">§3.3.1</a>, <a href="#SP3_3_2">§3.3.2</a>, <a href="#SP3_3_3">§3.3.3</a>, <a href="#SP3_3_5">§3.3.5</a>, <a href="#SP3_3_11">§3.3.11</a>, <a href="#SP3_3_14">§3.3.14</a>, <a href="#SP3_3_15">§3.3.15</a>, <a href="#SP3_3_20">§3.3.20</a>, <a href="#SP3_3_22">§3.3.22</a>, <a href="#SP3_3_25">§3.3.25</a>, <a href="#SP3_3_28">§3.3.28</a>, <a href="#SP3_3_34">§3.3.34</a>, <a href="#SP3_3_34_2">§3.3.34.2</a>, <a href="#SP3_3_34_4">§3.3.34.4</a>, <a href="#SP3_3_35">§3.3.35</a>, <a href="#SP3_3_36">§3.3.36</a>, <a href="#SP3_3_37">§3.3.37</a>, <a href="#SP3_3_41_7">§3.3.41.7</a>, <a href="#SP3_3_42">§3.3.42</a>, 9/tbath (<a href="9-tbath.html#SP5">§5</a>), 9/tc (<a href="9-tc.html#SP8_4_1">§8.4.1</a>).</p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::make_assertion_recursive_inner appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_1"></a><b>§3.1. </b>If a plugin sees fit to throw a problem message, we abandon the assertion.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">See if any plugin wants to intervene in this assertion</span> <span class="cwebmacronumber">3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pc</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::intervene_in_assertion</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</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">problem_count</span><span class="plain"> > </span><span class="identifier">pc</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_2"></a><b>§3.2. </b>These are better taken care of before we split up into cases.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Reject three forms of assertion</span> <span class="cwebmacronumber">3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">INITIALLY_CE</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) != </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) != </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">))) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MisplacedInitially</span><span class="plain">),</span>
|
|
<span class="string">"you can only say 'initially' when creating variables using 'is'"</span><span class="plain">,</span>
|
|
<span class="string">"so 'The squirrel population is initially 0' is fine, but not "</span>
|
|
<span class="string">"'The acorn is initially carried by Mr Hedges.' - probably you "</span>
|
|
<span class="string">"only need to remove the word 'initially'."</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">prevailing_mood</span><span class="plain"> != </span><span class="identifier">UNKNOWN_CE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">CON_property</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Lvalues::is_actual_NONLOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_VagueAboutSpecific</span><span class="plain">),</span>
|
|
<span class="string">"you can only equivocate with 'usually', 'rarely', "</span>
|
|
<span class="string">"'always' and the like when talking about kinds of thing"</span><span class="plain">,</span>
|
|
<span class="string">"because when a specific thing is involved you should say "</span>
|
|
<span class="string">"definitely one way or another. 'A cave is usually dark' is "</span>
|
|
<span class="string">"fine, but not 'the Mystic Wood is usually dark'."</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) && (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="constant">multiplicity_ANNOT</span><span class="plain">) > </span><span class="constant">1</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) != </span><span class="identifier">RELATIONSHIP_NT</span><span class="plain">)) ||</span>
|
|
<span class="plain">((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)) && (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="constant">multiplicity_ANNOT</span><span class="plain">) > </span><span class="constant">1</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) != </span><span class="identifier">RELATIONSHIP_NT</span><span class="plain">))) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MultiplyVague</span><span class="plain">),</span>
|
|
<span class="string">"multiple objects can only be put into relationships"</span><span class="plain">,</span>
|
|
<span class="string">"by saying something like 'In the Drawing Room are two women.', "</span>
|
|
<span class="string">"and all other assertions with multiple objects are disallowed: "</span>
|
|
<span class="string">"so 'Three doors are open.' is rejected - I can't tell which three."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3"></a><b>§3.3. </b>The case names here are systematic and were constructed from the above
|
|
matrix by a Perl script, in an attempt to ensure their truthfulness; but they're
|
|
just labels, so should they be wrong the only consequence is that the code
|
|
in this section will be harder to understand.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Split the assertion-handler into cases</span> <span class="cwebmacronumber">3.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">ma_case</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><<span class="cwebmacro">Case 1 - Miscellaneous vs AND</span> <span class="cwebmacronumber">3.3.1</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><<span class="cwebmacro">Case 2 - WITH vs Miscellaneous</span> <span class="cwebmacronumber">3.3.2</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><<span class="cwebmacro">Case 3 - Miscellaneous vs WITH</span> <span class="cwebmacronumber">3.3.3</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">4</span><span class="plain">: </span><<span class="cwebmacro">Case 4 - WITH on both sides</span> <span class="cwebmacronumber">3.3.4</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">5</span><span class="plain">: </span><<span class="cwebmacro">Case 5 - AND vs Miscellaneous</span> <span class="cwebmacronumber">3.3.5</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">6</span><span class="plain">: </span><<span class="cwebmacro">Case 6 - X OF Y on both sides</span> <span class="cwebmacronumber">3.3.6</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">7</span><span class="plain">: </span><<span class="cwebmacro">Case 7 - Miscellaneous vs X OF Y</span> <span class="cwebmacronumber">3.3.7</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">8</span><span class="plain">: </span><<span class="cwebmacro">Case 8 - Miscellaneous vs KIND</span> <span class="cwebmacronumber">3.3.8</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">9</span><span class="plain">: </span><<span class="cwebmacro">Case 9 - ALLOWED vs Miscellaneous</span> <span class="cwebmacronumber">3.3.9</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">10</span><span class="plain">: </span><<span class="cwebmacro">Case 10 - Miscellaneous vs ALLOWED</span> <span class="cwebmacronumber">3.3.10</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">11</span><span class="plain">: </span><<span class="cwebmacro">Case 11 - X OF Y vs PROPERTY LIST, ACTION, COMMON NOUN</span> <span class="cwebmacronumber">3.3.11</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">12</span><span class="plain">: </span><<span class="cwebmacro">Case 12 - KIND vs PROPERTY LIST, ADJECTIVE, COMMON NOUN, PROPER NOUN</span> <span class="cwebmacronumber">3.3.12</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">13</span><span class="plain">: </span><<span class="cwebmacro">Case 13 - X OF Y vs ADJECTIVE</span> <span class="cwebmacronumber">3.3.13</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">14</span><span class="plain">: </span><<span class="cwebmacro">Case 14 - RELATIONSHIP vs WITH</span> <span class="cwebmacronumber">3.3.14</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">15</span><span class="plain">: </span><<span class="cwebmacro">Case 15 - WITH vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.15</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">16</span><span class="plain">: </span><<span class="cwebmacro">Case 16 - EVERY vs Miscellaneous</span> <span class="cwebmacronumber">3.3.16</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">17</span><span class="plain">: </span><<span class="cwebmacro">Case 17 - Miscellaneous vs EVERY</span> <span class="cwebmacronumber">3.3.17</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">18</span><span class="plain">: </span><<span class="cwebmacro">Case 18 - PROPERTY LIST, COMMON NOUN, PROPER NOUN on both sides</span> <span class="cwebmacronumber">3.3.18</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">19</span><span class="plain">: </span><<span class="cwebmacro">Case 19 - ACTION, KIND, PROPERTY LIST, ADJECTIVE vs PROPERTY LIST, ACTION, COMMON NOUN, PROPER NOUN</span> <span class="cwebmacronumber">3.3.19</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">20</span><span class="plain">: </span><<span class="cwebmacro">Case 20 - Miscellaneous on both sides</span> <span class="cwebmacronumber">3.3.20</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">21</span><span class="plain">: </span><<span class="cwebmacro">Case 21 - X OF Y vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.21</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">22</span><span class="plain">: </span><<span class="cwebmacro">Case 22 - ADJECTIVE, PROPERTY LIST vs PROPERTY LIST, ADJECTIVE</span> <span class="cwebmacronumber">3.3.22</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">23</span><span class="plain">: </span><<span class="cwebmacro">Case 23 - COMMON NOUN vs X OF Y</span> <span class="cwebmacronumber">3.3.23</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">24</span><span class="plain">: </span><<span class="cwebmacro">Case 24 - ACTION vs ADJECTIVE</span> <span class="cwebmacronumber">3.3.24</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">25</span><span class="plain">: </span><<span class="cwebmacro">Case 25 - EVERY, COMMON NOUN, PROPER NOUN vs ALLOWED</span> <span class="cwebmacronumber">3.3.25</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">26</span><span class="plain">: </span><<span class="cwebmacro">Case 26 - X OF Y vs PROPER NOUN</span> <span class="cwebmacronumber">3.3.26</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">27</span><span class="plain">: </span><<span class="cwebmacro">Case 27 - ACTION on both sides</span> <span class="cwebmacronumber">3.3.27</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">28</span><span class="plain">: </span><<span class="cwebmacro">Case 28 - RELATIONSHIP on both sides</span> <span class="cwebmacronumber">3.3.28</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">29</span><span class="plain">: </span><<span class="cwebmacro">Case 29 - COMMON NOUN, PROPER NOUN vs ADJECTIVE</span> <span class="cwebmacronumber">3.3.29</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">30</span><span class="plain">: </span><<span class="cwebmacro">Case 30 - ADJECTIVE vs COMMON NOUN, PROPER NOUN</span> <span class="cwebmacronumber">3.3.30</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">31</span><span class="plain">: </span><<span class="cwebmacro">Case 31 - EVERY vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.31</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">32</span><span class="plain">: </span><<span class="cwebmacro">Case 32 - COMMON NOUN, PROPER NOUN vs ACTION</span> <span class="cwebmacronumber">3.3.32</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">33</span><span class="plain">: </span><<span class="cwebmacro">Case 33 - EVERY on both sides</span> <span class="cwebmacronumber">3.3.33</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">34</span><span class="plain">: </span><<span class="cwebmacro">Case 34 - COMMON NOUN vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.34</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">35</span><span class="plain">: </span><<span class="cwebmacro">Case 35 - RELATIONSHIP vs COMMON NOUN</span> <span class="cwebmacronumber">3.3.35</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">36</span><span class="plain">: </span><<span class="cwebmacro">Case 36 - PROPER NOUN vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.36</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">37</span><span class="plain">: </span><<span class="cwebmacro">Case 37 - RELATIONSHIP vs PROPER NOUN</span> <span class="cwebmacronumber">3.3.37</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">38</span><span class="plain">: </span><<span class="cwebmacro">Case 38 - COMMON NOUN on both sides</span> <span class="cwebmacronumber">3.3.38</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">39</span><span class="plain">: </span><<span class="cwebmacro">Case 39 - PROPER NOUN vs COMMON NOUN</span> <span class="cwebmacronumber">3.3.39</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">40</span><span class="plain">: </span><<span class="cwebmacro">Case 40 - COMMON NOUN vs PROPER NOUN</span> <span class="cwebmacronumber">3.3.40</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">41</span><span class="plain">: </span><<span class="cwebmacro">Case 41 - PROPER NOUN on both sides</span> <span class="cwebmacronumber">3.3.41</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">42</span><span class="plain">: </span><<span class="cwebmacro">Case 42 - ADJECTIVE vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.42</span>><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Unimplemented assertion case %d\n"</span><span class="plain">, </span><span class="identifier">ma_case</span><span class="plain">);</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"No implementation for make assertion case"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_1"></a><b>§3.3.1. Case 1. </b>"A is B and C": process as "A is B" then "A is C".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 1 - Miscellaneous vs AND</span> <span class="cwebmacronumber">3.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">across</span><span class="plain"> = </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">np</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">across</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">np</span><span class="plain"> == </span><span class="identifier">problem_count</span><span class="plain">) </span><span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">across</span><span class="plain">);</span>
|
|
<span class="identifier">across</span><span class="plain"> = </span><span class="identifier">across</span><span class="plain">-></span><span class="element">next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_2"></a><b>§3.3.2. Case 2. </b>"An A with I is B" looks symmetrical with case 3, but is not. We might be
|
|
looking at an implication, for example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>An open door is usually openable.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">We allow this provided the properties I are all adjectival, and so is the
|
|
outcome B.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Otherwise we handle case 2 much like case 3, but more simply since the
|
|
result will normally be problem messages — not unreasonably given how
|
|
strange sentences like this are:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A container with description "Solid." is the solid box.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 2 - WITH vs Miscellaneous</span> <span class="cwebmacronumber">3.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Assertions::Maker::is_adjlist</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Assertions::Maker::is_adjlist</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Assertions::Implications::new</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">next</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">np</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="comment">A is B</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="identifier">np</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">); </span><span class="comment">A is I</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">np</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="comment">A is B</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="identifier">np</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="comment">I is B</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_3"></a><b>§3.3.3. Case 3. </b>"A is a B with I": process as "A is a B" followed by "A is I", which
|
|
works nicely because we bend grammar to allow "is" in place of "has" when
|
|
it comes to lists of property values.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The wickerwork box is a container with description "Pricy." The bat and ball are things with description "Cricket equipment." A trophy is a kind of container with score for finding 5.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">An exception occurs with sentences like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>South is a dead end with printed name "Collapsed Dead End".</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Here <code class="display"><span class="extract">px</span></code>, "south", refers not to the direction but to the room which lies
|
|
to the south of the location being talked about, which means that the printed
|
|
name must be given to the dead end, not to the direction "south". In this
|
|
case, on traverse 2 when properties are set, we process as "A is a B"
|
|
followed by "B is I". (On traverse 1, B is still an <code class="display"><span class="extract">COMMON_NOUN_NT</span></code> node,
|
|
since it hasn't yet been instantiated into an actual but nameless room —
|
|
at which point it becomes a <code class="display"><span class="extract">PROPER_NOUN_NT</span></code> node.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 3 - Miscellaneous vs WITH</span> <span class="cwebmacronumber">3.3.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">PL::Map::is_a_direction</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">np</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">); </span><span class="comment">A is a B</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="identifier">np</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">); </span><span class="comment">B is I</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">np</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">); </span><span class="comment">A is a B</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="identifier">np</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">); </span><span class="comment">A is I</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_4"></a><b>§3.3.4. Case 4. </b>"A with B is C with D" must be incorrect.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A container with description "White" is a container with description "Black".</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 4 - WITH on both sides</span> <span class="cwebmacronumber">3.3.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_WithIsWith</span><span class="plain">),</span>
|
|
<span class="string">"you can't say that one general description is another "</span><span class="plain">,</span>
|
|
<span class="string">"for instance by writing 'A container with carrying capacity 10 is a "</span>
|
|
<span class="string">"container with description \"Handy.\"'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_5"></a><b>§3.3.5. Case 5. </b>"A and B are C": process as "A is C" then "B is C".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 5 - AND vs Miscellaneous</span> <span class="cwebmacronumber">3.3.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">across</span><span class="plain"> = </span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">np</span><span class="plain"> = </span><span class="identifier">problem_count</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">across</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">np</span><span class="plain"> == </span><span class="identifier">problem_count</span><span class="plain">) </span><span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">across</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">across</span><span class="plain"> = </span><span class="identifier">across</span><span class="plain">-></span><span class="element">next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_6"></a><b>§3.3.6. Case 6. </b>Now to begin on the <code class="display"><span class="extract">XOFY_NT</span></code> cases, which look syntactically
|
|
like properties.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 6 - X OF Y on both sides</span> <span class="cwebmacronumber">3.3.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_XofYisZofW</span><span class="plain">),</span>
|
|
<span class="string">"this seems to say two different properties are not simply equal "</span>
|
|
<span class="string">"but somehow the same thing"</span><span class="plain">,</span>
|
|
<span class="string">"like saying that 'the printed name of the millpond is the "</span>
|
|
<span class="string">"printed name of the village pond'. This puts me in a quandary: "</span>
|
|
<span class="string">"which should be changed to match the other, and what if I am "</span>
|
|
<span class="string">"unable to work out the value of either one?"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_7"></a><b>§3.3.7. Case 7. </b></p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 7 - Miscellaneous vs X OF Y</span> <span class="cwebmacronumber">3.3.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadXofY</span><span class="plain">),</span>
|
|
<span class="string">"this is the wrong way around if you want to specify a property"</span><span class="plain">,</span>
|
|
<span class="string">"like saying that '10 is the score of the platinum pyramid', "</span>
|
|
<span class="string">"which is poor style. (Though sweet are the uses of adversity.)"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8"></a><b>§3.3.8. Case 8. "A is a kind of B". </b>Much of the work has already been done at
|
|
refinement time. There are really four forms of this:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) "Length is a kind of value". Here <code class="display"><span class="extract">px</span></code> doesn't refer to an instance.
|
|
</li><li>(b) "A figment is a kind". Here <code class="display"><span class="extract">px</span></code> refers to a possibly new-made kind,
|
|
and <code class="display"><span class="extract">py</span></code> refers to "kind".
|
|
</li><li>(c) "A cart is a kind of vehicle". Ditto, and <code class="display"><span class="extract">py</span></code> refers to "vehicle".
|
|
</li><li>(d) "A food is a kind of thing which is edible". Ditto, except <code class="display"><span class="extract">py</span></code> refers
|
|
of course to "thing", and also has a child node, containing a proposition
|
|
specifying its edibility.
|
|
</li></ul>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 8 - Miscellaneous vs KIND</span> <span class="cwebmacronumber">3.3.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</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">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="identifier">KIND_NT</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Don't allow a kind of kind</span> <span class="cwebmacronumber">3.3.8.4</span>><span class="character">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="constant">EVERY_NT</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Don't allow a kind of everything</span> <span class="cwebmacronumber">3.3.8.5</span>><span class="character">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prevailing_mood</span><span class="plain"> != </span><span class="identifier">UNKNOWN_CE</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Don't allow a kind declaration to have uncertainty</span> <span class="cwebmacronumber">3.3.8.6</span>><span class="character">;</span>
|
|
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">inst</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">kind_of_what</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kind_of_what</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"KIND node without subject"</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InferenceSubjects::is_an_object</span><span class="plain">(</span><span class="identifier">inst</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::is_a_kind_of_object</span><span class="plain">(</span><span class="identifier">inst</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InferenceSubjects::domain</span><span class="plain">(</span><span class="identifier">inst</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::where_created</span><span class="plain">(</span><span class="identifier">inst</span><span class="plain">) != </span><span class="identifier">current_sentence</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Don't allow an existing object to be declared as a kind over again</span> <span class="cwebmacronumber">3.3.8.1</span>><span class="character">;</span>
|
|
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">subject_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="identifier">WITH_NT</span><span class="plain">)</span>
|
|
<span class="identifier">subject_to</span><span class="plain"> = </span><span class="identifier">ParseTree::get_creation_proposition</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">subject_to</span><span class="plain"> = </span><span class="functiontext">Specifications::to_proposition</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="functiontext">Calculus::Propositions::Abstract::assert_kind_of_subject</span><span class="plain">(</span><span class="identifier">inst</span><span class="plain">, </span><span class="identifier">kind_of_what</span><span class="plain">, </span><span class="identifier">subject_to</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<<span class="cwebmacro">Don't allow an existing property name to be redeclared as a kind</span> <span class="cwebmacronumber">3.3.8.2</span>><span class="character">;</span>
|
|
<<span class="cwebmacro">Don't allow any existing actual value to be redeclared as a kind</span> <span class="cwebmacronumber">3.3.8.3</span>><span class="character">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8_1"></a><b>§3.3.8.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Don't allow an existing object to be declared as a kind over again</span> <span class="cwebmacronumber">3.3.8.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Problems::quote_subject</span><span class="plain">(1, </span><span class="identifier">inst</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(2, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(3, </span><span class="functiontext">InferenceSubjects::where_created</span><span class="plain">(</span><span class="identifier">inst</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_InstanceNowKind</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"You wrote '%2', but that seems to say that some "</span>
|
|
<span class="string">"room or thing already created ('%1', created by '%3') is now to "</span>
|
|
<span class="string">"become a kind. To prevent a variety of possible misunderstandings, "</span>
|
|
<span class="string">"this is not allowed: when a kind is created, the name given has "</span>
|
|
<span class="string">"to be a name not so far used. (Sometimes this happens due to "</span>
|
|
<span class="string">"confusion between names. For instance, if a room called 'Marble "</span>
|
|
<span class="string">"archway' exists, then Inform reads 'An archway is a kind of thing', "</span>
|
|
<span class="string">"Inform will read 'archway' as a reference to the existing room, "</span>
|
|
<span class="string">"not as a new name. To solve this, put the sentences the other way "</span>
|
|
<span class="string">"round.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_8">§3.3.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8_2"></a><b>§3.3.8.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Don't allow an existing property name to be redeclared as a kind</span> <span class="cwebmacronumber">3.3.8.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_property</span><span class="plain">(</span>
|
|
<span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_property</span><span class="plain">(2, </span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording_as_source</span><span class="plain">(3, </span><span class="identifier">prn</span><span class="plain">-></span><span class="element">name</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindAsProperty</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"You wrote '%1', but that seems to say that a property "</span>
|
|
<span class="string">"(%3) has to be a kind as well. It is sometimes okay for a "</span>
|
|
<span class="string">"property to have the same name as a kind, but only when that "</span>
|
|
<span class="string">"kind is what it stores, and there shouldn't be a sentence "</span>
|
|
<span class="string">"like this one to declare the kind - it will be made when the "</span>
|
|
<span class="string">"property is made, and doesn't need to be made again."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_8">§3.3.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8_3"></a><b>§3.3.8.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Don't allow any existing actual value to be redeclared as a kind</span> <span class="cwebmacronumber">3.3.8.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(2, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording_as_source</span><span class="plain">(3, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindAsActualValue</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"You wrote '%1', but that seems to say that a value already "</span>
|
|
<span class="string">"in existence (%3) has to be a kind as well. (It's %2.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_8">§3.3.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8_4"></a><b>§3.3.8.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Don't allow a kind of kind</span> <span class="cwebmacronumber">3.3.8.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindOfKindDisallowed</span><span class="plain">),</span>
|
|
<span class="string">"you aren't allowed to make new kinds of kinds"</span><span class="plain">,</span>
|
|
<span class="string">"only kinds of things which already exist. So 'A fox is a kind of animal' "</span>
|
|
<span class="string">"is fine, but 'A tricky kind is a kind of kind' isn't allowed."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_8">§3.3.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8_5"></a><b>§3.3.8.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Don't allow a kind of everything</span> <span class="cwebmacronumber">3.3.8.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindOfEveryDisallowed</span><span class="plain">),</span>
|
|
<span class="string">"you aren't allowed to make a kind of everything"</span><span class="plain">,</span>
|
|
<span class="string">"or of everything matching a description. 'A badger is a kind of animal' "</span>
|
|
<span class="string">"is fine, but 'A gene is a kind of every animal' isn't allowed. (Probably "</span>
|
|
<span class="string">"you just need to get rid of the word 'every'.)"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_8">§3.3.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_8_6"></a><b>§3.3.8.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Don't allow a kind declaration to have uncertainty</span> <span class="cwebmacronumber">3.3.8.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindUncertainDisallowed</span><span class="plain">),</span>
|
|
<span class="string">"you aren't allowed to make a kind in a way expressing certainty or doubt"</span><span class="plain">,</span>
|
|
<span class="string">"so 'A badger is a kind of animal' is fine, but 'A fungus is usually a "</span>
|
|
<span class="string">"kind of every animal' isn't allowed, and nor is 'A fern is never a kind "</span>
|
|
<span class="string">"of animal'. When you tell me about kinds, you have to tell me certainly."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_8">§3.3.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_9"></a><b>§3.3.9. Case 9. </b>This can be proven never to happen, but just in case:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 9 - ALLOWED vs Miscellaneous</span> <span class="cwebmacronumber">3.3.9</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Forbidden case 9 in make assertion has occurred."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_10"></a><b>§3.3.10. Case 10. </b>The syntax looks as if we are assigning a new property to something,
|
|
but it isn't a case where this would be legal. That doesn't mean it's hopeless:
|
|
this is where we assign variables to specific gadgets, which is in a way the
|
|
same thing.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The before rulebook has a text called the standard demurral.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 10 - Miscellaneous vs ALLOWED</span> <span class="cwebmacronumber">3.3.10</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">KIND_NT</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Issue the too vague to have properties or variables problem message</span> <span class="cwebmacronumber">3.3.10.1</span>>
|
|
<span class="reserved">else</span>
|
|
<<span class="cwebmacro">Issue the not allowed to have properties or variables problem message</span> <span class="cwebmacronumber">3.3.10.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_11"></a><b>§3.3.11. Case 11. This is a catch-all sort of error. </b>It might need narrowing into
|
|
further sub-cases later.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The description of the Pitch is open.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 11 - X OF Y vs PROPERTY LIST, ACTION, COMMON NOUN</span> <span class="cwebmacronumber">3.3.11</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(3, </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_PropertyObj2</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In %1 you give a value of a property as '%2', but it "</span>
|
|
<span class="string">"seems to be a general description of a value (%3) rather than "</span>
|
|
<span class="string">"nailing down exactly what the value should be."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="constant">ACTION_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="identifier">ParseTree::get_action_meaning</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="plain">) && (</span><span class="identifier">PL::Actions::Patterns::is_unspecific</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">PL::Actions::Patterns::is_overspecific</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">Rvalues::from_action_pattern</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_value</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_PeculiarProperty</span><span class="plain">),</span>
|
|
<span class="string">"that is a very peculiar property value"</span><span class="plain">,</span>
|
|
<span class="string">"and ought to be something more definite and explicit."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_12"></a><b>§3.3.12. Case 12. </b></p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 12 - KIND vs PROPERTY LIST, ADJECTIVE, COMMON NOUN, PROPER NOUN</span> <span class="cwebmacronumber">3.3.12</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindOfIs</span><span class="plain">),</span>
|
|
<span class="string">"that seems to say that a new kind is the same as something else"</span><span class="plain">,</span>
|
|
<span class="string">"like saying 'A kind of container is a canister': which ought to be put the "</span>
|
|
<span class="string">"other way round, 'A canister is a kind of container'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_13"></a><b>§3.3.13. Case 13. </b>"The colour of the paint is white."
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 13 - X OF Y vs ADJECTIVE</span> <span class="cwebmacronumber">3.3.13</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</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="functiontext">Adjectives::Meanings::has_ENUMERATIVE_meaning</span><span class="plain">(</span><span class="identifier">ParseTree::get_aph</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::Valued::obtain</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="identifier">WITH_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_EOOwnerMutable</span><span class="plain">),</span>
|
|
<span class="string">"either/or properties have to be given to clearly identifiable "</span>
|
|
<span class="string">"owners"</span><span class="plain">,</span>
|
|
<span class="string">"rather than to a collection of owners which might vary during "</span>
|
|
<span class="string">"play. (It is possible to get around this using 'implications', "</span>
|
|
<span class="string">"but it's better to avoid the need.)"</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">,</span>
|
|
<span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">), </span><span class="identifier">py</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">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NonAdjectivalProperty</span><span class="plain">),</span>
|
|
<span class="string">"that property can't be used adjectivally as a value"</span><span class="plain">,</span>
|
|
<span class="string">"since it is an adjective applying to a thing but is "</span>
|
|
<span class="string">"not a name from a range of possibilities."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_14"></a><b>§3.3.14. Case 14. </b>"In A is a B with I": process as "In A is a B" followed by
|
|
"the newly created B is I".
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>In the Pitch is a container with description "Made of wood."</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 14 - RELATIONSHIP vs WITH</span> <span class="cwebmacronumber">3.3.14</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_15"></a><b>§3.3.15. Case 15. </b>"An A with I is in B": the mirror image case.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 15 - WITH vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.15</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_16"></a><b>§3.3.16. Case 16. </b>"Every K is Y" and other oddities.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 16 - EVERY vs Miscellaneous</span> <span class="cwebmacronumber">3.3.16</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadEvery</span><span class="plain">),</span>
|
|
<span class="string">"'every' (or 'always') can't be used in that way"</span><span class="plain">,</span>
|
|
<span class="string">"and should be reserved for sentences like 'A coin is in every room'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_17"></a><b>§3.3.17. Case 17. </b>In fact one sentence like this can make sense — "The mist is
|
|
everywhere", or similar — but is handled by the spatial plugin, if active.
|
|
Even then, of course, "everywhere" implicitly means "in every room",
|
|
not "every room".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 17 - Miscellaneous vs EVERY</span> <span class="cwebmacronumber">3.3.17</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadEvery2</span><span class="plain">),</span>
|
|
<span class="string">"'every' can't be used in that way"</span><span class="plain">,</span>
|
|
<span class="string">"and should be reserved for sentences like 'A coin is in every room'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_18"></a><b>§3.3.18. Case 18. </b>This are unlikely to be called as a top-level sentence with "is",
|
|
but will instead occur through recursion from <code class="display"><span class="extract">WITH_NT</span></code> nodes, or as part of the
|
|
handling of "to have" rather than "to be".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Property lists may contain references to things not yet created, if we
|
|
assert them during pass 1: so we wait until pass 2.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The oddball exception for rulebooks is to add named outcomes:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Reaching inside rules have outcomes allow access (success) and deny access (failure).</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">which syntactically resembles a property list, though in fact is not.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 18 - PROPERTY LIST, COMMON NOUN, PROPER NOUN on both sides</span> <span class="cwebmacronumber">3.3.18</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">CON_rulebook</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Rulebooks::parse_properties</span><span class="plain">(</span><span class="functiontext">Rvalues::to_rulebook</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)),</span>
|
|
<span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">ParseTree::left_edge_of</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">), </span><span class="identifier">ParseTree::right_edge_of</span><span class="plain">(</span><span class="identifier">py</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPERTY_LIST_NT</span><span class="plain">) </span><span class="functiontext">Assertions::PropertyKnowledge::assert_property_list</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Assertions::PropertyKnowledge::assert_property_list</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_19"></a><b>§3.3.19. Case 19. </b>This usually occurs as a name-clash, since it's otherwise something
|
|
pretty improbable:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Taking something is 100. The turn count is taking something.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 19 - ACTION, KIND, PROPERTY LIST, ADJECTIVE vs PROPERTY LIST, ACTION, COMMON NOUN, PROPER NOUN</span> <span class="cwebmacronumber">3.3.19</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActionEquated</span><span class="plain">),</span>
|
|
<span class="string">"an action can't be the same as a thing"</span><span class="plain">,</span>
|
|
<span class="string">"so my guess is that this is an attempt to categorise an action which went "</span>
|
|
<span class="string">"wrong because there was already something of that name in existence. For "</span>
|
|
<span class="string">"instance, 'Taking something is theft' would fail if 'theft' was already a "</span>
|
|
<span class="string">"value. (But it can also happen with a sentence which tries to set several "</span>
|
|
<span class="string">"actions at once to a named kind of action, like 'Taking and dropping are "</span>
|
|
<span class="string">"manipulation.' - only one can be named at a time.)"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActionEquated2</span><span class="plain">),</span>
|
|
<span class="string">"that means something else already"</span><span class="plain">,</span>
|
|
<span class="string">"so it will only confuse things if we use it for a kind of action."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_20"></a><b>§3.3.20. Case 20. </b>Hoovering up a variety of implausible things claimed to have
|
|
a spatial location.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>On the desk is 100. East of the Pitch is a rulebook.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 20 - Miscellaneous on both sides</span> <span class="cwebmacronumber">3.3.20</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) { </span><span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</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="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)) { </span><span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_IntangibleRelated</span><span class="plain">),</span>
|
|
<span class="string">"this seems to give a worldly relationship to something intangible"</span><span class="plain">,</span>
|
|
<span class="string">"like saying that 'in the box is a text'. Perhaps it came "</span>
|
|
<span class="string">"to this because you gave something physical a name which was "</span>
|
|
<span class="string">"accidentally something meaningful to me in another context? "</span>
|
|
<span class="string">"If so, you may be able to get around it by rewording ('In the "</span>
|
|
<span class="string">"box is a medieval text') or in extremis by using 'called' "</span>
|
|
<span class="string">"('In the box is a thing called text')."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_21"></a><b>§3.3.21. Case 21. </b></p>
|
|
|
|
<blockquote>
|
|
<p>The position of the weathervane is east of the church.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 21 - X OF Y vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.21</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_XofYRelated</span><span class="plain">),</span>
|
|
<span class="string">"this seems to say that a property of something is not simply equal "</span>
|
|
<span class="string">"to what happens at the moment to satisfy some relationship, but "</span>
|
|
<span class="string">"conceptually the same as that relationship"</span><span class="plain">,</span>
|
|
<span class="string">"like saying 'the position of the weathervane is east of the "</span>
|
|
<span class="string">"church'. It would be fine to say 'the position of the weathervane "</span>
|
|
<span class="string">"is east' or 'the position of the weathervane is the meadow', "</span>
|
|
<span class="string">"because 'east' and 'meadow' are definite things."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_22"></a><b>§3.3.22. Case 22. </b>Most of the time, we're here because of an implicatory sentence like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Scenery is usually fixed in place.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">But just maybe we have something like
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Guttering is inadequate.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where we are assigning a property ("inadequate") to a value ("guttering")
|
|
which can be used as an adjective, but isn't being so used here. So if it's
|
|
possible to coerce the left side to a noun, we will.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 22 - ADJECTIVE, PROPERTY LIST vs PROPERTY LIST, ADJECTIVE</span> <span class="cwebmacronumber">3.3.22</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Assertions::Refiner::coerce_adjectival_usage_to_noun</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</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">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="functiontext">Assertions::Implications::new</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_23"></a><b>§3.3.23. Case 23. </b>And so on.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 23 - COMMON NOUN vs X OF Y</span> <span class="cwebmacronumber">3.3.23</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DescriptionIsOther</span><span class="plain">),</span>
|
|
<span class="string">"this seems to say that a general description is something else"</span><span class="plain">,</span>
|
|
<span class="string">"like saying that 'a door is 20'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_24"></a><b>§3.3.24. Case 24. </b>Not as unlikely a mistake as it might seem:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Taking something is open.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 24 - ACTION vs ADJECTIVE</span> <span class="cwebmacronumber">3.3.24</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActionAdjective</span><span class="plain">),</span>
|
|
<span class="string">"that is already the name of a property"</span><span class="plain">,</span>
|
|
<span class="string">"so it will only confuse things if we use it for a kind of action."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_25"></a><b>§3.3.25. Case 25. </b>Here we are declaring a new property — either to an object, a kind
|
|
or a kind of value.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A container has a number called security rating.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 25 - EVERY, COMMON NOUN, PROPER NOUN vs ALLOWED</span> <span class="cwebmacronumber">3.3.25</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) {</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">CON_property</span><span class="plain">))) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_property</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prn</span><span class="plain">) && (</span><span class="functiontext">Properties::Valued::coincides_with_kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">))) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Properties::Valued::kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_type_and_clear_annotations</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
|
|
<span class="identifier">ParseTree::set_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="functiontext">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::offered_property</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</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">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_activity</span><span class="plain">) </span><<span class="cwebmacro">Assign a new activity variable</span> <span class="cwebmacronumber">3.3.25.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_rulebook</span><span class="plain">) </span><<span class="cwebmacro">Assign a new rulebook variable</span> <span class="cwebmacronumber">3.3.25.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<<span class="cwebmacro">Issue the not allowed to have properties or variables problem message</span> <span class="cwebmacronumber">3.3.10.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="functiontext">Assertions::Property::recursively_declare_properties</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_25_1"></a><b>§3.3.25.1. </b>Activities can optionally be referred to without the clarifier "activity",
|
|
but not in this context.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Assign a new activity variable</span> <span class="cwebmacronumber">3.3.25.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_activity</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"failed to extract activity structure"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="reserved">activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">formal</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)))</span>
|
|
<span class="functiontext">Activities::add_variable</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadActivityRef</span><span class="plain">),</span>
|
|
<span class="string">"an activity has to be formally referred to in a way making clear that "</span>
|
|
<span class="string">"it is indeed a rulebook when we give it named values"</span><span class="plain">,</span>
|
|
<span class="string">"to reduce the risk of ambiguity. So 'The printing the banner text "</span>
|
|
<span class="string">"activity has a number called the accumulated vanity' is fine, but "</span>
|
|
<span class="string">"'Printing the banner text has a number called...' is not. (I'm "</span>
|
|
<span class="string">"insisting on the presence of the word 'activity' because the "</span>
|
|
<span class="string">"syntax is so close to that for giving properties to objects, and "</span>
|
|
<span class="string">"it's important to avoid mistakes here.)"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_25">§3.3.25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_25_2"></a><b>§3.3.25.2. </b>And similarly for rulebooks.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Assign a new rulebook variable</span> <span class="cwebmacronumber">3.3.25.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_rulebook</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"failed to extract rulebook structure"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">formal</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)))</span>
|
|
<span class="functiontext">Rulebooks::add_variable</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadRulebookRef</span><span class="plain">),</span>
|
|
<span class="string">"a rulebook has to be formally referred to in a way making clear that "</span>
|
|
<span class="string">"it is indeed a rulebook when we give it named values"</span><span class="plain">,</span>
|
|
<span class="string">"to reduce the risk of ambiguity. So 'The every turn rulebook has a "</span>
|
|
<span class="string">"number called the accumulated bonus' is fine, but 'Every turn has a "</span>
|
|
<span class="string">"number called...' is not. (I'm insisting on the presence of the word "</span>
|
|
<span class="string">"'rulebook' because the syntax is so close to that for giving "</span>
|
|
<span class="string">"properties to objects, and it's important to avoid mistakes here.)"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_25">§3.3.25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_10_1"></a><b>§3.3.10.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue the too vague to have properties or variables problem message</span> <span class="cwebmacronumber">3.3.10.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TooVagueForVariables</span><span class="plain">),</span>
|
|
<span class="string">"this is too vague a description of the owner of the property"</span><span class="plain">,</span>
|
|
<span class="string">"so that I don't know where to put this. Something like 'A person "</span>
|
|
<span class="string">"has a number called age' is fine, but 'A kind has a number called "</span>
|
|
<span class="string">"age' is not. Which kind?"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_10">§3.3.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_10_2"></a><b>§3.3.10.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue the not allowed to have properties or variables problem message</span> <span class="cwebmacronumber">3.3.10.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_HasNoVariables</span><span class="plain">),</span>
|
|
<span class="string">"only an object, kind, rulebook, action or activity can be allowed to have "</span>
|
|
<span class="string">"properties or variables"</span><span class="plain">,</span>
|
|
<span class="string">"so for instance 'A door has a colour' is fine but not 'A number has a length'."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_10">§3.3.10</a>, <a href="#SP3_3_25">§3.3.25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_26"></a><b>§3.3.26. Case 26. </b>At last, a correctly set property value.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The description of the Pitch is "Verdant." The desk is a container. The carrying capacity of the desk is 10.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Property assignments fall into three sorts, which we handle in this order:
|
|
</p>
|
|
|
|
<ul class="items"><li>(i) The specification pseudo-property, which looks syntactically like a property
|
|
but in fact isn't one;
|
|
</li><li>(ii) Properties of values and kinds of value;
|
|
</li><li>(iii) Properties of objects and kinds of object.
|
|
</li></ul>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 26 - X OF Y vs PROPER NOUN</span> <span class="cwebmacronumber">3.3.26</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">negated</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))) {</span>
|
|
<span class="identifier">Problems::Issue::negative_sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NonValue</span><span class="plain">)); </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::Valued::obtain</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prn</span><span class="plain"> == </span><span class="identifier">P_specification</span><span class="plain">) </span><<span class="cwebmacro">We're setting the specification pseudo-property</span> <span class="cwebmacronumber">3.3.26.1</span>><span class="character">;</span>
|
|
<span class="functiontext">Assertions::Refiner::coerce_adjectival_usage_to_noun</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">owner_infs</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner_infs</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">)))</span>
|
|
<span class="identifier">owner_infs</span><span class="plain"> = </span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(<<</span><span class="identifier">rp</span><span class="plain">>>);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Specifications::is_description</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Issue a problem message for setting a property of an overspecified object</span> <span class="cwebmacronumber">3.3.26.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner_infs</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">owner_infs</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Issue a problem message for setting a property of something never having them</span> <span class="cwebmacronumber">3.3.26.3</span>><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<<span class="cwebmacro">Issue a problem message for setting a property of something not owning one</span> <span class="cwebmacronumber">3.3.26.4</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_26_1"></a><b>§3.3.26.1. </b>This handles sentences like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The specification of vehicle is "A kind of thing able to move between rooms."</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Specification is not a real property and has no existence at run-time; it's used
|
|
only to annotate the Index. For the most part it's set the way all other properties
|
|
are set, but exceptions are made for action names (which otherwise don't have
|
|
properties) and for kinds (which do, but differently).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">We're setting the specification pseudo-property</span> <span class="cwebmacronumber">3.3.26.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Extract the raw text of a specification</span> <span class="cwebmacronumber">3.3.26.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">)) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)));</span>
|
|
<span class="identifier">Kinds::Behaviour::set_specification_text</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">);</span>
|
|
<span class="reserved">return</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">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::offered_specification</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) != </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T\n"</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Unspecifiable</span><span class="plain">),</span>
|
|
<span class="string">"this tries to set specification text for a particular value"</span><span class="plain">,</span>
|
|
<span class="string">"rather than a kind of value. 'Specification' is a special property used "</span>
|
|
<span class="string">"only to annotate the Index, and it makes no sense to set this property for "</span>
|
|
<span class="string">"anything other than a kind of value, a kind of object or an action."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_26">§3.3.26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_26_1_1"></a><b>§3.3.26.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Extract the raw text of a specification</span> <span class="cwebmacronumber">3.3.26.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) && (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(<<</span><span class="identifier">rp</span><span class="plain">>>, </span><span class="identifier">K_text</span><span class="plain">))) {</span>
|
|
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_SpecNotText</span><span class="plain">),</span>
|
|
<span class="string">"this tries to set a specification to something other than literal quoted text"</span><span class="plain">,</span>
|
|
<span class="string">"which will not work. 'Specification' is a special property used only to "</span>
|
|
<span class="string">"annotate the Index, and specifically the Kinds index, so it makes no sense to "</span>
|
|
<span class="string">"set this property to anything other than text."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_26_1">§3.3.26.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_26_2"></a><b>§3.3.26.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem message for setting a property of an overspecified object</span> <span class="cwebmacronumber">3.3.26.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_OverspecifiedSpec</span><span class="plain">),</span>
|
|
<span class="string">"this tries to set a property for something more complicated than a single thing "</span>
|
|
<span class="string">"named without qualifications"</span><span class="plain">,</span>
|
|
<span class="string">"and that isn't allowed. For instance, 'The description of the Great Portal is "</span>
|
|
<span class="string">"\"It's open.\"' is fine, but 'The description of the Great Portal in the Palace "</span>
|
|
<span class="string">"is \"It's open.\"' is not allowed, because it tries to qualify 'Great Portal' "</span>
|
|
<span class="string">"with the extra clause 'in the Palace'. (If you need to make a description which "</span>
|
|
<span class="string">"changes based on where something is, or where it is seen from, try using text "</span>
|
|
<span class="string">"substitutions.)"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_26">§3.3.26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_26_3"></a><b>§3.3.26.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem message for setting a property of something never having them</span> <span class="cwebmacronumber">3.3.26.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadInferenceSubject</span><span class="plain">),</span>
|
|
<span class="string">"this tries to set a property for a value which can't have properties"</span><span class="plain">,</span>
|
|
<span class="string">"and that isn't allowed. For instance, 'The description of the Great Portal is "</span>
|
|
<span class="string">"\"It's open.\"' would be fine, if Great Portal were a room, but 'The description "</span>
|
|
<span class="string">"of 6 is \"Sixish.\"' would not, because the number 6 isn't allowed to have "</span>
|
|
<span class="string">"properties."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_26">§3.3.26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_26_4"></a><b>§3.3.26.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem message for setting a property of something not owning one</span> <span class="cwebmacronumber">3.3.26.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GeneralitySpec</span><span class="plain">),</span>
|
|
<span class="string">"this tries to set a property for a complicated generality of items all at once"</span><span class="plain">,</span>
|
|
<span class="string">"which can lead to ambiguities. For instance, 'The description of an open door "</span>
|
|
<span class="string">"is \"It's open.\"' is not allowed: if we followed Inform's normal conventions "</span>
|
|
<span class="string">"strictly, that would be an instruction to create a new, nameless, open door and "</span>
|
|
<span class="string">"give it the description. But this is very unlikely to be what the writer "</span>
|
|
<span class="string">"intended, given the presence of the adjective to make it seem as if a particular "</span>
|
|
<span class="string">"door is meant. So in fact we reject such sentences unless they refer only to a "</span>
|
|
<span class="string">"kind, without adjectives: 'The description of a door is \"It's a door.\"' is "</span>
|
|
<span class="string">"fine. (If the idea is actually to make the description change in play, we could "</span>
|
|
<span class="string">"write a rule like 'Instead of examining an open door, say \"It's open.\"'; or "</span>
|
|
<span class="string">"we could set the description of every door to \"[if open]It's open.[otherwise]It's "</span>
|
|
<span class="string">"closed.\".)"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_26">§3.3.26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_27"></a><b>§3.3.27. Case 27. </b>Beginning some cases to do with actions...
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 27 - ACTION on both sides</span> <span class="cwebmacronumber">3.3.27</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="identifier">action_pattern</span><span class="plain"> *</span><span class="identifier">apx</span><span class="plain"> = </span><span class="identifier">ParseTree::get_action_meaning</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="identifier">action_pattern</span><span class="plain"> *</span><span class="identifier">apy</span><span class="plain"> = </span><span class="identifier">ParseTree::get_action_meaning</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PL::Actions::Patterns::is_valid</span><span class="plain">(</span><span class="identifier">apy</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">PL::Actions::Patterns::is_named</span><span class="plain">(</span><span class="identifier">apy</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Actions: $A and $A\n"</span><span class="plain">, </span><span class="identifier">apx</span><span class="plain">, </span><span class="identifier">apy</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActionsEquated</span><span class="plain">),</span>
|
|
<span class="string">"two actions are rather oddly equated here"</span><span class="plain">,</span>
|
|
<span class="string">"which would only make sense if the second were a named pattern of actions "</span>
|
|
<span class="string">"like (say) 'unseemly behaviour'."</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">PL::Actions::Patterns::categorise_as</span><span class="plain">(</span><span class="identifier">apx</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_28"></a><b>§3.3.28. Case 28. </b>Sentence [1] below is deservedly rejected, but [2] makes a
|
|
non-reciprocal map connection: "D of the R is E of the S" is construed as
|
|
"D of the R is S" then "R is E of the S". We have to suppress Inform's
|
|
tendency to make tentative reciprocal map connections, because even though
|
|
they will only be listed as "likely", we know they are in fact impossible
|
|
in this case.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>[1] In the box is on the desk. [2] East of the Pitch is north of the Pavilion.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 28 - RELATIONSHIP on both sides</span> <span class="cwebmacronumber">3.3.28</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">relationship_node_type_ANNOT</span><span class="plain">) == </span><span class="identifier">DIRECTION_RELN</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">relationship_node_type_ANNOT</span><span class="plain">) == </span><span class="identifier">DIRECTION_RELN</span><span class="plain">)) {</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="identifier">PL::Map::enter_one_way_mode</span><span class="plain">();</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="identifier">PL::Map::exit_one_way_mode</span><span class="plain">();</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RelationsEquated</span><span class="plain">),</span>
|
|
<span class="string">"this says that two different relations are the same"</span><span class="plain">,</span>
|
|
<span class="string">"like saying that 'in the box is on the table'. (Sometimes this "</span>
|
|
<span class="string">"happens if I misinterpret names of places like 'In Prison' or "</span>
|
|
<span class="string">"'East of Fissure'.)"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_29"></a><b>§3.3.29. Case 29. </b>Equating something to a single adjective.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The desk is fixed in place. A container is usually fixed in place.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 29 - COMMON NOUN, PROPER NOUN vs ADJECTIVE</span> <span class="cwebmacronumber">3.3.29</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="functiontext">Assertions::PropertyKnowledge::assert_property_list</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_30"></a><b>§3.3.30. Case 30. </b>I am in two minds about the next nit-picking error message.
|
|
But really this is a device used in English only for declamatory purposes
|
|
or comedic intent. (As in Peter Schickele's spoof example of an 18th-century
|
|
opera about a dog, "Collared Is Bowser".)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 30 - ADJECTIVE vs COMMON NOUN, PROPER NOUN</span> <span class="cwebmacronumber">3.3.30</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_AdjectiveIsObject</span><span class="plain">),</span>
|
|
<span class="string">"that seems to say that an adjective is a noun"</span><span class="plain">,</span>
|
|
<span class="string">"like saying 'Open are the doubled doors': which I'm picky about, preferring "</span>
|
|
<span class="string">"it written the other way about ('The doubled doors are open'). Less poetic, "</span>
|
|
<span class="string">"but clearer style."</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_AdjectiveIsValue</span><span class="plain">),</span>
|
|
<span class="string">"that suggests that an adjective has some sort of value"</span><span class="plain">,</span>
|
|
<span class="string">"like saying 'Open is a number' or 'Scenery is 5': but of course an adjective "</span>
|
|
<span class="string">"represents something which is either true or false."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_31"></a><b>§3.3.31. Case 31. </b>"Every K is in L."
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 31 - EVERY vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.31</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="functiontext">Assertions::Assemblies::make_generalisation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_32"></a><b>§3.3.32. Case 32. </b>A problem message issued purely on stylistic grounds.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 32 - COMMON NOUN, PROPER NOUN vs ACTION</span> <span class="cwebmacronumber">3.3.32</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) && (</span><span class="functiontext">InferenceSubjects::domain</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)))) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(2, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindIsAction</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"You wrote %1: unfortunately %2 is already the name of an action, "</span>
|
|
<span class="string">"and it would only confuse things if we used it for a value as well."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ObjectIsAction</span><span class="plain">),</span>
|
|
<span class="string">"that is putting the definition back to front"</span><span class="plain">,</span>
|
|
<span class="string">"since I need these categorisations of actions to take the form 'Kissing a "</span>
|
|
<span class="string">"woman is love', not 'Love is kissing a woman'. (This is really because it "</span>
|
|
<span class="string">"is better style: love might be many other things too, and we don't want to "</span>
|
|
<span class="string">"imply that the present definition is all-inclusive.)"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_33"></a><b>§3.3.33. Case 33. </b>"Every K is every L."
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 33 - EVERY on both sides</span> <span class="cwebmacronumber">3.3.33</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_EveryEquated</span><span class="plain">),</span>
|
|
<span class="string">"I can't do that"</span><span class="plain">, </span><span class="string">"Dave."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_34"></a><b>§3.3.34. Case 34. </b>The "Genevieve" problem message is a finicky stylistic one, and
|
|
it I suspect it may be disliked. I've always been in two minds about whether
|
|
this ought to be allowed...
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>An animal is in the desk.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 34 - COMMON NOUN vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.34</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Generalised relationships are allowed</span> <span class="cwebmacronumber">3.3.34.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Multiple objects in a relationship are allowed</span> <span class="cwebmacronumber">3.3.34.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Certain non-spatial relationships are allowed too</span> <span class="cwebmacronumber">3.3.34.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">There is... relationships are allowed too</span> <span class="cwebmacronumber">3.3.34.4</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prevailing_mood</span><span class="plain"> == </span><span class="identifier">CERTAIN_CE</span><span class="plain">) {</span>
|
|
<span class="identifier">ParseTree::set_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">,</span>
|
|
<span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span>
|
|
<span class="functiontext">Specifications::to_kind</span><span class="plain">(</span>
|
|
<span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))));</span>
|
|
<span class="identifier">ParseTree::set_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="constant">EVERY_NT</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</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">Kinds::Compare::le</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)), </span><span class="identifier">K_object</span><span class="plain">))</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KindRelated</span><span class="plain">),</span>
|
|
<span class="string">"something described only by its kind should not be given a "</span>
|
|
<span class="string">"specific place or role in the world"</span><span class="plain">,</span>
|
|
<span class="string">"to avoid ambiguity. For instance, suppose 'car' is a kind. Then "</span>
|
|
<span class="string">"we are not allowed to say 'a car is in the garage': there's too "</span>
|
|
<span class="string">"much risk of confusion between whether an individual (but "</span>
|
|
<span class="string">"nameless) car is referred to, or whether cars are generically to "</span>
|
|
<span class="string">"be found there. Sentences of this form are therefore prohibited, "</span>
|
|
<span class="string">"though more specific ones like 'a car called Genevieve is in the "</span>
|
|
<span class="string">"garage' are fine, as is the reverse, 'In the garage is a car.'"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_KOVRelated</span><span class="plain">),</span>
|
|
<span class="string">"this seems to give a worldly relationship to something intangible"</span><span class="plain">,</span>
|
|
<span class="string">"possibly due to an accidental clash of names between a kind of "</span>
|
|
<span class="string">"value and something in the real world. "</span>
|
|
<span class="string">"I sometimes read sentences like 'There is a number on the "</span>
|
|
<span class="string">"door' or 'A text is in the prayer-box' literally - thinking "</span>
|
|
<span class="string">"you mean a whole number or a piece of double-quoted text, and "</span>
|
|
<span class="string">"not realising you intended to make a brass number-plate or "</span>
|
|
<span class="string">"an old book. If that's the trouble, you can use 'called': "</span>
|
|
<span class="string">"for instance, 'In the prayer-box is a thing called the text.'"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_34_1"></a><b>§3.3.34.1. </b>For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>An animal is in every desk.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Generalised relationships are allowed</span> <span class="cwebmacronumber">3.3.34.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="constant">EVERY_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="functiontext">Assertions::Assemblies::make_generalisation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_34">§3.3.34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_34_2"></a><b>§3.3.34.2. </b>For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Six animals are in the desk.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Note that the default multiplicity is 0, not 1; saying "one door" has a
|
|
slightly different meaning from simply saying "a door", since it clarifies
|
|
that we're discussing a number of actual objects, not the category of doors
|
|
in general.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Multiple objects in a relationship are allowed</span> <span class="cwebmacronumber">3.3.34.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="constant">multiplicity_ANNOT</span><span class="plain">) >= </span><span class="constant">1</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::Creator::convert_instance_to_nounphrase</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_34">§3.3.34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_34_3"></a><b>§3.3.34.3. </b>Further exceptions are made for sentences like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A chair usually allows sitting. A thing usually weighs 1kg.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Certain non-spatial relationships are allowed too</span> <span class="cwebmacronumber">3.3.34.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">bp</span><span class="plain"> = </span><span class="identifier">ParseTree::get_relationship</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bp</span><span class="plain">) && ((</span><span class="functiontext">Properties::SettingRelations::bp_sets_a_property</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">BinaryPredicates::relates_values_not_objects</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">)))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="functiontext">Assertions::Relational::assert_subtree_in_relationship</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_34">§3.3.34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_34_4"></a><b>§3.3.34.4. </b>And also for "There is..." sentences:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>There is a coin in the strongbox.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">There is... relationships are allowed too</span> <span class="cwebmacronumber">3.3.34.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">sentence_is_existential_ANNOT</span><span class="plain">)) {</span>
|
|
<span class="functiontext">Assertions::Creator::convert_instance_to_nounphrase</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_34">§3.3.34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_35"></a><b>§3.3.35. Case 35. </b></p>
|
|
|
|
<blockquote>
|
|
<p>In the desk is a copy of Wisden. On the table is a container.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 35 - RELATIONSHIP vs COMMON NOUN</span> <span class="cwebmacronumber">3.3.35</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">-></span><span class="element">down</span><span class="plain">) == </span><span class="constant">EVERY_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="functiontext">Assertions::Assemblies::make_generalisation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Assertions::Creator::convert_instance_to_nounphrase</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">ParseTree::get_relationship</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_36"></a><b>§3.3.36. Case 36. </b>"A box is on the table." This makes "box" the subject of
|
|
discussion. "The Gazebo is west of the Lawn" also falls into this case,
|
|
since "west of the Lawn" parses to a <code class="display"><span class="extract">RELATIONSHIP_NT</span></code> subtree.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 36 - PROPER NOUN vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.36</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) {</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Assertions::Maker::instantiate_related_common_nouns</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="functiontext">Assertions::Relational::assert_subtree_in_relationship</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_37"></a><b>§3.3.37. Case 37. </b>"On the table is a box." A mirror image, handling the inversion.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 37 - RELATIONSHIP vs PROPER NOUN</span> <span class="cwebmacronumber">3.3.37</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Assertions::Refiner::turn_player_to_yourself</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)) { </span><span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="functiontext">Assertions::Maker::instantiate_related_common_nouns</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="functiontext">Assertions::Relational::assert_subtree_in_relationship</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_38"></a><b>§3.3.38. Case 38. </b>"A door is a vehicle." This one's never legal; you can't equate
|
|
two whole domains. (We have the "kind of..." syntax instead.)
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">NAME_DESCRIPTION_CLASH_NOTE</span>
|
|
<span class="string">"Sometimes this happens because I've read too much into a name - for instance, "</span>
|
|
<span class="string">"'A dark room is a room' makes me read 'dark room' as 'dark' (an adjective I know) "</span>
|
|
<span class="string">"plus 'room', but maybe the writer actually meant a photographer's workshop. "</span>
|
|
<span class="string">"If you need to call something by a name which confuses me, one way is to use "</span>
|
|
<span class="string">"'called': for instance, 'West is a room called the dark room.' Another way is "</span>
|
|
<span class="string">"to call it something else here, and set the 'printed name' property to what you "</span>
|
|
<span class="string">"want the player to see - for instance, 'The photo lab is a room. The printed name "</span>
|
|
<span class="string">"of the photo lab is \"dark room\".'"</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 38 - COMMON NOUN on both sides</span> <span class="cwebmacronumber">3.3.38</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Produce a problem if two values that vary are equated</span> <span class="cwebmacronumber">3.3.38.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Issue a problem for a namespace clash between a variable name and a kind</span> <span class="cwebmacronumber">3.3.38.2</span>><span class="plain">;</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">left_object</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">right_kind</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_subject</span><span class="plain">(2, </span><span class="identifier">left_object</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_subject</span><span class="plain">(3, </span><span class="identifier">right_kind</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">left_object</span><span class="plain"> == </span><span class="identifier">right_kind</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_SameKindEquated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to be telling me that two descriptions, "</span>
|
|
<span class="string">"both forms of %2, are the same. That's a little puzzling - "</span>
|
|
<span class="string">"like saying that 'An open container is a container.' %P"</span>
|
|
<span class="constant">NAME_DESCRIPTION_CLASH_NOTE</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DescriptionsEquated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to be telling me that two descriptions, "</span>
|
|
<span class="string">"one a form of %2 and the other of %3, are the same. That's a "</span>
|
|
<span class="string">"little puzzling - like saying that 'An open door is a container.' %P"</span>
|
|
<span class="constant">NAME_DESCRIPTION_CLASH_NOTE</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_38_1"></a><b>§3.3.38.1. </b>For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A number that varies is a text that varies.</p>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Produce a problem if two values that vary are equated</span> <span class="cwebmacronumber">3.3.38.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)))) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_VariablesEquated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to tell me that '%2', which describes "</span>
|
|
<span class="string">"a kind of variable, is the same as '%3', another description "</span>
|
|
<span class="string">"of a kind of variable - but that doesn't make sense to me. "</span>
|
|
<span class="string">"(Perhaps you intended one of these to be a specific variable, "</span>
|
|
<span class="string">"but chose a wording which looked accidentally like a "</span>
|
|
<span class="string">"general description?)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_38">§3.3.38</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_38_2"></a><b>§3.3.38.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for a namespace clash between a variable name and a kind</span> <span class="cwebmacronumber">3.3.38.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))) {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_VarKOVClash</span><span class="plain">),</span>
|
|
<span class="string">"the name supplied for this new variable is a piece of text "</span>
|
|
<span class="string">"which is not available because it has a rival meaning already"</span><span class="plain">,</span>
|
|
<span class="string">"as a result of definitions made elsewhere. (Sometimes these "</span>
|
|
<span class="string">"are indirect: for instance, defining a column in a table "</span>
|
|
<span class="string">"called 'question' can make a name like 'container in question' "</span>
|
|
<span class="string">"suddenly ambiguous and thus unsuitable to be a variable "</span>
|
|
<span class="string">"name.) If you're getting this Problem message in the Standard "</span>
|
|
<span class="string">"Rules or some other extension you need to use, then your "</span>
|
|
<span class="string">"only option is to hunt through your own source text to see "</span>
|
|
<span class="string">"what you have defined which might cause this clash."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_38">§3.3.38</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_39"></a><b>§3.3.39. Case 39. </b>Sentences falling into this case have the form "X is a Y."; for
|
|
instance,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The lacquered box is a container.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">It might look as if
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A dead end is a kind of room. The Pitch is a room. East is a dead end.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">would throw the last sentence into this case, which would be wrong, but we
|
|
avoid this by having the IF model code intervene. (Clearly this is a quirk
|
|
only occurring when we have named directions, an IF-like thing.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">It's usually plain wrong to say that a value has a given kind, because the value
|
|
has already been defined and its kind is long since established. (But we do
|
|
allow one case, where the declaration is redundant and harmless.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 39 - PROPER NOUN vs COMMON NOUN</span> <span class="cwebmacronumber">3.3.39</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InferenceSubjects::is_an_object</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::is_a_kind_of_object</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) != </span><span class="functiontext">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::is_a_kind_of_object</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="functiontext">Assertions::Maker::issue_value_equation_problem</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Assert that X is an instance of Y</span> <span class="cwebmacronumber">3.3.39.5</span>><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">g_spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">a_spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">g_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">))</span>
|
|
<span class="identifier">g_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::kind_of_new_variable_like</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">a_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">a_spec</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">var_set</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Rvalues::to_instance</span><span class="plain">(</span><span class="identifier">a_spec</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Lvalues::get_storage_form</span><span class="plain">(</span><span class="identifier">a_spec</span><span class="plain">) == </span><span class="constant">NONLOCAL_VARIABLE_NT</span><span class="plain">)) {</span>
|
|
<span class="identifier">var_set</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">We're declaring the kind of the variable, not setting its value</span> <span class="cwebmacronumber">3.3.39.1</span>><span class="character">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Specifications::is_description</span><span class="plain">(</span><span class="identifier">g_spec</span><span class="plain">)))</span>
|
|
<span class="plain">&& (</span><span class="identifier">a_kind</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">a_kind</span><span class="plain">, </span><span class="identifier">g_kind</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">This sentence redundantly specifies the kind of value for a value</span> <span class="cwebmacronumber">3.3.39.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">a_kind</span><span class="plain">) == </span><span class="identifier">CON_description</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Issue problem for trying to use a description as a literal</span> <span class="cwebmacronumber">3.3.39.4</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">var_set</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><<span class="cwebmacro">Dabble further in ruthless sarcasm</span> <span class="cwebmacronumber">3.3.39.3</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(3, </span><span class="identifier">a_spec</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ChangedKind</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"Before reading %1, I already knew that '%2' is %3, "</span>
|
|
<span class="string">"and it is too late to change now."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_39_1"></a><b>§3.3.39.1. </b>For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The current prize value is a number that varies.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">We silently allow the kind of a variable to be restated or narrowed, but not
|
|
contradicted.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">We're declaring the kind of the variable, not setting its value</span> <span class="cwebmacronumber">3.3.39.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">nlv</span><span class="plain"> =</span>
|
|
<span class="identifier">ParseTree::get_constant_nonlocal_variable</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_as_declared</span><span class="plain"> = </span><span class="functiontext">NonlocalVariables::kind</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">constant_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_new_variable_like</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">))</span>
|
|
<span class="identifier">constant_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::kind_of_new_variable_like</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">constant_kind</span><span class="plain">, </span><span class="identifier">kind_as_declared</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$u, $u\n"</span><span class="plain">, </span><span class="identifier">kind_as_declared</span><span class="plain">, </span><span class="identifier">constant_kind</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain">)</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">nlv</span><span class="plain">-></span><span class="element">name</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(3, </span><span class="identifier">constant_kind</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain">)</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(4, </span><span class="identifier">kind_as_declared</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(4, </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GlobalRedeclared</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to tell me that '%2', which has already been "</span>
|
|
<span class="string">"declared as %4, is instead %3 - but that would be a contradiction."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">kind_as_declared</span><span class="plain">, </span><span class="identifier">constant_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<span class="functiontext">NonlocalVariables::set_kind</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">constant_kind</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_39">§3.3.39</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_39_2"></a><b>§3.3.39.2. </b>We allow redundant declarations, except for numbers, where we are
|
|
sarcastic because the information is so obvious that it must be a mistake.
|
|
In the case of texts, we cause the text to be compiled into the I6 story
|
|
file: this may possibly be useful to I6 hackers.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">This sentence redundantly specifies the kind of value for a value</span> <span class="cwebmacronumber">3.3.39.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">var_set</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">a_kind</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">))) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Sarcasm1</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"%1: Grateful as I generally am for your guidance, "</span>
|
|
<span class="string">"I think perhaps I could manage without this sentence."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">var_set</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">a_kind</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_39">§3.3.39</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_39_3"></a><b>§3.3.39.3. </b>My, aren't we charming?
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Dabble further in ruthless sarcasm</span> <span class="cwebmacronumber">3.3.39.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">a_kind</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Sarcasm2</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span><span class="string">"%1: That, sir, is a damnable lie. '%2' is a number."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</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">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">a_kind</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Sarcasm3</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span><span class="string">"%1: And I am the King of Siam. '%2' is some text."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_39">§3.3.39</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_39_4"></a><b>§3.3.39.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue problem for trying to use a description as a literal</span> <span class="cwebmacronumber">3.3.39.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DescAsLiteral</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span><span class="string">"%1: this seems to be using a description "</span>
|
|
<span class="string">"as if it were a constant value, which isn't allowed. (Descriptions "</span>
|
|
<span class="string">"can only be used as values to a limited extent.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_39">§3.3.39</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_39_5"></a><b>§3.3.39.5. </b>Creation has already taken place, in that X does now exist, but any
|
|
stipulations on X — that it should have certain properties, or be in a
|
|
certain place, for instance — will not yet be enforced. These will be in
|
|
the "creation proposition" of Y, and we now assert this to be true about X.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Assert that X is an instance of Y</span> <span class="cwebmacronumber">3.3.39.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">left_object</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">ParseTree::get_creation_proposition</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prop</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Calculus::Variables::number_free</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">left_object</span><span class="plain">)) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Proposition is: $D\n"</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::Issue::subject_problem_at_sentence</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_SubjectNotFree</span><span class="plain">),</span>
|
|
<span class="identifier">left_object</span><span class="plain">,</span>
|
|
<span class="string">"seems to be set equal to something in a complicated relationship "</span>
|
|
<span class="string">"with something else again"</span><span class="plain">,</span>
|
|
<span class="string">"which is too much for me. Perhaps you're trying to do two things "</span>
|
|
<span class="string">"at once, and it would be clearer to write it as two sentences?"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true_about</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">left_object</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Calculus::Atoms::KIND_new</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="functiontext">Calculus::Terms::new_variable</span><span class="plain">(0));</span>
|
|
<span class="functiontext">Calculus::Propositions::Assert::assert_true_about</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">left_object</span><span class="plain">, </span><span class="identifier">prevailing_mood</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_39">§3.3.39</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_40"></a><b>§3.3.40. Case 40. </b>And so on, with one exemption.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 40 - COMMON NOUN vs PROPER NOUN</span> <span class="cwebmacronumber">3.3.40</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Silently pass sentences like "The colours are red and blue."</span> <span class="cwebmacronumber">3.3.40.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)), </span><span class="identifier">K_object</span><span class="plain">))</span>
|
|
<span class="functiontext">Assertions::Maker::issue_value_equation_problem</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CommonIsProper</span><span class="plain">),</span>
|
|
<span class="string">"this seems to say that a general description is something else"</span><span class="plain">,</span>
|
|
<span class="string">"like saying that 'a door is 20'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_40_1"></a><b>§3.3.40.1. </b>Suppose on the left we have a kind ("a colour", say) and on the right
|
|
a specific value ("blue", say). We silently allow this if the kinds agree, as
|
|
that's the case we fall into if we created "blue" in the Creator earlier;
|
|
no further work need be done, and we return to avoid a spurious problem
|
|
message.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Silently pass sentences like "The colours are red and blue."</span> <span class="cwebmacronumber">3.3.40.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::to_instance</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">c_kind</span><span class="plain"> = </span><span class="functiontext">Instances::to_kind</span><span class="plain">(</span><span class="functiontext">Rvalues::to_instance</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">));</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">v_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">v_kind</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">c_kind</span><span class="plain">, </span><span class="identifier">v_kind</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_40">§3.3.40</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41"></a><b>§3.3.41. Case 41. </b>In general, an object simply can't be set equal to a value, but
|
|
there's one exception: when the value is really an adjectival use implying
|
|
a property, rather than a noun. This takes some setting up: only the last of
|
|
these sentences falls into case 41.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Colour is a kind of value. Green and blue are colours. A thing has a colour. The barn door is green.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">There is also one case in which an object can be set equal to another object:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>East is the Pavilion.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">(Of course this will only be true if the map plugin is active.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 41 - PROPER NOUN on both sides</span> <span class="cwebmacronumber">3.3.41</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Allow the case of a property name, implicitly a property, being assigned to</span> <span class="cwebmacronumber">3.3.41.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Allow the case where a constant value is being assigned a property value</span> <span class="cwebmacronumber">3.3.41.5</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Allow the case where a constant response is being assigned a text value</span> <span class="cwebmacronumber">3.3.41.6</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Allow the case of a variable being assigned to</span> <span class="cwebmacronumber">3.3.41.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Allow the case of a new value for a kind which coincides with a property name</span> <span class="cwebmacronumber">3.3.41.7</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">pname</span><span class="plain"> = </span><span class="functiontext">Properties::Conditions::get_coinciding_property</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pname</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PL::Map::is_a_direction</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))) ||</span>
|
|
<span class="plain">(</span><span class="identifier">PL::Map::is_a_direction</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))))</span>
|
|
<<span class="cwebmacro">This is a map connection referred to metonymically</span> <span class="cwebmacronumber">3.3.41.1</span>>
|
|
<span class="reserved">else</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_object</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Otherwise it's just wrong to equate objects</span> <span class="cwebmacronumber">3.3.41.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">), </span><span class="identifier">CON_property</span><span class="plain">))</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ObjectIsProperty</span><span class="plain">),</span>
|
|
<span class="string">"that seems to say that some object is a property"</span><span class="plain">,</span>
|
|
<span class="string">"like saying 'The brick building is the description': if you want to specify "</span>
|
|
<span class="string">"the description of the current object, try putting the sentence the other way "</span>
|
|
<span class="string">"around ('The description is...')."</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">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ObjectIsValue</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"I am reading the sentence %1 as saying that a thing called "</span>
|
|
<span class="string">"'%2' is a value, but this makes no sense to me - it would be "</span>
|
|
<span class="string">"like saying 'the chair is 10'."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Produce a problem to the effect that two values can't be asserted equal</span> <span class="cwebmacronumber">3.3.41.8</span>><span class="character">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_1"></a><b>§3.3.41.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">This is a map connection referred to metonymically</span> <span class="cwebmacronumber">3.3.41.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Assertions::Traverse::get_current_subject</span><span class="plain">() == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NoMapOrigin</span><span class="plain">),</span>
|
|
<span class="string">"no location is under discussion to be the origin of this map connection"</span><span class="plain">,</span>
|
|
<span class="string">"so this is like starting with 'North is the Aviary': I can't tell where from."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">), *</span><span class="identifier">way</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PL::Map::is_a_direction</span><span class="plain">(</span><span class="identifier">target</span><span class="plain">)) {</span>
|
|
<span class="identifier">target</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">); </span><span class="identifier">way</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">target</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapNonObject</span><span class="plain">),</span>
|
|
<span class="string">"this seems to make a map connection to something which is "</span>
|
|
<span class="string">"not an object"</span><span class="plain">,</span>
|
|
<span class="string">"like saying '20 is north'. This is an odd thing "</span>
|
|
<span class="string">"to say, and makes me think that I've misunderstood you."</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">PL::Map::connect</span><span class="plain">(</span><span class="functiontext">Assertions::Traverse::get_current_subject</span><span class="plain">(), </span><span class="identifier">target</span><span class="plain">, </span><span class="identifier">way</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_2"></a><b>§3.3.41.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Otherwise it's just wrong to equate objects</span> <span class="cwebmacronumber">3.3.41.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">))</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ProperIsItself</span><span class="plain">),</span>
|
|
<span class="string">"this seems to say that something is itself"</span><span class="plain">,</span>
|
|
<span class="string">"like saying 'the coin is the coin'. This is an odd thing "</span>
|
|
<span class="string">"to say, and makes me think that I've misunderstood you."</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">control</span><span class="plain">-</span><span class="identifier">structure</span><span class="plain">-</span><span class="reserved">phrase</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))) {</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_IfInAssertion</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"I am reading the sentence %1 as a declaration of the initial "</span>
|
|
<span class="string">"state of the world, so I'm expecting that it will be definite. "</span>
|
|
<span class="string">"The only way I can construe it that way is by thinking that "</span>
|
|
<span class="string">"'%2' and '%3' are two different things, but that doesn't make "</span>
|
|
<span class="string">"sense, and the 'if' makes me think that perhaps you did not "</span>
|
|
<span class="string">"mean this as a definite statement after all. Although 'if...' "</span>
|
|
<span class="string">"is often used in rules and definitions of what to do in given "</span>
|
|
<span class="string">"circumstances, it shouldn't be used in a direct assertion."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_object</span><span class="plain">(</span>
|
|
<span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Issue the generic problem message for equating objects</span> <span class="cwebmacronumber">3.3.41.2.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Issue a problem for equating an object to a value</span> <span class="cwebmacronumber">3.3.41.2.1</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_2_1"></a><b>§3.3.41.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for equating an object to a value</span> <span class="cwebmacronumber">3.3.41.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(4, </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(5, </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ObjectAndValueEquated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to say that '%2', which I think is %4, and "</span>
|
|
<span class="string">"'%3', which I think is %5, are the same. %P"</span>
|
|
<span class="string">"That can't be right, so I must have misunderstood. Perhaps you "</span>
|
|
<span class="string">"intended to make something new, but it accidentally had the same "</span>
|
|
<span class="string">"name as something already existing?"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41_2">§3.3.41.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_2_2"></a><b>§3.3.41.2.2. </b>This message is seen so often...
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Issue the generic problem message for equating objects</span> <span class="cwebmacronumber">3.3.41.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Choose random antagonists for variety</span> <span class="cwebmacronumber">3.3.41.2.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ChalkCheese</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 appears to say two things are the same - I am reading '%2' "</span>
|
|
<span class="string">"and '%3' as two different things, and therefore it makes no sense to say "</span>
|
|
<span class="string">"that one is the other: it would be like saying that '%4 is %5'. It would "</span>
|
|
<span class="string">"be all right if the second thing were the name of a kind, perhaps with "</span>
|
|
<span class="string">"properties: for instance '%6 is a lighted room' says that something "</span>
|
|
<span class="string">"called %6 exists and that it is a 'room', which is a kind I know about, "</span>
|
|
<span class="string">"combined with a property called 'lighted' which I also know about."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::diagnose_further</span><span class="plain">();</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41_2">§3.3.41.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_2_2_1"></a><b>§3.3.41.2.2.1. </b>...that we vary it randomly for fun. The low bits of the current time are not
|
|
exactly a crypto-quality source of entropy, but they'll do for us. (We have
|
|
to turn the variability off in fixed-RNG mode for the sake of the test
|
|
suite: it would be annoying to verify this problem message otherwise.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Choose random antagonists for variety</span> <span class="cwebmacronumber">3.3.41.2.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, *</span><span class="identifier">Q</span><span class="plain">, *</span><span class="identifier">In</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">variant</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="functiontext">Task::rng_seed</span><span class="plain">() == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">variant</span><span class="plain"> = (</span><span class="identifier">time</span><span class="plain">(0))&15;</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">variant</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"the chalk"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"the cheese"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Dairy Products School"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"St Peter"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"St Paul"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Pearly Gates"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Tom"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Jerry"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Mouse-Hole"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">4</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Clark Kent"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Lex Luthor"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Metropolis"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">5</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Ron"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Hermione"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Hogsmeade"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">6</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Tarzan"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Jane"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Treehouse"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">7</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Adam"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Eve"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Land of Nod"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">8</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Laurel"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Hardy"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Blue-Ridge Mountains"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">9</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Aeschylus"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Euripides"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Underworld"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">10</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Choucas"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Hibou"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"The Hall"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">11</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"John"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Paul"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Abbey Road"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">12</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Poirot"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Hastings"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"St Mary Mead"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">13</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"House"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Wilson"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Princeton Plainsboro"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">14</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Adams"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Jefferson"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Virginia"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">15</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Antony"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Cleopatra"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Alexandria"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">16</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Emmet"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Wildstyle"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Bricksburg"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">17</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Stanley"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Livingstone"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Africa"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">18</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"Jeeves"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Wooster"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Totleigh Towers"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">19</span><span class="plain">: </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"John"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"Timus"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"The Lab"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="string">"the hawk"</span><span class="plain">; </span><span class="identifier">Q</span><span class="plain"> = </span><span class="string">"the handsaw"</span><span class="plain">; </span><span class="identifier">In</span><span class="plain"> = </span><span class="string">"Elsinore"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Problems::quote_text</span><span class="plain">(4, </span><span class="identifier">P</span><span class="plain">); </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="identifier">Q</span><span class="plain">); </span><span class="identifier">Problems::quote_text</span><span class="plain">(6, </span><span class="identifier">In</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41_2_2">§3.3.41.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_3"></a><b>§3.3.41.3. </b>Usually it makes no sense to equate two values: "5 is 10",
|
|
for instance, and we produce a variety of more or less scornful errors.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>10 is 15. 14 is a number. "Fish" is text. The turn count is a text. 19 is a rulebook. "Frog" is a number. Before rules is a rule.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">But we do take polite notice when X is a variable name and Y is an
|
|
initial value with a compatible type, as in the second sentence here:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The innings total is a number that varies. The innings total is 101.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">We set such variables on traverse 2 because not all of the object values exist
|
|
yet during traverse 1.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Allow the case of a variable being assigned to</span> <span class="cwebmacronumber">3.3.41.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Lvalues::get_storage_form</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) == </span><span class="constant">NONLOCAL_VARIABLE_NT</span><span class="plain">) {</span>
|
|
<span class="reserved">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">nlv</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_nonlocal_variable</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) </span><span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="identifier">val</span><span class="plain"> = </span><span class="functiontext">NonlocalVariables::substitute_constants</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::initialise_global_variable</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">))</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Plugins::Call::variable_set_warning</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">))</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::initialise_global_variable</span><span class="plain">(</span><span class="identifier">nlv</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_4"></a><b>§3.3.41.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Allow the case of a property name, implicitly a property, being assigned to</span> <span class="cwebmacronumber">3.3.41.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">), </span><span class="identifier">CON_property</span><span class="plain">)) {</span>
|
|
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">talking_about</span><span class="plain"> = </span><span class="functiontext">Assertions::Traverse::get_current_subject</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">talking_about</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NothingDiscussed</span><span class="plain">),</span>
|
|
<span class="string">"nothing is under discussion which might have this property"</span><span class="plain">,</span>
|
|
<span class="string">"so this is like starting with 'The description is \"Orange.\"': "</span>
|
|
<span class="string">"I can't tell what of."</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">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">negated</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)))</span>
|
|
<span class="identifier">Problems::Issue::negative_sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NonValue2</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs</span><span class="plain">(</span>
|
|
<span class="functiontext">Rvalues::to_property</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)), </span><span class="identifier">talking_about</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_5"></a><b>§3.3.41.5. </b>Here we're watching out for assertions like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The Abruzzi Spur route is grade 5.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where "Abruzzi Spur route" is a value of kind "K2 ascent route", and values
|
|
of this kind have been given a property "difficulty rating" which is also
|
|
the name of a kind in turn, one value of which is "grade 5". To the A-parser
|
|
both sides are <code class="display"><span class="extract">VALUE</span></code> nodes; "grade 5" is being used adjectivally here,
|
|
but that's not evident without a lot of contextual checking.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Allow the case where a constant value is being assigned a property value</span> <span class="cwebmacronumber">3.3.41.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">constant</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Rvalues::to_instance</span><span class="plain">(</span><span class="identifier">constant</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">constant</span><span class="plain">))) {</span>
|
|
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_instance</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">pname</span><span class="plain"> = </span><span class="functiontext">Properties::Conditions::get_coinciding_property</span><span class="plain">(</span><span class="functiontext">Instances::to_kind</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pname</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="functiontext">Instances::as_subject</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">), </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_6"></a><b>§3.3.41.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Allow the case where a constant response is being assigned a text value</span> <span class="cwebmacronumber">3.3.41.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">constant</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">constant</span><span class="plain">, </span><span class="identifier">K_response</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">))) {</span>
|
|
<span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_rule</span><span class="plain">(</span><span class="identifier">constant</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">constant</span><span class="plain">, </span><span class="constant">response_code_ANNOT</span><span class="plain">);</span>
|
|
<span class="functiontext">Strings::assert_response_value</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">));</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_7"></a><b>§3.3.41.7. </b>This is to cope with text such as
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Plastic is a material.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where "material" is the name of both a kind of value, and also a property.
|
|
We find ourselves here because we've been considering "material" as the
|
|
property name (a proper noun), not the kind name (a common noun), and we
|
|
need to switch interpretations to avoid the problem message.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Allow the case of a new value for a kind which coincides with a property name</span> <span class="cwebmacronumber">3.3.41.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">), </span><span class="identifier">CON_property</span><span class="plain">)) {</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_property</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Properties::is_either_or</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Properties::Valued::coincides_with_kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">))) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Properties::Valued::kind</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_type_and_clear_annotations</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">, </span><span class="functiontext">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_41_8"></a><b>§3.3.41.8. </b>All other attempts are doomed.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Produce a problem to the effect that two values can't be asserted equal</span> <span class="cwebmacronumber">3.3.41.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(4, </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="functiontext">Problems::quote_kind_of</span><span class="plain">(5, </span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)),</span>
|
|
<span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ParseTree::get_evaluation</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">)))) {</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_SimilarValuesEquated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"Before reading %1, I already knew that '%2' is %4 and "</span>
|
|
<span class="string">"'%3' likewise: so they are specific values, and saying "</span>
|
|
<span class="string">"that they are equal will not make it so."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DissimilarValuesEquated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"Before reading %1, I already knew that '%2' is %4 and "</span>
|
|
<span class="string">"'%3' is %5: so they are specific values, and saying "</span>
|
|
<span class="string">"that they are equal will not make it so."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3_41">§3.3.41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Equating values in an assertion is never allowed, but there are a variety of
|
|
possible problem messages, because it usually occurs as a symptom of a failed
|
|
attempt to create something. The following is used to pick up sentences like
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Something called mauve is a colour.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">which fail because Inform reads "something" as "some thing", i.e., as
|
|
referring to a thing which then can't be equated with a colour.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">something</span><span class="plain">-</span><span class="identifier">loose</span><span class="plain">-</span><span class="identifier">diagnosis</span><span class="plain">> ::=</span>
|
|
<span class="plain">*** </span><span class="identifier">something</span><span class="plain"> *** ==> </span><<span class="cwebmacro">Issue PM_EquatesSomethingToValue problem</span> <span class="cwebmacronumber">4.1</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1"></a><b>§4.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_EquatesSomethingToValue problem</span> <span class="cwebmacronumber">4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_EquatesSomethingToValue</span><span class="plain">),</span>
|
|
<span class="string">"that seems to say that an object is the same as a value"</span><span class="plain">,</span>
|
|
<span class="string">"which must be wrong. This can happen if the word 'something' is "</span>
|
|
<span class="string">"used loosely - I read it as 'some thing', so I think it has to "</span>
|
|
<span class="string">"refer to a thing, which is a kind of object. A sentence like "</span>
|
|
<span class="string">"'Something called mauve is a colour' trips me up because mauve "</span>
|
|
<span class="string">"is a value, so it isn't an object, and doesn't match 'something'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_3_42"></a><b>§3.3.42. Case 42. </b>This is possibly a variation on 41 where an adjective is also
|
|
in some contexts a noun. For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Hostile hates friendly.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where "hostile" and "friendly" are values of an enumerated kind but which
|
|
can also be used adjectivally.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Case 42 - ADJECTIVE vs RELATIONSHIP</span> <span class="cwebmacronumber">3.3.42</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Assertions::Maker::convert_adjective_to_noun</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) || (</span><span class="functiontext">Assertions::Maker::convert_adjective_to_noun</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">-></span><span class="element">down</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Assertions::Maker::make_assertion_recursive</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">),</span>
|
|
<span class="string">"that seems to relate an adjective to something"</span><span class="plain">,</span>
|
|
<span class="string">"which must be wrong. (This can sometimes happen if the same word can "</span>
|
|
<span class="string">"be used both as an adjective and a noun, and I misunderstand.)"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3_3">§3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>where:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::convert_adjective_to_noun</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="constant">ADJECTIVE_NT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">negated_boolean_ANNOT</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)))</span>
|
|
<span class="functiontext">Assertions::Refiner::noun_from_value</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, <<</span><span class="identifier">rp</span><span class="plain">>>);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) != </span><span class="constant">ADJECTIVE_NT</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::convert_adjective_to_noun is used in <a href="#SP3_3_42">§3.3.42</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::issue_value_equation_problem</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_sentence</span><span class="plain">) &&</span>
|
|
<span class="plain">(<</span><span class="identifier">something</span><span class="plain">-</span><span class="identifier">loose</span><span class="plain">-</span><span class="identifier">diagnosis</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">current_sentence</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) != </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) ||</span>
|
|
<span class="plain">((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) != </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) != </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">))) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Assert PX of type PY on bad node types"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">px</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">py</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InferenceSubjects::where_created</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)) != </span><span class="identifier">current_sentence</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(1, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(2, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(3, </span><span class="functiontext">InferenceSubjects::where_created</span><span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">)));</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CantUncreate</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In order to act on %2, I seem to need to give "</span>
|
|
<span class="string">"a new meaning to '%1', something which was created by the earlier "</span>
|
|
<span class="string">"sentence %3. That must be wrong somehow: I'm guessing that there "</span>
|
|
<span class="string">"is an accidental clash of names. This sometimes happens when "</span>
|
|
<span class="string">"adjectives are being made after objects whose names include them: "</span>
|
|
<span class="string">"for instance, defining 'big' as an adjective after having already "</span>
|
|
<span class="string">"made a 'big top'. The simplest way to avoid this is to define "</span>
|
|
<span class="string">"the adjectives in question first."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) && (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">))) </span><span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Problems::quote_text</span><span class="plain">(3, </span><span class="string">"(something not given an explicit name)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_IdentityUnclear</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to tell me that '%2' and '%3' have to be "</span>
|
|
<span class="string">"the same, but it looks odd to me. '%2' is something generic - "</span>
|
|
<span class="string">"not something definite; but '%3' is (presumably) something "</span>
|
|
<span class="string">"specific. So it's as if you'd written 'A room is the Sydney "</span>
|
|
<span class="string">"Opera House'. (Which room, exactly? You see the trouble.)"</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">),</span>
|
|
<span class="string">"that seems to say that an object is the same as a value"</span><span class="plain">,</span>
|
|
<span class="string">"which must be wrong."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::issue_value_equation_problem is used in <a href="#SP3_3_39">§3.3.39</a>, <a href="#SP3_3_40">§3.3.40</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Instantiation of related kinds. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::instantiate_related_common_nouns</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::Maker::instantiate_related_common_nouns_r</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::instantiate_related_common_nouns_r</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="identifier">NULL</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">) == </span><span class="constant">COMMON_NOUN_NT</span><span class="plain">)</span>
|
|
<span class="functiontext">Assertions::Creator::convert_instance_to_nounphrase</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">,</span>
|
|
<span class="identifier">ParseTree::get_relationship</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">) == </span><span class="identifier">AND_NT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::Maker::instantiate_related_common_nouns_r</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">at</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::Maker::instantiate_related_common_nouns_r</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">at</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">) == </span><span class="identifier">WITH_NT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Assertions::Maker::instantiate_related_common_nouns_r</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">at</span><span class="plain">-></span><span class="element">down</span><span class="plain">);</span>
|
|
<span class="functiontext">Assertions::PropertyKnowledge::assert_property_list</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">-></span><span class="element">down</span><span class="plain">, </span><span class="identifier">at</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::instantiate_related_common_nouns is used in <a href="#SP3_3_36">§3.3.36</a>, <a href="#SP3_3_37">§3.3.37</a>.</p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::instantiate_related_common_nouns_r appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Adjective list trees. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Assertions::Maker::is_adjlist</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ADJECTIVE_NT:</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">AND_NT:</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> ((</span><span class="functiontext">Assertions::Maker::is_adjlist</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain">)) && (</span><span class="functiontext">Assertions::Maker::is_adjlist</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">next</span><span class="plain">)));</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Assertions::Maker::is_adjlist is used in <a href="#SP3_3_2">§3.3.2</a>.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="9-tc.html">Back to 'The Creator'</a></li><li><a href="9-pk.html">Continue with 'Property Knowledge'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|