mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
804 lines
85 KiB
HTML
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">★</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">§1. Definitions</a></li><li><a href="#SP5">§5. Measurements</a></li><li><a href="#SP10">§10. Adjectives arising from measurements</a></li><li><a href="#SP13">§13. Support routines for measurement</a></li><li><a href="#SP14">§14. Comparative forms</a></li><li><a href="#SP15">§15. Late registration of prepositions comparing properties</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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<= t},
|
|
{ t} or { x| x>= 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>§3. </b>We then need to create the comparative form "roomier" as a relation, and the
|
|
superlative "roomiest" as a phrasal form — 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 —
|
|
other forms are derived from it but they all appear under "roomy" in
|
|
the Phrasebook.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§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 — 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>§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">">"</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">"<"</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">§13</a>.</p>
|
|
|
|
<p class="endnote">The function Properties::Measurement::strict_comparison is used in <a href="#SP11_4_2">§11.4.2</a>, <a href="#SP14_1">§14.1</a>, 15/cr (<a href="15-cr.html#SP7_1">§7.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">)) && (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>prop</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">>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">>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">>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">§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">§2.1.6.1.14</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Inconveniently, at the time when we create a measurement to test if a subject
|
|
S satisfies (say) P(S) ∈ { x| x>= 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">§4.11</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">>prop</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>name_of_property_to_compare</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Fill in the missing property name, P</span> <span class="cwebmacronumber">8.1</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">>region_threshold_evaluated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Fill in the missing threshold value, t</span> <span class="cwebmacronumber">8.2</span>><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">§6</a>, <a href="#SP7">§7</a>, <a href="#SP12">§12</a>, <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_1"></a><b>§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">
|
|
<<span class="cwebmacrodefn">Fill in the missing property name, P</span> <span class="cwebmacronumber">8.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>name_of_property_to_compare</span><span class="plain">)) </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>prop</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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... <%W>\</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">>headword</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>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">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_2"></a><b>§8.2. </b>Here we either make t valid, or leave <code class="display"><span class="extract">mdef->region_threshold_evaluated</span></code> clear
|
|
and issue a problem.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Fill in the missing threshold value, t</span> <span class="cwebmacronumber">8.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_kind</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">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">>(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_threshold_text</span><span class="plain">))</span>
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_kind</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_kind</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">mdef</span><span class="plain">-</span><span class="element">>region_kind</span><span class="plain">) {</span>
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_threshold</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_encoded_notation</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">Kinds::Behaviour::is_quasinumerical</span><span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>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 <%W>\</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">>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">>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">>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">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§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">>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">>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">§6</a>, <a href="#SP12">§12</a>, <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§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"><measurement-adjective-definition> 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 <property-name>, and the text in the range must match
|
|
<s-literal>.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</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">> ::=</span>
|
|
<span class="plain"><</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">> ... </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"> ... | ==> </span><<span class="cwebmacro">Issue PM_GradingMisphrased problem</span> <span class="cwebmacronumber">10.1</span>>
|
|
<span class="plain"><</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">> {<</span><span class="reserved">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>} </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> <</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">> | ==> </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"><</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">> ... </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> <</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">> ==> </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"><</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">> ::=</span>
|
|
<span class="plain">... </span><span class="identifier">or</span><span class="plain"> </span><span class="identifier">more</span><span class="plain"> | ==> </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"> | ==> </span><span class="constant">MEASURE_T_OR_LESS</span>
|
|
<span class="plain">... ==> </span><span class="constant">MEASURE_T_EXACTLY</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10_1"></a><b>§10.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_GradingMisphrased problem</span> <span class="cwebmacronumber">10.1</span>> =
|
|
</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">§10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§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"> (<</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">>(</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"> = <<</span><span class="identifier">r</span><span class="plain">>>;</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">(<</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">>, 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">(<</span><span class="identifier">measurement</span><span class="plain">-</span><span class="identifier">range</span><span class="plain">>, 1);</span>
|
|
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
|
|
<<span class="cwebmacro">Reject some overly elaborate attempts to define overly elaborate measurements</span> <span class="cwebmacronumber">11.1</span>><span class="plain">;</span>
|
|
<<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>><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>
|
|
<<span class="cwebmacro">Initialise the measurement definition</span> <span class="cwebmacronumber">11.3</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="cwebmacro">Create the superlative form</span> <span class="cwebmacronumber">11.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Create the adjectival meaning arising from this measurement</span> <span class="cwebmacronumber">11.5</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="element">>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">§37</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_1"></a><b>§11.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Reject some overly elaborate attempts to define overly elaborate measurements</span> <span class="cwebmacronumber">11.1</span>> =
|
|
</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">) > 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">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2"></a><b>§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">
|
|
<<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>> =
|
|
</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"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">>(</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">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_3"></a><b>§11.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Initialise the measurement definition</span> <span class="cwebmacronumber">11.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>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">>region_threshold</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>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">>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">>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">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_4"></a><b>§11.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create the superlative form</span> <span class="cwebmacronumber">11.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>headword</span><span class="plain">, </span><span class="identifier">language_of_source_text</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Feed the preamble for the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Feed the body of the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.2</span>><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">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_4_1"></a><b>§11.4.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Feed the preamble for the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.1</span>> =
|
|
</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">>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">§11.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_4_2"></a><b>§11.4.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Feed the body of the superlative phrase into the lexer</span> <span class="cwebmacronumber">11.4.2</span>> =
|
|
</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">>region_shape</span><span class="plain">),</span>
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">§11.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_5"></a><b>§11.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Create the adjectival meaning arising from this measurement</span> <span class="cwebmacronumber">11.5</span>> =
|
|
</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">>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">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§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">>prop</span><span class="plain">) && (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_threshold_evaluated</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>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">>mdef_iname</span><span class="plain">);</span>
|
|
<span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">)) && (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>prop</span><span class="plain">) && (</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"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">>(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_threshold_text</span><span class="plain">)) </span><span class="identifier">val</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</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">>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">§38</a>).</p>
|
|
|
|
<p class="endnote">The function Properties::Measurement::ADJ_compile is used in 4/am (<a href="4-am.html#SP39">§39</a>).</p>
|
|
|
|
<p class="endnote">The function Properties::Measurement::ADJ_assert is used in 4/am (<a href="4-am.html#SP40">§40</a>).</p>
|
|
|
|
<p class="endnote">The function Properties::Measurement::ADJ_index is used in 4/am (<a href="4-am.html#SP41">§41</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§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">>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">>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">>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">>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"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">>(</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>region_threshold_text</span><span class="plain">)) </span><span class="identifier">val</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</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">>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">>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">§4.14</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§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">)) && (</span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">>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>
|
|
|
|
<<span class="cwebmacro">Work out property comparison schema</span> <span class="cwebmacronumber">14.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Construct a BP named for the quiddity and tested using the comparative schema</span> <span class="cwebmacronumber">14.2</span>><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">§4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_1"></a><b>§14.1. </b>This schema compares the property values:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work out property comparison schema</span> <span class="cwebmacronumber">14.1</span>> =
|
|
</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">>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">>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">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_2"></a><b>§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">
|
|
<<span class="cwebmacrodefn">Construct a BP named for the quiddity and tested using the comparative schema</span> <span class="cwebmacronumber">14.2</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">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">>region_shape</span><span class="plain">, </span><span class="identifier">mdef</span><span class="plain">-</span><span class="element">>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">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§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">(<</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">>, 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">§14.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§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"><</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">> ::=</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>§17. </b>And when Inform creates a value property, that also makes a preposition:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</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">> ::=</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>
|
|
|