1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/15-ma.html
2019-08-31 13:56:36 +01:00

804 lines
85 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>15/tpr</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '15/ma' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Measurement Adjectives</b></li></ul><p class="purpose">To define adjectives such as large, wide or roomy, which make implicit comparisons of the size of some numerical property, and which (unlike other adjectives) lead to comparative and superlative forms.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Measurements</a></li><li><a href="#SP10">&#167;10. Adjectives arising from measurements</a></li><li><a href="#SP13">&#167;13. Support routines for measurement</a></li><li><a href="#SP14">&#167;14. Comparative forms</a></li><li><a href="#SP15">&#167;15. Late registration of prepositions comparing properties</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>A typical example would be:
</p>
<blockquote>
<p>Definition: A container is roomy if its carrying capacity is 10 or more.</p>
</blockquote>
<p class="inwebparagraph">Here the domain of the definition is "container", and we must assign
an adjective meaning for "roomy" which involves the comparison of a
property (here "carrying capacity") against a threshold value t (here,
t=10). Each such definition allows the property value to belong to a
"region": we are looking for membership of { x| x&lt;= t},
{ t} or { x| x&gt;= t}. The following constants
enumerate the possible shapes of this region.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MEASURE_T_OR_LESS</span><span class="plain"> -1</span>
<span class="definitionkeyword">define</span> <span class="constant">MEASURE_T_EXACTLY</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">MEASURE_T_OR_MORE</span><span class="plain"> 1</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>We then need to create the comparative form "roomier" as a relation, and the
superlative "roomiest" as a phrasal form &mdash; not in general an adjective, since
its domain is too ambiguous in text such as:
</p>
<blockquote>
<p>if the canvas bag is roomiest, ...</p>
</blockquote>
<p class="inwebparagraph">which begs the question: roomiest out of what? All containers, or implicitly
some subcollection of them? So we avoid the problem by allowing superlatives
only when explicitly followed by a domain:
</p>
<blockquote>
<p>roomiest container in Heathrow Terminal 5</p>
</blockquote>
<p class="inwebparagraph">The word "roomy" is the headword, so called in the lexicography sense &mdash;
other forms are derived from it but they all appear under "roomy" in
the Phrasebook.
</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The implementation of measurement adjectives is tricksy for reasons of
timing during Inform's run: the names of kinds, properties and values become
available at different times; whereas we need the name of the adjective
itself to become available very early on. This is why the structure below
appears to record a lot of extraneous clutter apparently needed only
temporarily during parsing &mdash; because parsing does not happen all at once,
and partial results have to be parked in the structure after one stage to
be picked up at the next.
</p>
<p class="inwebparagraph">At any rate, here's the structure:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">measurement_definition</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">measurement_node</span><span class="plain">; </span> <span class="comment">where the actual definition is</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">headword</span><span class="plain">; </span> <span class="comment">adjective being defined (must be single word)</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">headword_as_adjective</span><span class="plain">; </span> <span class="comment">which adjective meaning</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">superlative</span><span class="plain">; </span> <span class="comment">its superlative form</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain">; </span> <span class="comment">the property being compared, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">name_of_property_to_compare</span><span class="plain">; </span> <span class="comment">text of the name of the property to compare</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">mdef_iname</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">region_shape</span><span class="plain">; </span> <span class="comment">one of the <code class="display"><span class="extract">MEASURE_T_*</span></code> constants</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">region_threshold</span><span class="plain">; </span> <span class="comment">numerical value of threshold (if any)</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">region_kind</span><span class="plain">; </span> <span class="comment">of this value</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">region_threshold_evaluated</span><span class="plain">; </span> <span class="comment">have we evaluated this one yet?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">region_threshold_text</span><span class="plain">; </span> <span class="comment">text of threshold value</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">property_schema_written</span><span class="plain">; </span> <span class="comment">I6 schema for testing written yet?</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">measurement_definition</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure measurement_definition is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Measurements. </b>Here are operators for checking whether we lie inside the domain, where
the LHS is the value being tested and the RHS is the constant t. In weak
comparison, t itself is a member; in strict comparison, it isn't.
</p>
<pre class="display">
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="functiontext">Properties::Measurement::weak_comparison_bp</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">shape</span><span class="plain">) {</span>
<span class="reserved">binary_predicate</span><span class="plain"> *</span><span class="identifier">operator</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">solely to placate gcc</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MEASURE_T_OR_MORE</span><span class="plain">: </span><span class="identifier">operator</span><span class="plain"> = </span><span class="identifier">R_numerically_greater_than_or_equal_to</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">MEASURE_T_EXACTLY</span><span class="plain">: </span><span class="identifier">operator</span><span class="plain"> = </span><span class="identifier">R_equality</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">MEASURE_T_OR_LESS</span><span class="plain">: </span><span class="identifier">operator</span><span class="plain"> = </span><span class="identifier">R_numerically_less_than_or_equal_to</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown region for weak comparison"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">operator</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Properties::Measurement::strict_comparison</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">shape</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">operator</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">solely to placate gcc</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MEASURE_T_OR_MORE</span><span class="plain">: </span><span class="identifier">operator</span><span class="plain"> = </span><span class="string">"&gt;"</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">MEASURE_T_OR_LESS</span><span class="plain">: </span><span class="identifier">operator</span><span class="plain"> = </span><span class="string">"&lt;"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown region for strict comparison"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">operator</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::weak_comparison_bp is used in <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">The function Properties::Measurement::strict_comparison is used in <a href="#SP11_4_2">&#167;11.4.2</a>, <a href="#SP14_1">&#167;14.1</a>, 15/cr (<a href="15-cr.html#SP7_1">&#167;7.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="functiontext">Properties::Measurement::retrieve</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="reserved">int</span><span class="plain"> </span><span class="identifier">shape</span><span class="plain">) {</span>
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">, </span><span class="reserved">measurement_definition</span><span class="plain">) {</span>
<span class="functiontext">Properties::Measurement::validate</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Properties::Measurement::is_valid</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain"> == </span><span class="identifier">prn</span><span class="plain">) &amp;&amp; (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain"> == </span><span class="identifier">shape</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mdef</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::read_property_details</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</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="reserved">int</span><span class="plain"> *</span><span class="identifier">shape</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">prn</span><span class="plain"> = </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain">) *</span><span class="identifier">shape</span><span class="plain"> = </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::retrieve is used in 12/dtd (<a href="12-dtd.html#SP22">&#167;22</a>).</p>
<p class="endnote">The function Properties::Measurement::read_property_details is used in 12/cdp (<a href="12-cdp.html#SP2_1_6_1_14">&#167;2.1.6.1.14</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Inconveniently, at the time when we create a measurement to test if a subject
S satisfies (say) P(S) ∈ { x| x&gt;= t}, we don't yet know
either the property P or the threshold value t. That means the measurement
definition structure stands incomplete for a while. Filling it in is called
"validation", as follows.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::validate_definitions</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">, </span><span class="reserved">measurement_definition</span><span class="plain">) </span><span class="functiontext">Properties::Measurement::validate</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::validate_definitions is used in 1/mr (<a href="1-mr.html#SP4_11">&#167;4.11</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Where:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::validate</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;name_of_property_to_compare</span><span class="plain">)))</span>
&lt;<span class="cwebmacro">Fill in the missing property name, P</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_evaluated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Fill in the missing threshold value, t</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::validate is used in <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, <a href="#SP12">&#167;12</a>, <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>Here we either make P valid, or leave it <code class="display"><span class="extract">NULL</span></code> and issue a problem.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Fill in the missing property name, P</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;name_of_property_to_compare</span><span class="plain">)) </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Validating mdef with headword %W... &lt;%W&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;name_of_property_to_compare</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingUnknownProperty</span><span class="plain">),</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;measurement_node</span><span class="plain">,</span>
<span class="string">"that definition involves an unknown property"</span><span class="plain">,</span>
<span class="string">"assuming it was meant to be a definition in the form 'Definition: "</span>
<span class="string">"a container is large if its carrying capacity is 10 or more.'"</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="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b>Here we either make t valid, or leave <code class="display"><span class="extract">mdef-&gt;region_threshold_evaluated</span></code> clear
and issue a problem.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Fill in the missing threshold value, t</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_kind</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">&gt;(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_text</span><span class="plain">))</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_kind</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_kind</span><span class="plain">(&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_kind</span><span class="plain">) {</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_encoded_notation</span><span class="plain">(&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Behaviour::is_quasinumerical</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain"> != </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingNonarithmeticKOV</span><span class="plain">),</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;measurement_node</span><span class="plain">,</span>
<span class="string">"the property value given here has a kind which can't be "</span>
<span class="string">"subject to numerical comparisons"</span><span class="plain">,</span>
<span class="string">"so it doesn't make sense to talk about it being 'more' or "</span>
<span class="string">"'less'."</span><span class="plain">);</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold</span><span class="plain"> = 0;</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::compatible</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_kind</span><span class="plain">,</span>
<span class="functiontext">Properties::Valued::kind</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">)) != </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingWrongKOV</span><span class="plain">),</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;measurement_node</span><span class="plain">,</span>
<span class="string">"the property value given here is the wrong kind"</span><span class="plain">,</span>
<span class="string">"and does not match the property being looked at."</span><span class="plain">);</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold</span><span class="plain"> = 0;</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="identifier">LOG</span><span class="plain">(</span><span class="string">"Can't get literal from &lt;%W&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_text</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingNonLiteral</span><span class="plain">),</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;measurement_node</span><span class="plain">,</span>
<span class="string">"that definition is wrongly phrased"</span><span class="plain">,</span>
<span class="string">"assuming it was meant to be a grading adjective like 'Definition: a "</span>
<span class="string">"container is large if its carrying capacity is 10 or more.'"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_evaluated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>To recover safely from these errors, we would be wise to check:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::is_valid</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_evaluated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::is_valid is used in <a href="#SP6">&#167;6</a>, <a href="#SP12">&#167;12</a>, <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Adjectives arising from measurements. </b>Measurement adjectives are created when we parse a "Definition:" clause for
a new adjective, and then only when the definition has a particular form:
</p>
<blockquote>
<p>Definition: A container is roomy if its carrying capacity is 10 or more.</p>
</blockquote>
<p class="inwebparagraph">&lt;measurement-adjective-definition&gt; is used to parse the definition part,
</p>
<blockquote>
<p>its carrying capacity is 10 or more</p>
</blockquote>
<p class="inwebparagraph">The following grammar is a little sketchy because it's parsed very early in
Inform's run. Eventually, though, the text after the possessive is required
always to match &lt;property-name&gt;, and the text in the range must match
&lt;s-literal&gt;.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">possessive</span><span class="plain">-</span><span class="identifier">third</span><span class="plain">-</span><span class="identifier">person</span><span class="plain">&gt; ... </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_GradingMisphrased problem</span> <span class="cwebmacronumber">10.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">possessive</span><span class="plain">-</span><span class="identifier">third</span><span class="plain">-</span><span class="identifier">person</span><span class="plain">&gt; {&lt;</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;} </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> &lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[3]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">possessive</span><span class="plain">-</span><span class="identifier">third</span><span class="plain">-</span><span class="identifier">person</span><span class="plain">&gt; ... </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> &lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[2]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span>
<span class="plain">&lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">or</span><span class="plain"> </span><span class="identifier">more</span><span class="plain"> | ==&gt; </span><span class="constant">MEASURE_T_OR_MORE</span>
<span class="plain">... </span><span class="identifier">or</span><span class="plain"> </span><span class="identifier">less</span><span class="plain"> | ==&gt; </span><span class="constant">MEASURE_T_OR_LESS</span>
<span class="plain">... ==&gt; </span><span class="constant">MEASURE_T_EXACTLY</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_GradingMisphrased problem</span> <span class="cwebmacronumber">10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingMisphrased</span><span class="plain">),</span>
<span class="identifier">NounPhrases::new_raw</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">),</span>
<span class="string">"that definition is wrongly phrased"</span><span class="plain">,</span>
<span class="string">"assuming it was meant to be a grading adjective like 'Definition: a "</span>
<span class="string">"container is large if its carrying capacity is 10 or more.'"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display">
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="functiontext">Properties::Measurement::ADJ_parse</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sense</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">DNW</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CONW</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CALLW</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sense</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">&gt;(</span><span class="identifier">CONW</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">shape</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PRW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">&gt;, 1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">THRESW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">&gt;, 1);</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
&lt;<span class="cwebmacro">Reject some overly elaborate attempts to define overly elaborate measurements</span> <span class="cwebmacronumber">11.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Allow an exact measurement to be created only if we can already parse the threshold</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the measurement definition</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain"> != </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">) </span>&lt;<span class="cwebmacro">Create the superlative form</span> <span class="cwebmacronumber">11.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Create the adjectival meaning arising from this measurement</span> <span class="cwebmacronumber">11.5</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword_as_adjective</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::ADJ_parse is used in 4/am (<a href="4-am.html#SP37">&#167;37</a>).</p>
<p class="inwebparagraph"><a id="SP11_1"></a><b>&#167;11.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Reject some overly elaborate attempts to define overly elaborate measurements</span> <span class="cwebmacronumber">11.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">) &gt; 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain"> != </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MultiwordGrading</span><span class="plain">),</span>
<span class="identifier">q</span><span class="plain">, </span><span class="string">"a grading adjective must be a single word"</span><span class="plain">,</span>
<span class="string">"as in 'Definition: a container is large if its carrying capacity is "</span>
<span class="string">"10 or more.': 'fairly large' would not be allowed because it would "</span>
<span class="string">"make no sense to talk about 'fairly larger' or 'fairly largest'."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</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">CALLW</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain"> != </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingCalled</span><span class="plain">),</span>
<span class="identifier">q</span><span class="plain">, </span><span class="string">"callings are not allowed when defining grading adjectives"</span><span class="plain">,</span>
<span class="string">"so 'Definition: a container is large if its carrying capacity is 10 "</span>
<span class="string">"or more.' is fine, but so 'Definition: a container (called the bag) "</span>
<span class="string">"is large if its carrying capacity is 10 or more.' is not - then again, "</span>
<span class="string">"there's very little call for it."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sense</span><span class="plain"> != 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain"> != </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GradingUnless</span><span class="plain">),</span>
<span class="identifier">q</span><span class="plain">, </span><span class="string">"'unless' is not allowed when defining grading adjectives"</span><span class="plain">,</span>
<span class="string">"so 'Definition: a container is large if its carrying capacity is 10 "</span>
<span class="string">"or more.' is fine, but so 'Definition: a container is modest unless "</span>
<span class="string">"its carrying capacity is 10 or more.' is not - of course a similar "</span>
<span class="string">"effect could be achieved by 'Definition: a container is modest if its "</span>
<span class="string">"carrying capacity is 9 or less.'"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP11_2"></a><b>&#167;11.2. </b>Perhaps this is a good point to say why we allow any exact measurements at
all. After all, if we didn't, a definition like:
</p>
<blockquote>
<p>Definition: a person is handy if his carrying capacity is 7.</p>
</blockquote>
<p class="inwebparagraph">...would still work; and "handy" would then be created as a <code class="display"><span class="extract">CONDITION_KADJ</span></code>
adjective. So why not let that happen?
</p>
<p class="inwebparagraph">The answer is that our <code class="display"><span class="extract">MEASUREMENT_KADJ</span></code> adjectives behave exactly the same
at run-time, but can also be asserted true in the model world at compile-time.
In particular, we could write:
</p>
<blockquote>
<p>Peter is a handy person.</p>
</blockquote>
<p class="inwebparagraph">This can't be done with general <code class="display"><span class="extract">CONDITION_KADJ</span></code> adjectives, because conditions
can't normally be unravelled at compile time.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Allow an exact measurement to be created only if we can already parse the threshold</span> <span class="cwebmacronumber">11.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shape</span><span class="plain"> == </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">&gt;(</span><span class="identifier">THRESW</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP11_3"></a><b>&#167;11.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the measurement definition</span> <span class="cwebmacronumber">11.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;measurement_node</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword</span><span class="plain"> = </span><span class="identifier">Wordings::first_word</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">);</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold</span><span class="plain"> = 0;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_text</span><span class="plain"> = </span><span class="identifier">THRESW</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_evaluated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain"> = </span><span class="identifier">prop</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;property_schema_written</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain"> = </span><span class="identifier">shape</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;name_of_property_to_compare</span><span class="plain"> = </span><span class="identifier">PRW</span><span class="plain">;</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;superlative</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span> <span class="comment">but it may be set below</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword_as_adjective</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">but it will certainly be set below</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package</span><span class="plain">(</span><span class="functiontext">Modules::current</span><span class="plain">(), </span><span class="constant">ADJECTIVE_MEANINGS_HAP</span><span class="plain">);</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;mdef_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">MEASUREMENT_FN_HL</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP11_4"></a><b>&#167;11.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create the superlative form</span> <span class="cwebmacronumber">11.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;superlative</span><span class="plain"> = </span><span class="identifier">Grading::make_superlative</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword</span><span class="plain">, </span><span class="identifier">language_of_source_text</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Feed the preamble for the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Feed the body of the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">Sentences::RuleSubtrees::register_recently_lexed_phrases</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP11_4_1"></a><b>&#167;11.4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Feed the preamble for the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">" To decide which object is %N ( S - description of objects ) "</span><span class="plain">,</span>
<span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;superlative</span><span class="plain">));</span>
<span class="identifier">Sentences::make_node</span><span class="plain">(</span>
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">),</span>
<span class="character">':'</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11_4">&#167;11.4</a>.</p>
<p class="inwebparagraph"><a id="SP11_4_2"></a><b>&#167;11.4.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Feed the body of the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">" (- {-primitive-definition:extremal%s%W} -) "</span><span class="plain">,</span>
<span class="functiontext">Properties::Measurement::strict_comparison</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain">),</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;name_of_property_to_compare</span><span class="plain">);</span>
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">), </span><span class="character">'.'</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11_4">&#167;11.4</a>.</p>
<p class="inwebparagraph"><a id="SP11_5"></a><b>&#167;11.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create the adjectival meaning arising from this measurement</span> <span class="cwebmacronumber">11.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am</span><span class="plain"> = </span><span class="functiontext">Adjectives::Meanings::new</span><span class="plain">(</span><span class="constant">MEASUREMENT_KADJ</span><span class="plain">,</span>
<span class="identifier">STORE_POINTER_measurement_definition</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">), </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">));</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword_as_adjective</span><span class="plain"> = </span><span class="identifier">am</span><span class="plain">;</span>
<span class="functiontext">Adjectives::Meanings::declare</span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">, 3);</span>
<span class="functiontext">Adjectives::Meanings::pass_task_to_support_routine</span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="constant">TEST_ADJECTIVE_TASK</span><span class="plain">);</span>
<span class="functiontext">Adjectives::Meanings::set_domain_text</span><span class="plain">(</span><span class="identifier">am</span><span class="plain">, </span><span class="identifier">DNW</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::ADJ_compiling_soon</span><span class="plain">(</span><span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am</span><span class="plain">,</span>
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">T</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">) &amp;&amp; (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_evaluated</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;property_schema_written</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext">Adjectives::Meanings::set_i6_schema</span><span class="plain">(</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword_as_adjective</span><span class="plain">, </span><span class="constant">TEST_ADJECTIVE_TASK</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="string">"%n(*1)"</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;mdef_iname</span><span class="plain">);</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;property_schema_written</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::ADJ_compile</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">emit_flag</span><span class="plain">, </span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::ADJ_assert</span><span class="plain">(</span><span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">,</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs_to_assert_on</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val_to_assert_on</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain">) {</span>
<span class="functiontext">Properties::Measurement::validate</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Properties::Measurement::is_valid</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">) &amp;&amp; (</span><span class="identifier">parity</span><span class="plain"> == </span><span class="identifier">TRUE</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">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">&gt;(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_text</span><span class="plain">)) </span><span class="identifier">val</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"literal unreadable"</span><span class="plain">);</span>
<span class="functiontext">World::Inferences::draw_property</span><span class="plain">(</span><span class="identifier">infs_to_assert_on</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</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="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::ADJ_index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</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 Properties::Measurement::ADJ_compiling_soon is used in 4/am (<a href="4-am.html#SP38">&#167;38</a>).</p>
<p class="endnote">The function Properties::Measurement::ADJ_compile is used in 4/am (<a href="4-am.html#SP39">&#167;39</a>).</p>
<p class="endnote">The function Properties::Measurement::ADJ_assert is used in 4/am (<a href="4-am.html#SP40">&#167;40</a>).</p>
<p class="endnote">The function Properties::Measurement::ADJ_index is used in 4/am (<a href="4-am.html#SP41">&#167;41</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Support routines for measurement. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::compile_MADJ_routines</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">, </span><span class="reserved">measurement_definition</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;property_schema_written</span><span class="plain">) {</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;mdef_iname</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lv</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_call_parameter</span><span class="plain">(</span>
<span class="functiontext">Frames::current_stack_frame</span><span class="plain">(),</span>
<span class="identifier">EMPTY_WORDING</span><span class="plain">,</span>
<span class="functiontext">Adjectives::Meanings::get_domain</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword_as_adjective</span><span class="plain">));</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">var</span><span class="plain"> = </span><span class="functiontext">Lvalues::new_LOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">lv</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">evaluated_prop</span><span class="plain"> = </span><span class="functiontext">Lvalues::new_PROPERTY_VALUE</span><span class="plain">(</span>
<span class="functiontext">Rvalues::from_property</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">), </span><span class="identifier">var</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">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">&gt;(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_text</span><span class="plain">)) </span><span class="identifier">val</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"literal unreadable"</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::binary_PREDICATE_new</span><span class="plain">(</span>
<span class="functiontext">Properties::Measurement::weak_comparison_bp</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain">),</span>
<span class="functiontext">Calculus::Terms::new_constant</span><span class="plain">(</span><span class="identifier">evaluated_prop</span><span class="plain">),</span>
<span class="functiontext">Calculus::Terms::new_constant</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">Calculus::Propositions::Checker::type_check</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">,</span>
<span class="functiontext">Calculus::Propositions::Checker::tc_problem_reporting</span><span class="plain">(</span>
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_threshold_text</span><span class="plain">,</span>
<span class="string">"be giving the boundary of the definition"</span><span class="plain">)) == </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Calculus::Deferrals::emit_test_of_proposition</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::compile_MADJ_routines is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Comparative forms. </b>For timing reasons, these are made all at once, and later than when the headword
adjectives and superlatives are made.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::create_comparatives</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">measurement_definition</span><span class="plain"> *</span><span class="identifier">mdef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">, </span><span class="reserved">measurement_definition</span><span class="plain">) {</span>
<span class="functiontext">Properties::Measurement::validate</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Properties::Measurement::is_valid</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain"> != </span><span class="constant">MEASURE_T_EXACTLY</span><span class="plain">)) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;headword</span><span class="plain">; </span> <span class="comment">word number of, e.g., "tall"</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">comparative_form</span><span class="plain"> = </span><span class="identifier">Grading::make_comparative</span><span class="plain">(</span><span class="identifier">H</span><span class="plain">, </span><span class="identifier">language_of_source_text</span><span class="plain">); </span> <span class="comment">"taller than"</span>
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">quiddity</span><span class="plain"> =</span>
<span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">Grading::make_quiddity</span><span class="plain">(</span><span class="identifier">H</span><span class="plain">, </span><span class="identifier">language_of_source_text</span><span class="plain">))); </span> <span class="comment">"tallness"</span>
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">schema_to_compare_property_values</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Work out property comparison schema</span> <span class="cwebmacronumber">14.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Construct a BP named for the quiddity and tested using the comparative schema</span> <span class="cwebmacronumber">14.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::create_comparatives is used in 15/cr (<a href="15-cr.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP14_1"></a><b>&#167;14.1. </b>This schema compares the property values:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out property comparison schema</span> <span class="cwebmacronumber">14.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain"> = </span><span class="functiontext">Properties::iname</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">);</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">operation</span><span class="plain"> = </span><span class="functiontext">Properties::Measurement::strict_comparison</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain">);</span>
<span class="identifier">schema_to_compare_property_values</span><span class="plain"> =</span>
<span class="functiontext">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"(*1.%n %s *2.%n)"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">operation</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP14_2"></a><b>&#167;14.2. </b>The relation arising from "tall" would be called the "tallness relation", for
instance. Note that we don't say anything about the domain of x and y
in T(x, y). That's because we a value property like "height" may exist
for more than one kind of object, and there is not necessarily any unifying
kind of value K such all objects satisfying K possess a height and all
others do not. (That's intentional: it is Inform's one concession towards
multiple-inheritance, and it allows containers and doors to share lockability
behaviour despite being of mutually incompatible kinds.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Construct a BP named for the quiddity and tested using the comparative schema</span> <span class="cwebmacronumber">14.2</span>&gt; =
</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">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">relname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">relname</span><span class="plain">, </span><span class="string">"%V"</span><span class="plain">, </span><span class="identifier">quiddity</span><span class="plain">);</span>
<span class="identifier">bp</span><span class="plain"> = </span><span class="functiontext">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="constant">PROPERTY_COMPARISON_KBP</span><span class="plain">,</span>
<span class="functiontext">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">), </span><span class="functiontext">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="identifier">relname</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">schema_to_compare_property_values</span><span class="plain">, </span><span class="identifier">WordAssemblages::lit_1</span><span class="plain">(</span><span class="identifier">quiddity</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">relname</span><span class="plain">);</span>
<span class="functiontext">BinaryPredicates::set_comparison_details</span><span class="plain">(</span><span class="identifier">bp</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;region_shape</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">&gt;prop</span><span class="plain">);</span>
<span class="functiontext">Properties::Measurement::register_comparative</span><span class="plain">(</span><span class="identifier">comparative_form</span><span class="plain">, </span><span class="identifier">bp</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Late registration of prepositions comparing properties. </b>The following routines, used only when all the properties have been
created, make suitable comparatives ("bigger than", etc.) and
prepositional usages to test property-equality ("the same height as").
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Properties::Measurement::register_comparative</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="constant">VERB_MEANING_TYPE</span><span class="plain"> *</span><span class="identifier">root</span><span class="plain">) {</span>
<span class="identifier">set_where_created</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="identifier">verb_meaning</span><span class="plain"> </span><span class="identifier">vm</span><span class="plain"> = </span><span class="identifier">VerbMeanings::new</span><span class="plain">(</span><span class="identifier">root</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">preposition_identity</span><span class="plain"> *</span><span class="identifier">prep</span><span class="plain"> =</span>
<span class="identifier">Prepositions::make</span><span class="plain">(</span><span class="identifier">Preform::Nonparsing::merge</span><span class="plain">(&lt;</span><span class="identifier">comparative</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt;, 0,</span>
<span class="identifier">WordAssemblages::lit_1</span><span class="plain">(</span><span class="identifier">Lexer::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">FALSE</span><span class="plain">);</span>
<span class="identifier">Verbs::add_form</span><span class="plain">(</span><span class="identifier">copular_verb</span><span class="plain">, </span><span class="identifier">prep</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">vm</span><span class="plain">, </span><span class="identifier">SVO_FS_BIT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Properties::Measurement::register_comparative is used in <a href="#SP14_2">&#167;14.2</a>.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>When the source text creates a measurement adjective, such as:
</p>
<blockquote>
<p>A man is tall if his height is 6 feet or more.</p>
</blockquote>
<p class="inwebparagraph">Inform also creates a comparative form of the adjective as a preposition:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">comparative</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">than</span><span class="plain"> </span> <span class="comment">Peter is taller than Claude</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>And when Inform creates a value property, that also makes a preposition:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">same</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">as</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt; ::=</span>
<span class="identifier">the</span><span class="plain"> </span><span class="identifier">same</span><span class="plain"> ... </span><span class="identifier">as</span><span class="plain"> </span> <span class="comment">if Peter is the same height as Claude</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="15-tpr.html">Back to 'The Provision Relation'</a></li><li><a href="15-cr.html">Continue with 'Comparative Relations'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>