From 1f14f0b155182c6e959e016acc18b5a90fbb6d9e Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Thu, 25 Mar 2021 23:20:37 +0000 Subject: [PATCH] Imperative definition families --- docs/assertions-module/1-am.html | 22 +- docs/assertions-module/2-ar.html | 2 +- docs/assertions-module/2-bv.html | 2 +- docs/assertions-module/2-cs.html | 2 +- docs/assertions-module/2-is.html | 24 +- docs/assertions-module/2-ps.html | 2 +- docs/assertions-module/2-ptmn.html | 10 +- docs/assertions-module/3-dbtr.html | 12 +- docs/assertions-module/3-dlr.html | 2 +- docs/assertions-module/3-nar.html | 2 +- docs/assertions-module/3-nar2.html | 2 +- docs/assertions-module/3-nlpr.html | 2 +- docs/assertions-module/3-npr.html | 8 +- docs/assertions-module/3-nrr.html | 12 +- docs/assertions-module/3-nuor.html | 4 +- docs/assertions-module/3-nvr.html | 2 +- docs/assertions-module/3-pr.html | 2 +- docs/assertions-module/3-rpr.html | 2 +- docs/assertions-module/3-tr.html | 2 +- docs/assertions-module/3-tr2.html | 2 +- docs/assertions-module/3-uor.html | 2 +- docs/assertions-module/4-ass.html | 8 +- docs/assertions-module/4-ass2.html | 6 +- docs/assertions-module/4-imp.html | 16 +- docs/assertions-module/4-npa.html | 4 +- docs/assertions-module/4-nr.html | 2 +- docs/assertions-module/4-pk.html | 10 +- docs/assertions-module/4-rk.html | 8 +- docs/assertions-module/4-rpt.html | 14 +- docs/assertions-module/4-tc.html | 26 +- docs/assertions-module/5-adf.html | 147 + docs/assertions-module/5-id.html | 447 +++ docs/assertions-module/5-rf.html | 224 ++ docs/assertions-module/5-tpf.html | 257 ++ .../{5-eqt.html => 6-eqt.html} | 382 +-- .../{5-tbl.html => 6-tbl.html} | 258 +- .../{5-tc.html => 6-tc.html} | 114 +- .../{6-aa.html => 7-aa.html} | 54 +- .../{6-am.html => 7-am.html} | 74 +- .../{6-amd.html => 7-amd.html} | 82 +- .../{6-cu.html => 7-cu.html} | 52 +- .../{6-er.html => 7-er.html} | 82 +- .../{6-kpr.html => 7-kpr.html} | 16 +- .../{6-lr.html => 7-lr.html} | 26 +- .../{6-qr.html => 7-qr.html} | 30 +- .../{6-tap.html => 7-tap.html} | 74 +- .../{6-tcp.html => 7-tcp.html} | 62 +- .../{6-terr.html => 7-terr.html} | 58 +- .../{6-tur.html => 7-tur.html} | 26 +- docs/assertions-module/P-wtmd.html | 10 +- docs/assertions-module/index.html | 63 +- docs/core-module/1-cp.html | 4 + docs/core-module/3-pc.html | 2 +- docs/imperative-module/1-im.html | 4 +- docs/imperative-module/2-bl.html | 8 +- docs/imperative-module/2-rb.html | 18 +- docs/imperative-module/2-rlb.html | 8 +- docs/imperative-module/2-rls.html | 40 +- docs/imperative-module/3-dptd.html | 13 +- docs/imperative-module/3-id.html | 603 ---- docs/imperative-module/3-itp.html | 2 +- docs/imperative-module/3-pav.html | 12 +- docs/imperative-module/3-phr.html | 98 +- docs/imperative-module/3-po.html | 2 +- docs/imperative-module/3-prcd.html | 10 +- docs/imperative-module/3-ptd.html | 52 +- docs/imperative-module/3-pu.html | 381 +-- docs/imperative-module/3-tp.html | 34 +- docs/imperative-module/3-tph.html | 24 +- docs/imperative-module/4-lv.html | 36 +- docs/imperative-module/4-sf.html | 10 +- docs/imperative-module/4-sv.html | 2 +- docs/imperative-module/5-cdp.html | 4 +- docs/imperative-module/6-cii.html | 4 +- docs/imperative-module/6-cp.html | 7 +- docs/imperative-module/6-cste.html | 2 +- docs/imperative-module/index.html | 5 - inform7/Downloads/preform-diagnostics.txt | 2759 ++++++++--------- inform7/Figures/memory-diagnostics.txt | 52 +- inform7/Figures/preform-summary.txt | 8 +- inform7/Figures/timings-diagnostics.txt | 35 +- .../Chapter 5/Adjectival Definition Family.w | 55 + .../Chapter 5}/Imperative Definitions.w | 168 +- .../assertions-module/Chapter 5/Rule Family.w | 125 + .../Chapter 5/To Phrase Family.w | 154 + .../{Chapter 5 => Chapter 6}/Equations.w | 0 .../{Chapter 5 => Chapter 6}/Table Columns.w | 0 .../{Chapter 5 => Chapter 6}/Tables.w | 0 .../Adjective Ambiguity.w | 0 .../Adjective Meaning Domains.w | 0 .../Adjective Meanings.w | 0 .../Calculus Utilities.w | 0 .../Explicit Relations.w | 0 .../Kind Predicates Revisited.w | 0 .../Listed-In Relations.w | 0 .../Quasinumeric Relations.w | 0 .../The Adjectival Predicates.w | 0 .../The Creation Predicates.w | 0 .../The Equality Relation Revisited.w | 0 .../The Universal Relation.w | 0 inform7/assertions-module/Contents.w | 11 +- .../Chapter 1/Class Predeclarations.w | 4 + .../Chapter 3/Describing Phrase Type Data.w | 5 +- .../Chapter 3/Phrase Usage.w | 125 +- inform7/imperative-module/Chapter 3/Phrases.w | 37 +- .../Chapter 6/Compile Phrases.w | 3 +- inform7/imperative-module/Contents.w | 1 - .../Figures/excerpts-diagnostics.txt | 2 +- 108 files changed, 4074 insertions(+), 3607 deletions(-) create mode 100644 docs/assertions-module/5-adf.html create mode 100644 docs/assertions-module/5-id.html create mode 100644 docs/assertions-module/5-rf.html create mode 100644 docs/assertions-module/5-tpf.html rename docs/assertions-module/{5-eqt.html => 6-eqt.html} (96%) rename docs/assertions-module/{5-tbl.html => 6-tbl.html} (97%) rename docs/assertions-module/{5-tc.html => 6-tc.html} (96%) rename docs/assertions-module/{6-aa.html => 7-aa.html} (95%) rename docs/assertions-module/{6-am.html => 7-am.html} (96%) rename docs/assertions-module/{6-amd.html => 7-amd.html} (94%) rename docs/assertions-module/{6-cu.html => 7-cu.html} (96%) rename docs/assertions-module/{6-er.html => 7-er.html} (94%) rename docs/assertions-module/{6-kpr.html => 7-kpr.html} (95%) rename docs/assertions-module/{6-lr.html => 7-lr.html} (90%) rename docs/assertions-module/{6-qr.html => 7-qr.html} (95%) rename docs/assertions-module/{6-tap.html => 7-tap.html} (93%) rename docs/assertions-module/{6-tcp.html => 7-tcp.html} (94%) rename docs/assertions-module/{6-terr.html => 7-terr.html} (95%) rename docs/assertions-module/{6-tur.html => 7-tur.html} (94%) delete mode 100644 docs/imperative-module/3-id.html create mode 100644 inform7/assertions-module/Chapter 5/Adjectival Definition Family.w rename inform7/{imperative-module/Chapter 3 => assertions-module/Chapter 5}/Imperative Definitions.w (62%) create mode 100644 inform7/assertions-module/Chapter 5/Rule Family.w create mode 100644 inform7/assertions-module/Chapter 5/To Phrase Family.w rename inform7/assertions-module/{Chapter 5 => Chapter 6}/Equations.w (100%) rename inform7/assertions-module/{Chapter 5 => Chapter 6}/Table Columns.w (100%) rename inform7/assertions-module/{Chapter 5 => Chapter 6}/Tables.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Adjective Ambiguity.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Adjective Meaning Domains.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Adjective Meanings.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Calculus Utilities.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Explicit Relations.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Kind Predicates Revisited.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Listed-In Relations.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/Quasinumeric Relations.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/The Adjectival Predicates.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/The Creation Predicates.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/The Equality Relation Revisited.w (100%) rename inform7/assertions-module/{Chapter 6 => Chapter 7}/The Universal Relation.w (100%) diff --git a/docs/assertions-module/1-am.html b/docs/assertions-module/1-am.html index 8a7e72f31..23a3c4d57 100644 --- a/docs/assertions-module/1-am.html +++ b/docs/assertions-module/1-am.html @@ -82,18 +82,18 @@ which use this module: enum RELATION_DEFINITIONS_DA
-COMPILE_WRITER(table *, Tables::log)
-COMPILE_WRITER(table_column *, Tables::Columns::log)
+COMPILE_WRITER(table *, Tables::log)
+COMPILE_WRITER(table_column *, Tables::Columns::log)
 
 void AssertionsModule::start(void) {
-    AdjectivalPredicates::start();
-    CreationPredicates::start();
-    Calculus::QuasinumericRelations::start();
-    Relations::Universal::start();
-    Relations::Explicit::start();
-    EqualityDetails::start();
-    KindPredicatesRevisited::start();
-    ImperativeDefinitions::create_families();
+    AdjectivalPredicates::start();
+    CreationPredicates::start();
+    Calculus::QuasinumericRelations::start();
+    Relations::Universal::start();
+    Relations::Explicit::start();
+    EqualityDetails::start();
+    KindPredicatesRevisited::start();
+    ImperativeDefinitions::create_families();
     Log::declare_aspect(ASSEMBLIES_DA, L"assemblies", FALSE, FALSE);
     Log::declare_aspect(ASSERTIONS_DA, L"assertions", FALSE, TRUE);
     Log::declare_aspect(IMPLICATIONS_DA, L"implications", FALSE, TRUE);
@@ -105,7 +105,7 @@ which use this module:
 }
 
diff --git a/docs/assertions-module/2-ar.html b/docs/assertions-module/2-ar.html index d148bc38f..5cdfa6fad 100644 --- a/docs/assertions-module/2-ar.html +++ b/docs/assertions-module/2-ar.html @@ -234,7 +234,7 @@ conclusion we would have reached. } diff --git a/docs/assertions-module/2-bv.html b/docs/assertions-module/2-bv.html index abb65b312..7ec3494ab 100644 --- a/docs/assertions-module/2-bv.html +++ b/docs/assertions-module/2-bv.html @@ -297,7 +297,7 @@ other languages may as well drop the hyphens. diff --git a/docs/assertions-module/2-cs.html b/docs/assertions-module/2-cs.html index c37948b08..809df713f 100644 --- a/docs/assertions-module/2-cs.html +++ b/docs/assertions-module/2-cs.html @@ -438,7 +438,7 @@ property of something. } diff --git a/docs/assertions-module/2-is.html b/docs/assertions-module/2-is.html index 80a5483f4..b792193a1 100644 --- a/docs/assertions-module/2-is.html +++ b/docs/assertions-module/2-is.html @@ -100,7 +100,7 @@ therefore safely be used to sweep up any void ImperativeSubtrees::accept(parse_node *p) { ImperativeSubtrees::accept_inner(p, TRUE); } -void ImperativeSubtrees::accept_body(parse_node *p) { +void ImperativeSubtrees::accept_body(parse_node *p) { ImperativeSubtrees::accept_inner(p, FALSE); } @@ -123,7 +123,7 @@ therefore safely be used to sweep up any worry about the preamble in the node p if (accept_header) Node::set_impdef(header, - ImperativeDefinitions::make_imperative_definition(header)); + ImperativeDefinitions::make_imperative_definition(header)); } } @@ -1034,7 +1034,7 @@ where we look for such mistakes.

-void ImperativeSubtrees::police_code_block(parse_node *block, control_structure_phrase *context) {
+void ImperativeSubtrees::police_code_block(parse_node *block, control_structure_phrase *context) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         current_sentence = p;
 
@@ -1217,7 +1217,7 @@ to issue good problem messages for failures to use "otherwise if" correctly.
 

-void ImperativeSubtrees::purge_otherwise_if(parse_node *block) {
+void ImperativeSubtrees::purge_otherwise_if(parse_node *block) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         if (Node::get_control_structure_used(p) == otherwise_if_CSP) {
             parse_node *former_contents = p->down;
@@ -1264,7 +1264,7 @@ We remove them.
 

§1.1.12.

-void ImperativeSubtrees::purge_end_markers(parse_node *block) {
+void ImperativeSubtrees::purge_end_markers(parse_node *block) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         if (Node::get_end_control_structure_used(p)) {
             if (prev_p) prev_p->next = p->next; else block->down = p->next;
@@ -1287,7 +1287,7 @@ can now be removed, too.
 

§1.1.14.

-void ImperativeSubtrees::purge_begin_markers(parse_node *block) {
+void ImperativeSubtrees::purge_begin_markers(parse_node *block) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         if (Node::get_control_structure_used(p))
             if (<phrase-beginning-block>(Node::get_text(p)))
@@ -1314,7 +1314,7 @@ annotations to them.
 

§1.1.16.

-void ImperativeSubtrees::insert_cb_nodes(parse_node *block) {
+void ImperativeSubtrees::insert_cb_nodes(parse_node *block) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         if (ControlStructures::opens_block(Node::get_control_structure_used(p))) {
             parse_node *blank_cb_node = Node::new(CODE_BLOCK_NT);
@@ -1345,7 +1345,7 @@ annotations to them.
 

§1.1.18.

-void ImperativeSubtrees::read_instead_markers(parse_node *block) {
+void ImperativeSubtrees::read_instead_markers(parse_node *block) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         if (<instead-keyword>(Node::get_text(p))) {
             Node::set_text(p, GET_RW(<instead-keyword>, 1));
@@ -1371,7 +1371,7 @@ annotations to them.
 

§3.

-void ImperativeSubtrees::break_up_says(parse_node *block) {
+void ImperativeSubtrees::break_up_says(parse_node *block) {
     for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {
         int sf = NO_SIGF;
         wording W = Node::get_text(p);
@@ -1405,7 +1405,7 @@ annotations to them.
     }
 }
 
-void ImperativeSubtrees::unroll_says(parse_node *cb_node, wording W, int depth) {
+void ImperativeSubtrees::unroll_says(parse_node *cb_node, wording W, int depth) {
     while (<phrase-with-comma-notation>(W)) {
         wording AW = GET_RW(<phrase-with-comma-notation>, 1);
         wording BW = GET_RW(<phrase-with-comma-notation>, 2);
@@ -1592,7 +1592,7 @@ to <s-say-phrase> to parse the list.
 

-parse_node *ImperativeSubtrees::end_node(parse_node *opening) {
+parse_node *ImperativeSubtrees::end_node(parse_node *opening) {
     parse_node *implicit_end = Node::new(INVOCATION_LIST_NT);
     Node::set_end_control_structure_used(implicit_end,
         Node::get_control_structure_used(opening));
@@ -1602,7 +1602,7 @@ to <s-say-phrase> to parse the list.
 }
 
diff --git a/docs/assertions-module/2-ps.html b/docs/assertions-module/2-ps.html index a5e6f69de..3b619d14a 100644 --- a/docs/assertions-module/2-ps.html +++ b/docs/assertions-module/2-ps.html @@ -228,7 +228,7 @@ production of <has-property-name>.
  • This code is used in §5 (twice).
diff --git a/docs/assertions-module/2-ptmn.html b/docs/assertions-module/2-ptmn.html index 063a6e37c..517b181e5 100644 --- a/docs/assertions-module/2-ptmn.html +++ b/docs/assertions-module/2-ptmn.html @@ -123,7 +123,7 @@ but saves a deal of passing parameters around. if (pass == 2) Extend the pass to sentences needed when implicit kinds are set2.2; }
-
  • The structure pass_state is accessed in 2/ar, 3/tr, 3/uor, 3/dbtr, 4/ass, 4/ass2, 5/tc and here.
+
  • The structure pass_state is accessed in 2/ar, 3/tr, 3/uor, 3/dbtr, 4/ass, 4/ass2, 6/tc and here.

§2.1. Extend the pass to invented sentences from kinds2.1 =

@@ -214,9 +214,9 @@ organisation, and are not directly functional in themselves. case SENTENCE_NT: Pass through a SENTENCE node3.1.2; break; case TRACE_NT: Pass through a TRACE node3.1.5; break; - case TABLE_NT: if (global_pass_state.pass == 0) Tables::create_table(p); + case TABLE_NT: if (global_pass_state.pass == 0) Tables::create_table(p); break; - case EQUATION_NT: if (global_pass_state.pass == 0) Equations::new_at(p, FALSE); + case EQUATION_NT: if (global_pass_state.pass == 0) Equations::new_at(p, FALSE); break; case INFORM6CODE_NT: if (global_pass_state.pass == 2) Config::Inclusions::inform_6_inclusion(p); @@ -328,7 +328,7 @@ two cases") and all others (such as "regular meaning are more subtle").

§3.1.3.

-void MajorNodes::try_special_meaning(int task, parse_node *p) {
+void MajorNodes::try_special_meaning(int task, parse_node *p) {
     SpecialMeanings::call(Node::get_special_meaning(p), task, p, NULL);
 }
 
@@ -387,7 +387,7 @@ followed by double-quoted text is a note for the telemetry file. }
diff --git a/docs/assertions-module/3-dbtr.html b/docs/assertions-module/3-dbtr.html index a46eb5bc0..c693cd7eb 100644 --- a/docs/assertions-module/3-dbtr.html +++ b/docs/assertions-module/3-dbtr.html @@ -240,7 +240,7 @@ whatever was named in column 1: see below. K = Kinds::weaken(K, K_object); if (!(Kinds::Behaviour::is_object(K))) RTKinds::set_defined_by_table(K, t); t->kind_defined_in_this_table = K; - Tables::Columns::set_kind(t->columns[0].column_identity, t, K); + Tables::Columns::set_kind(t->columns[0].column_identity, t, K); Create values for this kind as enumerated by names in the first column4.1.3;
  • This code is used in §4.
@@ -265,7 +265,7 @@ whatever was named in column 1: see below. Actually issue PM_TableDefiningTheImpossible problem6.1.1; return; } - if (t) Tables::use_to_define(t, defining_objects, V->next); + if (t) Tables::use_to_define(t, defining_objects, V->next);
  • This code is used in §4.1.

§4.1.1.1. Issue PM_TableDefiningObject problem4.1.1.1 = @@ -490,7 +490,7 @@ table: do they get permission as well? We're going to say that they do. Ensure that a property with the same name as the column name exists4.2.1; if (global_pass_state.pass == 1) Assert::true_about( - Propositions::Abstract::to_provide_property(P), + Propositions::Abstract::to_provide_property(P), KindSubjects::from_kind(t->kind_defined_in_this_table), prevailing_mood); if (t->contains_property_values_at_run_time) @@ -513,7 +513,7 @@ table-stocking the column will have a kind for its entries. <unfortunate-table-column-property>(PW); P = ValueProperties::obtain(PW); if (ValueProperties::kind(P) == NULL) { - kind *CK = Tables::Columns::get_kind(tc); + kind *CK = Tables::Columns::get_kind(tc); if ((Kinds::get_construct(CK) == CON_rule) || (Kinds::get_construct(CK) == CON_rulebook)) { kind *K1 = NULL, *K2 = NULL; @@ -521,7 +521,7 @@ table-stocking the column will have a kind for its entries. if ((Kinds::eq(K1, K_value)) && (Kinds::eq(K1, K_value))) { CK = Kinds::binary_con( Kinds::get_construct(CK), K_action_name, K_nil); - Tables::Columns::set_kind(tc, t, CK); + Tables::Columns::set_kind(tc, t, CK); } } if (CK) ValueProperties::set_kind(P, CK); @@ -617,7 +617,7 @@ also ordinary sentences about the property value, and the former won't.

diff --git a/docs/assertions-module/3-dlr.html b/docs/assertions-module/3-dlr.html index 635c03131..7a3cac4ae 100644 --- a/docs/assertions-module/3-dlr.html +++ b/docs/assertions-module/3-dlr.html @@ -184,7 +184,7 @@ modifiers and a pointer to a Preform nonterminal if one has been named. }
diff --git a/docs/assertions-module/3-nar.html b/docs/assertions-module/3-nar.html index f1ff29590..bbc092dd0 100644 --- a/docs/assertions-module/3-nar.html +++ b/docs/assertions-module/3-nar.html @@ -125,7 +125,7 @@ matches: } diff --git a/docs/assertions-module/3-nar2.html b/docs/assertions-module/3-nar2.html index 68369eff3..95ca75bde 100644 --- a/docs/assertions-module/3-nar2.html +++ b/docs/assertions-module/3-nar2.html @@ -121,7 +121,7 @@ function togglePopup(material_id) { } diff --git a/docs/assertions-module/3-nlpr.html b/docs/assertions-module/3-nlpr.html index fb813b31e..ef10cb797 100644 --- a/docs/assertions-module/3-nlpr.html +++ b/docs/assertions-module/3-nlpr.html @@ -469,7 +469,7 @@ by a bracketed list of up to three options in any order. } diff --git a/docs/assertions-module/3-npr.html b/docs/assertions-module/3-npr.html index 08bbea881..5c250a872 100644 --- a/docs/assertions-module/3-npr.html +++ b/docs/assertions-module/3-npr.html @@ -527,7 +527,7 @@ differently as a result. } else prn = ConditionsOfSubjects::parse(owner_infs, CNW, the_list, &already_created_instances); Assert::true_about( - Propositions::Abstract::to_provide_property(prn), + Propositions::Abstract::to_provide_property(prn), owner_infs, prevailing_mood);
  • This code is used in §5.
@@ -538,7 +538,7 @@ differently as a result. property *prnbar = EitherOrProperties::obtain(SW, owner_infs); if (prnbar) { i.e., unless that threw a problem message Assert::true_about( - Propositions::Abstract::to_provide_property(prnbar), + Propositions::Abstract::to_provide_property(prnbar), owner_infs, prevailing_mood); EitherOrProperties::make_pair(prn, prnbar); } @@ -599,7 +599,7 @@ or sky blue pink". PW = Node::get_text(option); Disallow this option name if it clashes with something non-adjectival5.11.1; Disallow this option name if it clashes with an either-or5.11.2; - pcalc_prop *prop = Propositions::Abstract::to_create_something(cnd_kind, PW); + pcalc_prop *prop = Propositions::Abstract::to_create_something(cnd_kind, PW); Assert::true(prop, prevailing_mood); } @@ -661,7 +661,7 @@ there would be horrible ambiguities in parsing. diff --git a/docs/assertions-module/3-nrr.html b/docs/assertions-module/3-nrr.html index 31e156f81..c0c6a2a86 100644 --- a/docs/assertions-module/3-nrr.html +++ b/docs/assertions-module/3-nrr.html @@ -134,7 +134,7 @@ of subsequent sentences, which also happens in the pre-pass. "this is too long a name for a single relation to have", "and would become unwieldy."); else Node::set_new_relation_here(V->next, - Relations::Explicit::make_pair_sketchily( + Relations::Explicit::make_pair_sketchily( WordAssemblages::from_wording(RW))); return TRUE; } @@ -170,7 +170,7 @@ and "each other" respectively. int unique; TRUE for one, FALSE for various, NOT_APPLICABLE if not yet known } relation_request_term; -
  • The structure relation_request is accessed in 6/kpr, 6/tap, 6/tcp and here.
  • The structure relation_request_term is accessed in 6/aa, 6/am, 6/amd and here.
+
  • The structure relation_request is accessed in 7/kpr, 7/tap, 7/tcp and here.
  • The structure relation_request_term is accessed in 7/aa, 7/am, 7/amd and here.

§2.2. Syntax on the left (term 0) and right (term 1) slightly differs. The integer result is a bitmap of these:

@@ -501,8 +501,8 @@ splitting into cases. ValueProperties::set_stored_relation(prn, bp); } if (dynamic) { - Relations::Explicit::store_dynamically(bp); - Relations::Explicit::store_dynamically(bpr); + Relations::Explicit::store_dynamically(bp); + Relations::Explicit::store_dynamically(bpr); RTRelations::initialiser_iname(bp); } RTRelations::mark_as_needed(bp); @@ -527,7 +527,7 @@ splitting into cases. } else { if (provide_prn) Assert::true_about( - Propositions::Abstract::to_provide_property(prn), storage_infs, prevailing_mood); + Propositions::Abstract::to_provide_property(prn), storage_infs, prevailing_mood); Add in the reducing functions5.12; } @@ -979,7 +979,7 @@ to have a name: } diff --git a/docs/assertions-module/3-nuor.html b/docs/assertions-module/3-nuor.html index 6406ad806..37cc5b452 100644 --- a/docs/assertions-module/3-nuor.html +++ b/docs/assertions-module/3-nuor.html @@ -163,7 +163,7 @@ OP match the following: CLASS_DEFINITION } use_option; -
  • The structure use_option is accessed in 3/dbtr, 3/rpr, 4/ass, 5/tc, 5/tbl, 5/eqt and here.
+
  • The structure use_option is accessed in 3/dbtr, 3/rpr, 4/ass, 5/tpf, 6/tc, 6/tbl, 6/eqt and here.

§3.2. Create a new use option3.2 =

@@ -388,7 +388,7 @@ by hand with a sentence in the source text.
  • This code is used in §10 (twice).
diff --git a/docs/assertions-module/3-nvr.html b/docs/assertions-module/3-nvr.html index e5c1ed8ff..c7f043e0c 100644 --- a/docs/assertions-module/3-nvr.html +++ b/docs/assertions-module/3-nvr.html @@ -674,7 +674,7 @@ in the case of ambiguity, with lower numbers preferred. See
  • This code is used in §5.2.2.
  • diff --git a/docs/assertions-module/3-pr.html b/docs/assertions-module/3-pr.html index 626eedc0e..1801125bd 100644 --- a/docs/assertions-module/3-pr.html +++ b/docs/assertions-module/3-pr.html @@ -149,7 +149,7 @@ text anyway, so the following problem messages are not too gratuitous.
    • This code is used in §2.
    diff --git a/docs/assertions-module/3-rpr.html b/docs/assertions-module/3-rpr.html index 70fa54de9..b284aed1e 100644 --- a/docs/assertions-module/3-rpr.html +++ b/docs/assertions-module/3-rpr.html @@ -559,7 +559,7 @@ a given rule appears in, and (within limits) where. A simple example: diff --git a/docs/assertions-module/3-tr.html b/docs/assertions-module/3-tr.html index 0f23c5568..e9efb44ca 100644 --- a/docs/assertions-module/3-tr.html +++ b/docs/assertions-module/3-tr.html @@ -513,7 +513,7 @@ will be required to pass <
    • This code is used in §7.
    diff --git a/docs/assertions-module/3-tr2.html b/docs/assertions-module/3-tr2.html index fa0a0de8e..b42ae6a16 100644 --- a/docs/assertions-module/3-tr2.html +++ b/docs/assertions-module/3-tr2.html @@ -245,7 +245,7 @@ more elaborate:
    • This code is used in §3 (three times).
    diff --git a/docs/assertions-module/3-uor.html b/docs/assertions-module/3-uor.html index b67e4545e..ff47b151d 100644 --- a/docs/assertions-module/3-uor.html +++ b/docs/assertions-module/3-uor.html @@ -211,7 +211,7 @@ since the compiler next down the chain may no longer be I6.
    • This code is used in §2.2.
    diff --git a/docs/assertions-module/4-ass.html b/docs/assertions-module/4-ass.html index 9f1f344ac..91ef6244c 100644 --- a/docs/assertions-module/4-ass.html +++ b/docs/assertions-module/4-ass.html @@ -644,7 +644,7 @@ specifying its edibility. subject_to = Specifications::to_proposition(Node::get_evaluation(py->down)); } - Propositions::Abstract::assert_kind_of_subject(inst, kind_of_what, subject_to); + Propositions::Abstract::assert_kind_of_subject(inst, kind_of_what, subject_to); return; } @@ -837,7 +837,7 @@ further sub-cases later.
         if (global_pass_state.pass == 1) return;
         unary_predicate *pred = Node::get_predicate(py);
    -    if (AdjectiveAmbiguity::has_enumerative_meaning(AdjectivalPredicates::to_adjective(pred))) {
    +    if (AdjectiveAmbiguity::has_enumerative_meaning(AdjectivalPredicates::to_adjective(pred))) {
             property *prn = ValueProperties::obtain(Node::get_text(px->down->next));
             if (Node::get_type(px->down) == WITH_NT) {
                 Problems::Using::assertion_problem(Task::syntax_tree(), _p_(PM_EOOwnerMutable),
    @@ -1614,7 +1614,7 @@ in general.
     
         binary_predicate *bp = Node::get_relationship(py);
         if ((bp) && ((SettingPropertyRelations::bp_sets_a_property(bp)) ||
    -        (Relations::Explicit::relates_values_not_objects(bp)))) {
    +        (Relations::Explicit::relates_values_not_objects(bp)))) {
             if (global_pass_state.pass == 2) Assertions::Relational::assert_subtree_in_relationship(px, py);
             return;
         }
    @@ -2551,7 +2551,7 @@ can also be used adjectivally.
     }
     
    diff --git a/docs/assertions-module/4-ass2.html b/docs/assertions-module/4-ass2.html index 1af0738a3..97f0197cb 100644 --- a/docs/assertions-module/4-ass2.html +++ b/docs/assertions-module/4-ass2.html @@ -128,7 +128,7 @@ generalisations which apply to it. CLASS_DEFINITION } generalisation;
    -
    • The structure generalisation is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/tbl, 5/eqt, 6/tcp, 6/cu and here.
    +
    • The structure generalisation is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/adf, 6/tbl, 6/eqt, 7/tcp, 7/cu and here.

    §3. For reasons to do with timing, each object needs to keep track of which generalisations have and have not yet applied to it. In practice, this is a list of pairs \((K, g)\) where \(K\) is a kind and \(g\) is the most recent one @@ -142,7 +142,7 @@ applied from \(K\)'s list. struct application *next; } application; -

    • The structure application is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/tbl, 5/eqt, 6/tcp, 6/cu and here.
    +
    • The structure application is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/adf, 6/tbl, 6/eqt, 7/tcp, 7/cu and here.

    §4. These structures are combined in the following packet of data attached to each inference subject:

    @@ -511,7 +511,7 @@ machinery is in infinite regress, e.g., because each \(K\) must contain an
    • This code is used in §13.
    diff --git a/docs/assertions-module/4-imp.html b/docs/assertions-module/4-imp.html index 7efb61cd6..d90191aa6 100644 --- a/docs/assertions-module/4-imp.html +++ b/docs/assertions-module/4-imp.html @@ -101,7 +101,7 @@ description only, whereas B could be any subtree of an assertion. int possession_certainty; ditto } possession_marker; -
    • The structure possession_marker is accessed in 6/tap and here.
    +
    • The structure possession_marker is accessed in 7/tap and here.

    §3. Implications are gathered during the main parse tree traverses, but all we do is to store them and sit on them.

    @@ -187,7 +187,7 @@ is to store them and sit on them.
         unary_predicate *pred = Node::get_predicate(py);
    -    property *prn = AdjectiveAmbiguity::has_either_or_property_meaning(AdjectivalPredicates::to_adjective(pred), NULL);
    +    property *prn = AdjectiveAmbiguity::has_either_or_property_meaning(AdjectivalPredicates::to_adjective(pred), NULL);
         if (prn == NULL) {
             StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ImplicationValueProperty),
                 "that's an implication where the outcome is an adjective other than "
    @@ -330,14 +330,14 @@ no better a certainty level.
     
         unary_predicate *pred = Node::get_predicate(imp->then_pn);
         int conclusion_state = TRUE;
    -    if (AdjectivalPredicates::parity(pred) == FALSE) conclusion_state = FALSE;
    +    if (AdjectivalPredicates::parity(pred) == FALSE) conclusion_state = FALSE;
         if (imp->implied_likelihood < 0) conclusion_state = (conclusion_state)?FALSE:TRUE;
     
         LOGIF(IMPLICATIONS, "$D => $T (certainty %d; changed state %d)\n",
             imp->if_proposition, imp->then_pn, imp->implied_likelihood, conclusion_state);
     
    -    property *conclusion_prop = AdjectiveAmbiguity::has_either_or_property_meaning(
    -        AdjectivalPredicates::to_adjective(pred), NULL);
    +    property *conclusion_prop = AdjectiveAmbiguity::has_either_or_property_meaning(
    +        AdjectivalPredicates::to_adjective(pred), NULL);
         Check that the conclusion is not impossible6.1.1;
     
         possession_marker *pom = Properties::get_possession_marker(conclusion_prop);
    @@ -389,17 +389,17 @@ no better a certainty level.
             KindSubjects::to_kind(domain), Terms::new_variable(0));
         if (conclusion_state == FALSE) {
             prop = Propositions::concatenate(prop, Atoms::new(NEGATION_OPEN_ATOM));
    -        prop = Propositions::concatenate(prop, AdjectivalPredicates::new_atom_on_x(aph, FALSE));
    +        prop = Propositions::concatenate(prop, AdjectivalPredicates::new_atom_on_x(aph, FALSE));
             prop = Propositions::concatenate(prop, Atoms::new(NEGATION_CLOSE_ATOM));
         } else {
    -        prop = Propositions::concatenate(prop, AdjectivalPredicates::new_atom_on_x(aph, FALSE));
    +        prop = Propositions::concatenate(prop, AdjectivalPredicates::new_atom_on_x(aph, FALSE));
         }
         Assert::true_about(prop, candidate, CERTAIN_CE);
         return TRUE;
     
    • This code is used in §6.1.
    diff --git a/docs/assertions-module/4-npa.html b/docs/assertions-module/4-npa.html index ea0fc3eb7..97884aa72 100644 --- a/docs/assertions-module/4-npa.html +++ b/docs/assertions-module/4-npa.html @@ -133,7 +133,7 @@ automatically creates it. if ((K) && (KindSubjects::has_properties(K) == FALSE)) Disallow this kind as a new owner of a value property1.1.1; property *prn = ValueProperties::obtain(Node::get_text(p)); - Assert::true_about(Propositions::Abstract::to_provide_property(prn), + Assert::true_about(Propositions::Abstract::to_provide_property(prn), owner_infs, prevailing_mood); return prn;
    @@ -294,7 +294,7 @@ several property names, e.g., in
    • This code is used in §2.1.
    diff --git a/docs/assertions-module/4-nr.html b/docs/assertions-module/4-nr.html index 62ed5ef66..b9ba82986 100644 --- a/docs/assertions-module/4-nr.html +++ b/docs/assertions-module/4-nr.html @@ -465,7 +465,7 @@ important. } diff --git a/docs/assertions-module/4-pk.html b/docs/assertions-module/4-pk.html index e739fbc77..2cef5536a 100644 --- a/docs/assertions-module/4-pk.html +++ b/docs/assertions-module/4-pk.html @@ -82,7 +82,7 @@ function togglePopup(material_id) { VariableSubjects::typecheck_initial_value(q, val, FALSE); parse_node *var = Lvalues::new_actual_NONLOCAL_VARIABLE(q); - pcalc_prop *prop = Propositions::Abstract::to_set_relation(R_equality, NULL, var, NULL, val); + pcalc_prop *prop = Propositions::Abstract::to_set_relation(R_equality, NULL, var, NULL, val); Assert::true(prop, prevailing_mood); } @@ -97,7 +97,7 @@ either as an object, a value or a subtree — should have
     void Assertions::PropertyKnowledge::assert_property_value_from_property_subtree_infs(property *prn,
         inference_subject *owner, parse_node *val_subtree) {
    -    pcalc_prop *prop = Propositions::Abstract::from_property_subtree(prn, val_subtree);
    +    pcalc_prop *prop = Propositions::Abstract::from_property_subtree(prn, val_subtree);
         if (owner == NULL) Issue a problem for an unrecognised property owner2.3;
         Assert::true_about(prop, owner, prevailing_mood);
     }
    @@ -122,7 +122,7 @@ either as an object, a value or a subtree — should have
         }
         kind *kind_clue = NULL;
         Work out the clue kind2.1;
    -    pcalc_prop *prop = Propositions::Abstract::from_property_list(list_subtree, kind_clue);
    +    pcalc_prop *prop = Propositions::Abstract::from_property_list(list_subtree, kind_clue);
         Assert::true_about(prop, owner, prevailing_mood);
     }
     
    @@ -197,7 +197,7 @@ the proposition machinery.

    -parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree(property *prn, parse_node *py) {
    +parse_node *Assertions::PropertyKnowledge::property_value_from_property_subtree(property *prn, parse_node *py) {
         if (Properties::is_either_or(prn)) {
             if (py == NULL) Issue a problem, as this uses a bare adjective as if a value-property3.1;
             Issue a problem, as this makes sense only for value properties3.2;
    @@ -319,7 +319,7 @@ the proposition machinery.
     
    • This code is used in §3.
    diff --git a/docs/assertions-module/4-rk.html b/docs/assertions-module/4-rk.html index cc6ba5ad3..ac04474b9 100644 --- a/docs/assertions-module/4-rk.html +++ b/docs/assertions-module/4-rk.html @@ -140,7 +140,7 @@ objects or values, but there are two exceptional cases to take care of. "like 'Here is nothing.': just don't put anything there."); } else { Assert::true_about( - Propositions::Abstract::to_put_here(), + Propositions::Abstract::to_put_here(), Node::get_subject(value), prevailing_mood); } return; @@ -244,7 +244,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and Impose a tedious restriction on relations between objects and values3.2; Assert::true( - Propositions::Abstract::to_set_relation(bp, Node::get_subject(px), Node::get_evaluation(px), Node::get_subject(py), Node::get_evaluation(py)), + Propositions::Abstract::to_set_relation(bp, Node::get_subject(px), Node::get_evaluation(px), Node::get_subject(py), Node::get_evaluation(py)), prevailing_mood); } @@ -275,7 +275,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and

    -    if ((Relations::Explicit::relates_values_not_objects(bp)) &&
    +    if ((Relations::Explicit::relates_values_not_objects(bp)) &&
             (((Node::get_subject(px)) && (KindSubjects::to_kind(Node::get_subject(px)))) ||
             ((Node::get_subject(py)) && (KindSubjects::to_kind(Node::get_subject(py)))))) {
             StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_KindRelatedToValue),
    @@ -306,7 +306,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and
     
    • This code is used in §3.
    diff --git a/docs/assertions-module/4-rpt.html b/docs/assertions-module/4-rpt.html index 8696c9cc7..a45ccd3a3 100644 --- a/docs/assertions-module/4-rpt.html +++ b/docs/assertions-module/4-rpt.html @@ -96,7 +96,7 @@ in a creation_proposition Make a common or proper noun as appropriate1.1; } -void Refiner::give_spec_to_noun(parse_node *p, parse_node *eval) { +void Refiner::give_spec_to_noun(parse_node *p, parse_node *eval) { inference_subject *infs = Specifications::to_subject(eval); Make a common or proper noun as appropriate1.1; } @@ -133,7 +133,7 @@ it probably never needs to be copied, but we do so for safety's sake.)

    -void Refiner::copy_noun_details(parse_node *p_to, parse_node *p_from) {
    +void Refiner::copy_noun_details(parse_node *p_to, parse_node *p_from) {
         Node::set_type(p_to, Node::get_type(p_from));
         Node::set_evaluation(p_to, Node::get_evaluation(p_from));
         Node::set_creation_proposition(p_to, Node::get_creation_proposition(p_from));
    @@ -205,9 +205,9 @@ though only if it has a positive sense and has a nominal meaning.
     int Refiner::nominalise_adjective(parse_node *p) {
         if ((p) && (Node::get_type(p) == ADJECTIVE_NT)) {
             unary_predicate *pred = Node::get_predicate(p);
    -        if (AdjectivalPredicates::parity(pred) == TRUE) {
    -            instance *q = AdjectiveAmbiguity::has_enumerative_meaning(
    -                AdjectivalPredicates::to_adjective(pred));
    +        if (AdjectivalPredicates::parity(pred) == TRUE) {
    +            instance *q = AdjectiveAmbiguity::has_enumerative_meaning(
    +                AdjectivalPredicates::to_adjective(pred));
                 if (q) Refiner::give_spec_to_noun(p, Rvalues::from_instance(q));
             }
         }
    @@ -363,7 +363,7 @@ refine them.
     
     
     int forbid_nowhere = FALSE;
    -void Refiner::refine(parse_node *p, int creation_rule) {
    +void Refiner::refine(parse_node *p, int creation_rule) {
         if (p == NULL) internal_error("Refine parse tree on null pn");
         if (Annotations::read_int(p, refined_ANNOT)) return;
         Annotations::write_int(p, refined_ANNOT, TRUE);
    @@ -1014,7 +1014,7 @@ issue for sentences like:
     }
     
    diff --git a/docs/assertions-module/4-tc.html b/docs/assertions-module/4-tc.html index bb75853a4..82301d2b0 100644 --- a/docs/assertions-module/4-tc.html +++ b/docs/assertions-module/4-tc.html @@ -447,7 +447,7 @@ or adjectives specified in the inference_subject *its_domain = Node::get_subject(what_to_make_node); if ((new_creation) && (its_domain)) - Propositions::Abstract::assert_kind_of_subject(new_creation, its_domain, + Propositions::Abstract::assert_kind_of_subject(new_creation, its_domain, Specifications::to_proposition(Node::get_evaluation(what_to_make_node))); if (Node::get_type(what_to_make_node) == WITH_NT) @@ -780,9 +780,9 @@ to abbreviated forms of object names are normally allowed. int is_a_kind = FALSE; if ((governor) && (Node::get_type(governor) == KIND_NT)) is_a_kind = TRUE; - pcalc_prop *prop = Propositions::Abstract::to_create_something(K_object, W); + pcalc_prop *prop = Propositions::Abstract::to_create_something(K_object, W); if (is_a_kind) - prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_kind(K_object)); + prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_kind(K_object)); Assert::true(prop, CERTAIN_CE); if (is_a_kind == FALSE) { @@ -854,8 +854,8 @@ to abbreviated forms of object names are normally allowed.

    -    pcalc_prop *prop = Propositions::Abstract::to_create_something(NULL, W);
    -    prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_kind(K_value));
    +    pcalc_prop *prop = Propositions::Abstract::to_create_something(NULL, W);
    +    prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_kind(K_value));
         Assert::true(prop, prevailing_mood);
         val = Specifications::from_kind(latest_base_kind_of_value);
     
    @@ -871,11 +871,11 @@ to abbreviated forms of object names are normally allowed. domain = Specifications::kind_of_new_variable_like(governing_spec); if ((K_understanding) && (Kinds::contains(domain, Kinds::get_construct(K_understanding)))) Issue a problem for topics that vary4.4.2.2.1; - pcalc_prop *prop = Propositions::Abstract::to_create_something(domain, W); + pcalc_prop *prop = Propositions::Abstract::to_create_something(domain, W); if (prevailing_mood == CERTAIN_CE) - prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_const()); + prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_const()); else - prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_var()); + prop = Propositions::concatenate(prop, Propositions::Abstract::to_make_a_var()); Assert::true(prop, prevailing_mood); if (NonlocalVariables::get_latest() == NULL) internal_error("failed to create"); val = Lvalues::new_actual_NONLOCAL_VARIABLE(NonlocalVariables::get_latest()); @@ -885,7 +885,7 @@ to abbreviated forms of object names are normally allowed.

    -    pcalc_prop *prop = Propositions::Abstract::to_create_something(create_as, W);
    +    pcalc_prop *prop = Propositions::Abstract::to_create_something(create_as, W);
         pcalc_prop *such_that = Node::get_creation_proposition(governor);
         if (such_that) prop = Propositions::concatenate(prop, such_that);
         Assert::true(prop, prevailing_mood);
    @@ -1024,7 +1024,7 @@ if nothing has already been said:
     

    -int Assertions::Creator::vet_name(wording W) {
    +int Assertions::Creator::vet_name(wording W) {
         if (<creation-problem-diagnosis>(W)) return FALSE;
         return TRUE;
     }
    @@ -1182,7 +1182,7 @@ to a different vehicle object.
             Check that the new name is non-empty and distinct from all existing ones7.4.1.2;
         NW = Wordings::truncate(NW, 32);  truncate to the maximum length
         parse_node *pz = Node::new(PROPER_NOUN_NT);
    -    pcalc_prop *prop = Propositions::Abstract::to_create_something(instance_kind, NW);
    +    pcalc_prop *prop = Propositions::Abstract::to_create_something(instance_kind, NW);
         Assert::true(prop, prevailing_mood);
         new_instance = Instances::as_subject(Instances::latest());
         if (named_after) {
    @@ -1360,14 +1360,14 @@ proposition claiming its existence, then assert it to be true.
         inform_language *L;
         LOOP_OVER(L, inform_language) {
             pcalc_prop *prop =
    -            Propositions::Abstract::to_create_something(K, L->instance_name);
    +            Propositions::Abstract::to_create_something(K, L->instance_name);
             Assert::true(prop, CERTAIN_CE);
             L->nl_instance = Instances::latest();
         }
     }
     
    diff --git a/docs/assertions-module/5-adf.html b/docs/assertions-module/5-adf.html new file mode 100644 index 000000000..ae811e1eb --- /dev/null +++ b/docs/assertions-module/5-adf.html @@ -0,0 +1,147 @@ + + + + Adjectival Definition Family + + + + + + + + + + + + + + + + + + + +
    + + +

    Imperative definitions of "Definition: X is Y: ..." adjectives.

    + +

    §1.

    + +
    +imperative_defn_family *DEFINITIONAL_PHRASE_EFF_family = NULL;  "Definition: a container is roomy if: ..."
    +
    +

    §2.

    + +
    +void AdjectivalDefinitionFamily::create_family(void) {
    +    DEFINITIONAL_PHRASE_EFF_family  = ImperativeDefinitions::new_family(I"DEFINITIONAL_PHRASE_EFF");
    +    METHOD_ADD(DEFINITIONAL_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, AdjectivalDefinitionFamily::claim);
    +    METHOD_ADD(DEFINITIONAL_PHRASE_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, AdjectivalDefinitionFamily::new_phrase);
    +}
    +
    +

    §3.

    + +
    +<definition-preamble> ::=
    +    definition
    +
    + +

    §4.

    + +
    +void AdjectivalDefinitionFamily::claim(imperative_defn_family *self, imperative_defn *id) {
    +    wording W = Node::get_text(id->at);
    +    if (<definition-preamble>(W)) {
    +        id->family = DEFINITIONAL_PHRASE_EFF_family;
    +        if ((id->at->next) && (id->at->down == NULL) &&
    +            (Node::get_type(id->at->next) == IMPERATIVE_NT)) {
    +            ImperativeSubtrees::accept_body(id->at->next);
    +            Node::set_type(id->at->next, DEFN_CONT_NT);
    +        }
    +        Phrases::Adjectives::look_for_headers(id->at);
    +    }
    +}
    +
    +

    §5. If a phrase defines an adjective, like so: +

    + +
    +

    Definition: A container is capacious if: ...

    +
    + +

    we need to make the pronoun "it" a local variable of kind "container" in the +stack frame used to compile the "..." part. If it uses a calling, like so: +

    + +
    +

    Definition: A container (called the sack) is capacious if: ...

    +
    + +

    then we also want the name "sack" to refer to this. Here's where we take care +of it: +

    + +
    +void AdjectivalDefinitionFamily::new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) {
    +    wording CW = EMPTY_WORDING;
    +    kind *K = NULL;
    +    Phrases::Phrasal::define_adjective_by_phrase(id->at, new_ph, &CW, &K);
    +    LocalVariables::add_pronoun(&(new_ph->stack_frame), CW, K);
    +}
    +
    + + +
    + + + diff --git a/docs/assertions-module/5-id.html b/docs/assertions-module/5-id.html new file mode 100644 index 000000000..02be130e6 --- /dev/null +++ b/docs/assertions-module/5-id.html @@ -0,0 +1,447 @@ + + + + Imperative Definitions + + + + + + + + + + + + + + + + + + +
    + + +

    Each IMPERATIVE node in the syntax tree makes a definition of a phrase or rule.

    + +

    §1. When this function starts, the tree contains a number of top-level IMPERATIVE_NT +nodes with INVOCATION_LIST_NT nodes hanging from them, but we haven't looked at +any of the text in the IMPERATIVE_NT head nodes and therefore we have no idea what +they define. Some will be rules, some will define To... phrases, and so on. +

    + +
    +typedef struct imperative_defn {
    +    struct imperative_defn_family *family;
    +    struct general_pointer family_specific_data;
    +    struct parse_node *at;
    +    struct phrase *defines;
    +    CLASS_DEFINITION
    +} imperative_defn;
    +
    +typedef struct imperative_defn_family {
    +    struct text_stream *family_name;
    +    struct method_set *methods;
    +    CLASS_DEFINITION
    +} imperative_defn_family;
    +
    +imperative_defn_family *AS_YET_UNKNOWN_EFF_family = NULL;  used only temporarily
    +
    +imperative_defn_family *ImperativeDefinitions::new_family(text_stream *name) {
    +    imperative_defn_family *family = CREATE(imperative_defn_family);
    +    family->family_name = Str::duplicate(name);
    +    family->methods = Methods::new_set();
    +    return family;
    +}
    +
    +
    • The structure imperative_defn is accessed in 5/adf, 5/tpf, 5/rf, 7/tap, 7/tcp, 7/aa, 7/am and here.
    • The structure imperative_defn_family is accessed in 7/am and here.
    +

    §2. CLAIM_IMP_DEFN_MTID is for deciding from the syntax of a preamble whether +this definition should belong to the family or not. +

    + +
    enum CLAIM_IMP_DEFN_MTID
    +
    +
    +VOID_METHOD_TYPE(CLAIM_IMP_DEFN_MTID, imperative_defn_family *f, imperative_defn *id)
    +
    +void ImperativeDefinitions::identify(imperative_defn *id) {
    +    imperative_defn_family *f;
    +    LOOP_OVER(f, imperative_defn_family)
    +        if (id->family == AS_YET_UNKNOWN_EFF_family)
    +            VOID_METHOD_CALL(f, CLAIM_IMP_DEFN_MTID, id);
    +}
    +
    +

    §3. NEW_PHRASE_IMP_DEFN_MTID is for deciding from the syntax of a preamble whether +this definition should belong to the family or not. +

    + +
    enum NEW_PHRASE_IMP_DEFN_MTID
    +
    +
    +VOID_METHOD_TYPE(NEW_PHRASE_IMP_DEFN_MTID, imperative_defn_family *f, imperative_defn *id, phrase *new_ph)
    +
    +void ImperativeDefinitions::new_phrase(imperative_defn *id, phrase *new_ph) {
    +    VOID_METHOD_CALL(id->family, NEW_PHRASE_IMP_DEFN_MTID, id, new_ph);
    +}
    +
    +

    §4.

    + +
    +int ImperativeDefinitions::goes_in_rulebooks(imperative_defn *id) {
    +    if (RuleFamily::is(id)) return TRUE;
    +    return FALSE;
    +}
    +
    +

    §5.

    + +
    +void ImperativeDefinitions::create_families(void) {
    +    AS_YET_UNKNOWN_EFF_family       = ImperativeDefinitions::new_family(I"AS_YET_UNKNOWN_EFF");
    +
    +    AdjectivalDefinitionFamily::create_family();
    +
    +    ToPhraseFamily::create_family();
    +
    +    RuleFamily::create_family();
    +}
    +
    +

    §6.

    + +
    +imperative_defn *ImperativeDefinitions::make_imperative_definition(parse_node *p) {
    +    imperative_defn *id = CREATE(imperative_defn);
    +    id->at = p;
    +    id->defines = NULL;
    +    id->family = AS_YET_UNKNOWN_EFF_family;
    +    id->family_specific_data = NULL_GENERAL_POINTER;
    +    current_sentence = p;
    +    ImperativeDefinitions::identify(id);
    +    return id;
    +}
    +
    +

    §7.

    + +
    +void ImperativeDefinitions::find_phrases_and_rules(void) {
    +    int initial_problem_count = problem_count;
    +
    +    int total = NUMBER_CREATED(imperative_defn), created = 0;
    +    imperative_defn *id;
    +    LOOP_OVER(id, imperative_defn) {
    +        created++;
    +        if ((created % 10) == 0)
    +            ProgressBar::update(3,
    +                ((float) (created))/((float) (total)));
    +        current_sentence = id->at;
    +        Phrases::create_from_preamble(id);
    +    }
    +    if (initial_problem_count < problem_count) return;
    +
    +    Routines::ToPhrases::register_all();
    +    if (initial_problem_count < problem_count) return;
    +
    +    phrase *ph;
    +    LOOP_OVER(ph, phrase) {
    +        current_sentence = ph->from->at;
    +        Frames::make_current(&(ph->stack_frame));
    +        ph->runtime_context_data =
    +            Phrases::Usage::to_runtime_context_data(&(ph->usage_data));
    +        Frames::remove_current();
    +    }
    +    if (initial_problem_count < problem_count) return;
    +
    +    RuleBookings::make_automatic_placements();
    +    if (initial_problem_count < problem_count) return;
    +
    +    SyntaxTree::traverse(Task::syntax_tree(), ImperativeDefinitions::visit_to_parse_placements);
    +}
    +
    +

    §8.

    + +
    enum TRAVERSE_FOR_RULE_FILING_SMFT
    +
    +
    +void ImperativeDefinitions::visit_to_parse_placements(parse_node *p) {
    +    if ((Node::get_type(p) == SENTENCE_NT) &&
    +        (p->down) &&
    +        (Node::get_type(p->down) == VERB_NT)) {
    +        prevailing_mood = Annotations::read_int(p->down, verbal_certainty_ANNOT);
    +        MajorNodes::try_special_meaning(TRAVERSE_FOR_RULE_FILING_SMFT, p->down);
    +    }
    +}
    +
    +

    §9. The rulebooks are now complete and final. It is time to +compile the Inter code which will provide the run-time definitions of all +these phrases. This will be a long task, and we can only do most of it now, +because more phrases will appear later. +

    + +
    +int total_phrases_to_compile = 0;
    +int total_phrases_compiled = 0;
    +void ImperativeDefinitions::compile_first_block(void) {
    +    Count up the scale of the task9.1;
    +    Compile definitions of rules in rulebooks9.2;
    +    Compile definitions of rules left out of rulebooks9.3;
    +    Compile phrases which define adjectives9.4;
    +    Mark To... phrases which have definite kinds for future compilation9.5;
    +    Throw problems for phrases with return kinds too vaguely defined9.6;
    +    Throw problems for inline phrases named as constants9.7;
    +}
    +
    +

    §9.1. Count up the scale of the task9.1 = +

    + +
    +    total_phrases_compiled = 0;
    +    phrase *ph;
    +    LOOP_OVER(ph, phrase)
    +        if (ph->at_least_one_compiled_form_needed)
    +            total_phrases_to_compile++;
    +
    +
    • This code is used in §9.
    +

    §9.2. Compile definitions of rules in rulebooks9.2 = +

    + +
    +    rulebook *rb;
    +    LOOP_OVER(rb, rulebook)
    +        RTRules::compile_rule_phrases(rb,
    +            &total_phrases_compiled, total_phrases_to_compile);
    +
    +
    • This code is used in §9.
    +

    §9.3. Compile definitions of rules left out of rulebooks9.3 = +

    + +
    +    rule *R;
    +    LOOP_OVER(R, rule)
    +        RTRules::compile_definition(R,
    +            &total_phrases_compiled, total_phrases_to_compile);
    +
    +
    • This code is used in §9.
    +

    §9.4. This doesn't compile all adjective definitions, only the ones which supply +a whole multi-step phrase to define them — a relatively little-used feature +of Inform. +

    + +

    Compile phrases which define adjectives9.4 = +

    + +
    +    imperative_defn *id;
    +    LOOP_OVER(id, imperative_defn)
    +        if (id->family == DEFINITIONAL_PHRASE_EFF_family)
    +            Phrases::compile(id->defines, &total_phrases_compiled,
    +                total_phrases_to_compile, NULL, NULL, NULL);
    +    RTAdjectives::compile_support_code();
    +
    +
    • This code is used in §9.
    +

    §9.5. As we'll see, it's legal in Inform to define "To..." phrases with vague +kinds: "To expose (X - a value)", for example. This can't be compiled as +vaguely as the definition implies, since there would be no way to know how +to store X. Instead, for each different kind of X which is actually needed, +a fresh version of the phrase is compiled — one where X is a number, one +where it's a text, and so on. This is handled by making a "request" for the +phrase, indicating that a compiled version of it will be needed. +

    + +

    Since "To..." phrases are only compiled on request, we must remember to +request the boring ones with straightforward kinds ("To award (N - a number) +points", say). This is where we do it: +

    + +

    Mark To... phrases which have definite kinds for future compilation9.5 = +

    + +
    +    phrase *ph;
    +    LOOP_OVER(ph, phrase) {
    +        kind *K = Phrases::TypeData::kind(&(ph->type_data));
    +        if (Kinds::Behaviour::definite(K)) {
    +            if (ph->at_least_one_compiled_form_needed)
    +                Routines::ToPhrases::make_request(ph, K, NULL, EMPTY_WORDING);
    +        }
    +    }
    +
    +
    • This code is used in §9.
    +

    §9.6. Throw problems for phrases with return kinds too vaguely defined9.6 = +

    + +
    +    phrase *ph;
    +    LOOP_OVER(ph, phrase) {
    +        kind *KR = Phrases::TypeData::get_return_kind(&(ph->type_data));
    +        if ((Kinds::Behaviour::semidefinite(KR) == FALSE) &&
    +            (Phrases::TypeData::arithmetic_operation(ph) == -1)) {
    +            current_sentence = Phrases::declaration_node(ph);
    +            Problems::quote_source(1, current_sentence);
    +            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague));
    +            Problems::issue_problem_segment(
    +                "The declaration %1 tries to set up a phrase which decides a "
    +                "value which is too vaguely described. For example, 'To decide "
    +                "which number is the target: ...' is fine, because 'number' "
    +                "is clear about what kind of value should emerge; but 'To "
    +                "decide which value is the target: ...' is not clear enough.");
    +            Problems::issue_problem_end();
    +        }
    +        for (int k=1; k<=26; k++)
    +            if ((Kinds::Behaviour::involves_var(KR, k)) &&
    +                (Phrases::TypeData::tokens_contain_variable(&(ph->type_data), k) == FALSE)) {
    +                current_sentence = Phrases::declaration_node(ph);
    +                TEMPORARY_TEXT(var_letter)
    +                PUT_TO(var_letter, 'A'+k-1);
    +                Problems::quote_source(1, current_sentence);
    +                Problems::quote_stream(2, var_letter);
    +                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined));
    +                Problems::issue_problem_segment(
    +                    "The declaration %1 tries to set up a phrase which decides a "
    +                    "value which is too vaguely described, because it involves "
    +                    "a kind variable (%2) which it can't determine through "
    +                    "usage.");
    +                Problems::issue_problem_end();
    +                DISCARD_TEXT(var_letter)
    +        }
    +    }
    +
    +
    • This code is used in §9.
    +

    §9.7. Throw problems for inline phrases named as constants9.7 = +

    + +
    +    phrase *ph;
    +    LOOP_OVER(ph, phrase)
    +        if ((Phrases::TypeData::invoked_inline(ph)) &&
    +            (Phrases::Usage::has_name_as_constant(&(ph->usage_data)))) {
    +            current_sentence = Phrases::declaration_node(ph);
    +            Problems::quote_source(1, current_sentence);
    +            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline));
    +            Problems::issue_problem_segment(
    +                "The declaration %1 tries to give a name to a phrase which is "
    +                "defined using inline Inform 6 code in (- markers -). Such "
    +                "phrases can't be named and used as constants because they "
    +                "have no independent existence, being instead made fresh "
    +                "each time they are used.");
    +            Problems::issue_problem_end();
    +        }
    +
    +
    • This code is used in §9.
    +

    §10. The twilight gathers, but our work is far from done. Recall that we have +accumulated compilation requests for "To..." phrases, but haven't actually +acted on them yet. +

    + +

    We have to do this in quite an open-ended way, because compiling one phrase +can easily generate fresh requests for others. For instance, suppose we have +the definition "To expose (X - a value)" in play, and suppose that when +compiling the phrase "To advertise", Inform runs into the line "expose the +hoarding text". This causes it to issue a compilation request for "To expose +(X - a text)". Perhaps we've compiled such a form already, but perhaps we +haven't. Compilation therefore goes on until all requests have been dealt +with. +

    + +

    Compiling phrases also produces the need for other pieces of code to be +generated — for example, suppose our phrase being compiled, "To advertise", +includes the text: +

    + +
    +

    let Z be "Two for the price of one! Just [expose price]!";

    +
    + +

    We are going to need to compile "Two for the price of one! Just [expose price]!" +later on, in its own text substitution routine; but notice that it contains +the need for "To expose (X - a number)", and that will generate a further +phrase request. +

    + +

    Because of this and similar problems, it's impossible to compile all the +phrases alone: we must compile phrases, then things arising from them, then +phrases arising from those, then things arising from the phrases arising +from those, and so on, until we're done. The process is therefore structured +as a set of "coroutines" which each carry out as much as they can and then +hand over to the others to generate more work. +

    + +
    +void ImperativeDefinitions::compile_as_needed(void) {
    +    rule *R;
    +    LOOP_OVER(R, rule)
    +        RTRules::compile_definition(R,
    +            &total_phrases_compiled, total_phrases_to_compile);
    +    int repeat = TRUE;
    +    while (repeat) {
    +        repeat = FALSE;
    +        if (Routines::ToPhrases::compilation_coroutine(
    +            &total_phrases_compiled, total_phrases_to_compile) > 0)
    +            repeat = TRUE;
    +        if (ListTogether::compilation_coroutine() > 0)
    +            repeat = TRUE;
    +        #ifdef IF_MODULE
    +        if (LoopingOverScope::compilation_coroutine() > 0)
    +            repeat = TRUE;
    +        #endif
    +        if (Strings::TextSubstitutions::compilation_coroutine(FALSE) > 0)
    +            repeat = TRUE;
    +        if (Propositions::Deferred::compilation_coroutine() > 0)
    +            repeat = TRUE;
    +    }
    +}
    +
    + + +
    + + + diff --git a/docs/assertions-module/5-rf.html b/docs/assertions-module/5-rf.html new file mode 100644 index 000000000..8eae7cd06 --- /dev/null +++ b/docs/assertions-module/5-rf.html @@ -0,0 +1,224 @@ + + + + Rule Family + + + + + + + + + + + + + + + + + + + +
    + + +

    Imperative definitions of rules.

    + +

    §1.

    + +
    +imperative_defn_family *RULE_NOT_IN_RULEBOOK_EFF_family = NULL;  "At 9 PM: ...", "This is the zap rule: ..."
    +imperative_defn_family *RULE_IN_RULEBOOK_EFF_family = NULL;  "Before taking a container, ..."
    +
    +typedef struct rule_family_data {
    +    int not_in_rulebook;
    +    CLASS_DEFINITION
    +} rule_family_data;
    +
    +
    • The structure rule_family_data is private to this section.
    +

    §2.

    + +
    +void RuleFamily::create_family(void) {
    +    RULE_NOT_IN_RULEBOOK_EFF_family = ImperativeDefinitions::new_family(I"RULE_NOT_IN_RULEBOOK_EFF");
    +    METHOD_ADD(RULE_NOT_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, RuleFamily::RNIR_claim);
    +    METHOD_ADD(RULE_NOT_IN_RULEBOOK_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, RuleFamily::rnir_new_phrase);
    +    RULE_IN_RULEBOOK_EFF_family     = ImperativeDefinitions::new_family(I"RULE_IN_RULEBOOK_EFF");
    +    METHOD_ADD(RULE_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, RuleFamily::RIR_claim);
    +    METHOD_ADD(RULE_IN_RULEBOOK_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, RuleFamily::rir_new_phrase);
    +}
    +
    +

    §3.

    + +
    +<rnir-preamble> ::=
    +    this is the {... rule} |                                  ==> { TRUE, - }
    +    this is the rule |                                        ==> Issue PM_NamelessRule problem3.2
    +    this is ... rule |                                        ==> Issue PM_UnarticledRule problem3.3
    +    this is ... rules |                                       ==> Issue PM_PluralisedRule problem3.4
    +    <event-rule-preamble>                                     ==> { FALSE, - }
    +void RuleFamily::RNIR_claim(imperative_defn_family *self, imperative_defn *id) {
    +    wording W = Node::get_text(id->at);
    +    if (<rnir-preamble>(W)) {
    +        id->family = RULE_NOT_IN_RULEBOOK_EFF_family;
    +        rule_family_data *rfd = CREATE(rule_family_data);
    +        rfd->not_in_rulebook = TRUE;
    +        id->family_specific_data = STORE_POINTER_rule_family_data(rfd);
    +        if (<<r>>) {
    +            wording RW = GET_RW(<rnir-preamble>, 1);
    +            if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE);
    +        }
    +    }
    +}
    +
    + +

    §3.1.

    + +
    +<rir-preamble> ::=
    +    ... ( this is the {... rule} ) |                          ==> { TRUE, - }
    +    ... ( this is the rule ) |                                ==> Issue PM_NamelessRule problem3.2
    +    ... ( this is ... rule ) |                                ==> Issue PM_UnarticledRule problem3.3
    +    ... ( this is ... rules ) |                               ==> Issue PM_PluralisedRule problem3.4
    +    ...                                                       ==> { FALSE, - }
    +
    + +

    §3.2. Issue PM_NamelessRule problem3.2 = +

    + +
    +    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule),
    +        "there are many rules in Inform",
    +        "so you need to give a name: 'this is the abolish dancing rule', say, "
    +        "not just 'this is the rule'.");
    +    ==> { FALSE, - }
    +
    + +

    §3.3. Issue PM_UnarticledRule problem3.3 = +

    + +
    +    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule),
    +        "a rule must be given a definite name",
    +        "which begins with 'the', just to emphasise that it is the only one "
    +        "with this name: 'this is the promote dancing rule', say, not just "
    +        "'this is promote dancing rule'.");
    +    ==> { FALSE, - }
    +
    + +

    §3.4. Issue PM_PluralisedRule problem3.4 = +

    + +
    +    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule),
    +        "a rule must be given a definite name ending in 'rule' not 'rules'",
    +        "since the plural is only used for rulebooks, which can of course "
    +        "contain many rules at once.");
    +    ==> { FALSE, - }
    +
    + +

    §4.

    + +
    +void RuleFamily::RIR_claim(imperative_defn_family *self, imperative_defn *id) {
    +    wording W = Node::get_text(id->at);
    +    if (<rir-preamble>(W)) {
    +        id->family = RULE_IN_RULEBOOK_EFF_family;
    +        rule_family_data *rfd = CREATE(rule_family_data);
    +        rfd->not_in_rulebook = FALSE;
    +        id->family_specific_data = STORE_POINTER_rule_family_data(rfd);
    +        if (<<r>>) {
    +            wording RW = GET_RW(<rir-preamble>, 2);
    +            if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE);
    +        }
    +    }
    +}
    +
    +int RuleFamily::is(imperative_defn *id) {
    +    if ((id->family == RULE_IN_RULEBOOK_EFF_family) ||
    +        (id->family == RULE_NOT_IN_RULEBOOK_EFF_family)) return TRUE;
    +    return FALSE;
    +}
    +
    +int RuleFamily::not_in_rulebook(imperative_defn *id) {
    +    if (RuleFamily::is(id)) {
    +        rule_family_data *rfd = RETRIEVE_POINTER_rule_family_data(id->family_specific_data);
    +        return rfd->not_in_rulebook;
    +    }
    +    return FALSE;
    +}
    +
    +

    §5.

    + +
    +void RuleFamily::rir_new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) {
    +    Rules::request_automatic_placement(
    +        Phrases::Usage::to_rule(&(new_ph->usage_data), id));
    +    new_ph->compile_with_run_time_debugging = TRUE;
    +}
    +
    +

    §6.

    + +
    +void RuleFamily::rnir_new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) {
    +    Phrases::Usage::to_rule(&(new_ph->usage_data), id);
    +    new_ph->compile_with_run_time_debugging = TRUE;
    +}
    +
    + + +
    + + + diff --git a/docs/assertions-module/5-tpf.html b/docs/assertions-module/5-tpf.html new file mode 100644 index 000000000..d0e34ebbc --- /dev/null +++ b/docs/assertions-module/5-tpf.html @@ -0,0 +1,257 @@ + + + + To Phrase Family + + + + + + + + + + + + + + + + + + + +
    + + +

    Imperative definitions of "To..." phrases.

    + +

    §1.

    + +
    +imperative_defn_family *TO_PHRASE_EFF_family = NULL;  "To award (some - number) points: ..."
    +
    +typedef struct to_family_data {
    +    struct wording pattern;
    +    struct wording constant_name;
    +    int explicit_name_used_in_maths;
    +    struct wording explicit_name_for_inverse;
    +    CLASS_DEFINITION
    +} to_family_data;
    +
    +
    • The structure to_family_data is private to this section.
    +

    §2.

    + +
    +void ToPhraseFamily::create_family(void) {
    +    TO_PHRASE_EFF_family            = ImperativeDefinitions::new_family(I"TO_PHRASE_EFF");
    +    METHOD_ADD(TO_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, ToPhraseFamily::claim);
    +    METHOD_ADD(TO_PHRASE_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, ToPhraseFamily::new_phrase);
    +}
    +
    +

    §3.

    + +
    +<to-phrase-preamble> ::=
    +    {to} |                                                    ==> Issue PM_BareTo problem3.1
    +    to ... ( called ... ) |                                   ==> Issue PM_DontCallPhrasesWithCalled problem3.2
    +    {to ...} ( this is the {### function} inverse to ### ) |  ==> { 1, - }
    +    {to ...} ( this is the {### function} ) |                 ==> { 2, - }
    +    {to ...} ( this is ... ) |                                ==> { 3, - }
    +    {to ...}                                                  ==> { 4, - }
    +
    + +

    §3.1. Issue PM_BareTo problem3.1 = +

    + +
    +    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo),
    +        "'to' what? No name is given",
    +        "which means that this would not define a new phrase.");
    +    ==> { 4, - };
    +
    +
    • This code is used in §3.
    +

    §3.2. Issue PM_DontCallPhrasesWithCalled problem3.2 = +

    + +
    +    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled),
    +        "phrases aren't named using 'called'",
    +        "and instead use 'this is...'. For example, 'To salute (called saluting)' "
    +        "isn't allowed, but 'To salute (this is saluting)' is.");
    +    ==> { 4, - };
    +
    +
    • This code is used in §3.
    +

    §4.

    + +
    +int no_now_phrases = 0;
    +
    +void ToPhraseFamily::claim(imperative_defn_family *self, imperative_defn *id) {
    +    wording W = Node::get_text(id->at);
    +    if (<to-phrase-preamble>(W)) {
    +        id->family = TO_PHRASE_EFF_family;
    +        to_family_data *tfd = CREATE(to_family_data);
    +        tfd->constant_name = EMPTY_WORDING;
    +        tfd->explicit_name_used_in_maths = FALSE;
    +        tfd->explicit_name_for_inverse = EMPTY_WORDING;
    +        id->family_specific_data = STORE_POINTER_to_family_data(tfd);
    +        int form = <<r>>;
    +        if (form != 4) {
    +            wording RW = GET_RW(<to-phrase-preamble>, 2);
    +            if (<s-type-expression>(RW)) {
    +                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated),
    +                    "that name for this new phrase is not allowed",
    +                    "because it already has a meaning.");
    +            } else {
    +                tfd->constant_name = RW;
    +                if (Phrases::Constants::parse(RW) == NULL)
    +                    Phrases::Constants::create(RW, GET_RW(<to-phrase-preamble>, 1));
    +            }
    +            if ((form == 1) || (form == 2)) tfd->explicit_name_used_in_maths = TRUE;
    +            if (form == 1) tfd->explicit_name_for_inverse = Wordings::first_word(GET_RW(<to-phrase-preamble>, 3));
    +        }
    +        tfd->pattern = GET_RW(<to-phrase-preamble>, 1);
    +    }
    +}
    +
    +

    §5. As a safety measure, to avoid ambiguities, Inform only allows one phrase +definition to begin with "now". It recognises such phrases as those whose +preambles match: +

    + +
    +<now-phrase-preamble> ::=
    +    to now ...
    +
    + +

    §6. In basic mode (only), the To phrase "to begin" acts as something like +main in a C-like language, so we need to take note of where it's defined: +

    + +
    +<begin-phrase-preamble> ::=
    +    to begin
    +
    + +

    §7.

    + +
    +void ToPhraseFamily::phud(imperative_defn *id, ph_usage_data *phud) {
    +    to_family_data *tfd = RETRIEVE_POINTER_to_family_data(id->family_specific_data);
    +    wording W = tfd->pattern;
    +    phud->rule_preamble = W;
    +
    +    if (Wordings::nonempty(tfd->constant_name)) The preamble parses to a named To phrase7.1;
    +    if (<now-phrase-preamble>(W)) {
    +        if (no_now_phrases++ == 1) {
    +            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow),
    +                "creating new variants on 'now' is not allowed",
    +                "because 'now' plays a special role in the language. "
    +                "It has a wide-ranging ability to make a condition "
    +                "become immediately true. (To give it wider abilities, "
    +                "the idea is to create new relations.)");
    +        }
    +    }
    +    if (<begin-phrase-preamble>(W)) {
    +        phud->to_begin = TRUE;
    +    }
    +}
    +
    +

    §7.1. When we parse a named phrase in coarse mode, we need to make sure that +name is registered as a constant value; when we parse it again in fine +mode, we can get that value back again if we look it up by name. +

    + +

    The preamble parses to a named To phrase7.1 = +

    + +
    +    wording NW = tfd->constant_name;
    +
    +    constant_phrase *cphr = Phrases::Constants::parse(NW);
    +    if (Kinds::Behaviour::definite(cphr->cphr_kind) == FALSE) {
    +        phrase *ph = Phrases::Constants::as_phrase(cphr);
    +        if (ph) current_sentence = Phrases::declaration_node(ph);
    +        Problems::quote_source(1, Diagrams::new_UNPARSED_NOUN(Nouns::nominative_singular(cphr->name)));
    +        Problems::quote_wording(2, Nouns::nominative_singular(cphr->name));
    +        StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric));
    +        Problems::issue_problem_segment(
    +            "I can't allow %1, because the phrase it gives a name to "
    +            "is generic, that is, it has a kind which is too vague. "
    +            "That means there isn't any single phrase which '%2' "
    +            "could refer to - there would have to be different versions "
    +            "for every setting where it might be needed, and we can't "
    +            "predict in advance which one '%2' might need to be.");
    +        Problems::issue_problem_end();
    +        LOG("CPHR failed at %d, %u\n", cphr->allocation_id, cphr->cphr_kind);
    +    }
    +    phud->explicit_name_used_in_maths = tfd->explicit_name_used_in_maths;
    +    phud->explicit_name_for_inverse = tfd->explicit_name_for_inverse;
    +    phud->explicit_name_used_in_maths = tfd->explicit_name_used_in_maths;
    +    phud->constant_phrase_holder = cphr;
    +
    +
    • This code is used in §7.
    +

    §8.

    + +
    +void ToPhraseFamily::new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) {
    +    if (new_ph->usage_data.to_begin) new_ph->to_begin = TRUE;
    +    Routines::ToPhrases::new(new_ph);
    +}
    +
    + + +
    + + + diff --git a/docs/assertions-module/5-eqt.html b/docs/assertions-module/6-eqt.html similarity index 96% rename from docs/assertions-module/5-eqt.html rename to docs/assertions-module/6-eqt.html index 3358ff31e..43d7ddb49 100644 --- a/docs/assertions-module/5-eqt.html +++ b/docs/assertions-module/6-eqt.html @@ -84,10 +84,10 @@ function togglePopup(material_id) {
    +

    To manage and compile equations, which relate numerical quantities.

    -
    +

    §1. As with tables, equations are detected early on in Inform's run but not parsed for their contents until later, so we store several word ranges. @@ -135,7 +135,7 @@ instance has its own equation CLASS_DEFINITION } equation_symbol;

    -
    • The structure equation_symbol is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/tc, 5/tbl, 6/tcp, 6/cu and here.
    +
    • The structure equation_symbol is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/adf, 5/tpf, 6/tc, 6/tbl, 7/tcp, 7/cu and here.

    §3. In addition, there are some standing symbols used by all equations: the constant "pi", for example. They're stored in this linked list:

    @@ -217,7 +217,7 @@ value pi. equation {<cardinal-number>} - ... | ==> { 3, - } equation {<cardinal-number>} | ==> { 1, - } equation - ... | ==> { 2, - } - equation *** ==> Issue PM_EquationMisnumbered problem8.3 + equation *** ==> Issue PM_EquationMisnumbered problem8.3

    §8.1. The above catches all of the named expressions written out in the @@ -236,10 +236,10 @@ either case, an equation begins here:

     equation *Equations::new_at(parse_node *p, int anonymous) {
         wording W = Node::get_text(p);
    -    return Equations::new(W, anonymous);
    +    return Equations::new(W, anonymous);
     }
     
    -equation *Equations::new(wording W, int anonymous) {
    +equation *Equations::new(wording W, int anonymous) {
         equation *eqn;
         LOOP_OVER(eqn, equation)
             if (eqn->equation_created_at == current_sentence)
    @@ -257,11 +257,11 @@ either case, an equation begins here:
     
         wording NO = EMPTY_WORDING, NA = EMPTY_WORDING;
         if (anonymous == FALSE) {
    -        Parse the equation's number and/or name8.1.1;
    -        Register any names for this equation8.1.3;
    +        Parse the equation's number and/or name8.1.1;
    +        Register any names for this equation8.1.3;
             if (<equation-where>(W)) {
                 W = GET_RW(<equation-where>, 1);
    -            Equations::set_wherewithal(eqn, GET_RW(<equation-where>, 2));
    +            Equations::set_wherewithal(eqn, GET_RW(<equation-where>, 2));
             }
         }
         eqn->equation_no_text = NO;
    @@ -297,7 +297,7 @@ We know that this begins with the word "equation", or we wouldn't be here
             "Newton's Second Law', or 'Equation 41 - Coulomb's Law'.");
         ==> { 0, - };
     
    -
    • This code is used in §8.
    +
    • This code is used in §8.

    §8.1.1. Parse the equation's number and/or name8.1.1 =

    @@ -315,7 +315,7 @@ We know that this begins with the word "equation", or we wouldn't be here } } else internal_error("malformed equation sentence"); -
    • This code is used in §8.1.
    +
    • This code is used in §8.1.

    §8.1.2. An equation can be referred to by its number, or by its name. Thus

    @@ -370,7 +370,7 @@ We know that this begins with the word "equation", or we wouldn't be here } } -
    • This code is used in §8.1.
    +
    • This code is used in §8.1.

    §9. A "where" clause following an equation defines its symbols, as we shall see. That can be detected in the above parsing process where the equation is displayed, but for anonymous equations occurring inline, the S-parser @@ -378,7 +378,7 @@ has to discover it; and the S-parser then calls this routine:

    -void Equations::set_wherewithal(equation *eqn, wording W) {
    +void Equations::set_wherewithal(equation *eqn, wording W) {
         eqn->where_text = W;
     }
     
    @@ -391,7 +391,7 @@ source text: equation *eqn; LOOP_OVER(eqn, equation) { current_sentence = eqn->equation_created_at; - Equations::examine(eqn); + Equations::examine(eqn); } } @@ -403,15 +403,15 @@ then type-checking it.

    -void Equations::examine(equation *eqn) {
    +void Equations::examine(equation *eqn) {
         if (eqn->examined_already) return;
         eqn->examined_already = TRUE;
    -    if (Equations::eqn_declare_symbols(eqn) == FALSE) return;
    -    Equations::eqn_declare_standard_symbols();
    -    eqn->parsed_equation = Equations::eqn_parse(eqn);
    +    if (Equations::eqn_declare_symbols(eqn) == FALSE) return;
    +    Equations::eqn_declare_standard_symbols();
    +    eqn->parsed_equation = Equations::eqn_parse(eqn);
         if (eqn->parsed_equation == NULL) return;
    -    if (Equations::eqn_typecheck(eqn) == FALSE)
    -        Equations::log_equation_node(eqn->parsed_equation);
    +    if (Equations::eqn_typecheck(eqn) == FALSE)
    +        Equations::log_equation_node(eqn->parsed_equation);
     }
     

    §12. Declaring symbols. Equations are allowed to end with a "where..." clause, explaining what @@ -436,9 +436,9 @@ is expected to declare every symbol occurring in it.

    -int Equations::eqn_declare_symbols(equation *eqn) {
    +int Equations::eqn_declare_symbols(equation *eqn) {
         if (Wordings::empty(eqn->where_text)) return TRUE;
    -    int result = Equations::eqn_declare_variables_inner(eqn, eqn->where_text, FALSE);
    +    int result = Equations::eqn_declare_variables_inner(eqn, eqn->where_text, FALSE);
         int changed = TRUE;
         while (changed) {
             changed = FALSE;
    @@ -502,7 +502,7 @@ mass, too.
     
     
     <equation-where-list> ::=
    -    ... |                                                   ==> Match only when looking ahead15.1
    +    ... |                                                   ==> Match only when looking ahead15.1
         <equation-where-setting-entry> <equation-where-tail> |  ==> { 0, - }
         <equation-where-setting-entry>                          ==> { 0, - }
     
    @@ -512,21 +512,21 @@ mass, too.
     
     <equation-where-setting-entry> ::=
         ...  |                                ==> { lookahead }
    -    <equation-where-setting>              ==> Declare an equation variable15.2
    +    <equation-where-setting>              ==> Declare an equation variable15.2
     
     <equation-where-setting> ::=
         <equation-symbol> is/are <k-kind> |   ==> { EQW_IDENTIFIES_KIND, RP[2] }; eq_symbol_wn = R[1];
         <equation-symbol> is/are <s-value> |  ==> { EQW_IDENTIFIES_VALUE, RP[2] }; eq_symbol_wn = R[1];
    -    <equation-symbol> is/are ... |        ==> Issue PM_EquationSymbolNonValue problem15.3
    -    <equation-symbol> = <k-kind> |        ==> Issue PM_EquationSymbolEqualsKOV problem15.4
    +    <equation-symbol> is/are ... |        ==> Issue PM_EquationSymbolNonValue problem15.3
    +    <equation-symbol> = <k-kind> |        ==> Issue PM_EquationSymbolEqualsKOV problem15.4
         <equation-symbol> = <s-value> |       ==> { EQW_IDENTIFIES_VALUE, RP[2] }; eq_symbol_wn = R[1];
    -    <equation-symbol> = ... |             ==> Issue PM_EquationSymbolNonValue problem15.3
    +    <equation-symbol> = ... |             ==> Issue PM_EquationSymbolNonValue problem15.3
         <equation-symbol>                     ==> { EQW_IDENTIFIES_NOTHING, NULL }; eq_symbol_wn = R[1];
     
     <equation-symbol> ::=
         <valid-equation-symbol> |             ==> { pass 1 }
    -    ### |                                 ==> Issue PM_EquationSymbolMalformed problem15.5
    -    ...                                   ==> Issue PM_EquationSymbolMisdeclared problem15.6
    +    ### |                                 ==> Issue PM_EquationSymbolMalformed problem15.5
    +    ...                                   ==> Issue PM_EquationSymbolMisdeclared problem15.6
     

    §15.1. Match only when looking ahead15.1 = @@ -537,15 +537,15 @@ mass, too. ==> { 0, - }; return preform_lookahead_mode;

    -
    • This code is used in §15.
    +
    • This code is used in §15.

    §15.2. Declare an equation variable15.2 =

    -    Equations::eqn_dec_var(equation_being_declared, Wordings::one_word(eq_symbol_wn), R[1], RP[1]);
    +    Equations::eqn_dec_var(equation_being_declared, Wordings::one_word(eq_symbol_wn), R[1], RP[1]);
         ==> { -, - };
     
    -
    • This code is used in §15.
    +
    • This code is used in §15.

    §15.3. Issue PM_EquationSymbolNonValue problem15.3 =

    @@ -556,7 +556,7 @@ mass, too. "this has neither a kind of value nor an actual value."); ==> { EQW_IDENTIFIES_PROBLEM, - }; -
    • This code is used in §15 (twice).
    +
    • This code is used in §15 (twice).

    §15.4. Issue PM_EquationSymbolEqualsKOV problem15.4 =

    @@ -568,7 +568,7 @@ mass, too. "than an actual value."); ==> { EQW_IDENTIFIES_PROBLEM, - }; -
    • This code is used in §15.
    +
    • This code is used in §15.

    §15.5. Issue PM_EquationSymbolMalformed problem15.5 =

    @@ -582,7 +582,7 @@ mass, too. "this one is not."); ==> { -1, - }; -
    • This code is used in §15.
    +
    • This code is used in §15.

    §15.6. Issue PM_EquationSymbolMisdeclared problem15.6 =

    @@ -595,7 +595,7 @@ mass, too. "actual value."); ==> { -1, - }; -
    • This code is used in §15.
    +
    • This code is used in §15.

    §16.

    define EQW_IDENTIFIES_KIND 1
    @@ -604,7 +604,7 @@ mass, too.
     define EQW_IDENTIFIES_PROBLEM 4
     
    -int Equations::eqn_declare_variables_inner(equation *eqn, wording W, int temp) {
    +int Equations::eqn_declare_variables_inner(equation *eqn, wording W, int temp) {
         equation_being_declared = eqn;
         equation_declared_temporarily = temp;
         int pc = problem_count;
    @@ -613,16 +613,16 @@ mass, too.
         return TRUE;
     }
     
    -int Equations::eqn_dec_var(equation *eqn, wording W, int X, void *XP) {
    +int Equations::eqn_dec_var(equation *eqn, wording W, int X, void *XP) {
         parse_node *spec = NULL;
         kind *K = NULL;
         int temp = equation_declared_temporarily;
         if ((X == EQW_IDENTIFIES_PROBLEM) || (Wordings::empty(W))) return FALSE;
         if (X != EQW_IDENTIFIES_NOTHING)
    -        Find the actual value, or kind of value, which the symbol is to match16.1;
    +        Find the actual value, or kind of value, which the symbol is to match16.1;
     
    -    if (temp) Assign the given value to this symbol on a temporary basis16.2
    -    else Equations::eqn_add_symbol(eqn, W, K, spec);
    +    if (temp) Assign the given value to this symbol on a temporary basis16.2
    +    else Equations::eqn_add_symbol(eqn, W, K, spec);
     
         return TRUE;
     }
    @@ -673,7 +673,7 @@ still using it in equations:
             return FALSE;
         }
     
    -
    • This code is used in §16.
    +
    • This code is used in §16.

    §16.2. At this point we know the user means the variable named at word wn to have the temporary value spec, and we have to identify that as one of the symbols: @@ -701,7 +701,7 @@ of the symbols: "This one doesn't seem to occur there."); return FALSE; -

    • This code is used in §16.
    +
    • This code is used in §16.

    §17. We won't want those temporary assignments hanging around, so once the hurly-burly is done, the following is called:

    @@ -738,8 +738,8 @@ be used. which calls the following for each current local variable in turn: void Equations::declare_local(equation *eqn, wording W, kind *K) { - if ((Equations::equation_symbol_legal(W)) && (Kinds::Behaviour::is_quasinumerical(K))) - Equations::eqn_add_symbol(eqn, W, K, NULL); + if ((Equations::equation_symbol_legal(W)) && (Kinds::Behaviour::is_quasinumerical(K))) + Equations::eqn_add_symbol(eqn, W, K, NULL); }

    §19. Next we add "e" and "pi". These are added last, so that any local @@ -747,7 +747,7 @@ declarations will trump them.

    -void Equations::eqn_declare_standard_symbols(void) {
    +void Equations::eqn_declare_standard_symbols(void) {
         if (standard_equation_symbols) return;
     
         wording TCW = Feeds::feed_C_string(L"e pi");
    @@ -755,14 +755,14 @@ declarations will trump them.
             wording V = Wordings::one_word(i);
             if (<s-type-expression>(V)) {
                 parse_node *spec = <<rp>>;
    -            Equations::eqn_add_symbol(NULL, V, K_real_number, spec);
    +            Equations::eqn_add_symbol(NULL, V, K_real_number, spec);
             }
         }
         phrase *ph;
         LOOP_OVER(ph, phrase) {
             wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
             if (Wordings::nonempty(W)) {
    -            equation_symbol *ev = Equations::eqn_add_symbol(NULL, W, K_real_number, NULL);
    +            equation_symbol *ev = Equations::eqn_add_symbol(NULL, W, K_real_number, NULL);
                 ev->function_notated = ph;
             }
         }
    @@ -773,7 +773,7 @@ actually declares symbols:
     

    -equation_symbol *Equations::eqn_add_symbol(equation *eqn, wording W, kind *K, parse_node *spec) {
    +equation_symbol *Equations::eqn_add_symbol(equation *eqn, wording W, kind *K, parse_node *spec) {
         W = Wordings::first_word(W);
         equation_symbol **list_head = &standard_equation_symbols;
         if (eqn) list_head = &(eqn->symbol_list);
    @@ -804,7 +804,7 @@ expression [A-Za-z]?{1,8}\d?{
     
     
     <valid-equation-symbol> internal {
    -    if (Equations::equation_symbol_legal(W)) {
    +    if (Equations::equation_symbol_legal(W)) {
             ==> { Wordings::first_wn(W), - };
             return TRUE;
         }
    @@ -816,7 +816,7 @@ expression [A-Za-z]?{1,8}\d?{
     

    -int Equations::equation_symbol_legal(wording W) {
    +int Equations::equation_symbol_legal(wording W) {
         if (Wordings::length(W) == 1) {
             wchar_t *p = Lexer::word_raw_text(Wordings::first_wn(W));
             int j, letters = 0, digits = 0, name_legal = TRUE;
    @@ -838,7 +838,7 @@ and examine them.
     

    -equation_node *Equations::enode_new(int t) {
    +equation_node *Equations::enode_new(int t) {
         equation_node *enode = CREATE(equation_node);
         enode->eqn_type = t;
         enode->eqn_operation = -1;
    @@ -859,20 +859,20 @@ equation. (The other kinds can be created using 
     
     
    -equation_node *Equations::enode_new_op(int op) {
    -    equation_node *enode = Equations::enode_new(OPERATION_EQN);
    +equation_node *Equations::enode_new_op(int op) {
    +    equation_node *enode = Equations::enode_new(OPERATION_EQN);
         enode->eqn_operation = op;
         return enode;
     }
     
    -equation_node *Equations::enode_new_symbol(equation_symbol *ev) {
    -    equation_node *enode = Equations::enode_new(SYMBOL_EQN);
    +equation_node *Equations::enode_new_symbol(equation_symbol *ev) {
    +    equation_node *enode = Equations::enode_new(SYMBOL_EQN);
         enode->leaf_symbol = ev;
         return enode;
     }
     
    -equation_node *Equations::enode_new_constant(parse_node *spec) {
    -    equation_node *enode = Equations::enode_new(CONSTANT_EQN);
    +equation_node *Equations::enode_new_constant(parse_node *spec) {
    +    equation_node *enode = Equations::enode_new(CONSTANT_EQN);
         enode->leaf_constant = spec;
         return enode;
     }
    @@ -882,8 +882,8 @@ watch shift-reduce parsers in action.
     

    -void Equations::log_equation_node(equation_node *tok) {
    -    Equations::log_equation_node_inner(tok, 0);
    +void Equations::log_equation_node(equation_node *tok) {
    +    Equations::log_equation_node_inner(tok, 0);
     }
     
     void Equations::log_equation_node_inner(equation_node *tok, int d) {
    @@ -918,7 +918,7 @@ watch shift-reduce parsers in action.
         LOG("\n");
         if (tok->eqn_type == OPERATION_EQN)
             for (int i=0; i<tok->enode_arity; i++)
    -            Equations::log_equation_node_inner(tok->enode_operands[i], d+1);
    +            Equations::log_equation_node_inner(tok->enode_operands[i], d+1);
     }
     

    §26. Tokenising equations. We break up the word range \((w_1, w_2)\) into tokens of equation matter. Word @@ -935,9 +935,9 @@ has to be issued, or else a pointer to the parsed tree if we succeed.

    define MAX_ENODES_IN_EXPRESSION 100
     
    -equation_node *Equations::eqn_parse(equation *eqn) {
    +equation_node *Equations::eqn_parse(equation *eqn) {
         wording W = eqn->equation_text;
    -    Equations::enode_sr_start();  start the shift-reduce parser
    +    Equations::enode_sr_start();  start the shift-reduce parser
     
         equation_node *previous_token = NULL;
         int enode_count = 0;  number of tokens shipped so far
    @@ -949,15 +949,15 @@ has to be issued, or else a pointer to the parsed tree if we succeed.
              we are now at character i in string p, while wn is the next word
     
             equation_node *token = NULL;
    -        Break off a token from the current position26.1;
    -        Issue the token to the shift-reduce parser26.2;
    +        Break off a token from the current position26.1;
    +        Issue the token to the shift-reduce parser26.2;
     
             previous_token = token;
             if (p[i] == 0) p = NULL;
         }
    -    if (Equations::enode_sr_token(eqn, Equations::enode_new(END_EQN)) == FALSE)
    -        Equation fails in the shift-reduce parser26.3;
    -    equation_node *result = Equations::enode_sr_result();
    +    if (Equations::enode_sr_token(eqn, Equations::enode_new(END_EQN)) == FALSE)
    +        Equation fails in the shift-reduce parser26.3;
    +    equation_node *result = Equations::enode_sr_result();
         if (bl != 0) {
             StandardProblems::equation_problem(_p_(BelievedImpossible), eqn, "",
                 "this seems to use brackets in a mismatched way, since there "
    @@ -975,11 +975,11 @@ has to be issued, or else a pointer to the parsed tree if we succeed.
     
     
         wchar_t c = p[i];
    -    if (Characters::isalpha(c)) Break off a symbol name as a token26.1.1
    -    else if (Characters::isdigit(c)) Break off a numeric constant as a token26.1.2
    -    else Break off an operator or a piece of punctuation as a token26.1.3;
    +    if (Characters::isalpha(c)) Break off a symbol name as a token26.1.1
    +    else if (Characters::isdigit(c)) Break off a numeric constant as a token26.1.2
    +    else Break off an operator or a piece of punctuation as a token26.1.3;
     
    -
    • This code is used in §26.
    +
    • This code is used in §26.

    §26.1.1. Note that symbols are identified by recognition: without knowing the identities of the symbols, the syntax alone wouldn't tell us how to break them. We can only break mc^2 as m followed by c^2 if we know that m and c are symbols, @@ -996,7 +996,7 @@ allow implicit multiplication.) for (j=0; (j<14) && (Characters::isalnum(p[i+j])) && (token == NULL); j++) PUT_TO(text_of_symbol, p[i+j]); for (equation_symbol *ev = standard_equation_symbols; ev; ev = ev->next) - Look for this symbol name26.1.1.1; + Look for this symbol name26.1.1.1; if (token == NULL) for (j=1; (j<15) && (Characters::isalnum(p[i+j-1])) && (token == NULL); j++) { copy the first j characters into a C string: @@ -1005,7 +1005,7 @@ allow implicit multiplication.) try to identify this as one of the declared symbols: equation_symbol *ev; for (ev = eqn->symbol_list; ev; ev = ev->next) - Look for this symbol name26.1.1.1; + Look for this symbol name26.1.1.1; } if (token == NULL) { StandardProblems::equation_problem_S(_p_(PM_EquationTokenUnrecognised), eqn, text_of_symbol, @@ -1016,18 +1016,18 @@ allow implicit multiplication.) } DISCARD_TEXT(text_of_symbol)

    - +

    §26.1.1.1. Look for this symbol name26.1.1.1 =

         if (Str::eq_wide_string(text_of_symbol, Lexer::word_raw_text(Wordings::first_wn(ev->name)))) {
    -        token = Equations::enode_new_symbol(ev);
    +        token = Equations::enode_new_symbol(ev);
             i += j;
             break;
         }
     
    - +

    §26.1.2. The following is reliable because a string of digits not starting with a 0 is always a valid number to Inform unless it overflows the virtual machine's capacity; and so is the number 0 itself. @@ -1045,7 +1045,7 @@ capacity; and so is the number 0 itself. } TEMPORARY_TEXT(text_of_number) - Copy the literal number into a C string, flanked by spaces26.1.2.1; + Copy the literal number into a C string, flanked by spaces26.1.2.1; now sneakily add this to the word stream, and let the S-parser read it: wording NW = Feeds::feed_text(text_of_number); DISCARD_TEXT(text_of_number) @@ -1060,9 +1060,9 @@ capacity; and so is the number 0 itself. } this can only go wrong if there was an overflow, and a problem will have been issued for that: if (Node::is(spec, CONSTANT_NT) == FALSE) return NULL; - token = Equations::enode_new_constant(spec); + token = Equations::enode_new_constant(spec);

    - +

    §26.1.2.1. Copy the literal number into a C string, flanked by spaces26.1.2.1 =

    @@ -1081,7 +1081,7 @@ capacity; and so is the number 0 itself. } PUT_TO(text_of_number, ' ');
    - +

    §26.1.3. Which leaves just the easiest case:

    @@ -1090,20 +1090,20 @@ capacity; and so is the number 0 itself.
         switch (c) {
    -        case '=': token = Equations::enode_new_op(EQUALS_OPERATION); break;
    -        case '+': token = Equations::enode_new_op(PLUS_OPERATION); break;
    +        case '=': token = Equations::enode_new_op(EQUALS_OPERATION); break;
    +        case '+': token = Equations::enode_new_op(PLUS_OPERATION); break;
             case '-':
                 if ((previous_token == NULL) ||
                     (previous_token->eqn_type == OPERATION_EQN) ||
                     (previous_token->eqn_type == OPEN_BRACKET_EQN))
    -                token = Equations::enode_new_op(UNARY_MINUS_OPERATION);
    +                token = Equations::enode_new_op(UNARY_MINUS_OPERATION);
                 else
    -                token = Equations::enode_new_op(MINUS_OPERATION); break;
    -        case '/': token = Equations::enode_new_op(DIVIDE_OPERATION); break;
    -        case '*': token = Equations::enode_new_op(TIMES_OPERATION); break;
    -        case '^': token = Equations::enode_new_op(POWER_OPERATION); break;
    -        case '(': token = Equations::enode_new(OPEN_BRACKET_EQN); bl++; break;
    -        case ')': token = Equations::enode_new(CLOSE_BRACKET_EQN); bl--; break;
    +                token = Equations::enode_new_op(MINUS_OPERATION); break;
    +        case '/': token = Equations::enode_new_op(DIVIDE_OPERATION); break;
    +        case '*': token = Equations::enode_new_op(TIMES_OPERATION); break;
    +        case '^': token = Equations::enode_new_op(POWER_OPERATION); break;
    +        case '(': token = Equations::enode_new(OPEN_BRACKET_EQN); bl++; break;
    +        case ')': token = Equations::enode_new(CLOSE_BRACKET_EQN); bl--; break;
             default: {
                 TEMPORARY_TEXT(symbol)
                 PUT_TO(symbol, (int) c);
    @@ -1117,7 +1117,7 @@ capacity; and so is the number 0 itself.
         }
         i++;
     
    - +

    §26.2. So now we have our next token, and are ready to ship it. But if we detect an implicit multiplication, for instance between m and c^2 in E=mc^2, we issue that as an IMPLICIT_TIMES_OPERATION enode in @@ -1128,18 +1128,18 @@ between; and in log pi

    -    if (Equations::application_is_implied(previous_token, token)) {
    -        if (Equations::enode_sr_token(eqn, Equations::enode_new_op(IMPLICIT_APPLICATION_OPERATION)) == FALSE)
    -            Equation fails in the shift-reduce parser26.3;
    +    if (Equations::application_is_implied(previous_token, token)) {
    +        if (Equations::enode_sr_token(eqn, Equations::enode_new_op(IMPLICIT_APPLICATION_OPERATION)) == FALSE)
    +            Equation fails in the shift-reduce parser26.3;
             enode_count++;
    -    } else if (Equations::multiplication_is_implied(previous_token, token)) {
    -        if (Equations::enode_sr_token(eqn, Equations::enode_new_op(IMPLICIT_TIMES_OPERATION)) == FALSE)
    -            Equation fails in the shift-reduce parser26.3;
    +    } else if (Equations::multiplication_is_implied(previous_token, token)) {
    +        if (Equations::enode_sr_token(eqn, Equations::enode_new_op(IMPLICIT_TIMES_OPERATION)) == FALSE)
    +            Equation fails in the shift-reduce parser26.3;
             enode_count++;
         }
     
    -    if (Equations::enode_sr_token(eqn, token) == FALSE)
    -        Equation fails in the shift-reduce parser26.3;
    +    if (Equations::enode_sr_token(eqn, token) == FALSE)
    +        Equation fails in the shift-reduce parser26.3;
         enode_count++;
         if (enode_count >= MAX_ENODES_IN_EXPRESSION - 2) {
             StandardProblems::equation_problem(_p_(PM_EquationTooComplex), eqn, "",
    @@ -1147,7 +1147,7 @@ between; and in log pi
             return NULL;
         }
     
    -
    • This code is used in §26.
    +
    • This code is used in §26.

    §26.3. In case any of the enode insertions fail. It's tricky to generate good error messages and recover well when an operator-precedence grammar fails to match in a parser like this, so we'll fall back on this: @@ -1162,12 +1162,12 @@ a parser like this, so we'll fall back on this: "mathematical formula."); return NULL;

    - +

    §27. Lastly, here is when multiplication is implied:

    -int Equations::multiplication_is_implied(equation_node *previous_token, equation_node *token) {
    +int Equations::multiplication_is_implied(equation_node *previous_token, equation_node *token) {
         int lt, rt;
         if ((token == NULL) || (previous_token == NULL)) return FALSE;
         lt = previous_token->eqn_type; rt = token->eqn_type;
    @@ -1181,7 +1181,7 @@ a parser like this, so we'll fall back on this:
     

    -int Equations::application_is_implied(equation_node *previous_token, equation_node *token) {
    +int Equations::application_is_implied(equation_node *previous_token, equation_node *token) {
         int lt, rt;
         if ((token == NULL) || (previous_token == NULL)) return FALSE;
         lt = previous_token->eqn_type; rt = token->eqn_type;
    @@ -1218,9 +1218,9 @@ entries, and \(N\) is bounded above by void Equations::log_sr_stacks(void) {
         int i;
         LOG("SR: ");
    -    for (i=0; i<SR_sp; i++) { LOG(" %d: ", i); Equations::log_equation_node(SR_stack[i]); }
    +    for (i=0; i<SR_sp; i++) { LOG(" %d: ", i); Equations::log_equation_node(SR_stack[i]); }
         LOG("EMITTER: ");
    -    for (i=0; i<emitter_sp; i++) { LOG(" %d: ", i); Equations::log_equation_node(emitter_stack[i]); }
    +    for (i=0; i<emitter_sp; i++) { LOG(" %d: ", i); Equations::log_equation_node(emitter_stack[i]); }
     }
     

    §30. The start and finish are as follows. At the start, the emitter stack is @@ -1231,8 +1231,8 @@ there will be two END_EQN

    -void Equations::enode_sr_start(void) {
    -    SR_stack[0] = Equations::enode_new(END_EQN);
    +void Equations::enode_sr_start(void) {
    +    SR_stack[0] = Equations::enode_new(END_EQN);
         SR_sp = 1;
         emitter_sp = 0;
     }
    @@ -1242,7 +1242,7 @@ node: the head of the tree we have grown to represent the expression.
     

    -equation_node *Equations::enode_sr_result(void) {
    +equation_node *Equations::enode_sr_result(void) {
         return emitter_stack[0];
     }
     
    @@ -1269,7 +1269,7 @@ addition problem on the SR-stack.

    -int Equations::enode_sr_token(equation *eqn, equation_node *tok) {
    +int Equations::enode_sr_token(equation *eqn, equation_node *tok) {
         int safety_cutout = 3*MAX_ENODES_IN_EXPRESSION;
     
         while (TRUE) {
    @@ -1277,10 +1277,10 @@ addition problem on the SR-stack.
     
             if ((SR_stack[SR_sp-1]->eqn_type == END_EQN) && (tok->eqn_type == END_EQN)) break;
     
    -        if ((Equations::enode_lt(SR_stack[SR_sp-1], tok)) || (Equations::enode_eq(SR_stack[SR_sp-1], tok)))
    -            Shift an enode onto the SR-stack32.1
    -        else if (Equations::enode_gt(SR_stack[SR_sp-1], tok))
    -            Reduce some enodes from the SR-stack to the emitter stack32.2
    +        if ((Equations::enode_lt(SR_stack[SR_sp-1], tok)) || (Equations::enode_eq(SR_stack[SR_sp-1], tok)))
    +            Shift an enode onto the SR-stack32.1
    +        else if (Equations::enode_gt(SR_stack[SR_sp-1], tok))
    +            Reduce some enodes from the SR-stack to the emitter stack32.2
             else return FALSE;
     
             if (safety_cutout-- < 0) internal_error("SR parser deadlocked");
    @@ -1301,7 +1301,7 @@ token to be sent.
         SR_stack[SR_sp++] = tok;
         return TRUE;
     
    -
    • This code is used in §32.
    +
    • This code is used in §32.

    §32.2. The ASU book is a little vague about what happens if there is an underflow here, I think because it's possible to set up the grammar such that an underflow cannot occur. But I can see no obvious proof that it will never @@ -1320,10 +1320,10 @@ is 1, not 0.

         do { if (SR_sp <= 1) return FALSE;
    -        if (Equations::enode_emit(SR_stack[--SR_sp]) == FALSE) return FALSE;
    -    } while ((SR_sp >= 1) && (Equations::enode_lt(SR_stack[SR_sp-1], SR_stack[SR_sp]) == FALSE));
    +        if (Equations::enode_emit(SR_stack[--SR_sp]) == FALSE) return FALSE;
    +    } while ((SR_sp >= 1) && (Equations::enode_lt(SR_stack[SR_sp-1], SR_stack[SR_sp]) == FALSE));
     
    -
    • This code is used in §32.
    +
    • This code is used in §32.

    §33. The key point is that if nodes arrive at the SR parser in their ordinary order of mathematical writing, then they "reduce" off the SR stack and onto the emitter stack in reverse Polish notation order. @@ -1333,7 +1333,7 @@ easy to build a tree from.

    -int Equations::enode_emit(equation_node *tok) {
    +int Equations::enode_emit(equation_node *tok) {
         switch (tok->eqn_type) {
             case SYMBOL_EQN: case CONSTANT_EQN:
                 emitter_stack[emitter_sp++] = tok;
    @@ -1375,18 +1375,18 @@ score \(g(T)\) if they appear on the right:
     

    -int Equations::enode_lt(equation_node *tok1, equation_node *tok2) {
    -    int f_left = Equations::f_function(tok1), g_right = Equations::g_function(tok2);
    +int Equations::enode_lt(equation_node *tok1, equation_node *tok2) {
    +    int f_left = Equations::f_function(tok1), g_right = Equations::g_function(tok2);
         if (f_left < g_right) return TRUE; return FALSE;
     }
     
    -int Equations::enode_eq(equation_node *tok1, equation_node *tok2) {
    -    int f_left = Equations::f_function(tok1), g_right = Equations::g_function(tok2);
    +int Equations::enode_eq(equation_node *tok1, equation_node *tok2) {
    +    int f_left = Equations::f_function(tok1), g_right = Equations::g_function(tok2);
         if (f_left == g_right) return TRUE; return FALSE;
     }
     
    -int Equations::enode_gt(equation_node *tok1, equation_node *tok2) {
    -    int f_left = Equations::f_function(tok1), g_right = Equations::g_function(tok2);
    +int Equations::enode_gt(equation_node *tok1, equation_node *tok2) {
    +    int f_left = Equations::f_function(tok1), g_right = Equations::g_function(tok2);
         if (f_left > g_right) return TRUE; return FALSE;
     }
     
    @@ -1404,7 +1404,7 @@ the same precedence as explicit multiplication), and is so that

    -int Equations::f_function(equation_node *tok) {
    +int Equations::f_function(equation_node *tok) {
         switch (tok->eqn_type) {
             case SYMBOL_EQN: case CONSTANT_EQN: return 16;
             case OPERATION_EQN:
    @@ -1429,7 +1429,7 @@ the same precedence as explicit multiplication), and is so that
     

    -int Equations::g_function(equation_node *tok) {
    +int Equations::g_function(equation_node *tok) {
         switch (tok->eqn_type) {
             case SYMBOL_EQN: case CONSTANT_EQN: return 15;
             case OPERATION_EQN:
    @@ -1456,15 +1456,15 @@ out first: we want the top node in the tree to be the unique 
    -int Equations::eqn_typecheck(equation *eqn) {
    -    switch (Equations::enode_count_equals(eqn->parsed_equation)) {
    +int Equations::eqn_typecheck(equation *eqn) {
    +    switch (Equations::enode_count_equals(eqn->parsed_equation)) {
             case 0:
                 StandardProblems::equation_problem(_p_(PM_EquationDoesntEquate), eqn, "",
                     "this equation doesn't seem to contain an equals sign, and "
                     "without '=' there is no equating anything with anything.");
                 return FALSE;
             case 1:
    -            if (Equations::enode_is_equals(eqn->parsed_equation) == FALSE) {
    +            if (Equations::enode_is_equals(eqn->parsed_equation) == FALSE) {
                     StandardProblems::equation_problem(_p_(PM_EquationEquatesBadly), eqn, "",
                         "the equals sign '=' here seems to be buried inside the "
                         "formula, not at the surface. For instance, 'F = ma' is "
    @@ -1480,24 +1480,24 @@ out first: we want the top node in the tree to be the unique             return FALSE;
         }
     
    -    return Equations::enode_typecheck(eqn, eqn->parsed_equation);
    +    return Equations::enode_typecheck(eqn, eqn->parsed_equation);
     }
     

    §38. A recursive count of instances down the tree from tok:

    -int Equations::enode_count_equals(equation_node *tok) {
    +int Equations::enode_count_equals(equation_node *tok) {
         int c = 0, i;
         if (tok) {
    -        if (Equations::enode_is_equals(tok)) c++;
    +        if (Equations::enode_is_equals(tok)) c++;
             for (i=0; i<tok->enode_arity; i++)
    -            c += Equations::enode_count_equals(tok->enode_operands[i]);
    +            c += Equations::enode_count_equals(tok->enode_operands[i]);
         }
         return c;
     }
     
    -int Equations::enode_is_equals(equation_node *tok) {
    +int Equations::enode_is_equals(equation_node *tok) {
         if (tok == NULL) return FALSE;
         if ((tok->eqn_type == OPERATION_EQN) && (tok->eqn_operation == EQUALS_OPERATION))
             return TRUE;
    @@ -1513,13 +1513,13 @@ are obliged to issue a problem message.
     
     int float_terminal_nodes = FALSE;
     
    -int Equations::enode_typecheck(equation *eqn, equation_node *tok) {
    +int Equations::enode_typecheck(equation *eqn, equation_node *tok) {
         int result = TRUE;
         if (tok == NULL) return result;
         LOG_INDENT;
         int i;
         for (i=0; i<tok->enode_arity; i++)
    -        if (Equations::enode_typecheck(eqn, tok->enode_operands[i]) == FALSE)
    +        if (Equations::enode_typecheck(eqn, tok->enode_operands[i]) == FALSE)
                 result = FALSE;
         if (result) {
             switch (tok->eqn_type) {
    @@ -1537,20 +1537,20 @@ are obliged to issue a problem message.
                     break;
                 case OPERATION_EQN:
                     if (tok->eqn_operation == EQUALS_OPERATION)
    -                    Typecheck the set-equals node at the top level39.1
    +                    Typecheck the set-equals node at the top level39.1
                     else if (tok->eqn_operation == POWER_OPERATION)
    -                    Typecheck a raise-to-integer-power node39.2
    +                    Typecheck a raise-to-integer-power node39.2
                     else if (tok->eqn_operation == IMPLICIT_APPLICATION_OPERATION)
    -                    Typecheck a function application node39.3
    +                    Typecheck a function application node39.3
                     else
    -                    Typecheck a general operation node39.4;
    +                    Typecheck a general operation node39.4;
                     break;
                 default: internal_error("forbidden enode found in parsed equation");
             }
         }
         tok->gK_after = tok->gK_before;
         if ((float_terminal_nodes) && (tok->enode_arity == FALSE))
    -        Equations::promote_subequation(eqn, tok, FALSE);
    +        Equations::promote_subequation(eqn, tok, FALSE);
         LOG_OUTDENT;
         return result;
     }
    @@ -1578,12 +1578,12 @@ integers to reals.
         int lf = Kinds::FloatingPoint::is_real(tok->enode_operands[0]->gK_after);
         int rf = Kinds::FloatingPoint::is_real(tok->enode_operands[1]->gK_after);
         if ((lf == TRUE) && (rf == FALSE))
    -        Equations::promote_subequation(eqn, tok->enode_operands[1], TRUE);
    +        Equations::promote_subequation(eqn, tok->enode_operands[1], TRUE);
         if ((lf == FALSE) && (rf == TRUE))
    -        Equations::demote_subequation(eqn, tok->enode_operands[1]);
    +        Equations::demote_subequation(eqn, tok->enode_operands[1]);
         tok->gK_before = tok->enode_operands[0]->gK_after;
     
    -
    • This code is used in §39.
    +
    • This code is used in §39.

    §39.2. The restriction on powers is needed to make it possible to know the dimensions of the result. If \(h\) is a length, \(h^2\) is an area but \(h^3\) is a volume; so if all we have is \(h^n\), and we don't know the value of \(n\), @@ -1600,18 +1600,18 @@ we're unable to see what equations \(h^n\) can appear in. if (Kinds::Dimensions::dimensionless(Kinds::FloatingPoint::underlying(base->gK_after))) { tok->gK_before = base->gK_after; tok->gK_after = base->gK_after; - } else Take the dimensional power of the kind of the base39.2.1; + } else Take the dimensional power of the kind of the base39.2.1; int lf = Kinds::FloatingPoint::is_real(tok->enode_operands[0]->gK_after); int rf = Kinds::FloatingPoint::is_real(tok->enode_operands[1]->gK_after); if ((lf == TRUE) && (rf == FALSE)) - Equations::promote_subequation(eqn, tok->enode_operands[1], FALSE); + Equations::promote_subequation(eqn, tok->enode_operands[1], FALSE); if ((lf == FALSE) && (rf == TRUE)) - Equations::promote_subequation(eqn, tok->enode_operands[0], FALSE); + Equations::promote_subequation(eqn, tok->enode_operands[0], FALSE); if ((Kinds::FloatingPoint::is_real(tok->gK_after) == FALSE) && ((lf) || (rf))) { tok->gK_before = Kinds::FloatingPoint::to_real(tok->gK_before); }

    -
    • This code is used in §39.
    +
    • This code is used in §39.

    §39.3. Typecheck a function application node39.3 =

    @@ -1637,9 +1637,9 @@ we're unable to see what equations \(h^n\) can appear in. tok->gK_before = Kinds::FloatingPoint::to_real(Kinds::FloatingPoint::new_gk(RK)); } int rf = Kinds::FloatingPoint::is_real(tok->enode_operands[1]->gK_after); - if (rf == FALSE) Equations::promote_subequation(eqn, tok->enode_operands[1], FALSE); + if (rf == FALSE) Equations::promote_subequation(eqn, tok->enode_operands[1], FALSE);
    -
    • This code is used in §39.
    +
    • This code is used in §39.

    §39.2.1. To work out the kind of \(b^n\), we use repeated multiplication or division of dimensions; if \(n=0\) then we have a dimensionless value, and choose "number" as the simplest possibility. @@ -1698,7 +1698,7 @@ of dimensions; if \(n=0\) then we have a dimensionless value, and choose Kinds::FloatingPoint::new_gk(K); }

    - +

    §39.4. The following is easy because it was the content of the whole "Dimensions.w" section:

    @@ -1728,18 +1728,18 @@ section: int lf = Kinds::FloatingPoint::is_real(tok->enode_operands[0]->gK_after); int rf = Kinds::FloatingPoint::is_real(tok->enode_operands[1]->gK_after); if ((lf == TRUE) && (rf == FALSE)) - Equations::promote_subequation(eqn, tok->enode_operands[1], FALSE); + Equations::promote_subequation(eqn, tok->enode_operands[1], FALSE); if ((lf == FALSE) && (rf == TRUE)) - Equations::promote_subequation(eqn, tok->enode_operands[0], FALSE); + Equations::promote_subequation(eqn, tok->enode_operands[0], FALSE); } if (K == NULL) { result = FALSE; tok->gK_before = Kinds::FloatingPoint::new_gk(K_value); - LOG("Failed at operation:\n"); Equations::log_equation_node(tok); + LOG("Failed at operation:\n"); Equations::log_equation_node(tok); if (Kinds::Dimensions::arithmetic_op_is_unary(tok->eqn_operation)) - Issue unary equation typechecking problem message39.4.1 + Issue unary equation typechecking problem message39.4.1 else - Issue binary equation typechecking problem message39.4.2; + Issue binary equation typechecking problem message39.4.2; } else if (real) tok->gK_before = Kinds::FloatingPoint::to_real( @@ -1748,7 +1748,7 @@ section: tok->gK_before = Kinds::FloatingPoint::new_gk(K);
    -
    • This code is used in §39.
    +
    • This code is used in §39.

    §39.4.1. Issue unary equation typechecking problem message39.4.1 =

    @@ -1776,7 +1776,7 @@ section: "good arithmetic."); Problems::issue_problem_end();
    - +

    §39.4.2. Issue binary equation typechecking problem message39.4.2 =

    @@ -1811,19 +1811,19 @@ section: "%6 %4 %7 %5, which is not good arithmetic."); Problems::issue_problem_end();
    - +
    -void Equations::promote_subequation(equation *eqn, equation_node *tok, int deeply) {
    +void Equations::promote_subequation(equation *eqn, equation_node *tok, int deeply) {
         if (tok == NULL) return;
         if (deeply) {
             float_terminal_nodes = TRUE;
    -        Equations::enode_typecheck(eqn, tok);
    +        Equations::enode_typecheck(eqn, tok);
             float_terminal_nodes = FALSE;
         }
         tok->gK_after = Kinds::FloatingPoint::to_real(tok->gK_after);
     }
     
    -void Equations::demote_subequation(equation *eqn, equation_node *tok) {
    +void Equations::demote_subequation(equation *eqn, equation_node *tok) {
         if (tok == NULL) return;
         tok->gK_after = Kinds::FloatingPoint::to_integer(tok->gK_after);
     }
    @@ -1847,9 +1847,9 @@ allows v to mak
     

    -int Equations::eqn_rearrange(equation *eqn, equation_symbol *to_solve) {
    +int Equations::eqn_rearrange(equation *eqn, equation_symbol *to_solve) {
         while (TRUE) {
    -        Swap the two sides if necessary so that v occurs only once and on the left41.1;
    +        Swap the two sides if necessary so that v occurs only once and on the left41.1;
     
             equation_node *old_LHS = eqn->parsed_equation->enode_operands[0];
             equation_node *old_RHS = eqn->parsed_equation->enode_operands[1];
    @@ -1857,9 +1857,9 @@ allows v to mak
             if (old_LHS->eqn_type != OPERATION_EQN) break;
     
             if (old_LHS->enode_arity == 2)
    -            Rearrange to move v upwards through this binary operator41.3
    +            Rearrange to move v upwards through this binary operator41.3
             else
    -            Rearrange to move v upwards through this unary operator41.4;
    +            Rearrange to move v upwards through this unary operator41.4;
         }
     
         return TRUE;
    @@ -1874,8 +1874,8 @@ have the same meaning, so we'll place 
    -    int lc = Equations::enode_count_var(eqn->parsed_equation->enode_operands[0], to_solve);
    -    int rc = Equations::enode_count_var(eqn->parsed_equation->enode_operands[1], to_solve);
    +    int lc = Equations::enode_count_var(eqn->parsed_equation->enode_operands[0], to_solve);
    +    int rc = Equations::enode_count_var(eqn->parsed_equation->enode_operands[1], to_solve);
     
         if (lc + rc != 1) return FALSE;
         if (lc == 0) {
    @@ -1884,7 +1884,7 @@ have the same meaning, so we'll place         eqn->parsed_equation->enode_operands[1] = swap;
         }
     
    -
    • This code is used in §41.
    +
    • This code is used in §41.

    §41.2. The main loop above terminates because on each iteration, either

    @@ -1955,12 +1955,12 @@ we fail property (i) but achieve property (ii). rearrange to move this operator int op = old_LHS->eqn_operation; if (op == POWER_OPERATION) - Rearrange to remove a power41.3.1 + Rearrange to remove a power41.3.1 else if (op == IMPLICIT_APPLICATION_OPERATION) - Rearrange using the inverse of function41.3.2 + Rearrange using the inverse of function41.3.2 else { int promote = 0, new_op = PLUS_OPERATION; - if (Equations::enode_count_var(old_LHS->enode_operands[1], to_solve) > 0) promote = 1; + if (Equations::enode_count_var(old_LHS->enode_operands[1], to_solve) > 0) promote = 1; switch (op) { case PLUS_OPERATION: new_op = MINUS_OPERATION; break; case MINUS_OPERATION: new_op = PLUS_OPERATION; promote = 0; break; @@ -1980,7 +1980,7 @@ we fail property (i) but achieve property (ii). old_LHS->eqn_operation = new_op; }
    -
    • This code is used in §41.
    +
    • This code is used in §41.

    §41.3.1. Solving \(x^v = y\) for \(v\) requires logs, which are not in our scheme; and solving \(v^n = y\) for non-constant \(n\) is no better. So in either case we surrender by returning FALSE. @@ -2041,9 +2041,9 @@ cube roots. old_LHS->enode_arity = 2; old_LHS->enode_operands[0] = old_RHS; equation_node *the_power = old_LHS->enode_operands[1]; - old_LHS->enode_operands[1] = Equations::enode_new_op(DIVIDE_OPERATION); + old_LHS->enode_operands[1] = Equations::enode_new_op(DIVIDE_OPERATION); old_LHS->enode_operands[1]->enode_arity = 2; - old_LHS->enode_operands[1]->enode_operands[0] = Equations::enode_new_constant( + old_LHS->enode_operands[1]->enode_operands[0] = Equations::enode_new_constant( Rvalues::from_int(1, EMPTY_WORDING)); old_LHS->enode_operands[1]->enode_operands[0]->gK_before = Kinds::FloatingPoint::new_gk(K_number); @@ -2061,7 +2061,7 @@ cube roots. RTKinds::notify_of_use(K_real_number); }

    - +

    §41.3.2. Here we have something like log x = y and want to rewrite as x = exp y, which is only possible if we have an inverse available for our function — in this case, exp being the inverse of log. Thus: @@ -2091,7 +2091,7 @@ in this case, exp equation_node *fnode = old_LHS->enode_operands[0]; if ((fnode->leaf_symbol == NULL) || (fnode->leaf_symbol->function_notated == NULL)) { - Equations::log_equation_node(fnode); + Equations::log_equation_node(fnode); internal_error("not a function being applied"); } phrase *f = fnode->leaf_symbol->function_notated; @@ -2111,7 +2111,7 @@ in this case, exp eqn->parsed_equation->enode_operands[1] = old_LHS; old_LHS->enode_operands[1] = old_RHS;

    - +

    §41.4. The unary operations are easy in a similar way — they only have one operand, so we always promote \(V\) and achieve property (i). A square root is rearranged as a square, and a cube root as a cube. (It's important that everything we do @@ -2146,27 +2146,27 @@ the other side; thus \(-V = R\) becomes \(V=-R\), and old_LHS->eqn_operation = TIMES_OPERATION; old_LHS->enode_arity = 2; old_LHS->enode_operands[0] = old_RHS; - old_LHS->enode_operands[1] = Equations::enode_new_op(TIMES_OPERATION); + old_LHS->enode_operands[1] = Equations::enode_new_op(TIMES_OPERATION); old_LHS->enode_operands[1]->enode_operands[0] = old_RHS; old_LHS->enode_operands[1]->enode_operands[1] = old_RHS; break; default: internal_error("unanticipated operator in rearrangement"); } -

    • This code is used in §41.
    +
    • This code is used in §41.

    §42. And that's the whole rearranger, except for the utility routine which counts instances of the magic variable v at or below a given point in the equation tree.

    -int Equations::enode_count_var(equation_node *tok, equation_symbol *to_solve) {
    +int Equations::enode_count_var(equation_node *tok, equation_symbol *to_solve) {
         int c = 0, i;
         if (tok == NULL) return c;
         if ((tok->eqn_type == SYMBOL_EQN) && (tok->leaf_symbol == to_solve))
             return 1;
         for (i=0; i<tok->enode_arity; i++)
    -        c += Equations::enode_count_var(tok->enode_operands[i], to_solve);
    +        c += Equations::enode_count_var(tok->enode_operands[i], to_solve);
         return c;
     }
     
    @@ -2181,18 +2181,18 @@ parse the equation, then rearrange to solve it for each variable in turn. E = GET_RW(<equation-where>, 1); WH = GET_RW(<equation-where>, 2); } - equation *eqn = Equations::new(E, TRUE); - Equations::set_wherewithal(eqn, WH); - Equations::examine(eqn); + equation *eqn = Equations::new(E, TRUE); + Equations::set_wherewithal(eqn, WH); + Equations::examine(eqn); InternalTests::begin_internal_reporting(); - Equations::log_equation_parsed(eqn); + Equations::log_equation_parsed(eqn); equation_symbol *ev; for (ev = eqn->symbol_list; ev; ev = ev->next) { - if (Equations::eqn_rearrange(eqn, ev) == FALSE) + if (Equations::eqn_rearrange(eqn, ev) == FALSE) LOG("Too hard to rearrange to solve for %W\n", ev->name); else { LOG("Rearranged to solve for %W:\n", ev->name); - Equations::log_equation_parsed(eqn); + Equations::log_equation_parsed(eqn); } } InternalTests::end_internal_reporting(); @@ -2206,9 +2206,9 @@ parse the equation, then rearrange to solve it for each variable in turn. LOG("{%W}", eqn->equation_text); } -void Equations::log_equation_parsed(equation *eqn) { +void Equations::log_equation_parsed(equation *eqn) { if (eqn == NULL) LOG("<null>\n"); - else Equations::log_equation_node(eqn->parsed_equation); + else Equations::log_equation_node(eqn->parsed_equation); } void Equations::index(OUTPUT_STREAM) { @@ -2237,7 +2237,7 @@ parse the equation, then rearrange to solve it for each variable in turn. } diff --git a/docs/assertions-module/5-tbl.html b/docs/assertions-module/6-tbl.html similarity index 97% rename from docs/assertions-module/5-tbl.html rename to docs/assertions-module/6-tbl.html index e96b20044..1b258d149 100644 --- a/docs/assertions-module/5-tbl.html +++ b/docs/assertions-module/6-tbl.html @@ -70,10 +70,10 @@ function togglePopup(material_id) {
    +

    To manage and compile tables, which are two-dimensional arrays with associative look-up facilities provided at run-time.

    -
    +

    §1. This is how a table is stored. Note that the limit on columns per table must not rise to 100 or beyond because that would break the system of table @@ -110,7 +110,7 @@ column ID numbers: see CLASS_DEFINITION } table; -

    +
    • The structure table is accessed in 3/dbtr, 6/tc and here.

    §2. For indexing purposes only:

    @@ -120,7 +120,7 @@ column ID numbers: see struct table_contribution *next; } table_contribution; -
    • The structure table_contribution is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/eqt, 6/tcp, 6/cu and here.
    +
    • The structure table_contribution is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/adf, 6/eqt, 7/tcp, 7/cu and here.

    §3. These are convenient during parsing.

    @@ -149,7 +149,7 @@ see below. table *t; LOOP_OVER(t, table) { current_sentence = t->table_created_at->source_table; - Tables::stock_table(t, phase); + Tables::stock_table(t, phase); } } } @@ -184,7 +184,7 @@ some of these fields have been properly filled in.

    -table *Tables::new_table_structure(parse_node *PN) {
    +table *Tables::new_table_structure(parse_node *PN) {
         table *t = CREATE(table);
         t->table_no_text = EMPTY_WORDING;
         t->table_name_text = EMPTY_WORDING;
    @@ -205,7 +205,7 @@ some of these fields have been properly filled in.
         t->no_columns = 0;
         t->table_created_at = NULL;
         RTTables::new_table(PN, t);
    -    Tables::add_table_contribution(t, current_sentence);
    +    Tables::add_table_contribution(t, current_sentence);
         return t;
     }
     
    @@ -213,7 +213,7 @@ some of these fields have been properly filled in.

    -void Tables::add_table_contribution(table *t, parse_node *src) {
    +void Tables::add_table_contribution(table *t, parse_node *src) {
         table_contribution *tc = CREATE(table_contribution);
         tc->source_table = src;
         tc->next = NULL;
    @@ -238,7 +238,7 @@ some of these fields have been properly filled in.
         return t->no_columns;
     }
     
    -int Tables::get_no_rows(table *t) {
    +int Tables::get_no_rows(table *t) {
         parse_node *PN; int c=0;
         for (PN=t->columns[0].entries->down; PN; PN=PN->next) c++;
         c += t->blank_rows;
    @@ -264,7 +264,7 @@ some of these fields have been properly filled in.
     kind *Tables::kind_of_ith_column(table *t, int i) {
         if ((i<0) || (i>=t->no_columns))
             internal_error("tcdt for column out of range");
    -    return Tables::Columns::get_kind(t->columns[i].column_identity);
    +    return Tables::Columns::get_kind(t->columns[i].column_identity);
     }
     

    §11. Oddball forms of naming: @@ -322,7 +322,7 @@ two forms in any case. table ... - ... | ==> { TABLE_HAS_NUMBER_AND_NAME, - } table ### | ==> { TABLE_HAS_ONLY_NUMBER, - } table of ... | ==> { TABLE_HAS_ONLY_NAME, - } - table ... ==> Issue PM_TableMisnamed problem14.1 + table ... ==> Issue PM_TableMisnamed problem14.1

    §14.1. Issue PM_TableMisnamed problem14.1 = @@ -337,7 +337,7 @@ two forms in any case. "Pepperland' is not."); ==> { TABLE_HAS_ONLY_NAME, - }; -

    • This code is used in §14.
    +
    • This code is used in §14.

    §15. The following is then used to register table names as constants. The idea is that "Table 12 - Chemical Elements" will be registered both as Table 12 and as Table of Chemical Elements. @@ -376,33 +376,33 @@ table and then destroy the temporary one made here. void Tables::create_table(parse_node *PN) { wording W = Node::get_text(PN); int connection = TABLE_IS_NEW; i.e., no connection with existing tables - table *t = Tables::new_table_structure(PN); + table *t = Tables::new_table_structure(PN); wording HW = Wordings::up_to(W, Wordings::last_word_of_formatted_text(W, FALSE)); - if (Wordings::length(HW) == 1) Reject this lexically malformed table declaration17.1; + if (Wordings::length(HW) == 1) Reject this lexically malformed table declaration17.1; t->headline_fragment = Diagrams::new_UNPARSED_NOUN(HW); RTTables::supply_table_wording(t, HW); current_sentence = t->headline_fragment; - Parse the table's header for a name and/or number, and connection to other tables17.2; - Require the table name not to tread on some other value17.3; + Parse the table's header for a name and/or number, and connection to other tables17.2; + Require the table name not to tread on some other value17.3; table *existing_table_with_same_name = NULL; - Find the first existing table with the same name, if any17.4; - if (connection != TABLE_IS_NEW) Require the previous table to exist17.5 - else Require the previous table not to exist17.6; + Find the first existing table with the same name, if any17.4; + if (connection != TABLE_IS_NEW) Require the previous table to exist17.5 + else Require the previous table not to exist17.6; if (connection == TABLE_IS_NEW) { - Register the names of the new table17.7; + Register the names of the new table17.7; LOGIF(TABLES, "Created: $B\n", t); } - Parse the table's footer for a number of blank rows17.8; + Parse the table's footer for a number of blank rows17.8; int row_count = 0; - Count out the rows and columns in the new table17.9; + Count out the rows and columns in the new table17.9; if (connection != TABLE_IS_NEW) - Act on the connection, possibly destroying the temporary table just made17.10; + Act on the connection, possibly destroying the temporary table just made17.10; }

    §17.1. Changes to the lexer mean that this shouldn't happen, but just in case: @@ -418,7 +418,7 @@ table and then destroy the temporary one made here. "the start of the table is too much."); return; -

    • This code is used in §17.
    +
    • This code is used in §17.

    §17.2. Parse the table's header for a name and/or number, and connection to other tables17.2 =

    @@ -440,7 +440,7 @@ table and then destroy the temporary one made here. break; } -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.3. Practical experience showed that the following restriction was wise:

    @@ -462,7 +462,7 @@ table and then destroy the temporary one made here. return; } -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.4. It's not as simple as it seems to decide when a new table headline refers back to a table which already exists — there are several ways we could play this. What we say is that if the new headline gives both name and number, @@ -509,7 +509,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: existing_table_with_same_name = t2; } -

    • This code is used in §17.
    +
    • This code is used in §17.

    §17.5. Require the previous table to exist17.5 =

    @@ -528,7 +528,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: return; } -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.6. Require the previous table not to exist17.6 =

    @@ -549,7 +549,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: return; } -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.7. Register the names of the new table17.7 =

    @@ -573,7 +573,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: TABLE_MC, Rvalues::from_table(t), Task::language_of_syntax()); } -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.8. Parse the table's footer for a number of blank rows17.8 =

    @@ -588,7 +588,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then: } } -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.9. Here's where we start building. The table's representation in the parse tree is currently very unhelpful: it's just one enormous sentence node with all the words in, headings and cells merged together. Instead of using this @@ -610,12 +610,12 @@ node for each column. Wordings::last_word_of_formatted_text(Wordings::new(pos, row_end), TRUE); LOGIF(TABLES, "Cell (%d, %d) is %W\n", row_count, col_count, Wordings::new(pos, cell_end)); - if (row_count == 0) This is a column-heading cell17.9.1 - else This is a data cell17.9.2; + if (row_count == 0) This is a column-heading cell17.9.1 + else This is a data cell17.9.2; col_count++; pos = cell_end + 1; } - Add implied blank data cells to fill out the row as needed17.9.3; + Add implied blank data cells to fill out the row as needed17.9.3; row_count++; } if ((row_count < 2) && (t->blank_rows == 0)) { @@ -624,7 +624,7 @@ node for each column. return; } -

    • This code is used in §17.
    +
    • This code is used in §17.

    §17.9.1. See "Table Columns" for the actual column creation: note that this makes a node in the parse tree representing the column's use within this table.

    @@ -646,12 +646,12 @@ a node in the parse tree representing the column's use within this table. } if (col_count < MAX_COLUMNS_PER_TABLE) { LOGIF(TABLES, "Creating col %d from '%W'\n", t->no_columns, CW); - t->columns[t->no_columns] = Tables::Columns::add_to_table(CW, t); + t->columns[t->no_columns] = Tables::Columns::add_to_table(CW, t); if (t->columns[t->no_columns].column_identity) i.e., no Problem occurred t->no_columns++; } - +

    §17.9.2. Each data cell becomes a node, and is added to the list under its column.

    @@ -677,7 +677,7 @@ a node in the parse tree representing the column's use within this table. SyntaxTree::graft(Task::syntax_tree(), cell, t->columns[col_count].entries); } - +

    §17.9.3. If a row finishes early, we pad it out with blanks.

    @@ -686,13 +686,13 @@ a node in the parse tree representing the column's use within this table.
         while (col_count < t->no_columns) {  which can only happen on data rows
    -        parse_node *cell = Tables::empty_cell_node();
    +        parse_node *cell = Tables::empty_cell_node();
             Annotations::write_int(cell, table_cell_unspecified_ANNOT, TRUE);
             SyntaxTree::graft(Task::syntax_tree(), cell, t->columns[col_count].entries);
             col_count++;
         }
     
    - +

    §17.10. All parsing is finished now.

    @@ -701,17 +701,17 @@ a node in the parse tree representing the column's use within this table.
         table *old_t = existing_table_with_same_name;
    -    Tables::add_table_contribution(old_t, t->headline_fragment);
    +    Tables::add_table_contribution(old_t, t->headline_fragment);
         int new_to_old[MAX_COLUMNS_PER_TABLE], old_to_new[MAX_COLUMNS_PER_TABLE];
    -    Build the column correspondence tables17.10.1;
    +    Build the column correspondence tables17.10.1;
         switch (connection) {
    -        case TABLE_IS_CONTINUED: Make the new part a continuation of the existing table17.10.2; break;
    -        case TABLE_IS_AMENDED: Make the new part an amendment of the existing table17.10.4; break;
    -        case TABLE_IS_REPLACED: Make the new part a replacement of the existing table17.10.3; break;
    +        case TABLE_IS_CONTINUED: Make the new part a continuation of the existing table17.10.2; break;
    +        case TABLE_IS_AMENDED: Make the new part an amendment of the existing table17.10.4; break;
    +        case TABLE_IS_REPLACED: Make the new part a replacement of the existing table17.10.3; break;
             default: internal_error("unknown form of table connection");
         }
     
    -
    • This code is used in §17.
    +
    • This code is used in §17.

    §17.10.1. We assume that columns in the new and old tables will be partial permutations of each other: for example the old might have columns "fish", "mammals", "birds" (index j running from 0 to 2) and the new "mammals", "reptiles", "fish", @@ -746,7 +746,7 @@ the other table at all. The result will be: Nouns::nominative_singular(t->columns[i].column_identity->name)); LOGIF(TABLES, "\n"); -

    +

    §17.10.2. We can carry out the continuation immediately, since it just means splicing the new table's rows onto the ends of the old table's columns.

    @@ -755,8 +755,8 @@ the new table's rows onto the ends of the old table's columns.

    -    Require that every column of the new table is also found in the old one17.10.2.2;
    -    Transfer blank rows of the new table to the old one17.10.2.1;
    +    Require that every column of the new table is also found in the old one17.10.2.2;
    +    Transfer blank rows of the new table to the old one17.10.2.1;
         if (row_count >= 2) {
             int j;
             for (j=0; j<old_t->no_columns; j++)
    @@ -767,7 +767,7 @@ the new table's rows onto the ends of the old table's columns.
                 } else {
                     int i;
                     for (i=1; i<row_count; i++) {  from 1 to omit the column headings
    -                    parse_node *blank = Tables::empty_cell_node();
    +                    parse_node *blank = Tables::empty_cell_node();
                         Annotations::write_int(blank, table_cell_unspecified_ANNOT, TRUE);
                         SyntaxTree::graft(Task::syntax_tree(), blank, old_t->columns[j].entries);
                     }
    @@ -775,7 +775,7 @@ the new table's rows onto the ends of the old table's columns.
         }
         DESTROY(t, table);
     
    - +

    §17.10.2.1. It's a little awkward to work out what the policy is if the original table wants a row for each man, and the continuation wants a row for each woman.

    @@ -803,7 +803,7 @@ wants a row for each man, and the continuation wants a row for each woman. old_t->blank_rows_for_each_text = t->blank_rows_for_each_text; } - +

    §17.10.3. And similarly for replacements...

    @@ -811,8 +811,8 @@ wants a row for each man, and the continuation wants a row for each woman.

    -    Require that every column of the old table is also found in the new one17.10.3.2;
    -    Copy blank rows of the new table to the old one17.10.3.1;
    +    Require that every column of the old table is also found in the new one17.10.3.2;
    +    Copy blank rows of the new table to the old one17.10.3.1;
         int j;
         for (j=0; j<old_t->no_columns; j++)
             if (old_to_new[j] >= 0)  and if this isn't true, we've issued a Problem already
    @@ -824,7 +824,7 @@ wants a row for each man, and the continuation wants a row for each woman.
                 old_t->columns[old_t->no_columns++] = t->columns[i];  old table must have room
         DESTROY(t, table);
     
    - +

    §17.10.3.1. ...but this is easier:

    @@ -836,7 +836,7 @@ wants a row for each man, and the continuation wants a row for each woman. old_t->blank_rows_text = t->blank_rows_text; old_t->blank_rows_for_each_text = t->blank_rows_for_each_text; - +

    §17.10.4. Amendments can't be done yet, because they depend on recognising values, and it's far too early in Inform's run to recognise constants. So we must postpone the work until later: note that we don't destroy the new table @@ -847,12 +847,12 @@ structure in this case.

    -    Require that the old and new tables have exactly matching columns17.10.4.1;
    +    Require that the old and new tables have exactly matching columns17.10.4.1;
         t->amendment_of = old_t;
         old_t->has_been_amended = TRUE;
         LOGIF(TABLES, "Amendment table created pro tem\n");
     
    - +

    §17.10.2.2. Here each new column must appear once in the old table, but the new table doesn't have to cover everything in the old table. (Blanks are used in continuation rows for columns not mentioned.) @@ -880,12 +880,12 @@ used in continuation rows for columns not mentioned.) "The table %1 won't work as a continuation, because it contains " "%3 not found in the original %2."); Problems::issue_problem_end(); - Display the old and new table column names17.10.2.2.1; + Display the old and new table column names17.10.2.2.1; DESTROY(t, table); return; } -

    +

    §17.10.3.2. Here each old column must appear once in the new table, but the new table is allowed to have extra columns. (This means the new table can be "wider" than the old one.) @@ -911,12 +911,12 @@ be "wider" than the old one.) "The table %1 won't work as a replacement, because it's missing " "%3 found in the original %2."); Problems::issue_problem_end(); - Display the old and new table column names17.10.2.2.1; + Display the old and new table column names17.10.2.2.1; DESTROY(t, table); return; } -

    +

    §17.10.4.1. We require this to be the identity permutation, i.e., exactly the same columns and in the same order.

    @@ -942,12 +942,12 @@ columns and in the same order. "make changes to rows in an existing table if the amended versions " "have the same columns and in the same order."); Problems::issue_problem_end(); - Display the old and new table column names17.10.2.2.1; + Display the old and new table column names17.10.2.2.1; DESTROY(t, table); return; } - +

    §17.10.2.2.1. Display the old and new table column names17.10.2.2.1 =

    @@ -981,11 +981,11 @@ columns and in the same order. } Problems::issue_problem_end(); - +

    §18.

    -parse_node *Tables::empty_cell_node(void) {
    +parse_node *Tables::empty_cell_node(void) {
         return Diagrams::new_PROPER_NOUN(EMPTY_WORDING);
     }
     
    @@ -998,7 +998,7 @@ things to be defined. So we exempt it from the checking below.

    -void Tables::stock_table(table *t, int phase) {
    +void Tables::stock_table(table *t, int phase) {
         LOGIF(TABLES, "Stocking $B (%d cols): phase %d\n", t, t->no_columns, phase);
         table_being_examined = t;
         int i = 0;
    @@ -1010,17 +1010,17 @@ things to be defined. So we exempt it from the checking below.
                     tcu->kind_name_entries = 0;
                     tcu->actual_constant_entries = 0;
                     tcu->observed_constant_cell = NULL;
    -                Tables::Columns::check_explicit_headings(t, i, tcu);
    +                Tables::Columns::check_explicit_headings(t, i, tcu);
                     break;
                 case 2: {
                     int c;
                     parse_node *PN;
                     for (PN = t->columns[i].entries->down, c = 1; PN; PN = PN->next, c++)
                         if (Wordings::nonempty(Node::get_text(PN)))
    -                        Tables::stock_table_cell(t, PN, c, i);
    +                        Tables::stock_table_cell(t, PN, c, i);
                     break;
                 }
    -            case 3: Tables::Columns::approve_kind(t, i, tcu);
    +            case 3: Tables::Columns::approve_kind(t, i, tcu);
                     break;
             }
         }
    @@ -1057,12 +1057,12 @@ us issue more contextual problem messages.
     
     <table-cell> ::=
         <table-cell-blank> |       ==> { BLANK_TABLE_ENTRY, Specifications::new_UNKNOWN(W) }
    -    <k-kind-articled> |        ==> Make anomalous entry for kind21.1
    +    <k-kind-articled> |        ==> Make anomalous entry for kind21.1
         <s-named-constant> |       ==> { NAMED_CONSTANT_ENTRY, RP[1] }
    -    <s-global-variable> |      ==> Issue PM_TablePlayerEntry or C20TableVariableEntry problem21.4
    +    <s-global-variable> |      ==> Issue PM_TablePlayerEntry or C20TableVariableEntry problem21.4
         <table-cell-value> |       ==> { pass 1 }
    -    <list-of-double-quotes> |  ==> Make anomalous entry for text to be understood21.2
    -    ...                        ==> Issue PM_TableUnknownEntry problem21.5
    +    <list-of-double-quotes> |  ==> Make anomalous entry for text to be understood21.2
    +    ...                        ==> Issue PM_TableUnknownEntry problem21.5
     
     <table-cell-blank> ::=
         --
    @@ -1070,8 +1070,8 @@ us issue more contextual problem messages.
     <table-cell-value> ::=
         the action of <s-constant-action> |  ==> { ACTION_TABLE_ENTRY, RP[1] }
         <s-constant-action> |                ==> { ACTION_TABLE_ENTRY, RP[1] }
    -    the action of <s-explicit-action> |  ==> Issue PM_NonconstantActionInTable problem21.3
    -    <s-explicit-action> |                ==> Issue PM_NonconstantActionInTable problem21.3
    +    the action of <s-explicit-action> |  ==> Issue PM_NonconstantActionInTable problem21.3
    +    <s-explicit-action> |                ==> Issue PM_NonconstantActionInTable problem21.3
         <instance-of-non-object> |           ==> { INSTANCE_TABLE_ENTRY, Rvalues::from_instance(RP[1]) }
         <s-type-expression>                  ==> { SPEC_TABLE_ENTRY, RP[1] }
     
    @@ -1088,7 +1088,7 @@ us issue more contextual problem messages.
         Node::set_text(new, W);
         ==> { KIND_TABLE_ENTRY, new };
     
    -
    • This code is used in §21.
    +
    • This code is used in §21.

    §21.2. Make anomalous entry for text to be understood21.2 =

    @@ -1097,7 +1097,7 @@ us issue more contextual problem messages. Node::set_text(new, W); ==> { TOPIC_TABLE_ENTRY, new };
    -
    • This code is used in §21.
    +
    • This code is used in §21.

    §21.3. Issue PM_NonconstantActionInTable problem21.3 =

    @@ -1118,7 +1118,7 @@ us issue more contextual problem messages. "is involved in some other way, try using 'yourself' instead."); ==> { PROBLEMATIC_TABLE_ENTRY, - }; -
    • This code is used in §21 (twice).
    +
    • This code is used in §21 (twice).

    §21.4. The message PM_TablePlayerEntry is so called because by far the commonest case of this is people writing "player" as a constant value in a column of people — it needs to be "yourself" instead, since "player" is a variable. @@ -1159,15 +1159,15 @@ people — it needs to be "yourself" instead, since "player" is a variable. } ==> { PROBLEMATIC_TABLE_ENTRY, - }; -

    • This code is used in §21.
    +
    • This code is used in §21.

    §21.5. Issue PM_TableUnknownEntry problem21.5 =

    -    Actually issue PM_TableUnknownEntry problem21.5.1;
    +    Actually issue PM_TableUnknownEntry problem21.5.1;
         ==> { PROBLEMATIC_TABLE_ENTRY, - };
     
    -
    • This code is used in §21.
    +
    • This code is used in §21.

    §21.5.1. (There are actually two ways this can happen, which is why it's set out like this.)

    @@ -1190,24 +1190,24 @@ people — it needs to be "yourself" instead, since "player" is a variable. "'a number') to show what sort of values will go into an otherwise blank " "row."); - +

    §22.

    -void Tables::stock_table_cell(table *t, parse_node *cell, int row_count, int col_count) {
    +void Tables::stock_table_cell(table *t, parse_node *cell, int row_count, int col_count) {
         current_sentence = cell;
         int topic_exception = FALSE;
         table_cell_node = cell;
         table_cell_row = row_count;
         table_cell_col = col_count;
     
    -    Parse the table cell and give it an evaluation as a noun22.1;
    +    Parse the table cell and give it an evaluation as a noun22.1;
         parse_node *evaluation = Node::get_evaluation(cell);
         LOGIF(TABLES, "Cell evaluates to: $P\n", evaluation);
     
    -    if (topic_exception == FALSE) Require the cell to evaluate to an actual constant22.2;
    +    if (topic_exception == FALSE) Require the cell to evaluate to an actual constant22.2;
     
    -    Tables::Columns::note_kind(t, col_count, &(t->columns[col_count]), cell,
    +    Tables::Columns::note_kind(t, col_count, &(t->columns[col_count]), cell,
             Specifications::to_kind(evaluation), FALSE);
     }
     
    @@ -1234,7 +1234,7 @@ people — it needs to be "yourself" instead, since "player" is a variable. case KIND_TABLE_ENTRY: Annotations::write_int(cell, table_cell_unspecified_ANNOT, TRUE); kind *K = Specifications::to_kind(spec); - Tables::Columns::note_kind(t, col_count, &(t->columns[col_count]), cell, + Tables::Columns::note_kind(t, col_count, &(t->columns[col_count]), cell, K, TRUE); return; case ACTION_TABLE_ENTRY: @@ -1248,7 +1248,7 @@ people — it needs to be "yourself" instead, since "player" is a variable. return; } -
    • This code is used in §22.
    +
    • This code is used in §22.

    §22.2. Require the cell to evaluate to an actual constant22.2 =

    @@ -1270,18 +1270,18 @@ people — it needs to be "yourself" instead, since "player" is a variable. } if (Node::is(evaluation, CONSTANT_NT) == FALSE) { LOG("Evaluation is $P\n", evaluation); - Actually issue PM_TableUnknownEntry problem21.5.1; + Actually issue PM_TableUnknownEntry problem21.5.1; } -
    • This code is used in §22.
    +
    • This code is used in §22.

    §23. Completing tables. Later on in Inform's run, just before compiling the tables, we call this:

     void Tables::complete(void) {
    -    Finally make any table amendments which have been called for23.1;
    -    Create blank rows described textually, if they were23.2;
    -    Create blank rows for each instance of a kind, if requested23.3;
    +    Finally make any table amendments which have been called for23.1;
    +    Create blank rows described textually, if they were23.2;
    +    Create blank rows for each instance of a kind, if requested23.3;
     }
     

    §23.1. For the actual code, see below. @@ -1294,9 +1294,9 @@ people — it needs to be "yourself" instead, since "player" is a variable. table *t; LOOP_OVER(t, table) if (t->amendment_of) - Tables::amend_table(t->amendment_of, t); + Tables::amend_table(t->amendment_of, t); -

    • This code is used in §23.
    +
    • This code is used in §23.

    §23.2. Create blank rows described textually, if they were23.2 =

    @@ -1325,7 +1325,7 @@ people — it needs to be "yourself" instead, since "player" is a variable. } } -
    • This code is used in §23.
    +
    • This code is used in §23.

    §23.3. Create blank rows for each instance of a kind, if requested23.3 =

    @@ -1349,7 +1349,7 @@ people — it needs to be "yourself" instead, since "player" is a variable. } } -
    • This code is used in §23.
    +
    • This code is used in §23.

    §24. Amending tables. Unlike continuations and replacements, table amendments depend on actual values written into the cells, which means they can't be performed early in the run. So for quite a long time two table structures exist: the "main table", the @@ -1365,14 +1365,14 @@ at a time:

    -void Tables::amend_table(table *main_table, table *amendments) {
    +void Tables::amend_table(table *main_table, table *amendments) {
         LOGIF(TABLES, "Amending table $B according to $B\n", main_table, amendments);
         parse_node *leftmost_amend_cell = NULL;
         int amend_row = 1, amendment_problem_opened = FALSE;
         for (amend_row = 1, leftmost_amend_cell = amendments->columns[0].entries->down;
             leftmost_amend_cell;
             amend_row++, leftmost_amend_cell = leftmost_amend_cell->next)
    -        Apply the amendment in this row to the main table24.1;
    +        Apply the amendment in this row to the main table24.1;
     }
     

    §24.1. The following is not so obvious. The amendment row is intended to replace a @@ -1406,21 +1406,21 @@ Eventually this should leave only a single row, and that's the winner.

         int col, matches_in_last_round = 0;
    -    Mark every row in the main table as a possible match24.1.1;
    +    Mark every row in the main table as a possible match24.1.1;
         for (col = 0; col < main_table->no_columns; col++) {
             parse_node *amend_cell;
    -        Set the amend-cell to this column's cell in the current amendment row24.1.2;
    +        Set the amend-cell to this column's cell in the current amendment row24.1.2;
             if (Annotations::read_int(amend_cell, table_cell_unspecified_ANNOT) == FALSE) {
                 int only_row_left = -1;
    -            Use the key value in the amend-cell to make an amendment24.1.3;
    +            Use the key value in the amend-cell to make an amendment24.1.3;
                 if (only_row_left >= 0) {
    -                Tables::splice_table_row(main_table, amendments, only_row_left, amend_row);
    +                Tables::splice_table_row(main_table, amendments, only_row_left, amend_row);
                     break;
                 }
             }
         }
     
    -
    • This code is used in §24.
    +
    • This code is used in §24.

    §24.1.1. We need one flag for each row in the main table; we do this with the "row amendable" annotation for the cell nodes in the first column. (There's nothing special about the first column, but it's guaranteed to exist, i.e., there is @@ -1439,7 +1439,7 @@ always at least one column.) matches_in_last_round++; } -

    +

    §24.1.2. Set the amend-cell to this column's cell in the current amendment row24.1.2 =

    @@ -1449,7 +1449,7 @@ always at least one column.) amend_cell && (i < amend_row); i++, amend_cell = amend_cell->next) ; if (amend_cell == NULL) internal_error("columns in amendments aren't equal in length"); - +

    §24.1.3. When we get here, then, we look at the key value in the amend-cell: suppose this is the number 17. If there's no row in the main table having 17 in this column, we're stuck. But if there are two or more, we allow the loop to move @@ -1470,15 +1470,15 @@ put another way, it can do no harm. internal_error("bad key in amendments table"); code above should make this impossible int matches = 0; - Find the number of possible-match rows in the main table with this key value in the same column24.1.3.1; - if (matches == 0) Issue problem to say that no row in the main table matches24.1.3.2; + Find the number of possible-match rows in the main table with this key value in the same column24.1.3.1; + if (matches == 0) Issue problem to say that no row in the main table matches24.1.3.2; if (matches > 1) { if (col < main_table->no_columns - 1) i.e., if we haven't reached the final column only_row_left = -1; because there's no single row left } matches_in_last_round = matches; -

    +

    §24.1.3.1. The loop below and its inner conditional look pretty forbidding, but they come down to this: loop through each row of the main table which is still a possible match. @@ -1500,10 +1500,10 @@ possible match. leftmost_cell = leftmost_cell->next) { parse_node *main_value = Node::get_evaluation(main_cell); if (Annotations::read_int(leftmost_cell, row_amendable_ANNOT)) - See if this possible-match row has the right key value in the new column24.1.3.1.1; + See if this possible-match row has the right key value in the new column24.1.3.1.1; } -

    +

    §24.1.3.1.1. We not only record the result if there's a match; we kick the row out of the possible-match set if there isn't.

    @@ -1521,7 +1521,7 @@ possible-match set if there isn't. Annotations::write_int(leftmost_cell, row_amendable_ANNOT, FALSE); } - +

    §24.1.3.2. That just leaves the problem message, a very subtle one which took a long time to find a clear wording for:

    @@ -1530,7 +1530,7 @@ time to find a clear wording for:

    -    Begin an amendment problem message24.1.3.2.1;
    +    Begin an amendment problem message24.1.3.2.1;
         int quoted_col = col + 1;  i.e., counting from 1, not 0
         Problems::quote_number(1, &amend_row);
         Problems::quote_number(2, &quoted_col);
    @@ -1554,7 +1554,7 @@ time to find a clear wording for:
         Problems::issue_problem_end();
         break;  to move on to the next row in the amendments
     
    - +

    §24.1.3.2.1. Begin an amendment problem message24.1.3.2.1 =

    @@ -1576,13 +1576,13 @@ time to find a clear wording for: Problems::issue_problem_end(); } - +

    §25. And, of course, the actual splicing of the amendment row in place of the original:

    -void Tables::splice_table_row(table *table_to, table *table_from, int row_to, int row_from) {
    +void Tables::splice_table_row(table *table_to, table *table_from, int row_to, int row_from) {
         int i;
         for (i=0; i<table_to->no_columns; i++) {
             parse_node *cell_to, *cell_from;
    @@ -1608,7 +1608,7 @@ Rules, which of course are always present. So these are hidden by default.
     
     void Tables::index(OUTPUT_STREAM) {
         HTML_OPEN("p");
    -    int m = Tables::index_tables_in(OUT, NULL, 0);
    +    int m = Tables::index_tables_in(OUT, NULL, 0);
         HTML_CLOSE("p");
         HTML_OPEN("p");
         Index::extra_link(OUT, 2);
    @@ -1617,7 +1617,7 @@ Rules, which of course are always present. So these are hidden by default.
         HTML_CLOSE("p");
         Index::extra_div_open(OUT, 2, 1, "e0e0e0");
         inform_extension *E; int efc = 0;
    -    LOOP_OVER(E, inform_extension) Tables::index_tables_in(OUT, E, efc++);
    +    LOOP_OVER(E, inform_extension) Tables::index_tables_in(OUT, E, efc++);
         Index::extra_div_close(OUT, "e0e0e0");
     }
     
    @@ -1626,9 +1626,9 @@ and does nothing at all if that number is 0.

    -int Tables::index_tables_in(OUTPUT_STREAM, inform_extension *E, int efc) {
    +int Tables::index_tables_in(OUTPUT_STREAM, inform_extension *E, int efc) {
         int tc = 0; table *t;
    -    LOOP_OVER(t, table) if (Tables::table_within(t, E)) tc++;
    +    LOOP_OVER(t, table) if (Tables::table_within(t, E)) tc++;
         if (tc > 0) {
             if (E) {
                 HTML_OPEN("p");
    @@ -1637,8 +1637,8 @@ and does nothing at all if that number is 0.
             }
             HTML::begin_plain_html_table(OUT);
             LOOP_OVER(t, table)
    -            if (Tables::table_within(t, E))
    -                Index this table27.1;
    +            if (Tables::table_within(t, E))
    +                Index this table27.1;
             HTML::end_html_table(OUT);
         }
         return tc;
    @@ -1660,7 +1660,7 @@ Helvetica-style lower case "x", but life is full of compromises.
             Index::link(OUT, Wordings::first_wn(Node::get_text(tc->source_table)));
         }
         HTML::next_html_column_spaced(OUT, 0);
    -    int rc = Tables::get_no_rows(t);
    +    int rc = Tables::get_no_rows(t);
         WRITE("<i>");
         HTML_OPEN_WITH("span", "class=\"smaller\"");
         if (t->first_column_by_definition) {
    @@ -1709,25 +1709,25 @@ Helvetica-style lower case "x", but life is full of compromises.
                 }
             } else if (t->first_column_by_definition) {
                 Kinds::Textual::write(OUT,
    -                Tables::Columns::get_kind(
    +                Tables::Columns::get_kind(
                         t->columns[col].column_identity));
                 WRITE(" property");
             } else {
                 WRITE("of ");
                 Kinds::Textual::write_plural(OUT,
    -                Tables::Columns::get_kind(
    +                Tables::Columns::get_kind(
                         t->columns[col].column_identity));
             }
             HTML::end_html_row(OUT);
         }
     
    -
    • This code is used in §27.
    +
    • This code is used in §27.

    §28. The following laboriously tests whether a table is defined within a given extension:

    -int Tables::table_within(table *t, inform_extension *E) {
    +int Tables::table_within(table *t, inform_extension *E) {
         if (t->amendment_of) return FALSE;
         heading *at_heading =
             Headings::of_wording(Node::get_text(t->table_created_at->source_table));
    @@ -1760,7 +1760,7 @@ given extension:
     }
     
    diff --git a/docs/assertions-module/5-tc.html b/docs/assertions-module/6-tc.html similarity index 96% rename from docs/assertions-module/5-tc.html rename to docs/assertions-module/6-tc.html index 217ca24eb..a3a432446 100644 --- a/docs/assertions-module/5-tc.html +++ b/docs/assertions-module/6-tc.html @@ -84,10 +84,10 @@ MathJax = {
    +

    To manage the named columns which appear in tables.

    -
    +

    §1. Tables are one of the most distinctive data structures of Inform. They imitate printed tables in books or scientific papers, and the data inside @@ -115,10 +115,10 @@ in both tables. CLASS_DEFINITION } table_column; -

    • The structure table_column is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 5/tbl, 5/eqt and here.
    +
    • The structure table_column is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 5/tpf, 6/tbl, 6/eqt and here.

    §2. The predicate calculus engine often finds conditions equivalent to "if A is a C listed in T", and we implement this as a binary predicate — see -Listed-In Relations. There is one such relation for each column, and +Listed-In Relations. There is one such relation for each column, and a pointer is stored in listed_in_predicate.

    @@ -141,12 +141,12 @@ of any existing column.

    -table_column *Tables::Columns::new_table_column(wording W) {
    +table_column *Tables::Columns::new_table_column(wording W) {
         table_column *tc = CREATE(table_column);
         tc->name = NULL;
         tc->kind_stored_in_column = NULL;
         tc->table_from_which_kind_inferred = NULL;
    -    tc->listed_in_predicate = Tables::Relations::make_listed_in_predicate(tc);
    +    tc->listed_in_predicate = Tables::Relations::make_listed_in_predicate(tc);
         if (Wordings::nonempty(W)) {  always happens unless recovering from a problem
             tc->name = Nouns::new_proper_noun(W, NEUTER_GENDER, ADD_TO_LEXICON_NTOPT,
                 TABLE_COLUMN_MC, Rvalues::from_table_column(tc),
    @@ -176,7 +176,7 @@ of entry in the column \(C\).
     

    -kind *Tables::Columns::get_kind(table_column *tc) {
    +kind *Tables::Columns::get_kind(table_column *tc) {
         return tc->kind_stored_in_column;
     }
     
    @@ -184,9 +184,9 @@ of entry in the column \(C\).
         return Kinds::unary_con(CON_table_column, tc->kind_stored_in_column);
     }
     
    -void Tables::Columns::set_kind(table_column *tc, table *t, kind *K) {
    +void Tables::Columns::set_kind(table_column *tc, table *t, kind *K) {
         if (Kinds::get_construct(K) == CON_description)
    -            Issue a problem message for a description heading5.1;
    +            Issue a problem message for a description heading5.1;
         if (Kinds::eq(tc->kind_stored_in_column, K)) {
             LOGIF(TABLES, "Table column $C continues to have kind %u, according to $B\n",
                 tc, K, t);
    @@ -197,8 +197,8 @@ of entry in the column \(C\).
         }
         tc->table_from_which_kind_inferred = t;
         if ((K_understanding) && (Kinds::eq(K, K_understanding)))
    -        Tables::Relations::supply_kind_for_listed_in_tc(tc->listed_in_predicate, K_snippet);
    -    else Tables::Relations::supply_kind_for_listed_in_tc(tc->listed_in_predicate, K);
    +        Tables::Relations::supply_kind_for_listed_in_tc(tc->listed_in_predicate, K_snippet);
    +    else Tables::Relations::supply_kind_for_listed_in_tc(tc->listed_in_predicate, K);
     }
     

    §5.1. Issue a problem message for a description heading5.1 = @@ -214,7 +214,7 @@ of entry in the column \(C\). "should be %4. But descriptions aren't allowed as table entries - tables " "have to hold values, not descriptions of values.");

    -
    • This code is used in §5.
    +
    • This code is used in §5.

    §6. Discovering columns. New TCs aren't declared ("Density is a table column."): they are discovered by looking through the column-heading lines of tables. Each one makes:

    @@ -231,15 +231,15 @@ by looking through the column-heading lines of tables. Each one makes: struct inter_name *tcu_iname; for the array holding this at run-time } table_column_usage; -
    • The structure table_column_usage is accessed in 3/dbtr, 5/tbl and here.
    +
    • The structure table_column_usage is accessed in 3/dbtr, 6/tbl and here.

    §7. Each piece of heading text is passed to the following routine in turn:

    -table_column_usage Tables::Columns::add_to_table(wording W, table *t) {
    +table_column_usage Tables::Columns::add_to_table(wording W, table *t) {
         wording EXPW = EMPTY_WORDING;
         table_column_usage tcu;
    -    table_column *tc = Tables::Columns::find_table_column(W, t, &EXPW);
    +    table_column *tc = Tables::Columns::find_table_column(W, t, &EXPW);
         for (int i=0; i<t->no_columns; i++)
             if (t->columns[i].column_identity == tc) {
                 Problems::quote_wording(4, W);
    @@ -283,17 +283,17 @@ what looks like text into grammar for parsing.
     
     
     <table-column-heading> ::=
    -    ( *** ) |                               ==> Issue PM_TableColumnBracketed problem9.3
    +    ( *** ) |                               ==> Issue PM_TableColumnBracketed problem9.3
         <s-table-column-name> ( {...} ) |       ==> { EXISTING_TC, RP[1] }
         <table-column-heading-bare> ( {...} ) | ==> { (R[1] == NEW_TC_PROBLEM)?R[1]:NEW_TC, - }
         <s-table-column-name> |                 ==> { EXISTING_TC_WITHOUT_KIND, RP[1] }
         <table-column-heading-bare>             ==> { pass 1 }
     
     <table-column-heading-bare> ::=
    -    <article> |                             ==> Issue PM_TableColumnArticle problem9.1
    +    <article> |                             ==> Issue PM_TableColumnArticle problem9.1
         {topic} |                               ==> { NEW_TC_TOPIC, - }
         {<property-name>} |                     ==> { NEW_TC_WITHOUT_KIND, - }
    -    {<s-constant-value>} |                  ==> Issue PM_TableColumnAlready problem9.2
    +    {<s-constant-value>} |                  ==> Issue PM_TableColumnAlready problem9.2
         ...                                     ==> { NEW_TC_WITHOUT_KIND, - }
     
    @@ -309,7 +309,7 @@ what looks like text into grammar for parsing. "would be quite awkward talking about the '%4 entry', for example.)"); ==> { NEW_TC_PROBLEM, - };
    -
    • This code is used in §9.
    +
    • This code is used in §9.

    §9.2. Issue PM_TableColumnAlready problem9.2 =

    @@ -320,7 +320,7 @@ what looks like text into grammar for parsing. "something else."); ==> { NEW_TC_PROBLEM, - }; -
    • This code is used in §9.
    +
    • This code is used in §9.

    §9.3. Issue PM_TableColumnBracketed problem9.3 =

    @@ -332,7 +332,7 @@ what looks like text into grammar for parsing. "entries, but forgot to put a name before the opening bracket.)"); ==> { NEW_TC_PROBLEM, - }; -
    • This code is used in §9.
    +
    • This code is used in §9.

    §10. When a column is found with a name not seen before — say, "merit points" — the following grammar is used to construct a proper noun to refer to this column; thus, "merit points column". @@ -349,7 +349,7 @@ text of any explicit kind declaration used within it.

    -table_column *Tables::Columns::find_table_column(wording W, table *t, wording *EXPW) {
    +table_column *Tables::Columns::find_table_column(wording W, table *t, wording *EXPW) {
         table_cell_node = Diagrams::new_PROPER_NOUN(W);
         table_cell_row = -1;
         table_cell_col = -1;
    @@ -372,9 +372,9 @@ text of any explicit kind declaration used within it.
             case NEW_TC_WITHOUT_KIND: break;
             case NEW_TC_PROBLEM: return NULL;
         }
    -    Make a try at identifying the any named kind, even though it probably won't work11.1;
    -    if (tc == NULL) Create a new table column with this name11.2;
    -    if (K) Tables::Columns::set_kind(tc, t, K);
    +    Make a try at identifying the any named kind, even though it probably won't work11.1;
    +    if (tc == NULL) Create a new table column with this name11.2;
    +    if (K) Tables::Columns::set_kind(tc, t, K);
         return tc;
     }
     
    @@ -392,33 +392,33 @@ hasn't been created yet; but we'll catch it later. K = <<rp>>; *EXPW = EMPTY_WORDING; } -
    • This code is used in §11.
    +
    • This code is used in §11.

    §11.2. Create a new table column with this name11.2 =

         W = GET_RW(<table-column-heading-bare>, 1);
    -    if (Assertions::Creator::vet_name(W)) tc = Tables::Columns::new_table_column(W);
    +    if (Assertions::Creator::vet_name(W)) tc = Tables::Columns::new_table_column(W);
         else return NULL;
     
    -
    • This code is used in §11.
    +
    • This code is used in §11.

    §12. Checking kind consistency. Well, and now it's later. First, the following is called on each usage of a column in turn:

    -void Tables::Columns::check_explicit_headings(table *t, int i, table_column_usage *tcu) {
    -    kind *K = Tables::Columns::get_kind(tcu->column_identity);
    +void Tables::Columns::check_explicit_headings(table *t, int i, table_column_usage *tcu) {
    +    kind *K = Tables::Columns::get_kind(tcu->column_identity);
         if (Wordings::nonempty(tcu->kind_declaration_text)) {
             kind *EK = NULL;
             if (<k-kind-articled>(tcu->kind_declaration_text)) {
                 EK = <<rp>>;
                 LOGIF(TABLES, "$B col %d '%W' claims %u\n", t, i, tcu->kind_declaration_text, EK);
                 if (K == NULL)
    -                Tables::Columns::set_kind(tcu->column_identity, t, EK);
    +                Tables::Columns::set_kind(tcu->column_identity, t, EK);
                 else if (!(Kinds::eq(K, EK)))
    -                Issue a problem message for a heading inconsistency12.1;
    -        } else Issue a problem message for an incomprehensible column heading12.2;
    +                Issue a problem message for a heading inconsistency12.1;
    +        } else Issue a problem message for an incomprehensible column heading12.2;
         } else {
             LOGIF(TABLES, "Column %d has no explicit kind named in $B\n", i, t);
         }
    @@ -438,7 +438,7 @@ column in turn:
             "entry there is %5. Inform doesn't allow this - the same column name always "
             "has to have the same kind of entry, whichever tables it appears in.");
     
    -
    • This code is used in §12.
    +
    • This code is used in §12.

    §12.2. Issue a problem message for an incomprehensible column heading12.2 =

    @@ -449,7 +449,7 @@ column in turn: "table column names when giving the kind of value which will be stored in " "the column. So 'poems (text)' is legal, but not 'poems (chiefly lyrical)'."); -
    • This code is used in §12.
    +
    • This code is used in §12.

    §13. Secondly, the actual entries are checked in turn, and their kinds passed to the following routine. Again, "topic" columns are a complication, since their kind is ostensibly K_understanding but the actual entries must be @@ -457,35 +457,35 @@ their kind is ostensibly K_un

    -void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu,
    +void Tables::Columns::note_kind(table *t, int i, table_column_usage *tcu,
         parse_node *cell, kind *K, int generic) {
         if (generic) {
             tcu->kind_name_entries++;
             if (tcu->observed_kind_cell == NULL) tcu->observed_kind_cell = cell;
             if (tcu->kind_name_entries == 2)
    -            Issue a problem for a second kind name in the column13.2
    +            Issue a problem for a second kind name in the column13.2
             else if (tcu->actual_constant_entries > 0)
    -            Issue a problem for a kind name lower in the column than a value13.1
    +            Issue a problem for a kind name lower in the column than a value13.1
             else {
    -            kind *CK = Tables::Columns::get_kind(tcu->column_identity);
    +            kind *CK = Tables::Columns::get_kind(tcu->column_identity);
                 if (CK == NULL) {
    -                Tables::Columns::set_kind(tcu->column_identity, t, K);
    +                Tables::Columns::set_kind(tcu->column_identity, t, K);
                     return;
                 } else if (Kinds::eq(K, CK) == FALSE)
    -                Issue a problem for an inconsistent kind for this column13.6;
    +                Issue a problem for an inconsistent kind for this column13.6;
             }
         } else {
             tcu->actual_constant_entries++;
             if (tcu->observed_constant_cell == NULL) tcu->observed_constant_cell = cell;
             if (tcu->kind_name_entries > 0)
    -            Issue a problem for a value lower in the column than a kind name13.3;
    +            Issue a problem for a value lower in the column than a kind name13.3;
         }
    -    kind *CK = Kinds::weaken(Tables::Columns::get_kind(tcu->column_identity), K_object);
    +    kind *CK = Kinds::weaken(Tables::Columns::get_kind(tcu->column_identity), K_object);
         K = Kinds::weaken(K, K_object);
         if ((global_pass_state.pass >= 2) && (CK) && (Kinds::Behaviour::definite(CK) == FALSE))
             CK = NULL;
         if (CK == NULL) {
    -        Tables::Columns::set_kind(tcu->column_identity, t, K);
    +        Tables::Columns::set_kind(tcu->column_identity, t, K);
         } else {
             int allow_refinement = TRUE;
             if ((K_understanding) && (Kinds::eq(CK, K_understanding))) {
    @@ -498,13 +498,13 @@ their kind is ostensibly K_un
                     Problems::quote_kind(4, K);
                     Problems::quote_kind(5, CK);
                     if (t == tcu->column_identity->table_from_which_kind_inferred)
    -                    Issue a problem for kind mismatch within column13.4
    +                    Issue a problem for kind mismatch within column13.4
                     else
    -                    Issue a problem for kind mismatch between columns of the same name13.5;
    +                    Issue a problem for kind mismatch between columns of the same name13.5;
                     allow_refinement = FALSE;
                 }
                 if (allow_refinement)
    -                Tables::Columns::set_kind(tcu->column_identity, t, max_K);
    +                Tables::Columns::set_kind(tcu->column_identity, t, max_K);
             }
         }
     }
    @@ -528,7 +528,7 @@ their kind is ostensibly K_un
             "myself, working it out from the actual values in the column, or you "
             "can put the kind in brackets after the column's name, at the top.)");
     
    -
    • This code is used in §13.
    +
    • This code is used in §13.

    §13.2. Issue a problem for a second kind name in the column13.2 =

    @@ -545,7 +545,7 @@ their kind is ostensibly K_un "tell me what might eventually go there - but only once; and " "this is the second time. (The first was %6.)"); -
    • This code is used in §13.
    +
    • This code is used in §13.

    §13.3. Issue a problem for a value lower in the column than a kind name13.3 =

    @@ -566,7 +566,7 @@ their kind is ostensibly K_un "kind by myself, working it out from the actual values in the column, or " "you can put the kind in brackets after the column's name, at the top.)"); -
    • This code is used in §13.
    +
    • This code is used in §13.

    §13.4. Issue a problem for kind mismatch within column13.4 =

    @@ -579,7 +579,7 @@ their kind is ostensibly K_un "In %1, column %6 (%2), the entry %3 (row %7) doesn't fit what I know " "about '%2' - it's %4, whereas I think every entry ought to be %5."); -
    • This code is used in §13.
    +
    • This code is used in §13.

    §13.5. Issue a problem for kind mismatch between columns of the same name13.5 =

    @@ -598,7 +598,7 @@ their kind is ostensibly K_un "if they have the same name. Compare the table %6, where there's also a " "column called '%7'."); -
    • This code is used in §13.
    +
    • This code is used in §13.

    §13.6. Relatedly, but visible only if there are no entries so that the above never happens:

    @@ -619,13 +619,13 @@ happens: "kind as each other, and this applies even to columns in different tables " "if they have the same name."); -
    • This code is used in §13.
    +
    • This code is used in §13.

    §14. Thirdly and lastly:

    -void Tables::Columns::approve_kind(table *t, int i, table_column_usage *tcu) {
    -    kind *K = Tables::Columns::get_kind(tcu->column_identity);
    +void Tables::Columns::approve_kind(table *t, int i, table_column_usage *tcu) {
    +    kind *K = Tables::Columns::get_kind(tcu->column_identity);
         LOGIF(TABLES, "Column %d '%W' has kind %u with data:\n$T",
             i, Nouns::nominative_singular(tcu->column_identity->name), K, tcu->entries);
         if ((Kinds::get_construct(K) == CON_list_of) &&
    @@ -651,12 +651,12 @@ happens:
                 "which means that I don't know how to deal with it. You should "
                 "either put a value into the column somewhere, or else write "
                 "the kind in as part of the heading: '%2 (a number)', say.");
    -        Tables::Columns::set_kind(tcu->column_identity, t, K_number);
    +        Tables::Columns::set_kind(tcu->column_identity, t, K_number);
         }
     }
     
    diff --git a/docs/assertions-module/6-aa.html b/docs/assertions-module/7-aa.html similarity index 95% rename from docs/assertions-module/6-aa.html rename to docs/assertions-module/7-aa.html index d9c13e75f..be4f031c0 100644 --- a/docs/assertions-module/6-aa.html +++ b/docs/assertions-module/7-aa.html @@ -88,10 +88,10 @@ function togglePopup(material_id) {
    +

    Managing the multiple contextual meanings which a single adjective can have.

    -
    +

    §1. Adjectives can have multiple meanings. For example, it is legal to define both of these in the same source text: @@ -112,7 +112,7 @@ and for a table name, the second.

    So, then, every adjective has the following data attached to it:

    -
    define ADJECTIVE_MEANING_LINGUISTICS_CALLBACK AdjectiveAmbiguity::new_set
    +
    define ADJECTIVE_MEANING_LINGUISTICS_CALLBACK AdjectiveAmbiguity::new_set
     
     typedef struct adjective_meaning_data {
    @@ -157,7 +157,7 @@ memory to keep the sorted list as a second linked list.
         adjective_meaning *am;
         LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_defn_order) {
             LOG("%d: %W ", n, am->indexing_text);
    -        AdjectiveMeaningDomains::log(&(am->domain));
    +        AdjectiveMeaningDomains::log(&(am->domain));
             n++;
         }
     }
    @@ -200,13 +200,13 @@ early in the run when sorting cannot yet be done.
     

    -int AdjectiveAmbiguity::can_be_applied_to(adjective *adj, kind *K) {
    +int AdjectiveAmbiguity::can_be_applied_to(adjective *adj, kind *K) {
         if (adj) {
             adjective_meaning *am;
             LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_defn_order) {
    -            if (AdjectiveMeaningDomains::determine_avoiding_circularity(am) == FALSE)
    +            if (AdjectiveMeaningDomains::determine_avoiding_circularity(am) == FALSE)
                     return FALSE;
    -            kind *am_kind = AdjectiveMeaningDomains::get_kind(am);
    +            kind *am_kind = AdjectiveMeaningDomains::get_kind(am);
                 if (Kinds::Behaviour::is_object(am_kind)) {
                     if (K == NULL) return TRUE;
                     if (Kinds::Behaviour::is_object(K)) return TRUE;
    @@ -233,7 +233,7 @@ value, or an either/or property? If so we return the earliest known.
         return NULL;
     }
     
    -property *AdjectiveAmbiguity::has_either_or_property_meaning(adjective *adj, int *sense) {
    +property *AdjectiveAmbiguity::has_either_or_property_meaning(adjective *adj, int *sense) {
         adjective_meaning *am;
         if (adj)
             LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_defn_order)
    @@ -251,7 +251,7 @@ value, or an either/or property? If so we return the earliest known.
     

    -adjective_meaning *AdjectiveAmbiguity::first_meaning(adjective *adj) {
    +adjective_meaning *AdjectiveAmbiguity::first_meaning(adjective *adj) {
         if (adj == NULL) return NULL;
         return FIRST_IN_LINKED_LIST(adjective_meaning,
             adj->adjective_meanings.in_defn_order);
    @@ -265,17 +265,17 @@ insertion-sorts1 the
     
    • 1 Well, yes, but these are very short lists, typically 5 items or fewer.

    -void AdjectiveAmbiguity::sort(adjective *adj) {
    +void AdjectiveAmbiguity::sort(adjective *adj) {
         if (adj == NULL) internal_error("tried to sort meanings for null adjective");
         adjective_meaning *am;
         LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_defn_order)
    -        AdjectiveMeaningDomains::determine_if_possible(am);
    +        AdjectiveMeaningDomains::determine_if_possible(am);
         LinkedLists::empty(adj->adjective_meanings.in_precedence_order);
         LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_defn_order) {
             adjective_meaning *am2; int pos = 0;
             LOOP_OVER_LINKED_LIST(am2, adjective_meaning,
                 adj->adjective_meanings.in_precedence_order) {
    -            if (AdjectiveAmbiguity::cmp(am, am2) == 1) break;
    +            if (AdjectiveAmbiguity::cmp(am, am2) == 1) break;
                 pos++;
             }
             LinkedLists::insert(adj->adjective_meanings.in_precedence_order, pos, am);
    @@ -284,10 +284,10 @@ insertion-sorts1 the
     
     int AdjectiveAmbiguity::cmp(adjective_meaning *am1, adjective_meaning *am2) {
         if (am1 == am2) return 0;
    -    int d = AdjectiveMeaningDomains::cmp(&(am1->domain), &(am2->domain));
    +    int d = AdjectiveMeaningDomains::cmp(&(am1->domain), &(am2->domain));
         if (d != 0) return d;
         if (am1->domain.domain_infs == am2->domain.domain_infs)
    -        Worry about definitions of the same adjective on the same domain7.1;
    +        Worry about definitions of the same adjective on the same domain7.1;
         return am2->allocation_id - am1->allocation_id;
     }
     
    @@ -331,7 +331,7 @@ author's source text.) if (ef2 == NULL) return -1; }
    -
    • This code is used in §7.
    +
    • This code is used in §7.

    §8. With that sorting done, we can begin to use an adjective. Suppose there has been an assertion sentence like this:

    @@ -346,7 +346,7 @@ kind we think this has. parit

    What happens is that the list of definitions for "fixed in place" is checked -in logical precedence order, and AdjectiveMeanings::assert called +in logical precedence order, and AdjectiveMeanings::assert called on any kind which the "ormolu clock" matches. (That will probably be the definition for the "fixed in place" either/or property for things, unless someone has given the adjective some special meaning unique to the clock.) The @@ -361,37 +361,37 @@ asserted for it.

    -int AdjectiveAmbiguity::assert(adjective *adj, kind *kind_domain,
    +int AdjectiveAmbiguity::assert(adjective *adj, kind *kind_domain,
         inference_subject *infs_to_assert_on, parse_node *val_to_assert_on, int parity) {
    -    AdjectiveAmbiguity::sort(adj);
    +    AdjectiveAmbiguity::sort(adj);
         adjective_meaning *am;
         LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_precedence_order)
    -        if (AdjectiveMeaningDomains::strong_match(kind_domain, infs_to_assert_on, am))
    -            if (AdjectiveMeanings::assert(am, infs_to_assert_on, parity))
    +        if (AdjectiveMeaningDomains::strong_match(kind_domain, infs_to_assert_on, am))
    +            if (AdjectiveMeanings::assert(am, infs_to_assert_on, parity))
                     return TRUE;
         return FALSE;
     }
     

    §9. Similarly, the following produces an I6 schema to carry out a task for the -adjective. (See AdjectiveMeanings::make_schema for tasks.) +adjective. (See AdjectiveMeanings::make_schema for tasks.)

    -i6_schema *AdjectiveAmbiguity::schema_for_task(adjective *adj, kind *kind_domain, int T) {
    +i6_schema *AdjectiveAmbiguity::schema_for_task(adjective *adj, kind *kind_domain, int T) {
         if (kind_domain == NULL) kind_domain = K_object;
    -    AdjectiveAmbiguity::sort(adj);
    +    AdjectiveAmbiguity::sort(adj);
         adjective_meaning *am;
         LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_precedence_order) {
    -        AdjectiveMeaningDomains::determine(am);
    -        if (AdjectiveMeaningDomains::weak_match(kind_domain, am) == FALSE) continue;
    -        i6_schema *i6s = AdjectiveMeanings::get_schema(am, T);
    +        AdjectiveMeaningDomains::determine(am);
    +        if (AdjectiveMeaningDomains::weak_match(kind_domain, am) == FALSE) continue;
    +        i6_schema *i6s = AdjectiveMeanings::get_schema(am, T);
             if (i6s) return i6s;
         }
         return NULL;
     }
     
    diff --git a/docs/assertions-module/6-am.html b/docs/assertions-module/7-am.html similarity index 96% rename from docs/assertions-module/6-am.html rename to docs/assertions-module/7-am.html index eadd1a10f..870cd9f22 100644 --- a/docs/assertions-module/6-am.html +++ b/docs/assertions-module/7-am.html @@ -69,10 +69,10 @@ function togglePopup(material_id) {
    +

    One individual meaning which an adjective can have.

    -
    +

    §1. Meanings. For example, "odd" in the sense of numbers is a single meaning. Each meaning is an instance of: @@ -99,7 +99,7 @@ is an instance of: CLASS_DEFINITION } adjective_meaning; -

    • The structure adjective_meaning is accessed in 3/nrr, 6/tap, 6/tcp, 6/aa, 6/amd and here.
    +
    • The structure adjective_meaning is accessed in 3/nrr, 5/id, 5/adf, 5/tpf, 5/rf, 7/tap, 7/tcp, 7/aa, 7/amd and here.

    §2. This can be created in two ways: straightforwardly —

    @@ -110,13 +110,13 @@ is an instance of: am->defined_at = current_sentence; am->indexing_text = W; am->owning_adjective = NULL; - am->domain = AdjectiveMeaningDomains::new_from_text(EMPTY_WORDING); + am->domain = AdjectiveMeaningDomains::new_from_text(EMPTY_WORDING); am->family = family; am->family_specific_data = details; am->has_been_compiled_in_support_function = FALSE; am->schemas_prepared = FALSE; am->negated_from = NULL; - AdjectiveMeanings::initialise_all_task_data(am); + AdjectiveMeanings::initialise_all_task_data(am); return am; } @@ -137,12 +137,12 @@ might be created as the negation of "even" for numbers): am->has_been_compiled_in_support_function = FALSE; am->schemas_prepared = FALSE; am->negated_from = other; - AdjectiveMeanings::negate_task_data(am, other); + AdjectiveMeanings::negate_task_data(am, other); for (int i=1; i<=NO_ATOM_TASKS; i++) { int j = i; if (i == NOW_ATOM_TRUE_TASK) j = NOW_ATOM_FALSE_TASK; if (i == NOW_ATOM_FALSE_TASK) j = NOW_ATOM_TRUE_TASK; - AdjectiveMeanings::copy_task_data(&(am->task_data[j]), &(other->task_data[i])); + AdjectiveMeanings::copy_task_data(&(am->task_data[j]), &(other->task_data[i])); Calculus::Schemas::modify(&(am->task_data[j].call_to_support_function), ""); } return am; @@ -151,7 +151,7 @@ might be created as the negation of "even" for numbers):

    §4. Task data. When Inform needs to compile code for testing if an adjective is true as applied to something, or to make it now true (or false), it does this by compiling code for the associated unary predicate — see -The Adjectival Predicates. What to compile depends on the meaning or +The Adjectival Predicates. What to compile depends on the meaning or meanings which might apply; if it's this meaning, then we will need an I6 schema to carry out one of three tasks, TEST_ATOM_TASK, NOW_ATOM_TRUE_TASK, or NOW_ATOM_FALSE_TASK. @@ -167,13 +167,13 @@ I6 schema to carry out one of three tasks, struct i6_schema code_to_perform; where TRUE } adjective_task_data; -void AdjectiveMeanings::initialise_task_data(adjective_task_data *atd) { +void AdjectiveMeanings::initialise_task_data(adjective_task_data *atd) { atd->task_mode = NO_TASKMODE; Calculus::Schemas::modify(&(atd->code_to_perform), ""); Calculus::Schemas::modify(&(atd->call_to_support_function), ""); } -void AdjectiveMeanings::copy_task_data(adjective_task_data *to, adjective_task_data *from) { +void AdjectiveMeanings::copy_task_data(adjective_task_data *to, adjective_task_data *from) { to->task_mode = from->task_mode; to->code_to_perform = from->code_to_perform; to->call_to_support_function = from->call_to_support_function; @@ -186,17 +186,17 @@ switched around from the original.

    -void AdjectiveMeanings::initialise_all_task_data(adjective_meaning *am) {
    +void AdjectiveMeanings::initialise_all_task_data(adjective_meaning *am) {
         for (int i=1; i<=NO_ATOM_TASKS; i++)
    -        AdjectiveMeanings::initialise_task_data(&(am->task_data[i]));
    +        AdjectiveMeanings::initialise_task_data(&(am->task_data[i]));
     }
     
    -void AdjectiveMeanings::negate_task_data(adjective_meaning *am, adjective_meaning *other) {
    +void AdjectiveMeanings::negate_task_data(adjective_meaning *am, adjective_meaning *other) {
         for (int i=1; i<=NO_ATOM_TASKS; i++) {
             int j = i;
             if (i == NOW_ATOM_TRUE_TASK) j = NOW_ATOM_FALSE_TASK;
             if (i == NOW_ATOM_FALSE_TASK) j = NOW_ATOM_TRUE_TASK;
    -        AdjectiveMeanings::copy_task_data(&(am->task_data[j]), &(other->task_data[i]));
    +        AdjectiveMeanings::copy_task_data(&(am->task_data[j]), &(other->task_data[i]));
             Calculus::Schemas::modify(&(am->task_data[j].call_to_support_function), "");
         }
     }
    @@ -212,11 +212,11 @@ switched around from the original.
     

    By default, an adjective meaning is unable to perform any of the three tasks, -and the creator of it has to call AdjectiveMeanings::make_schema to say +and the creator of it has to call AdjectiveMeanings::make_schema to say otherwise. This puts us by default into DIRECT_TASKMODE, unless we're working in the world of objects where run-time typechecking will be needed — in which case VIA_SUPPORT_FUNCTION_TASKMODE. But the creator can insist on the latter -anyway with a subsequent call to AdjectiveMeanings::perform_task_via_function. +anyway with a subsequent call to AdjectiveMeanings::perform_task_via_function.

    enum NO_TASKMODE from 1
    @@ -225,7 +225,7 @@ anyway with a subsequent call to Adject
     
     i6_schema *AdjectiveMeanings::make_schema(adjective_meaning *am, int T) {
    -    kind *K = AdjectiveMeaningDomains::get_kind(am);
    +    kind *K = AdjectiveMeaningDomains::get_kind(am);
         if (K == NULL) K = K_object;
         int via_support = DIRECT_TASKMODE;
         if (Kinds::Behaviour::is_object(K)) via_support = VIA_SUPPORT_FUNCTION_TASKMODE;
    @@ -242,21 +242,21 @@ schema if it's needed.
     

    -i6_schema *AdjectiveMeanings::get_schema(adjective_meaning *am, int T) {
    -    AdjectiveMeanings::prepare_schemas(am, T);
    +i6_schema *AdjectiveMeanings::get_schema(adjective_meaning *am, int T) {
    +    AdjectiveMeanings::prepare_schemas(am, T);
         switch (am->task_data[T].task_mode) {
             case DIRECT_TASKMODE:
                 return &(am->task_data[T].code_to_perform);
             case VIA_SUPPORT_FUNCTION_TASKMODE:
                 if (Calculus::Schemas::empty(&(am->task_data[T].call_to_support_function)))
    -                Construct a schema for calling the support function7.1;
    +                Construct a schema for calling the support function7.1;
                 return &(am->task_data[T].call_to_support_function);
         }
         return NULL;
     }
     
    -i6_schema *AdjectiveMeanings::get_schema_without_call(adjective_meaning *am, int T) {
    -    AdjectiveMeanings::prepare_schemas(am, T);
    +i6_schema *AdjectiveMeanings::get_schema_without_call(adjective_meaning *am, int T) {
    +    AdjectiveMeanings::prepare_schemas(am, T);
         switch (am->task_data[T].task_mode) {
             case DIRECT_TASKMODE:
             case VIA_SUPPORT_FUNCTION_TASKMODE:
    @@ -285,11 +285,11 @@ negation does not, and so must use those of the original.
             }
         }
         inter_name *iname = RTAdjectives::iname(use_adj, task,
    -        RTKinds::weak_id(AdjectiveMeaningDomains::get_kind(am)));
    +        RTKinds::weak_id(AdjectiveMeaningDomains::get_kind(am)));
         Calculus::Schemas::modify(&(am->task_data[T].call_to_support_function),
             "*=-(%s%n(*1))", negation_operator, iname);
     
    -
    • This code is used in §7.
    +
    • This code is used in §7.

    §8. Families of adjective meanings. The above API would allow us to make fairly arbitrary one-off adjectives, but in practice we have a number of distinct purposes and want to make a whole pile of related adjectives for each one. So we actually create @@ -313,7 +313,7 @@ adjective meanings in "families". return f; }

    -
    • The structure adjective_meaning_family is private to this section.
    +
    • The structure adjective_meaning_family is accessed in 5/id and here.

    §9. Families provide a number of methods to tweak how adjectives behave, and here goes. All of these methods are optional.

    @@ -358,7 +358,7 @@ is ascending order of the family's adjective_meaning_family *f; LOOP_OVER(f, adjective_meaning_family) if (f->definition_claim_priority == priority) - Try the f family9.1; + Try the f family9.1; } return NULL; } @@ -373,7 +373,7 @@ is ascending order of the family's AW, DNW, CONW, CALLW); if (rv) return am;
    -
    • This code is used in §9.
    +
    • This code is used in §9.

    §10. By default, an adjective meaning cannot be asserted, that is, said to be true of something (an inference subject) in the model world. So if "fizzy" is a newly created adjective, the sentence "The drink is fizzy" would be @@ -392,7 +392,7 @@ subject subj, a INT_METHOD_TYPE(ASSERT_ADJM_MTID, adjective_meaning_family *f, adjective_meaning *am, inference_subject *subj, int parity) -int AdjectiveMeanings::assert(adjective_meaning *am, inference_subject *subj, +int AdjectiveMeanings::assert(adjective_meaning *am, inference_subject *subj, int parity) { if (am->negated_from) { am = am->negated_from; parity = (parity)?FALSE:TRUE; @@ -415,7 +415,7 @@ creation time), but there is no obligation. VOID_METHOD_TYPE(PREPARE_SCHEMAS_ADJM_MTID, adjective_meaning_family *f, adjective_meaning *am, int task) -void AdjectiveMeanings::prepare_schemas(adjective_meaning *am, int task) { +void AdjectiveMeanings::prepare_schemas(adjective_meaning *am, int task) { VOID_METHOD_CALL(am->family, PREPARE_SCHEMAS_ADJM_MTID, am, task); am->schemas_prepared = TRUE; } @@ -456,19 +456,19 @@ whether it is able to do this or not.

     int AdjectiveMeanings::generate_in_support_function(adjective_meaning *am,
         int T, ph_stack_frame *phsf) {
    -    int rv = AdjectiveMeanings::nscg_inner(am, T, TRUE, phsf);
    +    int rv = AdjectiveMeanings::nscg_inner(am, T, TRUE, phsf);
         am->has_been_compiled_in_support_function = TRUE;
         return rv;
     }
     
     int AdjectiveMeanings::can_generate_in_support_function(adjective_meaning *am, int T) {
    -    return AdjectiveMeanings::nscg_inner(am, T, FALSE, NULL);
    +    return AdjectiveMeanings::nscg_inner(am, T, FALSE, NULL);
     }
     
     int AdjectiveMeanings::nscg_inner(adjective_meaning *am, int T, int emit_flag,
         ph_stack_frame *phsf) {
    -    AdjectiveMeanings::prepare_schemas(am, T);
    -    Use the I6 schema instead to compile the task, if one exists13.1;
    +    AdjectiveMeanings::prepare_schemas(am, T);
    +    Use the I6 schema instead to compile the task, if one exists13.1;
         int rv = FALSE;
         INT_METHOD_CALL(rv, am->family, GENERATE_IN_SUPPORT_FUNCTION_ADJM_MTID, am, T,
             emit_flag, phsf);
    @@ -476,7 +476,7 @@ whether it is able to do this or not.
     }
     

    §13.1. Because we are inside the support function, we need to call -AdjectiveMeanings::get_schema_without_call not AdjectiveMeanings::get_schema — +AdjectiveMeanings::get_schema_without_call not AdjectiveMeanings::get_schema — otherwise, we would be given the schema for a function call to the very thing we are now trying to compile, and the result would be code which recursed forever. @@ -491,7 +491,7 @@ the task on. *2

    -    i6_schema *sch = AdjectiveMeanings::get_schema_without_call(am, T);
    +    i6_schema *sch = AdjectiveMeanings::get_schema_without_call(am, T);
         if (Calculus::Schemas::empty(sch) == FALSE) {
             if (emit_flag) {
                 parse_node *it_var = Lvalues::new_LOCAL_VARIABLE(EMPTY_WORDING,
    @@ -502,7 +502,7 @@ the task on. *2
             return TRUE;
         }
     
    -
    • This code is used in §13.
    +
    • This code is used in §13.

    §14. At last, something simpler. INDEX_ADJM_MTID, if provided, should print a description suitable for use in the lexicon part of the index, and return TRUE. If not provided, or it returns FALSE, something sensible is done @@ -526,7 +526,7 @@ not for one which is the negated form of another. }

    diff --git a/docs/assertions-module/6-amd.html b/docs/assertions-module/7-amd.html similarity index 94% rename from docs/assertions-module/6-amd.html rename to docs/assertions-module/7-amd.html index 060faabab..61043d14a 100644 --- a/docs/assertions-module/6-amd.html +++ b/docs/assertions-module/7-amd.html @@ -88,12 +88,12 @@ MathJax = {
    +

    What a single sense of an adjective can apply to: perhaps a kind or an instance.

    -
    +
    -

    §1. Introduction. Each adjective_meaning structure contains one of these. The "domain" of +

    §1. Introduction. Each adjective_meaning structure contains one of these. The "domain" of an adjective meaning is the set of values to which it can validly apply. For example, the meaning of "odd" for numbers has the set of all numbers as its domain, whereas the sense here: @@ -130,21 +130,21 @@ and "boojum" is a kind yet to be created, we're stuck. int problems_thrown; number of problems thrown about this domain } adjective_domain_data; -void AdjectiveMeaningDomains::log(adjective_domain_data *domain) { +void AdjectiveMeaningDomains::log(adjective_domain_data *domain) { if (domain->domain_infs == NULL) LOG("domain:'%W'?", domain->domain_text); else LOG("domain:($j, %u)", domain->domain_infs, domain->domain_kind); } -

    • The structure adjective_domain_data is accessed in 6/aa and here.
    +
    • The structure adjective_domain_data is accessed in 7/aa and here.

    §2. If all we have is text:

     void AdjectiveMeaningDomains::set_from_text(adjective_meaning *am, wording W) {
    -    am->domain = AdjectiveMeaningDomains::new_from_text(W);
    -    AdjectiveMeaningDomains::determine_if_possible(am);
    +    am->domain = AdjectiveMeaningDomains::new_from_text(W);
    +    AdjectiveMeaningDomains::determine_if_possible(am);
     }
    -adjective_domain_data AdjectiveMeaningDomains::new_from_text(wording W) {
    +adjective_domain_data AdjectiveMeaningDomains::new_from_text(wording W) {
         adjective_domain_data domain;
         domain.domain_text = W;
         domain.domain_infs = NULL;
    @@ -166,10 +166,10 @@ is used when applying adjectives to objects.
     
     
     void AdjectiveMeaningDomains::set_from_kind(adjective_meaning *am, kind *K) {
    -    am->domain = AdjectiveMeaningDomains::new_from_kind(K);
    +    am->domain = AdjectiveMeaningDomains::new_from_kind(K);
     }
     adjective_domain_data AdjectiveMeaningDomains::new_from_kind(kind *K) {
    -    adjective_domain_data domain = AdjectiveMeaningDomains::new_from_text(EMPTY_WORDING);
    +    adjective_domain_data domain = AdjectiveMeaningDomains::new_from_text(EMPTY_WORDING);
         if ((K == NULL) || (Kinds::Behaviour::is_object(K))) K = K_object;
         domain.domain_infs = KindSubjects::from_kind(K);
         domain.domain_kind = K;
    @@ -177,11 +177,11 @@ is used when applying adjectives to objects.
     }
     
     void AdjectiveMeaningDomains::set_from_instance(adjective_meaning *am, instance *I) {
    -    am->domain = AdjectiveMeaningDomains::new_from_instance(I);
    +    am->domain = AdjectiveMeaningDomains::new_from_instance(I);
     }
     adjective_domain_data AdjectiveMeaningDomains::new_from_instance(instance *I) {
    -    adjective_domain_data domain = AdjectiveMeaningDomains::new_from_text(EMPTY_WORDING);
    -    if (I == NULL) return AdjectiveMeaningDomains::new_from_kind(K_object);
    +    adjective_domain_data domain = AdjectiveMeaningDomains::new_from_text(EMPTY_WORDING);
    +    if (I == NULL) return AdjectiveMeaningDomains::new_from_kind(K_object);
         domain.domain_infs = Instances::as_subject(I);
         domain.domain_kind = Kinds::weaken(Instances::to_kind(I), K_object);
         return domain;
    @@ -192,11 +192,11 @@ for timing reasons, sometimes we require that it must not fail:
     

    -void AdjectiveMeaningDomains::determine(adjective_meaning *am) {
    -    AdjectiveMeaningDomains::determine_inner(am, FALSE);
    +void AdjectiveMeaningDomains::determine(adjective_meaning *am) {
    +    AdjectiveMeaningDomains::determine_inner(am, FALSE);
     }
    -void AdjectiveMeaningDomains::determine_if_possible(adjective_meaning *am) {
    -    AdjectiveMeaningDomains::determine_inner(am, TRUE);
    +void AdjectiveMeaningDomains::determine_if_possible(adjective_meaning *am) {
    +    AdjectiveMeaningDomains::determine_inner(am, TRUE);
     }
     

    §5. This variant is useful to catch circularities like "A big container is big @@ -204,10 +204,10 @@ if...", where the adjective's domain directly or indirectly involves itself:

    -int AdjectiveMeaningDomains::determine_avoiding_circularity(adjective_meaning *am) {
    -    if (am->domain.currently_determining) Issue a problem for a circularity5.1;
    +int AdjectiveMeaningDomains::determine_avoiding_circularity(adjective_meaning *am) {
    +    if (am->domain.currently_determining) Issue a problem for a circularity5.1;
         am->domain.currently_determining = TRUE;
    -    AdjectiveMeaningDomains::determine_if_possible(am);
    +    AdjectiveMeaningDomains::determine_if_possible(am);
         am->domain.currently_determining = FALSE;
         return TRUE;
     }
    @@ -225,11 +225,11 @@ if...", where the adjective's domain directly or indirectly involves itself:
         }
         return FALSE;
     
    -
    • This code is used in §5.
    +
    • This code is used in §5.

    §6.

    -void AdjectiveMeaningDomains::determine_inner(adjective_meaning *am,
    +void AdjectiveMeaningDomains::determine_inner(adjective_meaning *am,
         int suppress_problems) {
         if (am->domain.domain_infs) return;  already determined
     
    @@ -238,18 +238,18 @@ if...", where the adjective's domain directly or indirectly involves itself:
             internal_error("undeclared domain kind for AM");
         parse_node *supplied = NULL;
         if (<s-type-expression>(am->domain.domain_text)) supplied = <<rp>>;
    -    if (supplied == NULL) Reject domain of adjective6.1;
    -    Reject domain of adjective unless a kind of value or description of objects6.4;
    +    if (supplied == NULL) Reject domain of adjective6.1;
    +    Reject domain of adjective unless a kind of value or description of objects6.4;
         kind *K = NULL;
         if (Specifications::is_condition(supplied)) {
             if (Specifications::to_kind(supplied)) K = Specifications::to_kind(supplied);
             else K = K_object;
    -        Reject domain of adjective if it is a set of objects which may vary in play6.5;
    +        Reject domain of adjective if it is a set of objects which may vary in play6.5;
         } else if (Rvalues::is_rvalue(supplied))
             K = Rvalues::to_kind(supplied);
    -    if (K == NULL) Reject domain of adjective6.1;
    -    if (Kinds::Behaviour::is_kind_of_kind(K)) Reject domain as vague6.2;
    -    if ((K_understanding) && (Kinds::eq(K, K_understanding))) Reject domain as topic6.3;
    +    if (K == NULL) Reject domain of adjective6.1;
    +    if (Kinds::Behaviour::is_kind_of_kind(K)) Reject domain as vague6.2;
    +    if ((K_understanding) && (Kinds::eq(K, K_understanding))) Reject domain as topic6.3;
         instance *I = Rvalues::to_object_instance(supplied);
         if (I) supplied = Rvalues::from_instance(I);
         else if (Kinds::Behaviour::is_subkind_of_object(K))
    @@ -275,7 +275,7 @@ can't be avoided.
             "and indeed doesn't have any meaning I can make sense of.");
         return;
     
    -
    • This code is used in §6 (twice).
    +
    • This code is used in §6 (twice).

    §6.2. Reject domain as vague6.2 =

    @@ -289,7 +289,7 @@ can't be avoided. "since it potentially describes many different kinds, not just one."); return;
    -
    • This code is used in §6.
    +
    • This code is used in §6.

    §6.3. Reject domain as topic6.3 =

    @@ -304,7 +304,7 @@ can't be avoided. "it comes to making comparisons."); return;
    -
    • This code is used in §6.
    +
    • This code is used in §6.

    §6.4. Reject domain of adjective unless a kind of value or description of objects6.4 =

    @@ -326,7 +326,7 @@ can't be avoided. return; } -
    • This code is used in §6.
    +
    • This code is used in §6.

    §6.5. Reject domain of adjective if it is a set of objects which may vary in play6.5 =

    @@ -348,7 +348,7 @@ can't be avoided. return; } -
    • This code is used in §6.
    +
    • This code is used in §6.

    §7. Finally, then, we can read what we currently believe the kind of the domain is with the following. Note that:

    @@ -357,7 +357,7 @@ is with the following. Note that:
  • ● if the domain is a single instance, we return the kind of that instance.
  • -kind *AdjectiveMeaningDomains::get_kind(adjective_meaning *am) {
    +kind *AdjectiveMeaningDomains::get_kind(adjective_meaning *am) {
         if (am == NULL) return NULL;
         if (am->domain.domain_infs == NULL) return NULL;
         return am->domain.domain_kind;
    @@ -385,15 +385,15 @@ inside "object" are treated as just "object", "container" weakly matches "animal
     specific instance, then it must definitely lie within the domain.
     
     
    -int AdjectiveMeaningDomains::weak_match(kind *K1, adjective_meaning *am) {
    -    kind *K2 = AdjectiveMeaningDomains::get_kind(am);
    +int AdjectiveMeaningDomains::weak_match(kind *K1, adjective_meaning *am) {
    +    kind *K2 = AdjectiveMeaningDomains::get_kind(am);
         if (RTKinds::weak_id(K1) == RTKinds::weak_id(K2)) return TRUE;
         return FALSE;
     }
     
    -int AdjectiveMeaningDomains::strong_match(kind *K1, inference_subject *infs,
    +int AdjectiveMeaningDomains::strong_match(kind *K1, inference_subject *infs,
         adjective_meaning *am) {
    -    if (AdjectiveMeaningDomains::weak_match(K1, am)) {
    +    if (AdjectiveMeaningDomains::weak_match(K1, am)) {
             instance *I = InstanceSubjects::to_object_instance(infs);
             if (I == NULL) return TRUE;
             while (infs) {
    @@ -405,7 +405,7 @@ specific instance, then it must definitely lie within the domain.
     }
     

    §10. The following sorting function is used in the process of sorting the meanings -of an adjective into precedence order — see AdjectiveAmbiguity::sort. +of an adjective into precedence order — see AdjectiveAmbiguity::sort. It takes two domains \(D_1\) and \(D_2\), and returns

    @@ -417,7 +417,7 @@ It takes two domains \(D_1\) and \(D_2\), and returns domains are set up.

    -int AdjectiveMeaningDomains::cmp(adjective_domain_data *domain1,
    +int AdjectiveMeaningDomains::cmp(adjective_domain_data *domain1,
         adjective_domain_data *domain2) {
         if ((domain1->domain_infs) && (domain2->domain_infs == NULL)) return 1;
         if ((domain1->domain_infs == NULL) && (domain2->domain_infs)) return -1;
    @@ -439,7 +439,7 @@ domains are set up.
     }
     
    diff --git a/docs/assertions-module/6-cu.html b/docs/assertions-module/7-cu.html similarity index 96% rename from docs/assertions-module/6-cu.html rename to docs/assertions-module/7-cu.html index 7e111ac3d..5a0c440d5 100644 --- a/docs/assertions-module/6-cu.html +++ b/docs/assertions-module/7-cu.html @@ -69,10 +69,10 @@ function togglePopup(material_id) {
    +

    Utility functions for creating basic propositions using these predicates.

    -
    +

    §1. Creation propositions. We start with some elementary propositions which create things, by asserting their existence. @@ -80,15 +80,15 @@ their existence.

     pcalc_prop *Propositions::Abstract::to_make_a_kind(kind *K) {
    -    return CreationPredicates::is_a_kind_up(Terms::new_variable(0), K);
    +    return CreationPredicates::is_a_kind_up(Terms::new_variable(0), K);
     }
     
     pcalc_prop *Propositions::Abstract::to_make_a_var(void) {
    -    return CreationPredicates::is_a_var_up(Terms::new_variable(0));
    +    return CreationPredicates::is_a_var_up(Terms::new_variable(0));
     }
     
     pcalc_prop *Propositions::Abstract::to_make_a_const(void) {
    -    return CreationPredicates::is_a_const_up(Terms::new_variable(0));
    +    return CreationPredicates::is_a_const_up(Terms::new_variable(0));
     }
     
     pcalc_prop *Propositions::Abstract::to_create_something(kind *K, wording W) {
    @@ -98,7 +98,7 @@ their existence.
                 KindPredicates::new_atom(K, Terms::new_variable(0)));
         if (Wordings::nonempty(W))
             prop = Propositions::concatenate(prop,
    -            CreationPredicates::calling_up(W, Terms::new_variable(0), K));
    +            CreationPredicates::calling_up(W, Terms::new_variable(0), K));
         return prop;
     }
     
    @@ -106,7 +106,7 @@ their existence.

    -pcalc_prop *Propositions::Abstract::prop_to_set_kind(kind *k) {
    +pcalc_prop *Propositions::Abstract::prop_to_set_kind(kind *k) {
         return KindPredicates::new_atom(k, Terms::new_variable(0));
     }
     
    @@ -116,7 +116,7 @@ their existence.
     void Propositions::Abstract::assert_kind_of_instance(instance *I, kind *k) {
         Assert::true_about(
    -        Propositions::Abstract::prop_to_set_kind(k),
    +        Propositions::Abstract::prop_to_set_kind(k),
             Instances::as_subject(I), prevailing_mood);
     }
     
    @@ -162,7 +162,7 @@ their existence.
             Terms::new_variable(0), Terms::new_constant(Rvalues::from_property(prn)));
     }
     
    -pcalc_prop *Propositions::Abstract::to_set_property(property *prn, parse_node *val) {
    +pcalc_prop *Propositions::Abstract::to_set_property(property *prn, parse_node *val) {
         if (val == NULL) return NULL;
         if (ValueProperties::get_setting_bp(prn) == NULL) internal_error("no BP for this property");
         return Atoms::binary_PREDICATE_new(ValueProperties::get_setting_bp(prn),
    @@ -190,8 +190,8 @@ whose text can be found in a node 
    -pcalc_prop *Propositions::Abstract::from_property_subtree(property *prn, parse_node *py) {
    -    return Propositions::Abstract::to_set_property(prn,
    +pcalc_prop *Propositions::Abstract::from_property_subtree(property *prn, parse_node *py) {
    +    return Propositions::Abstract::to_set_property(prn,
             Assertions::PropertyKnowledge::property_value_from_property_subtree(prn, py));
     }
     
    @@ -209,13 +209,13 @@ with it. case AND_NT: for (p = p->down; p; p = p->next) prop = Propositions::conjoin(prop, - Propositions::Abstract::from_property_list(p, NULL)); + Propositions::Abstract::from_property_list(p, NULL)); break; case PROPERTY_LIST_NT: - Conjoin atoms to assert from a property list8.1; + Conjoin atoms to assert from a property list8.1; break; case ADJECTIVE_NT: - Conjoin atoms to assert from an adjective node8.2; + Conjoin atoms to assert from an adjective node8.2; break; default: internal_error_on_node_type(p); } @@ -238,10 +238,10 @@ parse the text to find what which property is referred to.
         property *prn = NULL;
         wording PW = EMPTY_WORDING, VW = EMPTY_WORDING;
    -    Divide the property list entry into property name and value text8.1.1;
    +    Divide the property list entry into property name and value text8.1.1;
     
         if ((Wordings::nonempty(PW)) && (<property-name>(PW))) prn = <<rp>>;
    -    if (prn == NULL) Issue a problem message for no-such-property8.1.2;
    +    if (prn == NULL) Issue a problem message for no-such-property8.1.2;
     
         if (Wordings::nonempty(VW)) {  a value is supplied...
             if (Properties::is_either_or(prn)) {
    @@ -261,7 +261,7 @@ parse the text to find what which property is referred to.
             <np-as-object>(VW);
             parse_node *pn = <<rp>>;
             Refiner::refine(pn, FORBID_CREATION);
    -        pcalc_prop *P = Propositions::Abstract::from_property_subtree(prn, pn);
    +        pcalc_prop *P = Propositions::Abstract::from_property_subtree(prn, pn);
             prop = Propositions::conjoin(prop, P);
         } else {  no value is supplied...
             if (Properties::is_either_or(prn) == FALSE) {
    @@ -279,10 +279,10 @@ parse the text to find what which property is referred to.
                 return NULL;
             }
             prop = Propositions::conjoin(prop,
    -            Propositions::Abstract::from_property_subtree(prn, NULL));
    +            Propositions::Abstract::from_property_subtree(prn, NULL));
         }
     
    -
    • This code is used in §8.
    +
    • This code is used in §8.

    §8.1.1. The node has text in the form "property name property value", with no obvious division of punctuation between the two. What makes matters worse is that we do not yet know all the property names, nor do we have the @@ -317,7 +317,7 @@ that the rest is property name; and otherwise PW = Wordings::up_to(W, Wordings::first_wn(W) + name_length - 1); VW = Wordings::from(W, Wordings::first_wn(W) + name_length); -

    • This code is used in §8.1.
    +
    • This code is used in §8.1.

    §8.1.2. Issue a problem message for no-such-property8.1.2 =

    @@ -336,7 +336,7 @@ that the rest is property name; and otherwise "right to say 'The Louis Quinze chair is an antique with age 241.'"); return NULL; -
    • This code is used in §8.1.
    +
    • This code is used in §8.1.

    §8.2. An ADJECTIVE_NT node, on the other hand, is annotated with a valid property name property already, and may also have a value ready to put into that property, stored in evaluation. Nodes like this have been @@ -352,17 +352,17 @@ which is by now inside the "creation proposition". int negate_me = FALSE; unary_predicate *pred = Node::get_predicate(p); if (pred == NULL) internal_error("adjective without predicate"); - if (AdjectivalPredicates::parity(pred) == FALSE) negate_me = TRUE; + if (AdjectivalPredicates::parity(pred) == FALSE) negate_me = TRUE; if (Node::get_creation_proposition(p)) prop = Propositions::conjoin(prop, Node::get_creation_proposition(p)); - pcalc_prop *adj_prop = AdjectivalPredicates::new_atom_on_x( - AdjectivalPredicates::to_adjective(pred), FALSE); + pcalc_prop *adj_prop = AdjectivalPredicates::new_atom_on_x( + AdjectivalPredicates::to_adjective(pred), FALSE); if (negate_me) adj_prop = Propositions::negate(adj_prop); prop = Propositions::conjoin(prop, adj_prop); -

    • This code is used in §8.
    +
    • This code is used in §8.
    diff --git a/docs/assertions-module/6-er.html b/docs/assertions-module/7-er.html similarity index 94% rename from docs/assertions-module/6-er.html rename to docs/assertions-module/7-er.html index e4977fb16..8c7f829a2 100644 --- a/docs/assertions-module/6-er.html +++ b/docs/assertions-module/7-er.html @@ -83,10 +83,10 @@ MathJax = {
    +

    To draw inferences from the relations created explicitly by the source text.

    -
    +

    §1. Managing the BPs generated. The relations created in this section belong to the "explicit" family, named so because their definitions are explicit in the source text. Initially, @@ -111,20 +111,20 @@ there are none.

     void Relations::Explicit::start(void) {
         explicit_bp_family = BinaryPredicateFamilies::new();
    -    METHOD_ADD(explicit_bp_family, TYPECHECK_BPF_MTID, Relations::Explicit::typecheck);
    -    METHOD_ADD(explicit_bp_family, ASSERT_BPF_MTID, Relations::Explicit::assert);
    -    METHOD_ADD(explicit_bp_family, SCHEMA_BPF_MTID, Relations::Explicit::schema);
    -    METHOD_ADD(explicit_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Relations::Explicit::describe_for_problems);
    -    METHOD_ADD(explicit_bp_family, DESCRIBE_FOR_INDEX_BPF_MTID, Relations::Explicit::describe_for_index);
    +    METHOD_ADD(explicit_bp_family, TYPECHECK_BPF_MTID, Relations::Explicit::typecheck);
    +    METHOD_ADD(explicit_bp_family, ASSERT_BPF_MTID, Relations::Explicit::assert);
    +    METHOD_ADD(explicit_bp_family, SCHEMA_BPF_MTID, Relations::Explicit::schema);
    +    METHOD_ADD(explicit_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Relations::Explicit::describe_for_problems);
    +    METHOD_ADD(explicit_bp_family, DESCRIBE_FOR_INDEX_BPF_MTID, Relations::Explicit::describe_for_index);
         by_routine_bp_family = BinaryPredicateFamilies::new();
    -    METHOD_ADD(by_routine_bp_family, TYPECHECK_BPF_MTID, Relations::Explicit::typecheck);
    -    METHOD_ADD(by_routine_bp_family, ASSERT_BPF_MTID, Relations::Explicit::assert);
    -    METHOD_ADD(by_routine_bp_family, SCHEMA_BPF_MTID, Relations::Explicit::schema);
    -    METHOD_ADD(by_routine_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Relations::Explicit::describe_for_problems);
    -    METHOD_ADD(by_routine_bp_family, DESCRIBE_FOR_INDEX_BPF_MTID, Relations::Explicit::REL_br_describe_briefly);
    +    METHOD_ADD(by_routine_bp_family, TYPECHECK_BPF_MTID, Relations::Explicit::typecheck);
    +    METHOD_ADD(by_routine_bp_family, ASSERT_BPF_MTID, Relations::Explicit::assert);
    +    METHOD_ADD(by_routine_bp_family, SCHEMA_BPF_MTID, Relations::Explicit::schema);
    +    METHOD_ADD(by_routine_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Relations::Explicit::describe_for_problems);
    +    METHOD_ADD(by_routine_bp_family, DESCRIBE_FOR_INDEX_BPF_MTID, Relations::Explicit::REL_br_describe_briefly);
     }
     
    -int Relations::Explicit::is_explicit_with_runtime_storage(binary_predicate *bp) {
    +int Relations::Explicit::is_explicit_with_runtime_storage(binary_predicate *bp) {
         if (bp->relation_family == explicit_bp_family) return TRUE;
         return TRUE;
     }
    @@ -145,8 +145,8 @@ run-time code supporting relations.
     

    §4.

    -int Relations::Explicit::allow_arbitrary_assertions(binary_predicate *bp) {
    -    int f = Relations::Explicit::get_form_of_relation(bp);
    +int Relations::Explicit::allow_arbitrary_assertions(binary_predicate *bp) {
    +    int f = Relations::Explicit::get_form_of_relation(bp);
         if (f == Relation_Equiv) return TRUE;
         if (f == Relation_VtoV) return TRUE;
         if (f == Relation_Sym_VtoV) return TRUE;
    @@ -160,7 +160,7 @@ run-time code supporting relations.
         } else internal_error("not explicit");
     }
     
    -int Relations::Explicit::stored_dynamically(binary_predicate *bp) {
    +int Relations::Explicit::stored_dynamically(binary_predicate *bp) {
         if (bp->relation_family == explicit_bp_family) {
             explicit_bp_data *ED = RETRIEVE_POINTER_explicit_bp_data(bp->family_specific);
             return ED->store_dynamically;
    @@ -209,19 +209,19 @@ made:
         return bp;
     }
     
    -property *Relations::Explicit::get_i6_storage_property(binary_predicate *bp) {
    +property *Relations::Explicit::get_i6_storage_property(binary_predicate *bp) {
         if (bp->relation_family != explicit_bp_family) return NULL;
         explicit_bp_data *ED = RETRIEVE_POINTER_explicit_bp_data(bp->family_specific);
         return ED->i6_storage_property;
     }
     
    -int Relations::Explicit::get_form_of_relation(binary_predicate *bp) {
    +int Relations::Explicit::get_form_of_relation(binary_predicate *bp) {
         if (bp->relation_family != explicit_bp_family) return Relation_Implicit;
         explicit_bp_data *ED = RETRIEVE_POINTER_explicit_bp_data(bp->family_specific);
         return ED->form_of_relation;
     }
     char *Relations::Explicit::form_to_text(binary_predicate *bp) {
    -    switch(Relations::Explicit::get_form_of_relation(bp)) {
    +    switch(Relations::Explicit::get_form_of_relation(bp)) {
             case Relation_OtoO: return "Relation_OtoO";
             case Relation_OtoV: return "Relation_OtoV";
             case Relation_VtoO: return "Relation_VtoO";
    @@ -237,7 +237,7 @@ made:
     

    -int Relations::Explicit::typecheck(bp_family *self, binary_predicate *bp,
    +int Relations::Explicit::typecheck(bp_family *self, binary_predicate *bp,
             kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
         return DECLINE_TO_MATCH;
     }
    @@ -248,26 +248,26 @@ to behave as if \(B(y, x)\) had also been asserted whenever \(B(x, y)\) has, if
     

    -int Relations::Explicit::assert(bp_family *self, binary_predicate *bp,
    +int Relations::Explicit::assert(bp_family *self, binary_predicate *bp,
             inference_subject *infs0, parse_node *spec0,
             inference_subject *infs1, parse_node *spec1) {
     
    -    Reject non-assertable relations7.1;
    -    if (Relations::Explicit::stored_dynamically(bp)) {
    +    Reject non-assertable relations7.1;
    +    if (Relations::Explicit::stored_dynamically(bp)) {
             RelationInferences::draw_spec(bp, spec0, spec1);
             return TRUE;
         } else {
    -        if ((infs0 == NULL) || (infs1 == NULL)) Reject relationship with nothing7.2;
    -        if (Relations::Explicit::allow_arbitrary_assertions(bp)) {
    +        if ((infs0 == NULL) || (infs1 == NULL)) Reject relationship with nothing7.2;
    +        if (Relations::Explicit::allow_arbitrary_assertions(bp)) {
                 RelationInferences::draw(bp, infs0, infs1);
    -            if ((Relations::Explicit::get_form_of_relation(bp) == Relation_Sym_VtoV) && (infs0 != infs1))
    +            if ((Relations::Explicit::get_form_of_relation(bp) == Relation_Sym_VtoV) && (infs0 != infs1))
                     RelationInferences::draw(bp, infs1, infs0);
                 return TRUE;
             }
    -        if (Relations::Explicit::is_explicit_with_runtime_storage(bp)) {
    -            Relations::Explicit::infer_property_based_relation(bp, infs1, infs0);
    -            if ((Relations::Explicit::get_form_of_relation(bp) == Relation_Sym_OtoO) && (infs0 != infs1))
    -                Relations::Explicit::infer_property_based_relation(bp, infs0, infs1);
    +        if (Relations::Explicit::is_explicit_with_runtime_storage(bp)) {
    +            Relations::Explicit::infer_property_based_relation(bp, infs1, infs0);
    +            if ((Relations::Explicit::get_form_of_relation(bp) == Relation_Sym_OtoO) && (infs0 != infs1))
    +                Relations::Explicit::infer_property_based_relation(bp, infs0, infs1);
                 return TRUE;
             }
         }
    @@ -291,7 +291,7 @@ to behave as if \(B(y, x)\) had also been asserted whenever \(B(x, y)\) has, if
             return TRUE;
         }
     
    -
    • This code is used in §7.
    +
    • This code is used in §7.

    §7.2. Reject relationship with nothing7.2 =

    @@ -304,7 +304,7 @@ to behave as if \(B(y, x)\) had also been asserted whenever \(B(x, y)\) has, if "to try to put 'Mr Cogito' and 'nothing' into a relationship."); return TRUE;
    -
    • This code is used in §7.
    +
    • This code is used in §7.

    §8. This routine converts the knowledge that \(R(ox, oy)\) into a single inference. It can only be used for a simple subclass of the relations: those which store oy, the only thing related to ox, in a given property @@ -315,12 +315,12 @@ inferences for \(y\) and \(z\).

    -void Relations::Explicit::infer_property_based_relation(binary_predicate *bp,
    +void Relations::Explicit::infer_property_based_relation(binary_predicate *bp,
         inference_subject *infs0, inference_subject *infs1) {
    -    if (Relations::Explicit::get_form_of_relation(bp) == Relation_VtoO) {
    +    if (Relations::Explicit::get_form_of_relation(bp) == Relation_VtoO) {
             inference_subject *swap=infs0; infs0=infs1; infs1=swap;
         }
    -    property *prn = Relations::Explicit::get_i6_storage_property(bp);
    +    property *prn = Relations::Explicit::get_i6_storage_property(bp);
         PropertyInferences::draw(infs0, prn, InferenceSubjects::as_constant(infs1));
     }
     
    @@ -328,7 +328,7 @@ inferences for \(y\) and \(z\).

    -int Relations::Explicit::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
    +int Relations::Explicit::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
         return FALSE;
     }
     
    @@ -336,11 +336,11 @@ inferences for \(y\) and \(z\).

    -int Relations::Explicit::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +int Relations::Explicit::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
         return FALSE;
     }
    -void Relations::Explicit::describe_for_index(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    -    switch (Relations::Explicit::get_form_of_relation(bp)) {
    +void Relations::Explicit::describe_for_index(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +    switch (Relations::Explicit::get_form_of_relation(bp)) {
             case Relation_OtoO: WRITE("one-to-one"); break;
             case Relation_OtoV: WRITE("one-to-various"); break;
             case Relation_VtoO: WRITE("various-to-one"); break;
    @@ -350,12 +350,12 @@ inferences for \(y\) and \(z\).
             case Relation_Equiv: WRITE("in groups"); break;
         }
     }
    -void Relations::Explicit::REL_br_describe_briefly(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +void Relations::Explicit::REL_br_describe_briefly(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
         WRITE("defined");
     }
     
    diff --git a/docs/assertions-module/6-kpr.html b/docs/assertions-module/7-kpr.html similarity index 95% rename from docs/assertions-module/6-kpr.html rename to docs/assertions-module/7-kpr.html index 4bc68aff2..4531f8001 100644 --- a/docs/assertions-module/6-kpr.html +++ b/docs/assertions-module/7-kpr.html @@ -83,7 +83,7 @@ MathJax = {
    +

    To define how the kind predicates behave in the Inform language.

    §1. Recall that for every kind K the calculus module makes a built-in @@ -97,9 +97,9 @@ be asserted and compiled from.

     void KindPredicatesRevisited::start(void) {
    -    METHOD_ADD(kind_up_family, TYPECHECK_UPF_MTID, KindPredicatesRevisited::typecheck);
    -    METHOD_ADD(kind_up_family, ASSERT_UPF_MTID, KindPredicatesRevisited::assert);
    -    METHOD_ADD(kind_up_family, SCHEMA_UPF_MTID, KindPredicatesRevisited::get_schema);
    +    METHOD_ADD(kind_up_family, TYPECHECK_UPF_MTID, KindPredicatesRevisited::typecheck);
    +    METHOD_ADD(kind_up_family, ASSERT_UPF_MTID, KindPredicatesRevisited::assert);
    +    METHOD_ADD(kind_up_family, SCHEMA_UPF_MTID, KindPredicatesRevisited::get_schema);
     }
     

    §2. We will reject any "kind" applied to a constant if it necessarily fails — @@ -117,7 +117,7 @@ but not meaningless.

    -int KindPredicatesRevisited::typecheck(up_family *self, unary_predicate *up,
    +int KindPredicatesRevisited::typecheck(up_family *self, unary_predicate *up,
         pcalc_prop *prop, variable_type_assignment *vta, tc_problem_kit *tck) {
         kind *need_to_find = up->assert_kind;
         if (Kinds::Behaviour::is_object(need_to_find)) need_to_find = K_object;
    @@ -142,7 +142,7 @@ sentence.
     

    -void KindPredicatesRevisited::assert(up_family *self, unary_predicate *up,
    +void KindPredicatesRevisited::assert(up_family *self, unary_predicate *up,
         int now_negated, pcalc_prop *pl) {
         if (now_negated) {
             StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantAssertNonKind),
    @@ -170,7 +170,7 @@ the I6 ofclass
     
     
     int suppress_C14CantChangeKind = FALSE;
    -void KindPredicatesRevisited::get_schema(up_family *self, int task, unary_predicate *up,
    +void KindPredicatesRevisited::get_schema(up_family *self, int task, unary_predicate *up,
         annotated_i6_schema *asch, kind *K) {
         switch(task) {
             case TEST_ATOM_TASK:
    @@ -210,7 +210,7 @@ the I6 ofclass
     }
     
    diff --git a/docs/assertions-module/6-lr.html b/docs/assertions-module/7-lr.html similarity index 90% rename from docs/assertions-module/6-lr.html rename to docs/assertions-module/7-lr.html index 839d18350..6b1f170bb 100644 --- a/docs/assertions-module/6-lr.html +++ b/docs/assertions-module/7-lr.html @@ -69,10 +69,10 @@ function togglePopup(material_id) {
    +

    To define the binary predicates corresponding to table columns, and which determine whether a given value is listed in that column.

    -
    +

    §1. Family.

    @@ -81,10 +81,10 @@ function togglePopup(material_id) { void Tables::Relations::start(void) { listed_in_bp_family = BinaryPredicateFamilies::new(); - METHOD_ADD(listed_in_bp_family, TYPECHECK_BPF_MTID, Tables::Relations::typecheck); - METHOD_ADD(listed_in_bp_family, ASSERT_BPF_MTID, Tables::Relations::assert); - METHOD_ADD(listed_in_bp_family, SCHEMA_BPF_MTID, Tables::Relations::schema); - METHOD_ADD(listed_in_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Tables::Relations::describe_for_problems); + METHOD_ADD(listed_in_bp_family, TYPECHECK_BPF_MTID, Tables::Relations::typecheck); + METHOD_ADD(listed_in_bp_family, ASSERT_BPF_MTID, Tables::Relations::assert); + METHOD_ADD(listed_in_bp_family, SCHEMA_BPF_MTID, Tables::Relations::schema); + METHOD_ADD(listed_in_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Tables::Relations::describe_for_problems); }

    §2. Subsequent creations. When a column called, say, "pledged delegate count" appears in one or more @@ -100,7 +100,7 @@ predicates instead.

    -binary_predicate *Tables::Relations::make_listed_in_predicate(table_column *tc) {
    +binary_predicate *Tables::Relations::make_listed_in_predicate(table_column *tc) {
         binary_predicate *bp = BinaryPredicates::make_pair(listed_in_bp_family,
             BPTerms::new(NULL),
             BPTerms::new(KindSubjects::from_kind(K_table)),
    @@ -120,7 +120,7 @@ in later, instead:
     

    -void Tables::Relations::supply_kind_for_listed_in_tc(binary_predicate *bp, kind *K) {
    +void Tables::Relations::supply_kind_for_listed_in_tc(binary_predicate *bp, kind *K) {
         BPTerms::set_domain(&(bp->term_details[0]), K);
         BPTerms::set_domain(&(bp->reversal->term_details[1]), K);
     }
    @@ -128,7 +128,7 @@ in later, instead:
     

    §4. Typechecking.

    -int Tables::Relations::typecheck(bp_family *self, binary_predicate *bp,
    +int Tables::Relations::typecheck(bp_family *self, binary_predicate *bp,
             kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
         return DECLINE_TO_MATCH;
     }
    @@ -137,7 +137,7 @@ in later, instead:
     

    -int Tables::Relations::assert(bp_family *self, binary_predicate *bp,
    +int Tables::Relations::assert(bp_family *self, binary_predicate *bp,
             inference_subject *infs0, parse_node *spec0,
             inference_subject *infs1, parse_node *spec1) {
         return FALSE;
    @@ -149,7 +149,7 @@ the table reference for any successful lookup.
     

    -int Tables::Relations::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
    +int Tables::Relations::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
         if (task == TEST_ATOM_TASK) LocalVariables::add_table_lookup();
         return FALSE;
     }
    @@ -157,13 +157,13 @@ the table reference for any successful lookup.
     

    §7. Problem message text.

    -int Tables::Relations::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +int Tables::Relations::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
         WRITE("the listed in relation");
         return TRUE;
     }
     
    diff --git a/docs/assertions-module/6-qr.html b/docs/assertions-module/7-qr.html similarity index 95% rename from docs/assertions-module/6-qr.html rename to docs/assertions-module/7-qr.html index 028925b21..c938fcf44 100644 --- a/docs/assertions-module/6-qr.html +++ b/docs/assertions-module/7-qr.html @@ -83,10 +83,10 @@ function togglePopup(material_id) {
    +

    To define the binary predicates corresponding to numerical comparisons.

    -
    +

    §1. The inequality relations \(<\), \(>\), \(\leq\), and \(\geq\), which can be applied not only to numbers but also to units (height, length and so on). @@ -116,19 +116,19 @@ equality BP as everything else. void Calculus::QuasinumericRelations::start(void) { quasinumeric_bp_family = BinaryPredicateFamilies::new(); - METHOD_ADD(quasinumeric_bp_family, STOCK_BPF_MTID, Calculus::QuasinumericRelations::stock); - METHOD_ADD(quasinumeric_bp_family, TYPECHECK_BPF_MTID, Calculus::QuasinumericRelations::typecheck); - METHOD_ADD(quasinumeric_bp_family, ASSERT_BPF_MTID, Calculus::QuasinumericRelations::assert); - METHOD_ADD(quasinumeric_bp_family, SCHEMA_BPF_MTID, Calculus::QuasinumericRelations::schema); - METHOD_ADD(quasinumeric_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Calculus::QuasinumericRelations::describe_for_problems); - METHOD_ADD(quasinumeric_bp_family, DESCRIBE_FOR_INDEX_BPF_MTID, Calculus::QuasinumericRelations::describe_for_index); + METHOD_ADD(quasinumeric_bp_family, STOCK_BPF_MTID, Calculus::QuasinumericRelations::stock); + METHOD_ADD(quasinumeric_bp_family, TYPECHECK_BPF_MTID, Calculus::QuasinumericRelations::typecheck); + METHOD_ADD(quasinumeric_bp_family, ASSERT_BPF_MTID, Calculus::QuasinumericRelations::assert); + METHOD_ADD(quasinumeric_bp_family, SCHEMA_BPF_MTID, Calculus::QuasinumericRelations::schema); + METHOD_ADD(quasinumeric_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Calculus::QuasinumericRelations::describe_for_problems); + METHOD_ADD(quasinumeric_bp_family, DESCRIBE_FOR_INDEX_BPF_MTID, Calculus::QuasinumericRelations::describe_for_index); }

    §3. Initial stock. These relations are all hard-wired in.

    -void Calculus::QuasinumericRelations::stock(bp_family *self, int n) {
    +void Calculus::QuasinumericRelations::stock(bp_family *self, int n) {
         if (n == 1) {
             bp_term_details number_term = BPTerms::new(KindSubjects::from_kind(K_number));
             R_numerically_greater_than =
    @@ -165,7 +165,7 @@ equality BP as everything else.
     

    §4. Typechecking.

    -int Calculus::QuasinumericRelations::typecheck(bp_family *self, binary_predicate *bp,
    +int Calculus::QuasinumericRelations::typecheck(bp_family *self, binary_predicate *bp,
             kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
         if ((Kinds::compatible(kinds_of_terms[0], kinds_of_terms[1]) == NEVER_MATCH) &&
             (Kinds::compatible(kinds_of_terms[1], kinds_of_terms[0]) == NEVER_MATCH)) {
    @@ -185,7 +185,7 @@ equality BP as everything else.
     

    -int Calculus::QuasinumericRelations::assert(bp_family *self, binary_predicate *bp,
    +int Calculus::QuasinumericRelations::assert(bp_family *self, binary_predicate *bp,
             inference_subject *infs0, parse_node *spec0,
             inference_subject *infs1, parse_node *spec1) {
         return FALSE;
    @@ -197,7 +197,7 @@ call in I6.
     

    -int Calculus::QuasinumericRelations::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
    +int Calculus::QuasinumericRelations::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
         kind *st[2];
         st[0] = Calculus::Deferrals::Cinders::kind_of_value_of_term(asch->pt0);
         st[1] = Calculus::Deferrals::Cinders::kind_of_value_of_term(asch->pt1);
    @@ -257,15 +257,15 @@ call in I6.
     

    §7. Problem message text.

    -int Calculus::QuasinumericRelations::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +int Calculus::QuasinumericRelations::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
         return FALSE;
     }
    -void Calculus::QuasinumericRelations::describe_for_index(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +void Calculus::QuasinumericRelations::describe_for_index(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
         WRITE("numeric");
     }
     
    diff --git a/docs/assertions-module/6-tap.html b/docs/assertions-module/7-tap.html similarity index 93% rename from docs/assertions-module/6-tap.html rename to docs/assertions-module/7-tap.html index c1cb5856f..5fb2a65a0 100644 --- a/docs/assertions-module/6-tap.html +++ b/docs/assertions-module/7-tap.html @@ -83,7 +83,7 @@ MathJax = {
    +

    To define the predicates connected to linguistic adjectives.

    §1.

    @@ -96,13 +96,13 @@ MathJax = {
     void AdjectivalPredicates::start(void) {
         adjectival_up_family = UnaryPredicateFamilies::new();
    -    METHOD_ADD(adjectival_up_family, TYPECHECK_UPF_MTID, AdjectivalPredicates::typecheck);
    -    METHOD_ADD(adjectival_up_family, INFER_KIND_UPF_MTID, AdjectivalPredicates::infer_kind);
    -    METHOD_ADD(adjectival_up_family, ASSERT_UPF_MTID, AdjectivalPredicates::assert);
    -    METHOD_ADD(adjectival_up_family, TESTABLE_UPF_MTID, AdjectivalPredicates::testable);
    -    METHOD_ADD(adjectival_up_family, TEST_UPF_MTID, AdjectivalPredicates::test);
    -    METHOD_ADD(adjectival_up_family, SCHEMA_UPF_MTID, AdjectivalPredicates::get_schema);
    -    METHOD_ADD(adjectival_up_family, LOG_UPF_MTID, AdjectivalPredicates::log);
    +    METHOD_ADD(adjectival_up_family, TYPECHECK_UPF_MTID, AdjectivalPredicates::typecheck);
    +    METHOD_ADD(adjectival_up_family, INFER_KIND_UPF_MTID, AdjectivalPredicates::infer_kind);
    +    METHOD_ADD(adjectival_up_family, ASSERT_UPF_MTID, AdjectivalPredicates::assert);
    +    METHOD_ADD(adjectival_up_family, TESTABLE_UPF_MTID, AdjectivalPredicates::testable);
    +    METHOD_ADD(adjectival_up_family, TEST_UPF_MTID, AdjectivalPredicates::test);
    +    METHOD_ADD(adjectival_up_family, SCHEMA_UPF_MTID, AdjectivalPredicates::get_schema);
    +    METHOD_ADD(adjectival_up_family, LOG_UPF_MTID, AdjectivalPredicates::log);
     }
     
     unary_predicate *AdjectivalPredicates::new_up(adjective *adj, int pos) {
    @@ -115,31 +115,31 @@ MathJax = {
     
     pcalc_prop *AdjectivalPredicates::new_atom(adjective *adj, int negated, pcalc_term t) {
         return Atoms::unary_PREDICATE_new(
    -        AdjectivalPredicates::new_up(adj, (negated)?FALSE:TRUE), t);
    +        AdjectivalPredicates::new_up(adj, (negated)?FALSE:TRUE), t);
     }
     
    -pcalc_prop *AdjectivalPredicates::new_atom_on_x(adjective *adj, int negated) {
    -    return AdjectivalPredicates::new_atom(adj, negated, Terms::new_variable(0));
    +pcalc_prop *AdjectivalPredicates::new_atom_on_x(adjective *adj, int negated) {
    +    return AdjectivalPredicates::new_atom(adj, negated, Terms::new_variable(0));
     }
     
     void AdjectivalPredicates::log(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
    -    if (AdjectivalPredicates::parity(up) == FALSE) WRITE("not-");
    -    wording W = Adjectives::get_nominative_singular(AdjectivalPredicates::to_adjective(up));
    +    if (AdjectivalPredicates::parity(up) == FALSE) WRITE("not-");
    +    wording W = Adjectives::get_nominative_singular(AdjectivalPredicates::to_adjective(up));
         WRITE("%W", W);
     }
     
     void AdjectivalPredicates::infer_kind(up_family *self, unary_predicate *up, kind **K) {
    -    adjective *adj = AdjectivalPredicates::to_adjective(up);
    -    adjective_meaning *am = AdjectiveAmbiguity::first_meaning(adj);
    -    kind *D = AdjectiveMeaningDomains::get_kind(am);
    +    adjective *adj = AdjectivalPredicates::to_adjective(up);
    +    adjective_meaning *am = AdjectiveAmbiguity::first_meaning(adj);
    +    kind *D = AdjectiveMeaningDomains::get_kind(am);
         if (D) *K = D;
     }
     
     int AdjectivalPredicates::typecheck(up_family *self, unary_predicate *up,
         pcalc_prop *prop, variable_type_assignment *vta, tc_problem_kit *tck) {
    -    adjective *adj = AdjectivalPredicates::to_adjective(up);
    +    adjective *adj = AdjectivalPredicates::to_adjective(up);
         kind *K = Propositions::Checker::kind_of_term(&(prop->terms[0]), vta, tck);
    -    if ((adj) && (AdjectiveAmbiguity::can_be_applied_to(adj, K) == FALSE)) {
    +    if ((adj) && (AdjectiveAmbiguity::can_be_applied_to(adj, K) == FALSE)) {
             wording W = Adjectives::get_nominative_singular(adj);
             if (tck->log_to_I6_text) LOG("Adjective '%W' undefined on %u\n", W, K);
             Propositions::Checker::problem(UnaryMisapplied_CALCERROR,
    @@ -157,11 +157,11 @@ success flag.
     

    -void AdjectivalPredicates::assert(up_family *self, unary_predicate *up,
    +void AdjectivalPredicates::assert(up_family *self, unary_predicate *up,
         int now_negated, pcalc_prop *pl) {
    -    adjective *adj = AdjectivalPredicates::to_adjective(up);
    +    adjective *adj = AdjectivalPredicates::to_adjective(up);
         int parity = (now_negated)?FALSE:TRUE, found;
    -    if (AdjectivalPredicates::parity(up) == FALSE) parity = (parity)?FALSE:TRUE;
    +    if (AdjectivalPredicates::parity(up) == FALSE) parity = (parity)?FALSE:TRUE;
         inference_subject *ox = Assert::subject_of_term(pl->terms[0]);
     
         parse_node *ots = Assert::spec_of_term(pl->terms[0]);
    @@ -180,24 +180,24 @@ success flag.
         if (domain_of_definition == NULL)
             domain_of_definition = Node::get_kind_of_value(ots);
     
    -    if (ox) found = AdjectiveAmbiguity::assert(adj, domain_of_definition, ox, NULL, parity);
    -    else found = AdjectiveAmbiguity::assert(adj, domain_of_definition, NULL, ots, parity);
    +    if (ox) found = AdjectiveAmbiguity::assert(adj, domain_of_definition, ox, NULL, parity);
    +    else found = AdjectiveAmbiguity::assert(adj, domain_of_definition, NULL, ots, parity);
     
         if (found == FALSE) Assert::issue_couldnt_problem(adj, parity);
     }
     
    -int AdjectivalPredicates::testable(up_family *self, unary_predicate *up) {
    -    adjective *adj = AdjectivalPredicates::to_adjective(up);
    -    property *prn = AdjectiveAmbiguity::has_either_or_property_meaning(adj, NULL);
    +int AdjectivalPredicates::testable(up_family *self, unary_predicate *up) {
    +    adjective *adj = AdjectivalPredicates::to_adjective(up);
    +    property *prn = AdjectiveAmbiguity::has_either_or_property_meaning(adj, NULL);
         if (prn == NULL) return FALSE;
         return TRUE;
     }
     
    -int AdjectivalPredicates::test(up_family *self, unary_predicate *up,
    +int AdjectivalPredicates::test(up_family *self, unary_predicate *up,
         TERM_DOMAIN_CALCULUS_TYPE *about) {
    -    adjective *adj = AdjectivalPredicates::to_adjective(up);
    -    int sense = AdjectivalPredicates::parity(up);
    -    property *prn = AdjectiveAmbiguity::has_either_or_property_meaning(adj, NULL);
    +    adjective *adj = AdjectivalPredicates::to_adjective(up);
    +    int sense = AdjectivalPredicates::parity(up);
    +    property *prn = AdjectiveAmbiguity::has_either_or_property_meaning(adj, NULL);
         if (prn) {
             possession_marker *adj = Properties::get_possession_marker(prn);
             if (sense) {
    @@ -210,26 +210,26 @@ success flag.
         return FALSE;
     }
     
    -void AdjectivalPredicates::get_schema(up_family *self, int task, unary_predicate *up,
    +void AdjectivalPredicates::get_schema(up_family *self, int task, unary_predicate *up,
         annotated_i6_schema *asch, kind *K) {
    -    adjective *adj = AdjectivalPredicates::to_adjective(up);
    +    adjective *adj = AdjectivalPredicates::to_adjective(up);
     
    -    if (AdjectivalPredicates::parity(up) == FALSE) asch->negate_schema = TRUE;
    +    if (AdjectivalPredicates::parity(up) == FALSE) asch->negate_schema = TRUE;
     
    -    asch->schema = AdjectiveAmbiguity::schema_for_task(adj, K, task);
    +    asch->schema = AdjectiveAmbiguity::schema_for_task(adj, K, task);
     }
     

    §4. Access:

    -adjective *AdjectivalPredicates::to_adjective(unary_predicate *up) {
    +adjective *AdjectivalPredicates::to_adjective(unary_predicate *up) {
         if (up == NULL) return NULL;
         if (up->family != adjectival_up_family) return NULL;
         return Adjectives::from_lcon(up->lcon);
     }
     
    -int AdjectivalPredicates::parity(unary_predicate *up) {
    +int AdjectivalPredicates::parity(unary_predicate *up) {
         if (up == NULL) internal_error("null adjective tested for positivity");
         if (up->family != adjectival_up_family) return TRUE;
         if (Lcon::get_sense(up->lcon) == NEGATIVE_SENSE) return FALSE;
    @@ -251,7 +251,7 @@ reverse its sense.
     }
     
    diff --git a/docs/assertions-module/6-tcp.html b/docs/assertions-module/7-tcp.html similarity index 94% rename from docs/assertions-module/6-tcp.html rename to docs/assertions-module/7-tcp.html index 0164a72d8..a8d56d2b8 100644 --- a/docs/assertions-module/6-tcp.html +++ b/docs/assertions-module/7-tcp.html @@ -69,10 +69,10 @@ function togglePopup(material_id) {
    +

    To define the predicates causing instances to be created.

    -
    +

    §1. This predicate plays a very special role in our calculus, and must always exist. @@ -94,23 +94,23 @@ family to handle its typechecking and so on.

     void CreationPredicates::start(void) {
         calling_up_family = UnaryPredicateFamilies::new();
    -    METHOD_ADD(calling_up_family, LOG_UPF_MTID, CreationPredicates::log_calling);
    +    METHOD_ADD(calling_up_family, LOG_UPF_MTID, CreationPredicates::log_calling);
         #ifdef CORE_MODULE
    -    METHOD_ADD(calling_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_calling);
    -    METHOD_ADD(calling_up_family, SCHEMA_UPF_MTID, CreationPredicates::schema_calling);
    +    METHOD_ADD(calling_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_calling);
    +    METHOD_ADD(calling_up_family, SCHEMA_UPF_MTID, CreationPredicates::schema_calling);
         #endif
         is_a_var_up_family = UnaryPredicateFamilies::new();
    -    METHOD_ADD(is_a_var_up_family, STOCK_UPF_MTID, CreationPredicates::stock_is_a_var);
    -    METHOD_ADD(is_a_var_up_family, LOG_UPF_MTID, CreationPredicates::log_is_a_var);
    +    METHOD_ADD(is_a_var_up_family, STOCK_UPF_MTID, CreationPredicates::stock_is_a_var);
    +    METHOD_ADD(is_a_var_up_family, LOG_UPF_MTID, CreationPredicates::log_is_a_var);
         is_a_const_up_family = UnaryPredicateFamilies::new();
    -    METHOD_ADD(is_a_const_up_family, STOCK_UPF_MTID, CreationPredicates::stock_is_a_const);
    -    METHOD_ADD(is_a_const_up_family, LOG_UPF_MTID, CreationPredicates::log_is_a_const);
    +    METHOD_ADD(is_a_const_up_family, STOCK_UPF_MTID, CreationPredicates::stock_is_a_const);
    +    METHOD_ADD(is_a_const_up_family, LOG_UPF_MTID, CreationPredicates::log_is_a_const);
         is_a_kind_up_family = UnaryPredicateFamilies::new();
    -    METHOD_ADD(is_a_kind_up_family, LOG_UPF_MTID, CreationPredicates::log_is_a_kind);
    +    METHOD_ADD(is_a_kind_up_family, LOG_UPF_MTID, CreationPredicates::log_is_a_kind);
         #ifdef CORE_MODULE
    -    METHOD_ADD(is_a_var_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_is_a_var);
    -    METHOD_ADD(is_a_const_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_is_a_const);
    -    METHOD_ADD(is_a_kind_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_is_a_kind);
    +    METHOD_ADD(is_a_var_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_is_a_var);
    +    METHOD_ADD(is_a_const_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_is_a_const);
    +    METHOD_ADD(is_a_kind_up_family, TYPECHECK_UPF_MTID, CreationPredicates::typecheck_is_a_kind);
         #endif
     }
     
    @@ -134,7 +134,7 @@ will be called.

    -int CreationPredicates::is_calling_up_atom(pcalc_prop *prop) {
    +int CreationPredicates::is_calling_up_atom(pcalc_prop *prop) {
         if ((prop->element == PREDICATE_ATOM) && (prop->arity == 1)) {
             unary_predicate *up = RETRIEVE_POINTER_unary_predicate(prop->predicate);
             if (up->family == calling_up_family) return TRUE;
    @@ -150,7 +150,7 @@ will be called.
         return NULL;
     }
     
    -pcalc_prop *CreationPredicates::calling_up(wording W, pcalc_term t, kind *K) {
    +pcalc_prop *CreationPredicates::calling_up(wording W, pcalc_term t, kind *K) {
         unary_predicate *up = UnaryPredicates::new(calling_up_family);
         up->calling_name = W;
         up->assert_kind = K;
    @@ -170,27 +170,27 @@ since (alone among binary predicates) it has no distinct reversal.
     

    -void CreationPredicates::stock_is_a_var(up_family *self, int n) {
    +void CreationPredicates::stock_is_a_var(up_family *self, int n) {
         if (n == 1) {
             is_a_var_up = UnaryPredicates::new(is_a_var_up_family);
         }
     }
     
    -void CreationPredicates::stock_is_a_const(up_family *self, int n) {
    +void CreationPredicates::stock_is_a_const(up_family *self, int n) {
         if (n == 1) {
             is_a_const_up = UnaryPredicates::new(is_a_const_up_family);
         }
     }
     
    -pcalc_prop *CreationPredicates::is_a_var_up(pcalc_term t) {
    +pcalc_prop *CreationPredicates::is_a_var_up(pcalc_term t) {
         return Atoms::unary_PREDICATE_new(is_a_var_up, t);
     }
     
    -pcalc_prop *CreationPredicates::is_a_const_up(pcalc_term t) {
    +pcalc_prop *CreationPredicates::is_a_const_up(pcalc_term t) {
         return Atoms::unary_PREDICATE_new(is_a_const_up, t);
     }
     
    -pcalc_prop *CreationPredicates::is_a_kind_up(pcalc_term t, kind *K) {
    +pcalc_prop *CreationPredicates::is_a_kind_up(pcalc_term t, kind *K) {
         unary_predicate *up = UnaryPredicates::new(is_a_kind_up_family);
         up->assert_kind = K;
         return Atoms::unary_PREDICATE_new(up, t);
    @@ -205,19 +205,19 @@ since (alone among binary predicates) it has no distinct reversal.
     }
     
     #ifdef CORE_MODULE
    -int CreationPredicates::typecheck_calling(up_family *self, unary_predicate *up,
    +int CreationPredicates::typecheck_calling(up_family *self, unary_predicate *up,
         pcalc_prop *prop, variable_type_assignment *vta, tc_problem_kit *tck) {
         return ALWAYS_MATCH;
     }
    -int CreationPredicates::typecheck_is_a_var(up_family *self, unary_predicate *up,
    +int CreationPredicates::typecheck_is_a_var(up_family *self, unary_predicate *up,
         pcalc_prop *prop, variable_type_assignment *vta, tc_problem_kit *tck) {
         return ALWAYS_MATCH;
     }
    -int CreationPredicates::typecheck_is_a_const(up_family *self, unary_predicate *up,
    +int CreationPredicates::typecheck_is_a_const(up_family *self, unary_predicate *up,
         pcalc_prop *prop, variable_type_assignment *vta, tc_problem_kit *tck) {
         return ALWAYS_MATCH;
     }
    -int CreationPredicates::typecheck_is_a_kind(up_family *self, unary_predicate *up,
    +int CreationPredicates::typecheck_is_a_kind(up_family *self, unary_predicate *up,
         pcalc_prop *prop, variable_type_assignment *vta, tc_problem_kit *tck) {
         kind *actually_find = Propositions::Checker::kind_of_term(&(prop->terms[0]), vta, tck);
         if (Kinds::compatible(actually_find, K_object) == NEVER_MATCH)
    @@ -239,7 +239,7 @@ to true.
     
     
     #ifdef CORE_MODULE
    -void CreationPredicates::schema_calling(up_family *self, int task, unary_predicate *up,
    +void CreationPredicates::schema_calling(up_family *self, int task, unary_predicate *up,
         annotated_i6_schema *asch, kind *K) {
         switch(task) {
             case TEST_ATOM_TASK:
    @@ -253,33 +253,33 @@ to true.
     }
     #endif
     
    -void CreationPredicates::log_calling(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
    +void CreationPredicates::log_calling(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
         WRITE("called='%W'", up->calling_name);
         if (up->assert_kind) WRITE(":%u", up->assert_kind);
     }
     
    -void CreationPredicates::log_is_a_var(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
    +void CreationPredicates::log_is_a_var(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
         WRITE("is-a-var");
     }
     
    -void CreationPredicates::log_is_a_const(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
    +void CreationPredicates::log_is_a_const(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
         WRITE("is-a-const");
     }
     
    -void CreationPredicates::log_is_a_kind(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
    +void CreationPredicates::log_is_a_kind(up_family *self, OUTPUT_STREAM, unary_predicate *up) {
         WRITE("is-a-kind");
         if (up->assert_kind) WRITE("=%u", up->assert_kind);
     }
     
     int CreationPredicates::contains_callings(pcalc_prop *prop) {
         for (pcalc_prop *p = prop; p; p = p->next)
    -        if (CreationPredicates::is_calling_up_atom(p))
    +        if (CreationPredicates::is_calling_up_atom(p))
                 return TRUE;
         return FALSE;
     }
     
    diff --git a/docs/assertions-module/6-terr.html b/docs/assertions-module/7-terr.html similarity index 95% rename from docs/assertions-module/6-terr.html rename to docs/assertions-module/7-terr.html index 5543051d0..70981d462 100644 --- a/docs/assertions-module/6-terr.html +++ b/docs/assertions-module/7-terr.html @@ -83,18 +83,18 @@ MathJax = {
    +

    To define how equality behaves in the Inform language.

    -
    +

    §1. Additional details.

     void EqualityDetails::start(void) {
    -    METHOD_ADD(equality_bp_family, TYPECHECK_BPF_MTID, EqualityDetails::typecheck);
    -    METHOD_ADD(equality_bp_family, ASSERT_BPF_MTID, EqualityDetails::assert);
    -    METHOD_ADD(equality_bp_family, SCHEMA_BPF_MTID, EqualityDetails::schema);
    +    METHOD_ADD(equality_bp_family, TYPECHECK_BPF_MTID, EqualityDetails::typecheck);
    +    METHOD_ADD(equality_bp_family, ASSERT_BPF_MTID, EqualityDetails::assert);
    +    METHOD_ADD(equality_bp_family, SCHEMA_BPF_MTID, EqualityDetails::schema);
     }
     

    §2. Typechecking. This is a very polymorphic relation, in that it can accept terms of almost @@ -102,7 +102,7 @@ any kind.

    -int EqualityDetails::typecheck(bp_family *self, binary_predicate *bp,
    +int EqualityDetails::typecheck(bp_family *self, binary_predicate *bp,
             kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
         LOGIF(MATCHING, "Typecheck %u '==' %u\n", kinds_of_terms[0], kinds_of_terms[1]);
         if ((K_understanding) && (Kinds::eq(kinds_of_terms[0], K_understanding)) &&
    @@ -120,7 +120,7 @@ any kind.
             return ALWAYS_MATCH;
         if ((Kinds::Behaviour::is_object(kinds_of_terms[0])) &&
             (Properties::can_name_coincide_with_kind(kinds_of_terms[1])))
    -        Apply rule for "is" applied to an object and a value2.1
    +        Apply rule for "is" applied to an object and a value2.1
         else if ((K_understanding) && (Kinds::eq(kinds_of_terms[1], K_understanding)) &&
                 (Kinds::eq(kinds_of_terms[0], K_snippet)))
             return ALWAYS_MATCH;
    @@ -131,7 +131,7 @@ any kind.
                 (Kinds::eq(kinds_of_terms[0], K_response)))
             return ALWAYS_MATCH;
         else
    -        Allow comparison only where left domain and right domain are not disjoint2.2;
    +        Allow comparison only where left domain and right domain are not disjoint2.2;
         return ALWAYS_MATCH;
     }
     
    @@ -158,7 +158,7 @@ for a fairly common mistake: return NEVER_MATCH; } -
    • This code is used in §2.
    +
    • This code is used in §2.

    §2.2. With comparisons there is no restriction on the two kinds except that they must match each other; \({\it is}(t, s)\) is allowed if \(K(t)\subseteq K(s)\) or vice versa. So rules and rulebooks are comparable, for instance, but numbers @@ -169,11 +169,11 @@ and scenes are not.

    -    if (EqualityDetails::both_terms_of_same_construction(kinds_of_terms[0], kinds_of_terms[1], CON_rule))
    +    if (EqualityDetails::both_terms_of_same_construction(kinds_of_terms[0], kinds_of_terms[1], CON_rule))
             return ALWAYS_MATCH;
    -    if (EqualityDetails::both_terms_of_same_construction(kinds_of_terms[0], kinds_of_terms[1], CON_rulebook))
    +    if (EqualityDetails::both_terms_of_same_construction(kinds_of_terms[0], kinds_of_terms[1], CON_rulebook))
             return ALWAYS_MATCH;
    -    if (EqualityDetails::both_terms_of_same_construction(kinds_of_terms[0], kinds_of_terms[1], CON_activity))
    +    if (EqualityDetails::both_terms_of_same_construction(kinds_of_terms[0], kinds_of_terms[1], CON_activity))
             return ALWAYS_MATCH;
         if ((Kinds::compatible(kinds_of_terms[0], kinds_of_terms[1]) == NEVER_MATCH) &&
             (Kinds::compatible(kinds_of_terms[1], kinds_of_terms[0]) == NEVER_MATCH)) {
    @@ -182,11 +182,11 @@ and scenes are not.
             return NEVER_MATCH_SAYING_WHY_NOT;
         }
     
    -
    • This code is used in §2.
    +
    • This code is used in §2.

    §3.

    -int EqualityDetails::both_terms_of_same_construction(kind *k0, kind *k1, kind_constructor *cons) {
    +int EqualityDetails::both_terms_of_same_construction(kind *k0, kind *k1, kind_constructor *cons) {
         if ((Kinds::get_construct(k0) == cons) && (Kinds::get_construct(k1) == cons))
             return TRUE;
         return FALSE;
    @@ -197,7 +197,7 @@ setting a global variable.
     

    -int EqualityDetails::assert(bp_family *self, binary_predicate *bp,
    +int EqualityDetails::assert(bp_family *self, binary_predicate *bp,
             inference_subject *infs0, parse_node *spec0,
             inference_subject *infs1, parse_node *spec1) {
         if (Lvalues::is_actual_NONLOCAL_VARIABLE(spec0)) {
    @@ -259,17 +259,17 @@ of both A and B.
     

    -int EqualityDetails::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
    +int EqualityDetails::schema(bp_family *self, int task, binary_predicate *bp, annotated_i6_schema *asch) {
         kind *st[2];
         st[0] = Calculus::Deferrals::Cinders::kind_of_value_of_term(asch->pt0);
         st[1] = Calculus::Deferrals::Cinders::kind_of_value_of_term(asch->pt1);
     
         if ((Kinds::Behaviour::is_object(st[0])) &&
             (Properties::can_name_coincide_with_kind(st[1])) && (Properties::property_with_same_name_as(st[1])))
    -        Handle the case of setting a property of A separately5.1;
    +        Handle the case of setting a property of A separately5.1;
     
         if ((Kinds::eq(st[0], K_response)) && (Kinds::eq(st[1], K_text)))
    -        Handle the case of setting a response separately5.2;
    +        Handle the case of setting a response separately5.2;
     
         switch (task) {
             case TEST_ATOM_TASK:
    @@ -291,15 +291,15 @@ of both A and B.
                 if ((storage_class == UNKNOWN_NT) &&
                     (Kinds::get_construct(st[0]) == CON_property))
                     storage_class = PROPERTY_VALUE_NT;
    -            Make a further check that kinds permit this assignment5.4;
    +            Make a further check that kinds permit this assignment5.4;
                 if (storage_class == UNKNOWN_NT) {
    -                Issue problem message for being unable to set equal5.5
    +                Issue problem message for being unable to set equal5.5
                     asch->schema = NULL;
                 } else {
    -                Exceptional case of setting the "player" global variable5.3;
    +                Exceptional case of setting the "player" global variable5.3;
                     Calculus::Schemas::modify(asch->schema, "%s",
                         Lvalues::interpret_store(storage_class, st[0], st[1], 0));
    -                Add kind-checking code for run-time checking5.6;
    +                Add kind-checking code for run-time checking5.6;
                 }
                 return TRUE;
             }
    @@ -337,7 +337,7 @@ lantern is bright".
         }
         return FALSE;
     
    -
    • This code is used in §5.
    +
    • This code is used in §5.

    §5.2. Handle the case of setting a response separately5.2 =

    @@ -357,7 +357,7 @@ lantern is bright". } return FALSE;
    -
    • This code is used in §5.
    +
    • This code is used in §5.

    §5.3. A little bit of support within Inform to help the template layer.

    @@ -377,7 +377,7 @@ lantern is bright". return TRUE; }
    -
    • This code is used in §5.
    +
    • This code is used in §5.

    §5.4. Make a further check that kinds permit this assignment5.4 =

    @@ -400,7 +400,7 @@ lantern is bright". } } -
    • This code is used in §5.
    +
    • This code is used in §5.

    §5.5. Rather than just returning FALSE for a generic problem message, we issue one that's more helpfully specific and return TRUE.

    @@ -426,7 +426,7 @@ one that's more helpfully specific and return "just as the number '7' is fixed."); } -
    • This code is used in §5.
    +
    • This code is used in §5.

    §5.6. Add kind-checking code for run-time checking5.6 =

    @@ -443,9 +443,9 @@ one that's more helpfully specific and return DISCARD_TEXT(TEMP) } -
    • This code is used in §5.
    +
    • This code is used in §5.
    diff --git a/docs/assertions-module/6-tur.html b/docs/assertions-module/7-tur.html similarity index 94% rename from docs/assertions-module/6-tur.html rename to docs/assertions-module/7-tur.html index 4150d6e77..eb0786e90 100644 --- a/docs/assertions-module/6-tur.html +++ b/docs/assertions-module/7-tur.html @@ -69,10 +69,10 @@ function togglePopup(material_id) {
    +

    To define the universal relation, which can apply and therefore subsumes all other relations.

    -
    +

    §1. Definitions.

    @@ -89,18 +89,18 @@ function togglePopup(material_id) { void Relations::Universal::start(void) { universal_bp_family = BinaryPredicateFamilies::new(); - METHOD_ADD(universal_bp_family, STOCK_BPF_MTID, Relations::Universal::stock); - METHOD_ADD(universal_bp_family, TYPECHECK_BPF_MTID, Relations::Universal::typecheck); - METHOD_ADD(universal_bp_family, ASSERT_BPF_MTID, Relations::Universal::assert); - METHOD_ADD(universal_bp_family, SCHEMA_BPF_MTID, Relations::Universal::schema); - METHOD_ADD(universal_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Relations::Universal::describe_for_problems); + METHOD_ADD(universal_bp_family, STOCK_BPF_MTID, Relations::Universal::stock); + METHOD_ADD(universal_bp_family, TYPECHECK_BPF_MTID, Relations::Universal::typecheck); + METHOD_ADD(universal_bp_family, ASSERT_BPF_MTID, Relations::Universal::assert); + METHOD_ADD(universal_bp_family, SCHEMA_BPF_MTID, Relations::Universal::schema); + METHOD_ADD(universal_bp_family, DESCRIBE_FOR_PROBLEMS_BPF_MTID, Relations::Universal::describe_for_problems); }

    §3. Initial stock. There are just two relations of this kind, and both are hard-wired in.

    -void Relations::Universal::stock(bp_family *self, int n) {
    +void Relations::Universal::stock(bp_family *self, int n) {
         if (n == 1) {
             R_universal =
                 BinaryPredicates::make_pair(universal_bp_family,
    @@ -119,7 +119,7 @@ function togglePopup(material_id) {
     

    -int Relations::Universal::typecheck(bp_family *self, binary_predicate *bp,
    +int Relations::Universal::typecheck(bp_family *self, binary_predicate *bp,
         kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
         if (bp == R_meaning) {
             if (Kinds::eq(kinds_of_terms[0], K_verb) == FALSE) {
    @@ -184,7 +184,7 @@ function togglePopup(material_id) {
     

    -int Relations::Universal::assert(bp_family *self, binary_predicate *bp,
    +int Relations::Universal::assert(bp_family *self, binary_predicate *bp,
             inference_subject *infs0, parse_node *spec0,
             inference_subject *infs1, parse_node *spec1) {
         return FALSE;
    @@ -195,7 +195,7 @@ can't be changed at compile time, but the universal relation can.
     

    -int Relations::Universal::schema(bp_family *self, int task, binary_predicate *bp,
    +int Relations::Universal::schema(bp_family *self, int task, binary_predicate *bp,
         annotated_i6_schema *asch) {
         if (bp == R_meaning) {
             switch(task) {
    @@ -223,12 +223,12 @@ can't be changed at compile time, but the universal relation can.
     

    -int Relations::Universal::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
    +int Relations::Universal::describe_for_problems(bp_family *self, OUTPUT_STREAM, binary_predicate *bp) {
         return FALSE;
     }
     
    diff --git a/docs/assertions-module/P-wtmd.html b/docs/assertions-module/P-wtmd.html index 180d924a9..e96892a99 100644 --- a/docs/assertions-module/P-wtmd.html +++ b/docs/assertions-module/P-wtmd.html @@ -216,13 +216,13 @@ usually wearable" do not immediately lead to propositions being drawn up.

    §6. Other gadgets. At the top level, Inform source text consists of more than just assertion sentences. Rules and phrases are left to imperative to look after, but we -will take care of Tables (and their Table Columns) here, along with -the quirkier inclusion of Equations. +will take care of Tables (and their Table Columns) here, along with +the quirkier inclusion of Equations.

    -

    §7. Making use of the calculus module. Chapter 5: Other Gadgets simply stocks up our predicate calculus system with some +

    §7. Making use of the calculus module. Chapter 5: Imperative Code simply stocks up our predicate calculus system with some basic unary and binary predicates, and provides a few shorthand functions -to make commonly-needed propositions (see Calculus Utilities). +to make commonly-needed propositions (see Calculus Utilities).

    More specialised predicates will also be added by other modules, so the @@ -230,7 +230,7 @@ roster here is not complete, but these are the essentials.

    diff --git a/docs/assertions-module/index.html b/docs/assertions-module/index.html index af5c5b091..6cbae96d3 100644 --- a/docs/assertions-module/index.html +++ b/docs/assertions-module/index.html @@ -252,88 +252,115 @@
  • - Chapter 5: Other Gadgets

    + Chapter 5: Imperative Code

    +

    What happens to preambles, colons, and blocks of imperative code.

    + +
  • +
  • +

    + Chapter 6: Other Gadgets

    Tables and equations do not look like sentences, but are also top-level.

    • -

      +

      Table Columns - To manage the named columns which appear in tables.

    • -

      +

      Tables - To manage and compile tables, which are two-dimensional arrays with associative look-up facilities provided at run-time.

    • -

      +

      Equations - To manage and compile equations, which relate numerical quantities.

  • -

    - Chapter 6: Predicates

    +

    + Chapter 7: Predicates

    Unary and then binary predicates for the calculus module to conjure with.

    • -

      +

      Kind Predicates Revisited - To define how the kind predicates behave in the Inform language.

    • -

      +

      The Adjectival Predicates - To define the predicates connected to linguistic adjectives.

    • -

      +

      The Creation Predicates - To define the predicates causing instances to be created.

    • -

      +

      The Equality Relation Revisited - To define how equality behaves in the Inform language.

    • -

      +

      Quasinumeric Relations - To define the binary predicates corresponding to numerical comparisons.

    • -

      +

      The Universal Relation - To define the universal relation, which can apply and therefore subsumes all other relations.

    • -

      +

      Explicit Relations - To draw inferences from the relations created explicitly by the source text.

    • -

      +

      Listed-In Relations - To define the binary predicates corresponding to table columns, and which determine whether a given value is listed in that column.

    • -

      +

      Adjective Ambiguity - Managing the multiple contextual meanings which a single adjective can have.

    • -

      +

      Adjective Meanings - One individual meaning which an adjective can have.

    • -

      +

      Adjective Meaning Domains - What a single sense of an adjective can apply to: perhaps a kind or an instance.

    • -

      +

      Calculus Utilities - Utility functions for creating basic propositions using these predicates.

    • diff --git a/docs/core-module/1-cp.html b/docs/core-module/1-cp.html index f67ebe978..11f952e64 100644 --- a/docs/core-module/1-cp.html +++ b/docs/core-module/1-cp.html @@ -95,9 +95,11 @@ We begin with core itself. enum imperative_defn_family_CLASS enum implication_CLASS enum relation_guard_CLASS +enum rule_family_data_CLASS enum table_CLASS enum table_column_CLASS enum table_contribution_CLASS +enum to_family_data_CLASS enum use_option_CLASS
      @@ -113,9 +115,11 @@ We begin with core itself.
       DECLARE_CLASS(imperative_defn_family)
       DECLARE_CLASS(implication)
       DECLARE_CLASS(relation_guard)
      +DECLARE_CLASS(rule_family_data)
       DECLARE_CLASS(table)
       DECLARE_CLASS(table_column)
       DECLARE_CLASS_ALLOCATED_IN_ARRAYS(table_contribution, 100)
      +DECLARE_CLASS(to_family_data)
       DECLARE_CLASS(use_option)
       

      §3. values — diff --git a/docs/core-module/3-pc.html b/docs/core-module/3-pc.html index 0b22f4273..e288f3794 100644 --- a/docs/core-module/3-pc.html +++ b/docs/core-module/3-pc.html @@ -260,7 +260,7 @@ this to spot that a sentence will create a new direction. PLUGINS_CALL(NEW_ASSERTION_NOTIFY_PLUG, p); } -

      §14. Called from The Equality Relation Revisited (in assertions) when we have +

      §14. Called from The Equality Relation Revisited (in assertions) when we have to decide if it's valid to ask or declare that two things are the same. Returning TRUE says that it is always valid; returning FALSE leaves it to the regular machinery. This plug can therefore only be used to permit diff --git a/docs/imperative-module/1-im.html b/docs/imperative-module/1-im.html index bacc6b2fe..f0dff5605 100644 --- a/docs/imperative-module/1-im.html +++ b/docs/imperative-module/1-im.html @@ -89,7 +89,7 @@ which use this module: COMPILE_WRITER(ph_type_data *, Phrases::TypeData::Textual::log) COMPILE_WRITER(local_variable *, LocalVariables::log) COMPILE_WRITER(phrase *, Phrases::log) -COMPILE_WRITER(ph_usage_data *, Phrases::Usage::log) +COMPILE_WRITER(ph_usage_data *, Phrases::Usage::log) void ImperativeModule::start(void) { Writers::register_writer('L', &LocalVariables::writer); @@ -98,7 +98,7 @@ which use this module: REGISTER_WRITER('h', Phrases::TypeData::Textual::log); REGISTER_WRITER('k', LocalVariables::log); REGISTER_WRITER('R', Phrases::log); - REGISTER_WRITER('U', Phrases::Usage::log); + REGISTER_WRITER('U', Phrases::Usage::log); Memory::reason_name(INV_LIST_MREASON, "lists for type-checking invocations"); Log::declare_aspect(DESCRIPTION_COMPILATION_DA, L"description compilation", FALSE, FALSE); Log::declare_aspect(EXPRESSIONS_DA, L"expressions", FALSE, FALSE); diff --git a/docs/imperative-module/2-bl.html b/docs/imperative-module/2-bl.html index 0a545bdd0..3526dbd7e 100644 --- a/docs/imperative-module/2-bl.html +++ b/docs/imperative-module/2-bl.html @@ -404,8 +404,8 @@ BEFORE a FIRST one.) int BookingLists::is_contextually_empty(booking_list *L, rule_context rc) { LOOP_OVER_BOOKINGS(br, L) { - imperative_defn *id = Rules::get_imperative_definition(RuleBookings::get_rule(br)); - if ((id) && (Phrases::Context::phrase_fits_rule_context(id->defines, rc))) + imperative_defn *id = Rules::get_imperative_definition(RuleBookings::get_rule(br)); + if ((id) && (Phrases::Context::phrase_fits_rule_context(id->defines, rc))) return FALSE; } return TRUE; @@ -432,8 +432,8 @@ BEFORE a FIRST one.) int BookingLists::contains_ph(booking_list *L, phrase *ph_to_find) { LOOP_OVER_BOOKINGS(br, L) { - imperative_defn *id = Rules::get_imperative_definition(RuleBookings::get_rule(br)); - if ((id) && (id->defines == ph_to_find)) + imperative_defn *id = Rules::get_imperative_definition(RuleBookings::get_rule(br)); + if ((id) && (id->defines == ph_to_find)) return TRUE; } return FALSE; diff --git a/docs/imperative-module/2-rb.html b/docs/imperative-module/2-rb.html index 51288244e..2141789b9 100644 --- a/docs/imperative-module/2-rb.html +++ b/docs/imperative-module/2-rb.html @@ -167,20 +167,20 @@ the rulebook; instead, the booking is marked for automatic placement later on.

      -void RuleBookings::make_automatic_placements(void) {
      +void RuleBookings::make_automatic_placements(void) {
           booking *br;
           LOOP_OVER(br, booking)
               if (br->place_automatically) {
      -            imperative_defn *id = Rules::get_imperative_definition(br->rule_being_booked);
      +            imperative_defn *id = Rules::get_imperative_definition(br->rule_being_booked);
                   if (id) {
      -                current_sentence = id->at;
      +                current_sentence = id->at;
                       phrase *ph = id->defines;
      -                rulebook *original_owner = Phrases::Usage::get_rulebook(&(ph->usage_data));
      -                int placement = Phrases::Usage::get_rulebook_placement(&(ph->usage_data));
      +                rulebook *original_owner = Phrases::Usage::get_rulebook(&(ph->usage_data));
      +                int placement = Phrases::Usage::get_rulebook_placement(&(ph->usage_data));
                       rulebook *owner = original_owner;
                       PluginCalls::place_rule(br->rule_being_booked, original_owner, &owner);
                       if (owner != original_owner) {
      -                    Phrases::Usage::set_rulebook(&(ph->usage_data), owner);
      +                    Phrases::Usage::set_rulebook(&(ph->usage_data), owner);
                           LOGIF(RULE_ATTACHMENTS, "Rerouting $b: $K --> $K\n",
                               br, original_owner, owner);
                       }
      @@ -199,7 +199,7 @@ than br1, or 0
       

      -int RuleBookings::cmp(booking *br1, booking *br2, int log_this) {
      +int RuleBookings::cmp(booking *br1, booking *br2, int log_this) {
           if ((br1 == NULL) || (br2 == NULL)) internal_error("compared null specificity");
           if (log_this) LOG("Comparing specificity of rules:\n(1) $b\n(2) $b\n", br1, br2);
           return Rules::cmp(br1->rule_being_booked, br2->rule_being_booked, log_this);
      @@ -218,7 +218,7 @@ is used only for code comments and the index.
           struct text_stream *law_applied;  name of Law used to sort
       } booking_commentary;
       
      -booking_commentary RuleBookings::new_commentary(void) {
      +booking_commentary RuleBookings::new_commentary(void) {
           booking_commentary bc;
           bc.next_rule_specificity = 0;
           bc.tooltip_text = NULL;
      @@ -226,7 +226,7 @@ is used only for code comments and the index.
           return bc;
       }
       
      -void RuleBookings::comment(OUTPUT_STREAM, booking *br) {
      +void RuleBookings::comment(OUTPUT_STREAM, booking *br) {
           text_stream *law = br->commentary.law_applied;
           switch(br->commentary.next_rule_specificity) {
               case -1: WRITE("  <<< %S <<<", law); break;
      diff --git a/docs/imperative-module/2-rlb.html b/docs/imperative-module/2-rlb.html
      index 2bd016ece..6398dec60 100644
      --- a/docs/imperative-module/2-rlb.html
      +++ b/docs/imperative-module/2-rlb.html
      @@ -242,12 +242,12 @@ being analogous to a function \(X\to Y\).
       

      -int Rulebooks::action_focus(rulebook *B) {
      +int Rulebooks::action_focus(rulebook *B) {
           if (B) return FocusAndOutcome::action_focus(&(B->my_focus));
           return FALSE;
       }
       
      -kind *Rulebooks::get_focus_kind(rulebook *B) {
      +kind *Rulebooks::get_focus_kind(rulebook *B) {
           return FocusAndOutcome::get_focus_parameter_kind(&(B->my_focus));
       }
       
      @@ -409,7 +409,7 @@ that action are automatically created, and similarly for activities and scenes.
           return BookingLists::first(B->contents);
       }
       
      -int Rulebooks::runs_during_activities(rulebook *B) {
      +int Rulebooks::runs_during_activities(rulebook *B) {
           return B->runs_during_activities;
       }
       
      @@ -436,7 +436,7 @@ It marks a rulebook as definitely needing to check the actor.

      -void Rulebooks::log_name_only(rulebook *B) {
      +void Rulebooks::log_name_only(rulebook *B) {
           LOG("Rulebook %d (%W)", B->allocation_id, B->primary_name);
       }
       
      diff --git a/docs/imperative-module/2-rls.html b/docs/imperative-module/2-rls.html
      index 392a700f8..59ce6a2c2 100644
      --- a/docs/imperative-module/2-rls.html
      +++ b/docs/imperative-module/2-rls.html
      @@ -108,7 +108,7 @@ different dynamics altogether. In short, then: rules are not phrases.
           struct kind *kind_of_rule;  determined from its rulebook(s)
           struct rulebook *kind_of_rule_set_from;
       
      -    struct imperative_defn *defn_as_I7_source;  if defined by an I7 phrase
      +    struct imperative_defn *defn_as_I7_source;  if defined by an I7 phrase
           struct stacked_variable_owner_list *variables_visible_in_definition;  if so
           struct text_stream *defn_as_Inter_function;  if not
       
      @@ -145,7 +145,7 @@ rule called W,
       

      -rule *Rules::obtain(wording W, int allow_responses) {
      +rule *Rules::obtain(wording W, int allow_responses) {
           if (Wordings::nonempty(W)) {
               W = Articles::remove_the(W);
               rule *R = Rules::by_name(W);
      @@ -182,7 +182,7 @@ rule called W,
       
       
       int PM_RuleWithComma_issued_at = -1;
      -int Rules::vet_name(wording W) {
      +int Rules::vet_name(wording W) {
           if (<unsuitable-name>(W)) {
               if (PM_RuleWithComma_issued_at != Wordings::first_wn(W)) {
                   PM_RuleWithComma_issued_at = Wordings::first_wn(W);
      @@ -318,11 +318,11 @@ of a phrase as follows:
       

      -void Rules::set_imperative_definition(rule *R, imperative_defn *id) {
      +void Rules::set_imperative_definition(rule *R, imperative_defn *id) {
           R->defn_as_I7_source = id;
       }
       
      -imperative_defn *Rules::get_imperative_definition(rule *R) {
      +imperative_defn *Rules::get_imperative_definition(rule *R) {
           if (R == NULL) return NULL;
           return R->defn_as_I7_source;
       }
      @@ -348,7 +348,7 @@ the variables belonging to that activity.
       
       struct stacked_variable_owner_list *all_action_processing_vars = NULL;
       
      -stacked_variable_owner_list *Rules::all_action_processing_variables(void) {
      +stacked_variable_owner_list *Rules::all_action_processing_variables(void) {
           if (all_action_processing_vars == NULL) {
               rulebook *B = Rulebooks::std(ACTION_PROCESSING_RB);
               if (B) all_action_processing_vars =
      @@ -387,7 +387,7 @@ is wording which should contain just the double-quoted function name.
           if (R == NULL) { LOG("<null-rule>"); return; }
           if (Wordings::nonempty(R->name)) LOG("['%W':", R->name); else LOG("[");
           if (R->defn_as_I7_source)
      -        LOG("$R]", R->defn_as_I7_source->defines);
      +        LOG("$R]", R->defn_as_I7_source->defines);
           else if (Str::len(R->defn_as_Inter_function) > 0)
               LOG("%S]", R->defn_as_Inter_function);
           else
      @@ -429,10 +429,10 @@ than R1, or 0 i
       
       
       int Rules::cmp(rule *R1, rule *R2, int log_this) {
      -    imperative_defn *id1 = R1->defn_as_I7_source, *id2 = R2->defn_as_I7_source;
      +    imperative_defn *id1 = R1->defn_as_I7_source, *id2 = R2->defn_as_I7_source;
           ph_runtime_context_data *phrcd1 = NULL, *phrcd2 = NULL;
      -    if (id1) phrcd1 = &(id1->defines->runtime_context_data);
      -    if (id2) phrcd2 = &(id2->defines->runtime_context_data);
      +    if (id1) phrcd1 = &(id1->defines->runtime_context_data);
      +    if (id2) phrcd2 = &(id2->defines->runtime_context_data);
           int rv = Phrases::Context::compare_specificity(phrcd1, phrcd2);
           if (log_this) {
               if (rv != 0) LOG("Decided by Law %S that ", c_s_stage_law);
      @@ -551,7 +551,7 @@ of another.
       

      -void Rules::request_automatic_placement(rule *R) {
      +void Rules::request_automatic_placement(rule *R) {
           if (R->automatic_booking == NULL)
               R->automatic_booking = RuleBookings::new(R);
           RuleBookings::request_automatic_placement(R->automatic_booking);
      @@ -562,30 +562,30 @@ it's possible to change the way that applicability testing is done.
       

      -void Rules::set_always_test_actor(rule *R) {
      +void Rules::set_always_test_actor(rule *R) {
           if (R->defn_as_I7_source) {
      -        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
      +        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
               Phrases::Context::set_always_test_actor(phrcd);
           }
       }
       
      -void Rules::set_never_test_actor(rule *R) {
      +void Rules::set_never_test_actor(rule *R) {
           if (R->defn_as_I7_source) {
      -        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
      +        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
               Phrases::Context::set_never_test_actor(phrcd);
           }
       }
       
       void Rules::set_marked_for_anyone(rule *R, int to) {
           if (R->defn_as_I7_source) {
      -        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
      +        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
               Phrases::Context::set_marked_for_anyone(phrcd, to);
           }
       }
       
       void Rules::suppress_action_testing(rule *R) {
           if (R->defn_as_I7_source) {
      -        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
      +        ph_runtime_context_data *phrcd = &(R->defn_as_I7_source->defines->runtime_context_data);
               Phrases::Context::suppress_action_testing(phrcd);
           }
       }
      @@ -595,10 +595,10 @@ it's possible to change the way that applicability testing is done.
       
           ph_runtime_context_data *phrcd_from = NULL;
           if (R_from->defn_as_I7_source)
      -        phrcd_from = &(R_from->defn_as_I7_source->defines->runtime_context_data);
      +        phrcd_from = &(R_from->defn_as_I7_source->defines->runtime_context_data);
           ph_runtime_context_data *phrcd_to = NULL;
           if (R_to->defn_as_I7_source)
      -        phrcd_to = &(R_to->defn_as_I7_source->defines->runtime_context_data);
      +        phrcd_to = &(R_to->defn_as_I7_source->defines->runtime_context_data);
       
           if (phrcd_to) {
               if ((phrcd_from == NULL) ||
      @@ -631,7 +631,7 @@ possibility we store one of these:
           struct wording content;
       } rule_response;
       
      -rule_response Rules::new_rule_response(void) {
      +rule_response Rules::new_rule_response(void) {
           rule_response rr;
           rr.message = NULL;
           rr.used = NULL;
      diff --git a/docs/imperative-module/3-dptd.html b/docs/imperative-module/3-dptd.html
      index 2787e3b46..c0475de5a 100644
      --- a/docs/imperative-module/3-dptd.html
      +++ b/docs/imperative-module/3-dptd.html
      @@ -310,7 +310,7 @@ match is shown.
                   Index::DocReferences::link_to(OUT, pds, -1);
                   DISCARD_TEXT(pds)
               } else
      -            Index::link_to(OUT, Wordings::first_wn(Node::get_text(ph->from->at)), FALSE);
      +            Index::link_to(OUT, Wordings::first_wn(Node::get_text(ph->from->at)), FALSE);
               WRITE(" ");
               Phrases::TypeData::Textual::write_HTML_representation(OUT, phtd, INDEX_PHRASE_FORMAT, inv);
               WRITE(" ");
      @@ -337,7 +337,7 @@ match is shown.
               if (Kinds::Behaviour::definite(phtd->return_kind) == FALSE) WRITE("value");
               else Kinds::Textual::write(OUT, phtd->return_kind);
               WRITE("</i>");
      -        wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
      +        wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
               if (Wordings::nonempty(W)) {
                   WRITE("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>y</i>&nbsp;=&nbsp;<b>%+W</b>(<i>x</i>)", W);
               }
      @@ -397,7 +397,7 @@ of course.
       

      -    wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
      +    wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
           if (Wordings::nonempty(W)) {
               HTML_CLOSE("p");
               HTML_OPEN("p");
      @@ -729,7 +729,10 @@ haven't yet been parsed, so that we don't yet know it will be meaningful.
                   case TO_RANN:  mor = DECIDES_NOTHING_MOR; break;
               }
               if (mor >= 0) Phrases::TypeData::set_mor(phtd, mor, K);
      -    } else internal_error("to phrase without to");
      +    } else {
      +        WRITE_TO(STDERR, "XW = %W\n", XW);
      +        internal_error("to phrase without to");
      +    }
           if (Kinds::eq(phtd->return_kind, K_truth_state)) {
               if (no_truth_state_returns++ > 0)
               StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TruthStateToDecide),
      @@ -1233,7 +1236,7 @@ in exactly one place: for example,
       
      • This code is used in §21.
      diff --git a/docs/imperative-module/3-id.html b/docs/imperative-module/3-id.html deleted file mode 100644 index 149a19fc1..000000000 --- a/docs/imperative-module/3-id.html +++ /dev/null @@ -1,603 +0,0 @@ - - - - Imperative Definitions - - - - - - - - - - - - - - - - - - - -
      - - -

      Each IMPERATIVE node in the syntax tree makes a definition of a phrase or rule.

      - -

      §1. When this function starts, the tree contains a number of top-level IMPERATIVE_NT -nodes with INVOCATION_LIST_NT nodes hanging from them, but we haven't looked at -any of the text in the IMPERATIVE_NT head nodes and therefore we have no idea what -they define. Some will be rules, some will define To... phrases, and so on. -

      - -
      -typedef struct imperative_defn {
      -    struct imperative_defn_family *family;
      -    struct parse_node *at;
      -    struct phrase *defines;
      -    CLASS_DEFINITION
      -} imperative_defn;
      -
      -typedef struct imperative_defn_family {
      -    struct text_stream *family_name;
      -    struct method_set *methods;
      -    CLASS_DEFINITION
      -} imperative_defn_family;
      -
      -imperative_defn_family *AS_YET_UNKNOWN_EFF_family = NULL;  used only temporarily
      -imperative_defn_family *DEFINITIONAL_PHRASE_EFF_family = NULL;  "Definition: a container is roomy if: ..."
      -imperative_defn_family *RULE_NOT_IN_RULEBOOK_EFF_family = NULL;  "At 9 PM: ...", "This is the zap rule: ..."
      -imperative_defn_family *TO_PHRASE_EFF_family = NULL;  "To award (some - number) points: ..."
      -imperative_defn_family *RULE_IN_RULEBOOK_EFF_family = NULL;  "Before taking a container, ..."
      -
      -imperative_defn_family *ImperativeDefinitions::new_family(text_stream *name) {
      -    imperative_defn_family *family = CREATE(imperative_defn_family);
      -    family->family_name = Str::duplicate(name);
      -    family->methods = Methods::new_set();
      -    return family;
      -}
      -
      -
      • The structure imperative_defn is accessed in 2/rls, 2/rb, 2/bl, 3/phr, 3/pu, 3/prcd, 3/dptd, 3/tph, 3/tp, 6/cii, 6/cp and here.
      • The structure imperative_defn_family is accessed in 3/pu and here.
      -

      §2. CLAIM_IMP_DEFN_MTID is for deciding from the syntax of a preamble whether -this definition should belong to the family or not. -

      - -
      enum CLAIM_IMP_DEFN_MTID
      -
      -
      -VOID_METHOD_TYPE(CLAIM_IMP_DEFN_MTID, imperative_defn_family *f, imperative_defn *id)
      -
      -void ImperativeDefinitions::identify(imperative_defn *id) {
      -    imperative_defn_family *f;
      -    LOOP_OVER(f, imperative_defn_family)
      -        if (id->family == AS_YET_UNKNOWN_EFF_family)
      -            VOID_METHOD_CALL(f, CLAIM_IMP_DEFN_MTID, id);
      -}
      -
      -

      §3.

      - -
      -void ImperativeDefinitions::create_families(void) {
      -    AS_YET_UNKNOWN_EFF_family       = ImperativeDefinitions::new_family(I"AS_YET_UNKNOWN_EFF");
      -
      -    DEFINITIONAL_PHRASE_EFF_family  = ImperativeDefinitions::new_family(I"DEFINITIONAL_PHRASE_EFF");
      -    METHOD_ADD(DEFINITIONAL_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::Defn_claim);
      -
      -    RULE_NOT_IN_RULEBOOK_EFF_family = ImperativeDefinitions::new_family(I"RULE_NOT_IN_RULEBOOK_EFF");
      -    METHOD_ADD(RULE_NOT_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::RNIR_claim);
      -
      -    TO_PHRASE_EFF_family            = ImperativeDefinitions::new_family(I"TO_PHRASE_EFF");
      -    METHOD_ADD(TO_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::To_claim);
      -
      -    RULE_IN_RULEBOOK_EFF_family     = ImperativeDefinitions::new_family(I"RULE_IN_RULEBOOK_EFF");
      -    METHOD_ADD(RULE_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::RIR_claim);
      -}
      -
      -

      §4.

      - -
      -<definition-preamble> ::=
      -    definition                                                ==> { -, DEFINITIONAL_PHRASE_EFF_family }
      -
      - -

      §5.

      - -
      -void ImperativeDefinitions::Defn_claim(imperative_defn_family *self, imperative_defn *id) {
      -    wording W = Node::get_text(id->at);
      -    if (<definition-preamble>(W)) {
      -        id->family = DEFINITIONAL_PHRASE_EFF_family;
      -        if ((id->at->next) && (id->at->down == NULL) &&
      -            (Node::get_type(id->at->next) == IMPERATIVE_NT)) {
      -            ImperativeSubtrees::accept_body(id->at->next);
      -            Node::set_type(id->at->next, DEFN_CONT_NT);
      -        }
      -        Phrases::Adjectives::look_for_headers(id->at);
      -    }
      -}
      -
      -

      §6.

      - -
      -<rnir-preamble> ::=
      -    this is the {... rule} |                                  ==> { TRUE, - }
      -    this is the rule |                                        ==> Issue PM_NamelessRule problem6.3
      -    this is ... rule |                                        ==> Issue PM_UnarticledRule problem6.4
      -    this is ... rules |                                       ==> Issue PM_PluralisedRule problem6.5
      -    <event-rule-preamble>                                     ==> { FALSE, - }
      -void ImperativeDefinitions::RNIR_claim(imperative_defn_family *self, imperative_defn *id) {
      -    wording W = Node::get_text(id->at);
      -    if (<rnir-preamble>(W)) {
      -        id->family = RULE_NOT_IN_RULEBOOK_EFF_family;
      -        if (<<r>>) {
      -            wording RW = GET_RW(<rnir-preamble>, 1);
      -            if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE);
      -        }
      -    }
      -}
      -
      - -

      §7.

      - -
      -<to-phrase-preamble> ::=
      -    to |                                                      ==> Issue PM_BareTo problem7.1
      -    to ... ( called ... ) |                                   ==> Issue PM_DontCallPhrasesWithCalled problem7.2
      -    {to ...} ( this is the {### function} inverse to ### ) |  ==> { TRUE, -, <<written>> = TRUE, <<inverted>> = TRUE }
      -    {to ...} ( this is the {### function} ) |                 ==> { TRUE, -, <<written>> = TRUE, <<inverted>> = FALSE }
      -    {to ...} ( this is ... ) |                                ==> { TRUE, -, <<written>> = FALSE }
      -    to ...                                                    ==> { FALSE, - }
      -
      - -

      §7.1. Issue PM_BareTo problem7.1 = -

      - -
      -    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo),
      -        "'to' what? No name is given",
      -        "which means that this would not define a new phrase.");
      -    ==> { FALSE, - };
      -
      -
      • This code is used in §7.
      -

      §7.2. Issue PM_DontCallPhrasesWithCalled problem7.2 = -

      - -
      -    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled),
      -        "phrases aren't named using 'called'",
      -        "and instead use 'this is...'. For example, 'To salute (called saluting)' "
      -        "isn't allowed, but 'To salute (this is saluting)' is.");
      -    ==> { FALSE, - };
      -
      -
      • This code is used in §7.
      -

      §6.1.

      - -
      -void ImperativeDefinitions::To_claim(imperative_defn_family *self, imperative_defn *id) {
      -    wording W = Node::get_text(id->at);
      -    if (<to-phrase-preamble>(W)) {
      -        id->family = TO_PHRASE_EFF_family;
      -        if (<<r>>) {
      -            wording RW = GET_RW(<to-phrase-preamble>, 2);
      -            if (<s-type-expression>(RW))
      -                StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated),
      -                    "that name for this new phrase is not allowed",
      -                    "because it already has a meaning.");
      -            if (Phrases::Constants::parse(RW) == NULL)
      -                Phrases::Constants::create(RW, GET_RW(<to-phrase-preamble>, 1));
      -        }
      -    }
      -}
      -
      -

      §6.2.

      - -
      -<rir-preamble> ::=
      -    ... ( this is the {... rule} ) |                          ==> { TRUE, - }
      -    ... ( this is the rule ) |                                ==> Issue PM_NamelessRule problem6.3
      -    ... ( this is ... rule ) |                                ==> Issue PM_UnarticledRule problem6.4
      -    ... ( this is ... rules ) |                               ==> Issue PM_PluralisedRule problem6.5
      -    ...                                                       ==> { FALSE, - }
      -
      - -

      §6.3. Issue PM_NamelessRule problem6.3 = -

      - -
      -    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule),
      -        "there are many rules in Inform",
      -        "so you need to give a name: 'this is the abolish dancing rule', say, "
      -        "not just 'this is the rule'.");
      -    ==> { FALSE, - }
      -
      - -

      §6.4. Issue PM_UnarticledRule problem6.4 = -

      - -
      -    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule),
      -        "a rule must be given a definite name",
      -        "which begins with 'the', just to emphasise that it is the only one "
      -        "with this name: 'this is the promote dancing rule', say, not just "
      -        "'this is promote dancing rule'.");
      -    ==> { FALSE, - }
      -
      - -

      §6.5. Issue PM_PluralisedRule problem6.5 = -

      - -
      -    StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule),
      -        "a rule must be given a definite name ending in 'rule' not 'rules'",
      -        "since the plural is only used for rulebooks, which can of course "
      -        "contain many rules at once.");
      -    ==> { FALSE, - }
      -
      - -

      §8.

      - -
      -void ImperativeDefinitions::RIR_claim(imperative_defn_family *self, imperative_defn *id) {
      -    wording W = Node::get_text(id->at);
      -    if (<rir-preamble>(W)) {
      -        id->family = RULE_IN_RULEBOOK_EFF_family;
      -        if (<<r>>) {
      -            wording RW = GET_RW(<rir-preamble>, 2);
      -            if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE);
      -        }
      -    }
      -}
      -
      -

      §9.

      - -
      -imperative_defn *ImperativeDefinitions::make_imperative_definition(parse_node *p) {
      -    imperative_defn *id = CREATE(imperative_defn);
      -    id->at = p;
      -    id->defines = NULL;
      -    id->family = AS_YET_UNKNOWN_EFF_family;
      -    current_sentence = p;
      -    ImperativeDefinitions::identify(id);
      -    return id;
      -}
      -
      -

      §10. Here we look at the preamble for a rule name: if we find it, we declare this -as a rule. -

      - -
      -<rule-preamble-name> ::=
      -    {to ...} ( this is the {### function} inverse to ### ) |  ==> { 2, - }
      -    {to ...} ( this is the {### function} ) |                 ==> { 2, - }
      -    {to ...} ( this is ... ) |                                ==> { 2, - }
      -    this is the {... rule} |        ==> { -1, - }
      -    ... ( this is the {... rule} )  ==> { -2, - }
      -
      - -

      §11.

      - -
      -void ImperativeDefinitions::find_phrases_and_rules(void) {
      -    int initial_problem_count = problem_count;
      -
      -    int total = NUMBER_CREATED(imperative_defn), created = 0;
      -    imperative_defn *id;
      -    LOOP_OVER(id, imperative_defn) {
      -        created++;
      -        if ((created % 10) == 0)
      -            ProgressBar::update(3,
      -                ((float) (created))/((float) (total)));
      -        current_sentence = id->at;
      -        Phrases::create_from_preamble(id);
      -    }
      -    if (initial_problem_count < problem_count) return;
      -
      -    Routines::ToPhrases::register_all();
      -    if (initial_problem_count < problem_count) return;
      -
      -    phrase *ph;
      -    LOOP_OVER(ph, phrase) {
      -        current_sentence = ph->from->at;
      -        Frames::make_current(&(ph->stack_frame));
      -        ph->runtime_context_data =
      -            Phrases::Usage::to_runtime_context_data(&(ph->usage_data));
      -        Frames::remove_current();
      -    }
      -    if (initial_problem_count < problem_count) return;
      -
      -    RuleBookings::make_automatic_placements();
      -    if (initial_problem_count < problem_count) return;
      -
      -    SyntaxTree::traverse(Task::syntax_tree(), ImperativeDefinitions::visit_to_parse_placements);
      -}
      -
      -

      §12.

      - -
      enum TRAVERSE_FOR_RULE_FILING_SMFT
      -
      -
      -void ImperativeDefinitions::visit_to_parse_placements(parse_node *p) {
      -    if ((Node::get_type(p) == SENTENCE_NT) &&
      -        (p->down) &&
      -        (Node::get_type(p->down) == VERB_NT)) {
      -        prevailing_mood = Annotations::read_int(p->down, verbal_certainty_ANNOT);
      -        MajorNodes::try_special_meaning(TRAVERSE_FOR_RULE_FILING_SMFT, p->down);
      -    }
      -}
      -
      -

      §13. The rulebooks are now complete and final. It is time to -compile the Inter code which will provide the run-time definitions of all -these phrases. This will be a long task, and we can only do most of it now, -because more phrases will appear later. -

      - -
      -int total_phrases_to_compile = 0;
      -int total_phrases_compiled = 0;
      -void ImperativeDefinitions::compile_first_block(void) {
      -    Count up the scale of the task13.1;
      -    Compile definitions of rules in rulebooks13.2;
      -    Compile definitions of rules left out of rulebooks13.3;
      -    Compile phrases which define adjectives13.4;
      -    Mark To... phrases which have definite kinds for future compilation13.5;
      -    Throw problems for phrases with return kinds too vaguely defined13.6;
      -    Throw problems for inline phrases named as constants13.7;
      -}
      -
      -

      §13.1. Count up the scale of the task13.1 = -

      - -
      -    total_phrases_compiled = 0;
      -    phrase *ph;
      -    LOOP_OVER(ph, phrase)
      -        if (ph->at_least_one_compiled_form_needed)
      -            total_phrases_to_compile++;
      -
      -
      • This code is used in §13.
      -

      §13.2. Compile definitions of rules in rulebooks13.2 = -

      - -
      -    rulebook *rb;
      -    LOOP_OVER(rb, rulebook)
      -        RTRules::compile_rule_phrases(rb,
      -            &total_phrases_compiled, total_phrases_to_compile);
      -
      -
      • This code is used in §13.
      -

      §13.3. Compile definitions of rules left out of rulebooks13.3 = -

      - -
      -    rule *R;
      -    LOOP_OVER(R, rule)
      -        RTRules::compile_definition(R,
      -            &total_phrases_compiled, total_phrases_to_compile);
      -
      -
      • This code is used in §13.
      -

      §13.4. This doesn't compile all adjective definitions, only the ones which supply -a whole multi-step phrase to define them — a relatively little-used feature -of Inform. -

      - -

      Compile phrases which define adjectives13.4 = -

      - -
      -    imperative_defn *id;
      -    LOOP_OVER(id, imperative_defn)
      -        if (id->family == DEFINITIONAL_PHRASE_EFF_family)
      -            Phrases::compile(id->defines, &total_phrases_compiled,
      -                total_phrases_to_compile, NULL, NULL, NULL);
      -    RTAdjectives::compile_support_code();
      -
      -
      • This code is used in §13.
      -

      §13.5. As we'll see, it's legal in Inform to define "To..." phrases with vague -kinds: "To expose (X - a value)", for example. This can't be compiled as -vaguely as the definition implies, since there would be no way to know how -to store X. Instead, for each different kind of X which is actually needed, -a fresh version of the phrase is compiled — one where X is a number, one -where it's a text, and so on. This is handled by making a "request" for the -phrase, indicating that a compiled version of it will be needed. -

      - -

      Since "To..." phrases are only compiled on request, we must remember to -request the boring ones with straightforward kinds ("To award (N - a number) -points", say). This is where we do it: -

      - -

      Mark To... phrases which have definite kinds for future compilation13.5 = -

      - -
      -    phrase *ph;
      -    LOOP_OVER(ph, phrase) {
      -        kind *K = Phrases::TypeData::kind(&(ph->type_data));
      -        if (Kinds::Behaviour::definite(K)) {
      -            if (ph->at_least_one_compiled_form_needed)
      -                Routines::ToPhrases::make_request(ph, K, NULL, EMPTY_WORDING);
      -        }
      -    }
      -
      -
      • This code is used in §13.
      -

      §13.6. Throw problems for phrases with return kinds too vaguely defined13.6 = -

      - -
      -    phrase *ph;
      -    LOOP_OVER(ph, phrase) {
      -        kind *KR = Phrases::TypeData::get_return_kind(&(ph->type_data));
      -        if ((Kinds::Behaviour::semidefinite(KR) == FALSE) &&
      -            (Phrases::TypeData::arithmetic_operation(ph) == -1)) {
      -            current_sentence = Phrases::declaration_node(ph);
      -            Problems::quote_source(1, current_sentence);
      -            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague));
      -            Problems::issue_problem_segment(
      -                "The declaration %1 tries to set up a phrase which decides a "
      -                "value which is too vaguely described. For example, 'To decide "
      -                "which number is the target: ...' is fine, because 'number' "
      -                "is clear about what kind of value should emerge; but 'To "
      -                "decide which value is the target: ...' is not clear enough.");
      -            Problems::issue_problem_end();
      -        }
      -        for (int k=1; k<=26; k++)
      -            if ((Kinds::Behaviour::involves_var(KR, k)) &&
      -                (Phrases::TypeData::tokens_contain_variable(&(ph->type_data), k) == FALSE)) {
      -                current_sentence = Phrases::declaration_node(ph);
      -                TEMPORARY_TEXT(var_letter)
      -                PUT_TO(var_letter, 'A'+k-1);
      -                Problems::quote_source(1, current_sentence);
      -                Problems::quote_stream(2, var_letter);
      -                StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined));
      -                Problems::issue_problem_segment(
      -                    "The declaration %1 tries to set up a phrase which decides a "
      -                    "value which is too vaguely described, because it involves "
      -                    "a kind variable (%2) which it can't determine through "
      -                    "usage.");
      -                Problems::issue_problem_end();
      -                DISCARD_TEXT(var_letter)
      -        }
      -    }
      -
      -
      • This code is used in §13.
      -

      §13.7. Throw problems for inline phrases named as constants13.7 = -

      - -
      -    phrase *ph;
      -    LOOP_OVER(ph, phrase)
      -        if ((Phrases::TypeData::invoked_inline(ph)) &&
      -            (Phrases::Usage::has_name_as_constant(&(ph->usage_data)))) {
      -            current_sentence = Phrases::declaration_node(ph);
      -            Problems::quote_source(1, current_sentence);
      -            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline));
      -            Problems::issue_problem_segment(
      -                "The declaration %1 tries to give a name to a phrase which is "
      -                "defined using inline Inform 6 code in (- markers -). Such "
      -                "phrases can't be named and used as constants because they "
      -                "have no independent existence, being instead made fresh "
      -                "each time they are used.");
      -            Problems::issue_problem_end();
      -        }
      -
      -
      • This code is used in §13.
      -

      §14. The twilight gathers, but our work is far from done. Recall that we have -accumulated compilation requests for "To..." phrases, but haven't actually -acted on them yet. -

      - -

      We have to do this in quite an open-ended way, because compiling one phrase -can easily generate fresh requests for others. For instance, suppose we have -the definition "To expose (X - a value)" in play, and suppose that when -compiling the phrase "To advertise", Inform runs into the line "expose the -hoarding text". This causes it to issue a compilation request for "To expose -(X - a text)". Perhaps we've compiled such a form already, but perhaps we -haven't. Compilation therefore goes on until all requests have been dealt -with. -

      - -

      Compiling phrases also produces the need for other pieces of code to be -generated — for example, suppose our phrase being compiled, "To advertise", -includes the text: -

      - -
      -

      let Z be "Two for the price of one! Just [expose price]!";

      -
      - -

      We are going to need to compile "Two for the price of one! Just [expose price]!" -later on, in its own text substitution routine; but notice that it contains -the need for "To expose (X - a number)", and that will generate a further -phrase request. -

      - -

      Because of this and similar problems, it's impossible to compile all the -phrases alone: we must compile phrases, then things arising from them, then -phrases arising from those, then things arising from the phrases arising -from those, and so on, until we're done. The process is therefore structured -as a set of "coroutines" which each carry out as much as they can and then -hand over to the others to generate more work. -

      - -
      -void ImperativeDefinitions::compile_as_needed(void) {
      -    rule *R;
      -    LOOP_OVER(R, rule)
      -        RTRules::compile_definition(R,
      -            &total_phrases_compiled, total_phrases_to_compile);
      -    int repeat = TRUE;
      -    while (repeat) {
      -        repeat = FALSE;
      -        if (Routines::ToPhrases::compilation_coroutine(
      -            &total_phrases_compiled, total_phrases_to_compile) > 0)
      -            repeat = TRUE;
      -        if (ListTogether::compilation_coroutine() > 0)
      -            repeat = TRUE;
      -        #ifdef IF_MODULE
      -        if (LoopingOverScope::compilation_coroutine() > 0)
      -            repeat = TRUE;
      -        #endif
      -        if (Strings::TextSubstitutions::compilation_coroutine(FALSE) > 0)
      -            repeat = TRUE;
      -        if (Propositions::Deferred::compilation_coroutine() > 0)
      -            repeat = TRUE;
      -    }
      -}
      -
      - - -
      - - - diff --git a/docs/imperative-module/3-itp.html b/docs/imperative-module/3-itp.html index afbc8e6dd..388154e57 100644 --- a/docs/imperative-module/3-itp.html +++ b/docs/imperative-module/3-itp.html @@ -228,7 +228,7 @@ significant timing difficulties.

      diff --git a/docs/imperative-module/3-pav.html b/docs/imperative-module/3-pav.html index eed3184e6..d41c17ffd 100644 --- a/docs/imperative-module/3-pav.html +++ b/docs/imperative-module/3-pav.html @@ -98,7 +98,7 @@ own right, a functional-programming sort of device. For example:

      -constant_phrase *Phrases::Constants::create(wording NW, wording RW) {
      +constant_phrase *Phrases::Constants::create(wording NW, wording RW) {
           constant_phrase *cphr = CREATE(constant_phrase);
           cphr->phrase_meant = NULL;  we won't know until later
           cphr->cphr_kind = NULL;  nor this
      @@ -113,7 +113,7 @@ own right, a functional-programming sort of device. For example:
       

      -constant_phrase *Phrases::Constants::parse(wording NW) {
      +constant_phrase *Phrases::Constants::parse(wording NW) {
           if (<s-value>(NW)) {
               parse_node *spec = <<rp>>;
               if (Rvalues::is_CONSTANT_construction(spec, CON_phrase)) {
      @@ -132,7 +132,7 @@ the following takes a patch-it-later approach.
       

      -kind *Phrases::Constants::kind(constant_phrase *cphr) {
      +kind *Phrases::Constants::kind(constant_phrase *cphr) {
           if (cphr == NULL) return NULL;
           if (global_pass_state.pass < 2) return Kinds::binary_con(CON_phrase, K_value, K_value);
           if (cphr->cphr_kind == NULL) {
      @@ -149,7 +149,7 @@ the following takes a patch-it-later approach.
       

      -phrase *Phrases::Constants::as_phrase(constant_phrase *cphr) {
      +phrase *Phrases::Constants::as_phrase(constant_phrase *cphr) {
           if (cphr == NULL) internal_error("null cphr");
           if (cphr->phrase_meant == NULL) {
               phrase *ph;
      @@ -178,7 +178,7 @@ an I6 routine name, but no: it compiles to a small array called a "closure".
           return Phrases::Constants::iname(cphr);
       }
       
      -inter_name *Phrases::Constants::iname(constant_phrase *cphr) {
      +inter_name *Phrases::Constants::iname(constant_phrase *cphr) {
           if (cphr->cphr_iname == NULL) {
               phrase *ph = Phrases::Constants::as_phrase(cphr);
               if (ph == NULL) internal_error("cannot reconstruct phrase from cphr");
      @@ -314,7 +314,7 @@ made above.
       
      • This code is used in §8.
      diff --git a/docs/imperative-module/3-phr.html b/docs/imperative-module/3-phr.html index cde383520..5d8d2c3b7 100644 --- a/docs/imperative-module/3-phr.html +++ b/docs/imperative-module/3-phr.html @@ -104,7 +104,7 @@ code below.
       typedef struct phrase {
      -    struct imperative_defn *from;
      +    struct imperative_defn *from;
       
           int inline_wn;  word number of inline I6 definition, or -1 if not inline
           struct inter_schema *inter_head_defn;  inline definition translated to inter, if possible
      @@ -133,7 +133,7 @@ code below.
           CLASS_DEFINITION
       } phrase;
       
      -
      • The structure phrase is accessed in 2/rls, 2/rb, 3/id, 3/pu, 3/prcd, 3/ptd, 3/dptd, 3/po, 3/pav, 3/tph, 3/tp, 6/inv, 6/pi, 6/ci, 6/cii, 6/cp, 6/cste and here.
      +
      • The structure phrase is accessed in 2/rls, 2/rb, 3/pu, 3/prcd, 3/ptd, 3/dptd, 3/po, 3/pav, 3/tph, 3/tp, 6/inv, 6/pi, 6/ci, 6/cii, 6/cp, 6/cste and here.

      §4. "To..." phrases, though no others, are listed in logical precedence order:

      @@ -149,8 +149,8 @@ invocation which is given as verbatim I6.

      -void Phrases::create_from_preamble(imperative_defn *id) {
      -    parse_node *p = id->at;
      +void Phrases::create_from_preamble(imperative_defn *id) {
      +    parse_node *p = id->at;
           if ((p == NULL) || (Node::get_type(p) != IMPERATIVE_NT))
               internal_error("a phrase preamble should be at a IMPERATIVE_NT node");
           int inline_wn = -1;          the word number of an inline I6 definition if any
      @@ -170,7 +170,7 @@ invocation which is given as verbatim I6.
       
           if ((inline_wn >= 0) && (id->family != TO_PHRASE_EFF_family)) Inline is for To... phrases only5.10;
       
      -    if ((id->family != DEFINITIONAL_PHRASE_EFF_family) && (p->down == NULL))
      +    if ((id->family != DEFINITIONAL_PHRASE_EFF_family) && (p->down == NULL))
               There seems to be no definition5.9;
       
           Construct the PHTD, find the phrase options, find the documentation reference5.3;
      @@ -180,7 +180,7 @@ invocation which is given as verbatim I6.
       
           phrase *new_ph;
           Create the phrase structure5.8;
      -    id->defines = new_ph;
      +    id->defines = new_ph;
           Tell other parts of Inform about this new phrase5.7;
       }
       
      @@ -202,20 +202,20 @@ invocation which is given as verbatim I6.

      -    phud = Phrases::Usage::new(Node::get_text(p), FALSE, id);
      +    phud = Phrases::Usage::new(Node::get_text(p), id);
       
      • This code is used in §5.

      §5.3. Construct the PHTD, find the phrase options, find the documentation reference5.3 =

      -    wording XW = Phrases::Usage::get_preamble_text(&phud);
      +    wording XW = Phrases::Usage::get_preamble_text(&phud);
           phtd = Phrases::TypeData::new();
           if (inline_wn >= 0) Phrases::TypeData::make_inline(&phtd);
      -    if (id->family == TO_PHRASE_EFF_family) {
      +    if (id->family == TO_PHRASE_EFF_family) {
               documentation_W = Index::DocReferences::position_of_symbol(&XW);
               Phrases::TypeData::Textual::parse(&phtd, XW, &OW);
      -    } else if (id->family == DEFINITIONAL_PHRASE_EFF_family) {
      +    } else if (id->family == DEFINITIONAL_PHRASE_EFF_family) {
               Phrases::TypeData::set_mor(&phtd, DECIDES_CONDITION_MOR, NULL);
           } else {
               Phrases::TypeData::set_mor(&phtd, DECIDES_NOTHING_AND_RETURNS_MOR, NULL);
      @@ -263,58 +263,14 @@ inline definitions.
       

      -    if (id->family == TO_PHRASE_EFF_family) {
      -        if (phud.to_begin) new_ph->to_begin = TRUE;
      -        Routines::ToPhrases::new(new_ph);
      -    }
      -    if (id->family == DEFINITIONAL_PHRASE_EFF_family) {
      -        Give this phrase a local variable for the subject of the definition5.7.1;
      -    }
      -    if (id->family == RULE_IN_RULEBOOK_EFF_family) {
      -        Rules::request_automatic_placement(
      -            Phrases::Usage::to_rule(&(new_ph->usage_data), id));
      -        new_ph->compile_with_run_time_debugging = TRUE;
      -    }
      -    if (id->family == RULE_NOT_IN_RULEBOOK_EFF_family) {
      -        Phrases::Usage::to_rule(&(new_ph->usage_data), id);
      -        new_ph->compile_with_run_time_debugging = TRUE;
      -    }
      +    ImperativeDefinitions::new_phrase(id, new_ph);
       
      • This code is used in §5.
      -

      §5.7.1. If a phrase defines an adjective, like so: -

      - -
      -

      Definition: A container is capacious if: ...

      -
      - -

      we need to make the pronoun "it" a local variable of kind "container" in the -stack frame used to compile the "..." part. If it uses a calling, like so: -

      - -
      -

      Definition: A container (called the sack) is capacious if: ...

      -
      - -

      then we also want the name "sack" to refer to this. Here's where we take care -of it: -

      - -

      Give this phrase a local variable for the subject of the definition5.7.1 = -

      - -
      -    wording CW = EMPTY_WORDING;
      -    kind *K = NULL;
      -    Phrases::Phrasal::define_adjective_by_phrase(p, new_ph, &CW, &K);
      -    LocalVariables::add_pronoun(&(new_ph->stack_frame), CW, K);
      -
      -
      • This code is used in §5.7.

      §5.8. Create the phrase structure5.8 =

      -    wording XW = Phrases::Usage::get_preamble_text(&phud);
      +    wording XW = Phrases::Usage::get_preamble_text(&phud);
           LOGIF(PHRASE_CREATIONS, "Creating phrase: <%W>\n$U", XW, &phud);
       
           new_ph = CREATE(phrase);
      @@ -417,7 +373,7 @@ what number is...", for instance.
       

      -void Phrases::parse_possible_inline_defn(wording W, int *wn, int *mor) {
      +void Phrases::parse_possible_inline_defn(wording W, int *wn, int *mor) {
           LOGIF(MATCHING, "form of inline: %W\n", W);
           *wn = -1;
           if (<inline-phrase-definition>(W)) { *wn = <<inlinecode>>; *mor = <<r>>; }
      @@ -427,13 +383,13 @@ what number is...", for instance.
       

      -void Phrases::log(phrase *ph) {
      +void Phrases::log(phrase *ph) {
           if (ph == NULL) { LOG("RULE:NULL"); return; }
           LOG("%n", Phrases::iname(ph));
      -    Phrases::Usage::log_rule_name(&(ph->usage_data));
      +    Phrases::Usage::log_rule_name(&(ph->usage_data));
       }
       
      -void Phrases::log_briefly(phrase *ph) {
      +void Phrases::log_briefly(phrase *ph) {
           Phrases::TypeData::Textual::log_briefly(&(ph->type_data));
       }
       
      @@ -441,7 +397,7 @@ what number is...", for instance.

      -void Phrases::write_HTML_representation(OUTPUT_STREAM, phrase *ph, int format) {
      +void Phrases::write_HTML_representation(OUTPUT_STREAM, phrase *ph, int format) {
           Phrases::TypeData::Textual::write_HTML_representation(OUT, &(ph->type_data), format, NULL);
       }
       
      @@ -449,18 +405,18 @@ what number is...", for instance.

      -int Phrases::compiled_inline(phrase *ph) {
      +int Phrases::compiled_inline(phrase *ph) {
           if (ph->inline_wn < 0) return FALSE;
           return TRUE;
       }
       
      -wchar_t *Phrases::get_inline_definition(phrase *ph) {
      +wchar_t *Phrases::get_inline_definition(phrase *ph) {
           if (ph->inline_wn < 0)
               internal_error("tried to access inline definition of non-inline phrase");
           return Lexer::word_text(ph->inline_wn);
       }
       
      -inter_schema *Phrases::get_inter_head(phrase *ph) {
      +inter_schema *Phrases::get_inter_head(phrase *ph) {
           if (ph->inter_defn_converted == FALSE) {
               if (ph->inline_wn >= 0) {
                   InterSchemas::from_inline_phrase_definition(Phrases::get_inline_definition(ph), &(ph->inter_head_defn), &(ph->inter_tail_defn));
      @@ -470,7 +426,7 @@ what number is...", for instance.
           return ph->inter_head_defn;
       }
       
      -inter_schema *Phrases::get_inter_tail(phrase *ph) {
      +inter_schema *Phrases::get_inter_tail(phrase *ph) {
           if (ph->inter_defn_converted == FALSE) {
               if (ph->inline_wn >= 0) {
                   InterSchemas::from_inline_phrase_definition(Phrases::get_inline_definition(ph), &(ph->inter_head_defn), &(ph->inter_tail_defn));
      @@ -480,7 +436,7 @@ what number is...", for instance.
           return ph->inter_tail_defn;
       }
       
      -inter_name *Phrases::iname(phrase *ph) {
      +inter_name *Phrases::iname(phrase *ph) {
           if (ph->ph_iname == NULL) {
               package_request *PR = Hierarchy::package(ph->owning_module, ADJECTIVE_PHRASES_HAP);
               ph->ph_iname = Hierarchy::make_iname_in(DEFINITION_FN_HL, PR);
      @@ -488,8 +444,8 @@ what number is...", for instance.
           return ph->ph_iname;
       }
       
      -parse_node *Phrases::declaration_node(phrase *ph) {
      -    return ph->from->at;
      +parse_node *Phrases::declaration_node(phrase *ph) {
      +    return ph->from->at;
       }
       

      §11. Compilation. The following is called to give us an opportunity to compile a routine defining @@ -503,10 +459,10 @@ response to "requests". All other phrases are compiled just once. ph->imported = TRUE; } -void Phrases::compile(phrase *ph, int *i, int max_i, +void Phrases::compile(phrase *ph, int *i, int max_i, stacked_variable_owner_list *legible, to_phrase_request *req, rule *R) { if (ph->imported) return; - if (ph->from->family == TO_PHRASE_EFF_family) { + if (ph->from->family == TO_PHRASE_EFF_family) { Routines::Compile::routine(ph, legible, req, R); Move along the progress bar if it's this phrase's first compilation11.1; } else if (ph->at_least_one_compiled_form_needed) { @@ -571,7 +527,7 @@ response to "requests". All other phrases are compiled just once. }

      diff --git a/docs/imperative-module/3-po.html b/docs/imperative-module/3-po.html index d2a497a53..2bfe76292 100644 --- a/docs/imperative-module/3-po.html +++ b/docs/imperative-module/3-po.html @@ -407,7 +407,7 @@ by "and":
      diff --git a/docs/imperative-module/3-prcd.html b/docs/imperative-module/3-prcd.html index af7344b04..eae7928d8 100644 --- a/docs/imperative-module/3-prcd.html +++ b/docs/imperative-module/3-prcd.html @@ -182,7 +182,7 @@ the following only blanks out a PHRCD structure ready for that to happen.

      -ph_runtime_context_data Phrases::Context::new(void) {
      +ph_runtime_context_data Phrases::Context::new(void) {
           ph_runtime_context_data phrcd;
           phrcd.activity_context = EMPTY_WORDING;
           phrcd.activity_where = NULL;
      @@ -444,9 +444,9 @@ process.
       
       
       void Phrases::Context::ensure_avl(rule *R) {
      -    imperative_defn *id = Rules::get_imperative_definition(R);
      +    imperative_defn *id = Rules::get_imperative_definition(R);
           if (id) {
      -        phrase *ph = id->defines;
      +        phrase *ph = id->defines;
               ph_runtime_context_data *rcd = &(ph->runtime_context_data);
               if (Wordings::nonempty(rcd->activity_context)) {
                   parse_node *save_cs = current_sentence;
      @@ -735,7 +735,7 @@ with the default outcome return (see above).
           return n;
       }
       
      -
      • The structure activity_list is accessed in 2/rlb, 2/act, 3/id, 3/phr, 3/tph, 3/tp, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
      +
      • The structure activity_list is accessed in 2/rlb, 2/act, 3/phr, 3/tph, 3/tp, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.

      §11. Run-time contexts are seen in the "while" clauses at the end of rules. For example:

      @@ -902,7 +902,7 @@ values, of the kind to which the activity applies. }
      diff --git a/docs/imperative-module/3-ptd.html b/docs/imperative-module/3-ptd.html index d8cc32dbc..24e114f62 100644 --- a/docs/imperative-module/3-ptd.html +++ b/docs/imperative-module/3-ptd.html @@ -326,7 +326,7 @@ whistles and doodads which regular phrases don't. return phtd->manner_of_return; } -kind *Phrases::TypeData::get_return_kind(ph_type_data *phtd) { +kind *Phrases::TypeData::get_return_kind(ph_type_data *phtd) { if (phtd->manner_of_return == DECIDES_CONDITION_MOR) return K_truth_state; return phtd->return_kind; } @@ -403,7 +403,7 @@ logic, since one argument is in effect a kind rather than a value.)

      -kind *Phrases::TypeData::kind(ph_type_data *phtd) {
      +kind *Phrases::TypeData::kind(ph_type_data *phtd) {
           kind *argument_kinds[MAX_TOKENS_PER_PHRASE];
           int i, j = 0;
           for (i=0; i<phtd->no_tokens; i++)
      @@ -427,7 +427,7 @@ logic, since one argument is in effect a kind rather than a value.)
       

      -int Phrases::TypeData::tokens_contain_variable(ph_type_data *phtd, int v) {
      +int Phrases::TypeData::tokens_contain_variable(ph_type_data *phtd, int v) {
           for (int i=0; i<phtd->no_tokens; i++)
               if (Kinds::Behaviour::involves_var(phtd->token_sequence[i].token_kind, v))
                   return TRUE;
      @@ -437,7 +437,7 @@ logic, since one argument is in effect a kind rather than a value.)
       

      §15. The tokens.

      -int Phrases::TypeData::get_no_tokens(ph_type_data *phtd) {
      +int Phrases::TypeData::get_no_tokens(ph_type_data *phtd) {
           return phtd->no_tokens;
       }
       
      @@ -477,11 +477,11 @@ in the next.

      -int Phrases::TypeData::deprecated(ph_type_data *phtd) {
      +int Phrases::TypeData::deprecated(ph_type_data *phtd) {
           return phtd->now_deprecated;
       }
       
      -void Phrases::TypeData::deprecate_phrase(ph_type_data *phtd) {
      +void Phrases::TypeData::deprecate_phrase(ph_type_data *phtd) {
           phtd->now_deprecated = TRUE;
       }
       
      @@ -528,7 +528,7 @@ variables "new entry" and "L" with those kinds.

      -void Phrases::TypeData::into_stack_frame(ph_stack_frame *phsf,
      +void Phrases::TypeData::into_stack_frame(ph_stack_frame *phsf,
           ph_type_data *phtd, kind *kind_in_this_compilation, int first) {
           if (Kinds::get_construct(kind_in_this_compilation) != CON_phrase)
               internal_error("no function kind");
      @@ -558,7 +558,7 @@ see Phrases for the return codes.
       

      -int Phrases::TypeData::comparison(ph_type_data *phtd1, ph_type_data *phtd2) {
      +int Phrases::TypeData::comparison(ph_type_data *phtd1, ph_type_data *phtd2) {
       
           if (phtd1 == phtd2) return EQUAL_PH;
       
      @@ -738,7 +738,7 @@ variable" is more specific than "new variable", which isn't helpful.
       define THE_PRIMORDIAL_SAY_PHRASE 2
       
      -say_details Phrases::TypeData::new_say_details(void) {
      +say_details Phrases::TypeData::new_say_details(void) {
           say_details sd;
           sd.say_phrase = NOT_A_SAY_PHRASE;
           sd.say_phrase_running_on = FALSE;
      @@ -751,7 +751,7 @@ variable" is more specific than "new variable", which isn't helpful.
       
       int first_say_made = FALSE;
       
      -void Phrases::TypeData::make_sd(say_details *sd, int ro, int cs, int pos, int at, int cat) {
      +void Phrases::TypeData::make_sd(say_details *sd, int ro, int cs, int pos, int at, int cat) {
           sd->say_phrase = A_MISCELLANEOUS_SAY_PHRASE;
           if (first_say_made == FALSE) {
               sd->say_phrase = THE_PRIMORDIAL_SAY_PHRASE;
      @@ -764,7 +764,7 @@ variable" is more specific than "new variable", which isn't helpful.
           if (cat >= 0) sd->say_phrase_stream_closing_token_at = cat;
       }
       
      -void Phrases::TypeData::log_say_details(say_details sd) {
      +void Phrases::TypeData::log_say_details(say_details sd) {
           switch (sd.say_phrase) {
               case NOT_A_SAY_PHRASE: break;
               case A_MISCELLANEOUS_SAY_PHRASE: LOG("  A_MISCELLANEOUS_SAY_PHRASE\n"); break;
      @@ -783,7 +783,7 @@ variable" is more specific than "new variable", which isn't helpful.
           }
       }
       
      -int Phrases::TypeData::is_a_say_phrase(phrase *ph) {
      +int Phrases::TypeData::is_a_say_phrase(phrase *ph) {
           if ((ph) && (ph->type_data.as_say.say_phrase)) return TRUE;
           return FALSE;
       }
      @@ -810,7 +810,7 @@ variable" is more specific than "new variable", which isn't helpful.
           return FALSE;
       }
       
      -void Phrases::TypeData::get_say_data(say_details *sd,
      +void Phrases::TypeData::get_say_data(say_details *sd,
           int *say_cs, int *ssp_tok, int *ssp_ctok, int *ssp_pos) {
           *say_cs = sd->say_control_structure;
           *ssp_tok = sd->say_phrase_stream_token_at;
      @@ -818,7 +818,7 @@ variable" is more specific than "new variable", which isn't helpful.
           *ssp_pos = sd->say_phrase_stream_position;
       }
       
      -int Phrases::TypeData::preface_for_say_HTML(OUTPUT_STREAM, say_details sd, int paste_format) {
      +int Phrases::TypeData::preface_for_say_HTML(OUTPUT_STREAM, say_details sd, int paste_format) {
           if (sd.say_phrase) {
               if (sd.say_phrase != THE_PRIMORDIAL_SAY_PHRASE) {
                   switch (paste_format) {
      @@ -836,7 +836,7 @@ variable" is more specific than "new variable", which isn't helpful.
           return FALSE;
       }
       
      -void Phrases::TypeData::epilogue_for_say_HTML(OUTPUT_STREAM, say_details sd, int paste_format) {
      +void Phrases::TypeData::epilogue_for_say_HTML(OUTPUT_STREAM, say_details sd, int paste_format) {
           if (sd.say_phrase) {
               if (sd.say_phrase != THE_PRIMORDIAL_SAY_PHRASE) {
                   if (paste_format == PASTE_PHRASE_FORMAT) WRITE("]");
      @@ -847,7 +847,7 @@ variable" is more specific than "new variable", which isn't helpful.
           }
       }
       
      -int Phrases::TypeData::ssp_matches(ph_type_data *phtd, int ssp_tok, int list_pos,
      +int Phrases::TypeData::ssp_matches(ph_type_data *phtd, int ssp_tok, int list_pos,
           wording *W) {
           int this_tok = phtd->as_say.say_phrase_stream_token_at;
           int this_pos = phtd->as_say.say_phrase_stream_position;
      @@ -869,7 +869,7 @@ by than name.
       define LOOP_BODY_BLOCK_FOLLOWS 3
       
      -inline_details Phrases::TypeData::new_inline_details(void) {
      +inline_details Phrases::TypeData::new_inline_details(void) {
           inline_details id;
       
           id.invoked_inline_not_as_call = FALSE;
      @@ -888,7 +888,7 @@ by than name.
       
       int no_lets_made = 0;
       
      -void Phrases::TypeData::make_id(inline_details *id, int op, int assgn, int let, int blk, int only_in) {
      +void Phrases::TypeData::make_id(inline_details *id, int op, int assgn, int let, int blk, int only_in) {
           id->arithmetical_operation = op;
           id->assignment_phrase = assgn;
           if ((let == ASSIGNMENT_LET_PHRASE) && (no_lets_made++ >= 3)) let = NOT_A_LET_PHRASE;
      @@ -901,7 +901,7 @@ by than name.
       

      §24.

      -void Phrases::TypeData::log_inline_details(inline_details id) {
      +void Phrases::TypeData::log_inline_details(inline_details id) {
           if (id.block_follows) LOG("  block follows\n");
           if (id.let_phrase != NOT_A_LET_PHRASE) LOG("  let phrase (%d)\n", id.let_phrase);
           if (id.only_in_loop) LOG("  may only be used in a %w body\n", id.only_in_loop);
      @@ -914,11 +914,11 @@ by than name.
       

      §25.

      -void Phrases::TypeData::make_inline(ph_type_data *phtd) {
      +void Phrases::TypeData::make_inline(ph_type_data *phtd) {
           phtd->as_inline.invoked_inline_not_as_call = TRUE;
       }
       
      -int Phrases::TypeData::invoked_inline(phrase *ph) {
      +int Phrases::TypeData::invoked_inline(phrase *ph) {
           return ph->type_data.as_inline.invoked_inline_not_as_call;
       }
       
      @@ -930,12 +930,12 @@ by than name. return FALSE; } -int Phrases::TypeData::is_a_let_equation(phrase *ph) { +int Phrases::TypeData::is_a_let_equation(phrase *ph) { if (ph->type_data.as_inline.let_phrase == EQUATION_LET_PHRASE) return TRUE; return FALSE; } -int Phrases::TypeData::arithmetic_operation(phrase *ph) { +int Phrases::TypeData::arithmetic_operation(phrase *ph) { return ph->type_data.as_inline.arithmetical_operation; } @@ -954,7 +954,7 @@ by than name. return NULL; } -int Phrases::TypeData::block_follows(phrase *ph) { +int Phrases::TypeData::block_follows(phrase *ph) { return ph->type_data.as_inline.block_follows; }
      @@ -981,7 +981,7 @@ source text.

      -int Phrases::TypeData::inline_type_data_comparison(ph_type_data *phtd1, ph_type_data *phtd2) {
      +int Phrases::TypeData::inline_type_data_comparison(ph_type_data *phtd1, ph_type_data *phtd2) {
           if ((phtd1->as_inline.only_in_loop) && (phtd2->as_inline.only_in_loop == FALSE))
               return BEFORE_PH;
           if ((phtd2->as_inline.only_in_loop) && (phtd1->as_inline.only_in_loop == FALSE))
      @@ -991,7 +991,7 @@ source text.
       }
       
      diff --git a/docs/imperative-module/3-pu.html b/docs/imperative-module/3-pu.html index e9fe69213..617280b51 100644 --- a/docs/imperative-module/3-pu.html +++ b/docs/imperative-module/3-pu.html @@ -73,14 +73,14 @@ function togglePopup(material_id) {

      To parse the preamble of a phrase declaration to a phrase usage (PHUD) structure containing a mostly textual representation of the conditions for its usage.

      -
      +

      §1. And here is the usage data.

       typedef struct ph_usage_data {
      -    struct imperative_defn *from;
      +    struct imperative_defn *from;
           struct wording full_preamble;  e.g. to identify nameless rules in the log
           struct constant_phrase *constant_phrase_holder;  for named To... phrases
           int to_begin;  used in Basic mode only: this is to be the main phrase
      @@ -100,7 +100,7 @@ function togglePopup(material_id) {
           int owning_rulebook_placement;  ...and with this placement value: see Rulebooks
       } ph_usage_data;
       
      -
      • The structure ph_usage_data is accessed in 3/id, 3/phr, 3/dptd, 3/pav, 3/tph, 3/tp, 6/cp and here.
      +
      • The structure ph_usage_data is accessed in 3/phr, 3/dptd, 3/pav, 3/tph, 3/tp, 6/cp and here.

      §2. The late-morning creations. A little later on, we've made a rule phrase, and it now has a proper PHUD. If the rule is an anonymous one, such as:

      @@ -122,7 +122,7 @@ connect this existing one to the phrase.

      -rule *Phrases::Usage::to_rule(ph_usage_data *phud, imperative_defn *id) {
      +rule *Phrases::Usage::to_rule(ph_usage_data *phud, imperative_defn *id) {
           wording W = EMPTY_WORDING;
           int explicitly = FALSE;
           Find the name of the phrase, and whether or not it's explicitly given2.1;
      @@ -132,9 +132,9 @@ connect this existing one to the phrase.
           if (R) Check that this isn't duplicating the name of a rule already made2.2
           else R = Rules::obtain(W, explicitly);
           if (Wordings::empty(W))
      -        Hierarchy::markup_wording(R->compilation_data.rule_package, RULE_NAME_HMD, Node::get_text(id->at));
      +        Hierarchy::markup_wording(R->compilation_data.rule_package, RULE_NAME_HMD, Node::get_text(id->at));
           Rules::set_imperative_definition(R, id);
      -    phrase *ph = id->defines;
      +    phrase *ph = id->defines;
           package_request *P = RTRules::package(R);
           ph->ph_iname = Hierarchy::make_localised_iname_in(RULE_FN_HL, P, ph->owning_module);
       
      @@ -159,7 +159,7 @@ connect this existing one to the phrase.
       

      -    imperative_defn *existing_id = Rules::get_imperative_definition(R);
      +    imperative_defn *existing_id = Rules::get_imperative_definition(R);
           if ((existing_id) && (existing_id != id)) {
               Problems::quote_source(1, current_sentence);
               Problems::quote_wording(2, W);
      @@ -199,45 +199,26 @@ just enough from the wording to tell what sort of rule/phrase is to follow.
       
       
       <rule-preamble> ::=
      -    definition |                                              ==> { -, DEFINITIONAL_PHRASE_EFF_family }
      -    this is the {... rule} |                                  ==> { -, RULE_NOT_IN_RULEBOOK_EFF_family, <<event-time>> = NOT_AN_EVENT, <<written>> = FALSE }
      +    definition |                                              ==> { -, - }
      +    this is the {... rule} |                                  ==> { -, -, <<event-time>> = NOT_AN_EVENT, <<written>> = FALSE }
           this is the rule |                                        ==> { fail production }
           this is ... rule |                                        ==> { fail production }
           this is ... rules |                                       ==> { fail production }
      -    <event-rule-preamble> |                                   ==> { -, RULE_NOT_IN_RULEBOOK_EFF_family, <<event-time>> = R[1] }
      +    <event-rule-preamble> |                                   ==> { -, -, <<event-time>> = R[1] }
           to |                                                      ==> { fail production }
           to ... ( called ... ) |                                   ==> { fail production }
      -    {to ...} ( this is the {### function} inverse to ### ) |  ==> { -, TO_PHRASE_EFF_family, <<named>> = TRUE, <<written>> = TRUE, <<inverted>> = TRUE }
      -    {to ...} ( this is the {### function} ) |                 ==> { -, TO_PHRASE_EFF_family, <<named>> = TRUE, <<written>> = TRUE, <<inverted>> = FALSE }
      -    {to ...} ( this is ... ) |                                ==> { -, TO_PHRASE_EFF_family, <<named>> = TRUE, <<written>> = FALSE }
      -    to ... |                                                  ==> { -, TO_PHRASE_EFF_family, <<named>> = FALSE }
      -    ... ( this is the {... rule} ) |                          ==> { -, RULE_IN_RULEBOOK_EFF_family, <<named>> = TRUE, <<written>> = FALSE }
      +    {to ...} ( this is the {### function} inverse to ### ) |  ==> { -, -, <<named>> = TRUE, <<written>> = TRUE, <<inverted>> = TRUE }
      +    {to ...} ( this is the {### function} ) |                 ==> { -, -, <<named>> = TRUE, <<written>> = TRUE, <<inverted>> = FALSE }
      +    {to ...} ( this is ... ) |                                ==> { -, -, <<named>> = TRUE, <<written>> = FALSE }
      +    to ... |                                                  ==> { -, -, <<named>> = FALSE }
      +    ... ( this is the {... rule} ) |                          ==> { -, -, <<named>> = TRUE, <<written>> = FALSE }
           ... ( this is the rule ) |                                ==> { fail production }
           ... ( this is ... rule ) |                                ==> { fail production }
           ... ( this is ... rules ) |                               ==> { fail production }
      -    ...                                                       ==> { -, RULE_IN_RULEBOOK_EFF_family, <<named>> = FALSE }
      +    ...                                                       ==> { -, -, <<named>> = FALSE }
       
      -

      §4. As a safety measure, to avoid ambiguities, Inform only allows one phrase -definition to begin with "now". It recognises such phrases as those whose -preambles match: -

      - -
      -<now-phrase-preamble> ::=
      -    to now ...
      -
      - -

      §5. In basic mode (only), the To phrase "to begin" acts as something like -main in a C-like language, so we need to take note of where it's defined: -

      - -
      -<begin-phrase-preamble> ::=
      -    to begin
      -
      - -

      §6. Much later on, Inform returns to the definition. If the preamble matches +

      §4. Much later on, Inform returns to the definition. If the preamble matches either of the final two productions of <rule-preamble>, then we definitely have a rule rather than a phrase definition or a timed event; and in that case the rule's preamble (without its name, if given) has to match the @@ -267,7 +248,7 @@ following grammar. (Parsing this is "fine mode".) rule ==> { FALSE, - }

      -

      §7. The following turns the preamble text into a PHUD. It can be used as often +

      §5. The following turns the preamble text into a PHUD. It can be used as often as necessary in "coarse mode", but should be run once and once only on any given phrase when in "fine mode".

      @@ -282,23 +263,23 @@ effects — see below.)

      -int no_now_phrases = 0;
      -
      -ph_usage_data Phrases::Usage::new(wording W, int coarse_mode, imperative_defn *id) {
      +ph_usage_data Phrases::Usage::new(wording W, imperative_defn *id) {
           ph_usage_data phud;
      -    Empty the PHUD7.1;
      +    Empty the PHUD5.1;
      +
      +    if (id->family == TO_PHRASE_EFF_family) { ToPhraseFamily::phud(id, &phud); return phud; }
       
           if (<rule-preamble>(W)) {
      -        imperative_defn_family *family = <<rp>>;
      -        if (family == TO_PHRASE_EFF_family) The preamble parses to a To phrase7.2;
      -        if (family == RULE_IN_RULEBOOK_EFF_family) The preamble parses to a rule with a specified rulebook7.3;
      -        if (family == RULE_NOT_IN_RULEBOOK_EFF_family) The preamble parses to a rule with no specified rulebook7.4;
      +        if (RuleFamily::is(id)) {
      +            if (RuleFamily::not_in_rulebook(id)) The preamble parses to a rule with no specified rulebook5.3
      +            else The preamble parses to a rule with a specified rulebook5.2;
      +        }
           }
       
           return phud;
       }
       
      -

      §7.1. Empty the PHUD7.1 = +

      §5.1. Empty the PHUD5.1 =

      @@ -321,82 +302,8 @@ effects — see below.)
           phud.owning_rulebook_placement = MIDDLE_PLACEMENT;
           phud.explicit_name_for_inverse = EMPTY_WORDING;
       
      -
      • This code is used in §7.
      -

      §7.2. The preamble parses to a To phrase7.2 = -

      - -
      -    phud.rule_preamble = W;
      -
      -    if (<<named>>) The preamble parses to a named To phrase7.2.1;
      -    if (<now-phrase-preamble>(W)) {
      -        if (no_now_phrases++ == 1) {
      -            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow),
      -                "creating new variants on 'now' is not allowed",
      -                "because 'now' plays a special role in the language. "
      -                "It has a wide-ranging ability to make a condition "
      -                "become immediately true. (To give it wider abilities, "
      -                "the idea is to create new relations.)");
      -        }
      -    }
      -    if (<begin-phrase-preamble>(W)) {
      -        phud.to_begin = TRUE;
      -    }
      -
      -
      • This code is used in §7.
      -

      §7.2.1. When we parse a named phrase in coarse mode, we need to make sure that -name is registered as a constant value; when we parse it again in fine -mode, we can get that value back again if we look it up by name. -

      - -

      The preamble parses to a named To phrase7.2.1 = -

      - -
      -    wording RW = GET_RW(<rule-preamble>, 1);
      -    wording NW = GET_RW(<rule-preamble>, 2);
      -
      -    if (coarse_mode) {
      -        if (<s-type-expression>(NW)) {
      -            StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated),
      -                "that name for this new phrase is not allowed",
      -                "because it already has a meaning.");
      -        }
      -        phud.constant_phrase_holder = Phrases::Constants::parse(NW);
      -        if (phud.constant_phrase_holder == NULL)
      -            phud.constant_phrase_holder =
      -                Phrases::Constants::create(NW, RW);
      -    } else {
      -        constant_phrase *cphr = Phrases::Constants::parse(NW);
      -        if (Kinds::Behaviour::definite(cphr->cphr_kind) == FALSE) {
      -            phrase *ph = Phrases::Constants::as_phrase(cphr);
      -            if (ph) current_sentence = Phrases::declaration_node(ph);
      -            Problems::quote_source(1, Diagrams::new_UNPARSED_NOUN(Nouns::nominative_singular(cphr->name)));
      -            Problems::quote_wording(2, Nouns::nominative_singular(cphr->name));
      -            StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric));
      -            Problems::issue_problem_segment(
      -                "I can't allow %1, because the phrase it gives a name to "
      -                "is generic, that is, it has a kind which is too vague. "
      -                "That means there isn't any single phrase which '%2' "
      -                "could refer to - there would have to be different versions "
      -                "for every setting where it might be needed, and we can't "
      -                "predict in advance which one '%2' might need to be.");
      -            Problems::issue_problem_end();
      -            LOG("CPHR failed at %d, %u\n", cphr->allocation_id, cphr->cphr_kind);
      -        }
      -        if (<<written>>) {
      -            phud.explicit_name_used_in_maths = TRUE;
      -            if (<<inverted>>) {
      -                wording IW = GET_RW(<rule-preamble>, 3);
      -                phud.explicit_name_for_inverse = Wordings::first_word(IW);
      -            }
      -        }
      -        phud.constant_phrase_holder = cphr;
      -    }
      -    phud.rule_preamble = RW;
      -
      -
      • This code is used in §7.2.
      -

      §7.3. The preamble parses to a rule with a specified rulebook7.3 = +

      • This code is used in §5.
      +

      §5.2. The preamble parses to a rule with a specified rulebook5.2 =

      @@ -404,10 +311,10 @@ mode, we can get that value back again if we look it up by name.
               W = GET_RW(<rule-preamble>, 1);
               phud.explicit_name = GET_RW(<rule-preamble>, 2);
           }
      -    if (coarse_mode == FALSE) Parse the rulebook stem in fine mode7.3.1;
      +    Parse the rulebook stem in fine mode5.2.1;
       
      -
      • This code is used in §7.
      -

      §7.4. The preamble parses to a rule with no specified rulebook7.4 = +

      • This code is used in §5.
      +

      §5.3. The preamble parses to a rule with no specified rulebook5.3 =

      @@ -421,8 +328,8 @@ mode, we can get that value back again if we look it up by name.
                   phud.event_name = GET_RW(<event-rule-preamble>, 1);
           }
       
      -
      • This code is used in §7.
      -

      §7.3.1. That's it for coarse mode. The rest is what happens in fine mode, which +

      • This code is used in §5.
      +

      §5.2.1. That's it for coarse mode. The rest is what happens in fine mode, which affects rules giving a rulebook and some circumstances:

      @@ -433,7 +340,7 @@ affects rules giving a rulebook and some circumstances:

      Here "Instead of" is the stem and "taking a container" the bud.

      -

      Parse the rulebook stem in fine mode7.3.1 = +

      Parse the rulebook stem in fine mode5.2.1 =

      @@ -449,17 +356,17 @@ affects rules giving a rulebook and some circumstances:
               phud.owning_rulebook = parsed_rm.matched_rulebook;
               if (phud.owning_rulebook == NULL) internal_error("rulebook stem misparsed");
               phud.owning_rulebook_placement = parsed_rm.placement_requested;
      -        Disallow the definite article for anonymous rules7.3.1.2;
      -        Cut off the bud from the stem7.3.1.1;
      +        Disallow the definite article for anonymous rules5.2.1.2;
      +        Cut off the bud from the stem5.2.1.1;
           }
           phud.rule_preamble = W;
       
      -
      • This code is used in §7.3.
      -

      §7.3.1.1. The bud is not always present at all, and need not always be at the end +

      • This code is used in §5.2.
      +

      §5.2.1.1. The bud is not always present at all, and need not always be at the end of the stem, so we have to be very careful:

      -

      Cut off the bud from the stem7.3.1.1 = +

      Cut off the bud from the stem5.2.1.1 =

      @@ -515,17 +422,17 @@ of the stem, so we have to be very careful:
               phud.whenwhile = EMPTY_WORDING;
           }
       
      - -

      §8. If we can't find a stem, the following chooses which problem to issue: +

      +

      §6. If we can't find a stem, the following chooses which problem to issue:

       <unrecognised-rule-stem-diagnosis> ::=
      -    when *** |    ==> Issue PM_BadRulePreambleWhen problem8.1
      -    ...                         ==> Issue PM_BadRulePreamble problem8.2
      +    when *** |    ==> Issue PM_BadRulePreambleWhen problem6.1
      +    ...                         ==> Issue PM_BadRulePreamble problem6.2
       
      -

      §8.1. Issue PM_BadRulePreambleWhen problem8.1 = +

      §6.1. Issue PM_BadRulePreambleWhen problem6.1 =

      @@ -551,8 +458,8 @@ of the stem, so we have to be very careful:
               "location is the South Pole.'");
           Problems::issue_problem_end();
       
      -
      • This code is used in §8.
      -

      §8.2. Issue PM_BadRulePreamble problem8.2 = +

      • This code is used in §6.
      +

      §6.2. Issue PM_BadRulePreamble problem6.2 =

      @@ -566,8 +473,8 @@ of the stem, so we have to be very careful:
               "by some description of the action or value to apply to (e.g. "
               "'Instead of taking something:' or 'Every turn:').");
       
      -
      • This code is used in §8.
      -

      §7.3.1.2. Disallow the definite article for anonymous rules7.3.1.2 = +

      • This code is used in §6.
      +

      §5.2.1.2. Disallow the definite article for anonymous rules5.2.1.2 =

      @@ -578,17 +485,17 @@ of the stem, so we have to be very careful:
                   "so (e.g.) 'the before rule: ...' is disallowed; you should "
                   "write 'a before rule: ...' instead.");
       
      - -

      §9. Extracting the stem. A couple of routines to read but not really parse the stem and the bud. +

      +

      §7. Extracting the stem. A couple of routines to read but not really parse the stem and the bud.

      -wording Phrases::Usage::get_preamble_text(ph_usage_data *phud) {
      -    if (phud->from->family == TO_PHRASE_EFF_family) return phud->rule_preamble;
      +wording Phrases::Usage::get_preamble_text(ph_usage_data *phud) {
      +    if (phud->from->family == TO_PHRASE_EFF_family) return phud->rule_preamble;
           return phud->full_preamble;
       }
       
      -

      §10. For example, for the rule +

      §8. For example, for the rule

      @@ -608,42 +515,42 @@ of the stem, so we have to be very careful: return EMPTY_WORDING; }
      -

      §11.

      +

      §9.

       <when-while-clause> ::=
           ... when/while ...
       
      -

      §12. Miscellaneous. Some access routines. +

      §10. Miscellaneous. Some access routines.

      -int Phrases::Usage::get_rulebook_placement(ph_usage_data *phud) {
      +int Phrases::Usage::get_rulebook_placement(ph_usage_data *phud) {
           return phud->owning_rulebook_placement;
       }
       
      -rulebook *Phrases::Usage::get_rulebook(ph_usage_data *phud) {
      +rulebook *Phrases::Usage::get_rulebook(ph_usage_data *phud) {
           return phud->owning_rulebook;
       }
       
      -void Phrases::Usage::set_rulebook(ph_usage_data *phud, rulebook *rb) {
      +void Phrases::Usage::set_rulebook(ph_usage_data *phud, rulebook *rb) {
           phud->owning_rulebook = rb;
       
       }
       
      -int Phrases::Usage::get_timing_of_event(ph_usage_data *phud) {
      +int Phrases::Usage::get_timing_of_event(ph_usage_data *phud) {
           return phud->timing_of_event;
       }
       
      -int Phrases::Usage::has_name_as_constant(ph_usage_data *phud) {
      +int Phrases::Usage::has_name_as_constant(ph_usage_data *phud) {
           if ((phud->constant_phrase_holder) &&
               (phud->explicit_name_used_in_maths == FALSE) &&
               (Wordings::nonempty(Nouns::nominative_singular(phud->constant_phrase_holder->name)))) return TRUE;
           return FALSE;
       }
       
      -wording Phrases::Usage::get_equation_form(ph_usage_data *phud) {
      +wording Phrases::Usage::get_equation_form(ph_usage_data *phud) {
           if (phud->explicit_name_used_in_maths)
               return Wordings::first_word(Nouns::nominative_singular(phud->constant_phrase_holder->name));
           return EMPTY_WORDING;
      @@ -653,7 +560,7 @@ of the stem, so we have to be very careful:
           if (Wordings::nonempty(phud->explicit_name_for_inverse)) {
               phrase *ph;
               LOOP_OVER(ph, phrase) {
      -            wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
      +            wording W = Phrases::Usage::get_equation_form(&(ph->usage_data));
                   if (Wordings::nonempty(W))
                       if (Wordings::match(W, phud->explicit_name_for_inverse))
                           return ph;
      @@ -662,13 +569,13 @@ of the stem, so we have to be very careful:
           return NULL;
       }
       
      -

      §13. Logging and indexing. The length and thoroughness of this may give some hint of how troublesome +

      §11. Logging and indexing. The length and thoroughness of this may give some hint of how troublesome it was to debug the preamble-parsing code:

      -void Phrases::Usage::log(ph_usage_data *phud) {
      -    LOG("PHUD: <%W>: rule attachment mode %S\n", phud->full_preamble, phud->from->family->family_name);
      +void Phrases::Usage::log(ph_usage_data *phud) {
      +    LOG("PHUD: <%W>: rule attachment mode %S\n", phud->full_preamble, phud->from->family->family_name);
           if (phud->constant_phrase_holder)
               LOG("  Constant name: <%W>\n", Nouns::nominative_singular(phud->constant_phrase_holder->name));
           if (Wordings::nonempty(phud->explicit_name))
      @@ -702,7 +609,7 @@ it was to debug the preamble-parsing code:
           }
       }
       
      -void Phrases::Usage::log_rule_name(ph_usage_data *phud) {
      +void Phrases::Usage::log_rule_name(ph_usage_data *phud) {
           if (Wordings::empty(phud->explicit_name)) {
               if (Wordings::nonempty(phud->full_preamble))
                   LOG("\"%W\"", phud->full_preamble);
      @@ -710,26 +617,26 @@ it was to debug the preamble-parsing code:
           } else LOG("(%W)", phud->explicit_name);
       }
       
      -

      §14. In our compiled code, it's useful to label routines with I6 comments: +

      §12. In our compiled code, it's useful to label routines with I6 comments:

      -void Phrases::Usage::write_I6_comment_describing(ph_usage_data *phud) {
      +void Phrases::Usage::write_I6_comment_describing(ph_usage_data *phud) {
           TEMPORARY_TEXT(C)
           WRITE_TO(C, "%~W:", phud->full_preamble);
           Produce::comment(Emit::tree(), C);
           DISCARD_TEXT(C)
       }
       
      -

      §15. And similarly: +

      §13. And similarly:

      -void Phrases::Usage::index_preamble(OUTPUT_STREAM, ph_usage_data *phud) {
      +void Phrases::Usage::index_preamble(OUTPUT_STREAM, ph_usage_data *phud) {
           WRITE("%+W", phud->full_preamble);
       }
       
      -

      §16. How the PHUD translates into a PHRCD. Recall that in the early afternoon, the PHUD for a rule phrase is translated +

      §14. How the PHUD translates into a PHRCD. Recall that in the early afternoon, the PHUD for a rule phrase is translated into a PHRCD, that is, a set of instructions about the circumstances for the rule to fire.

      @@ -743,31 +650,31 @@ seen problems in Inform. A couple of variables are needed just for that: int NAP_problem_explained = FALSE; pertains to Named Action Patterns int issuing_ANL_problem = FALSE; pertains to Action Name Lists
      -

      §17.

      +

      §15.

      -ph_runtime_context_data Phrases::Usage::to_runtime_context_data(ph_usage_data *phud) {
      +ph_runtime_context_data Phrases::Usage::to_runtime_context_data(ph_usage_data *phud) {
           ph_runtime_context_data phrcd = Phrases::Context::new();
       
      -    if (phud->from->family == RULE_NOT_IN_RULEBOOK_EFF_family)
      -        phrcd.permit_all_outcomes = TRUE;
      -
      -    if (phud->from->family == RULE_IN_RULEBOOK_EFF_family)
      -        Finish work parsing the conditions for the rule to fire17.1;
      -
      +    if (RuleFamily::is(phud->from)) {
      +        if (RuleFamily::not_in_rulebook(phud->from))
      +            phrcd.permit_all_outcomes = TRUE;
      +        else
      +            Finish work parsing the conditions for the rule to fire15.1;
      +    }
           return phrcd;
       }
       
      -

      §17.1. All of this is just dumb copying... +

      §15.1. All of this is just dumb copying...

      -

      Finish work parsing the conditions for the rule to fire17.1 = +

      Finish work parsing the conditions for the rule to fire15.1 =

           phrcd.compile_for_rulebook = &(phud->owning_rulebook);
       
      -    if (Wordings::nonempty(phud->rule_parameter)) Parse what used to be the bud into the PHRCD17.1.1;
      +    if (Wordings::nonempty(phud->rule_parameter)) Parse what used to be the bud into the PHRCD15.1.1;
       
           if (Wordings::nonempty(phud->whenwhile)) {
               phrcd.activity_context =
      @@ -781,11 +688,11 @@ seen problems in Inform. A couple of variables are needed just for that:
           if (phud->during_scene_spec) phrcd.during_scene = phud->during_scene_spec;
           #endif
       
      -
      • This code is used in §17.
      -

      §17.1.1. ...except for this: +

      • This code is used in §15.
      +

      §15.1.1. ...except for this:

      -

      Parse what used to be the bud into the PHRCD17.1.1 = +

      Parse what used to be the bud into the PHRCD15.1.1 =

      @@ -800,7 +707,7 @@ seen problems in Inform. A couple of variables are needed just for that:
               ParseActionPatterns::restore_mode(saved);
       
               if (phrcd.ap == NULL)
      -            Issue a problem message for a bad action17.1.1.1;
      +            Issue a problem message for a bad action15.1.1.1;
           } else {
               kind *pk = Rulebooks::get_focus_kind(phud->owning_rulebook);
               phrcd.ap = ActionPatterns::parse_parametric(phud->rule_parameter, pk);
      @@ -814,16 +721,16 @@ seen problems in Inform. A couple of variables are needed just for that:
                       }
                   }
               }
      -        if (phrcd.ap == NULL) Issue a problem message for a bad parameter17.1.1.2;
      +        if (phrcd.ap == NULL) Issue a problem message for a bad parameter15.1.1.2;
           }
           #endif
           #ifndef IF_MODULE
           kind *pk = Rulebooks::get_focus_kind(phud->owning_rulebook);
      -    Issue a problem message for a bad parameter17.1.1.2;
      +    Issue a problem message for a bad parameter15.1.1.2;
           #endif
       
      - -

      §17.1.1.1. All that's left is to issue a "good" problem message, but this is quite +

      +

      §15.1.1.1. All that's left is to issue a "good" problem message, but this is quite a large undertaking, because the situation as we currently know it is just that something's wrong with the rule preamble — which covers an enormous range of different faults. @@ -833,26 +740,26 @@ range of different faults. parser, recording how it most recently failed.

      -

      Issue a problem message for a bad action17.1.1.1 = +

      Issue a problem message for a bad action15.1.1.1 =

      -    Phrases::Usage::log(phud);
      +    Phrases::Usage::log(phud);
           LOG("Bad action pattern: %W = $A\nPAP failure reason: %d\n",
               phud->rule_parameter, phrcd.ap, pap_failure_reason);
           Problems::quote_source(1, current_sentence);
           Problems::quote_wording(2, phud->rule_parameter);
           if (<action-problem-diagnosis>(phud->rule_parameter) == FALSE)
               switch(pap_failure_reason) {
      -            case MIXEDNOUNS_PAPF: Issue PM_APWithDisjunction problem17.1.1.1.1; break;
      -            case NOPARTICIPLE_PAPF: Issue PM_APWithNoParticiple problem17.1.1.1.2; break;
      -            case IMMISCIBLE_PAPF: Issue PM_APWithImmiscible problem17.1.1.1.3; break;
      -            case WHEN_PAPF: Issue PM_APWithBadWhen problem17.1.1.1.4; break;
      -            default: Issue PM_APUnknown problem17.1.1.1.5; break;
      +            case MIXEDNOUNS_PAPF: Issue PM_APWithDisjunction problem15.1.1.1.1; break;
      +            case NOPARTICIPLE_PAPF: Issue PM_APWithNoParticiple problem15.1.1.1.2; break;
      +            case IMMISCIBLE_PAPF: Issue PM_APWithImmiscible problem15.1.1.1.3; break;
      +            case WHEN_PAPF: Issue PM_APWithBadWhen problem15.1.1.1.4; break;
      +            default: Issue PM_APUnknown problem15.1.1.1.5; break;
               }
       
      - -

      §17.1.1.1.1. Issue PM_APWithDisjunction problem17.1.1.1.1 = +

      +

      §15.1.1.1.1. Issue PM_APWithDisjunction problem15.1.1.1.1 =

      @@ -870,8 +777,8 @@ parser, recording how it most recently failed.
               "write more than one rule.");
           Problems::issue_problem_end();
       
      - -

      §17.1.1.1.2. Issue PM_APWithNoParticiple problem17.1.1.1.2 = +

      +

      §15.1.1.1.2. Issue PM_APWithNoParticiple problem15.1.1.1.2 =

      @@ -884,8 +791,8 @@ parser, recording how it most recently failed.
               "badly misunderstood what you intended.");
           Problems::issue_problem_end();
       
      - -

      §17.1.1.1.3. Issue PM_APWithImmiscible problem17.1.1.1.3 = +

      +

      §15.1.1.1.3. Issue PM_APWithImmiscible problem15.1.1.1.3 =

      @@ -901,8 +808,8 @@ parser, recording how it most recently failed.
               "would make different use of objects from each other.)");
           Problems::issue_problem_end();
       
      - -

      §17.1.1.1.4. Issue PM_APWithBadWhen problem17.1.1.1.4 = +

      +

      §15.1.1.1.4. Issue PM_APWithBadWhen problem15.1.1.1.4 =

      @@ -940,8 +847,8 @@ parser, recording how it most recently failed.
                   "location'; but the same thing with '...and when Peter is...' is not allowed.");
           Problems::issue_problem_end();
       
      - -

      §17.1.1.1.5. Issue PM_APUnknown problem17.1.1.1.5 = +

      +

      §15.1.1.1.5. Issue PM_APUnknown problem15.1.1.1.5 =

      @@ -954,15 +861,15 @@ parser, recording how it most recently failed.
           Problems::issue_problem_segment(
               "You wrote %1, which seems to introduce a rule taking effect only if the "
               "action is '%2'. %3 did not make sense as a description of an action.");
      -    See if it starts with a valid action name, at least17.1.1.1.5.1;
      -    See if this might be a when-for confusion17.1.1.1.5.2;
      -    Break down the action list and say which are okay17.1.1.1.5.3;
      +    See if it starts with a valid action name, at least15.1.1.1.5.1;
      +    See if this might be a when-for confusion15.1.1.1.5.2;
      +    Break down the action list and say which are okay15.1.1.1.5.3;
           Problems::issue_problem_segment(
               " I am unable to place this rule into any rulebook.");
           Problems::issue_problem_end();
       
      - -

      §17.1.1.1.5.1. See if it starts with a valid action name, at least17.1.1.1.5.1 = +

      +

      §15.1.1.1.5.1. See if it starts with a valid action name, at least15.1.1.1.5.1 =

      @@ -978,8 +885,8 @@ parser, recording how it most recently failed.
                   break;
               }
       
      - -

      §17.1.1.1.5.2. See if this might be a when-for confusion17.1.1.1.5.2 = +

      +

      §15.1.1.1.5.2. See if this might be a when-for confusion15.1.1.1.5.2 =

      @@ -994,8 +901,8 @@ parser, recording how it most recently failed.
               }
           }
       
      - -

      §17.1.1.1.5.3. If the action pattern contains what looks like a list of action names, as +

      +

      §15.1.1.1.5.3. If the action pattern contains what looks like a list of action names, as for example

      @@ -1008,7 +915,7 @@ apparent number of action names. We then run the grammar again, but this time allowing it to print comments on each apparent action name it sees.

      -

      Break down the action list and say which are okay17.1.1.1.5.3 = +

      Break down the action list and say which are okay15.1.1.1.5.3 =

      @@ -1029,37 +936,37 @@ allowing it to print comments on each apparent action name it sees.
               Problems::issue_problem_segment(" so");
           }
       
      - -

      §17.1.1.2. We have a much easier time if the rulebook was value-focused, so that +

      +

      §15.1.1.2. We have a much easier time if the rulebook was value-focused, so that the only possible problem is that the value was wrong.

      -

      Issue a problem message for a bad parameter17.1.1.2 = +

      Issue a problem message for a bad parameter15.1.1.2 =

      -    Phrases::Usage::log(phud);
      +    Phrases::Usage::log(phud);
           Problems::quote_source(1, current_sentence);
           Problems::quote_wording(2, phud->rule_parameter);
           Problems::quote_kind(3, pk);
           <parametric-problem-diagnosis>(phud->rule_preamble);
       
      - -

      §18. And that is the end of the code as such, but we still have to define the +

      +

      §16. And that is the end of the code as such, but we still have to define the three diagnosis grammars we needed.

      -

      §19. Parametric rules are those applying to values not actions, and the following +

      §17. Parametric rules are those applying to values not actions, and the following is used to choose a problem message if the value makes no sense.

       <parametric-problem-diagnosis> ::=
      -    when the play begins/ends |    ==> Issue PM_WhenThePlay problem19.1
      -    ...                                 ==> Issue PM_BadParameter problem19.2
      +    when the play begins/ends |    ==> Issue PM_WhenThePlay problem17.1
      +    ...                                 ==> Issue PM_BadParameter problem17.2
       
      -

      §19.1. Issue PM_WhenThePlay problem19.1 = +

      §17.1. Issue PM_WhenThePlay problem17.1 =

      @@ -1069,8 +976,8 @@ is used to choose a problem message if the value makes no sense.
               "special rulebooks, 'When play begins' and 'When play ends', "
               "and I think you probably mean to refer to one of those.");
       
      -
      • This code is used in §19.
      -

      §19.2. Issue PM_BadParameter problem19.2 = +

      • This code is used in §17.
      +

      §17.2. Issue PM_BadParameter problem17.2 =

      @@ -1081,18 +988,18 @@ is used to choose a problem message if the value makes no sense.
               "that should have described %3.");
           Problems::issue_problem_end();
       
      -
      • This code is used in §19.
      -

      §20. And here we choose a problem message if a rule applying to an action is used, +

      • This code is used in §17.
      +

      §18. And here we choose a problem message if a rule applying to an action is used, but the action isn't one we recognise.

       <action-problem-diagnosis> ::=
      -    in the presence of ... |    ==> Issue PM_NonActionInPresenceOf problem20.1
      -    in ...                          ==> Issue PM_NonActionIn problem20.2
      +    in the presence of ... |    ==> Issue PM_NonActionInPresenceOf problem18.1
      +    in ...                          ==> Issue PM_NonActionIn problem18.2
       
      -

      §20.1. Issue PM_NonActionInPresenceOf problem20.1 = +

      §18.1. Issue PM_NonActionInPresenceOf problem18.1 =

      @@ -1109,8 +1016,8 @@ but the action isn't one we recognise.
               "see...'.");
           Problems::issue_problem_end();
       
      -
      • This code is used in §20.
      -

      §20.2. Issue PM_NonActionIn problem20.2 = +

      • This code is used in §18.
      +

      §18.2. Issue PM_NonActionIn problem18.2 =

      @@ -1123,8 +1030,8 @@ but the action isn't one we recognise.
               "when in the Library'.");
           Problems::issue_problem_end();
       
      -
      • This code is used in §20.
      -

      §21. The following is used to choose a problem when the trouble with the rule +

      • This code is used in §18.
      +

      §19. The following is used to choose a problem when the trouble with the rule occurred in a when/while condition at the end; while all five cases produce the PM_APWithBadWhen problem, they each provide different clues as to what might have gone wrong. @@ -1139,7 +1046,7 @@ might have gone wrong. ... {when/while ...} ==> { 5, -, <<cw1>> = Wordings::first_wn(WR[2]), <<cw2>> = Wordings::last_wn(WR[2]) }

      -

      §22.

      +

      §20.

       <anl-diagnosis> ::=
      @@ -1155,10 +1062,10 @@ might have gone wrong.
           _,/or <anl-inner-diagnosis>                   ==> { pass 1 }
       
       <anl-entry-diagnosis> ::=
      -    ......                                          ==> Diagnose problem with this ANL entry22.1
      +    ......                                          ==> Diagnose problem with this ANL entry20.1
       
      -

      §22.1. Diagnose problem with this ANL entry22.1 = +

      §20.1. Diagnose problem with this ANL entry20.1 =

      @@ -1206,9 +1113,9 @@ might have gone wrong.
           }
           ==> { 1, - };
       
      -
      • This code is used in §22.
      +
      • This code is used in §20.
      diff --git a/docs/imperative-module/3-tp.html b/docs/imperative-module/3-tp.html index 3c5e7b718..4b7b40f8c 100644 --- a/docs/imperative-module/3-tp.html +++ b/docs/imperative-module/3-tp.html @@ -92,7 +92,7 @@ defined as "At 9:00 AM: ..." But two values are special: CLASS_DEFINITION } use_as_event;
      -
      • The structure use_as_event is accessed in 2/rlb, 2/act, 3/id, 3/phr, 3/prcd, 3/tph, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
      +
      • The structure use_as_event is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.

      §3. Timed events are stored in two simple arrays, processed by run-time code.

      @@ -103,7 +103,7 @@ defined as "At 9:00 AM: ..." But two values are special: int when_count = 0; phrase *ph; LOOP_OVER(ph, phrase) { - int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data)); + int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data)); if (t == NOT_A_TIMED_EVENT) continue; if (t == NO_FIXED_TIME) when_count++; else Emit::array_iname_entry(Phrases::iname(ph)); @@ -123,7 +123,7 @@ defined as "At 9:00 AM: ..." But two values are special: int when_count = 0; phrase *ph; LOOP_OVER(ph, phrase) { - int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data)); + int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data)); if (t == NOT_A_TIMED_EVENT) continue; if (t == NO_FIXED_TIME) when_count++; else Emit::array_numeric_entry((inter_ti) t); @@ -142,7 +142,7 @@ defined as "At 9:00 AM: ..." But two values are special:
       void Phrases::Timed::note_usage(phrase *ph, parse_node *at) {
      -    int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data));
      +    int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data));
           if (t == NO_FIXED_TIME) {
               use_as_event *uae = CREATE(use_as_event);
               uae->where_triggered = at;
      @@ -164,9 +164,9 @@ arguably shouldn't block compilation. Then again...
       void Phrases::Timed::check_for_unused(void) {
           phrase *ph;
           LOOP_OVER(ph, phrase)
      -        if (Phrases::Usage::get_timing_of_event(&(ph->usage_data)) == NO_FIXED_TIME) {
      +        if (Phrases::Usage::get_timing_of_event(&(ph->usage_data)) == NO_FIXED_TIME) {
                   if (ph->usage_data.uses_as_event == NULL) {
      -                current_sentence = ph->from->at;
      +                current_sentence = ph->from->at;
                       StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnusedTimedEvent),
                           "this sets up a timed event which is never used",
                           "since you never use any of the phrases which could cause it. "
      @@ -195,7 +195,7 @@ arguably shouldn't block compilation. Then again...
       
           phrase *ph;
           LOOP_OVER(ph, phrase) {
      -        int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data));
      +        int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data));
               if (t == NO_FIXED_TIME) {
                   if (when_count == 0) {
                       HTML_OPEN("p");
      @@ -204,10 +204,10 @@ arguably shouldn't block compilation. Then again...
                   }
                   when_count++;
                   HTML_OPEN_WITH("p", "class=\"tightin2\"");
      -            Phrases::Usage::index_preamble(OUT, &(ph->usage_data));
      -            if ((ph->from->at) &&
      -                (Wordings::nonempty(Node::get_text(ph->from->at))))
      -                Index::link(OUT, Wordings::first_wn(Node::get_text(ph->from->at)));
      +            Phrases::Usage::index_preamble(OUT, &(ph->usage_data));
      +            if ((ph->from->at) &&
      +                (Wordings::nonempty(Node::get_text(ph->from->at))))
      +                Index::link(OUT, Wordings::first_wn(Node::get_text(ph->from->at)));
                   WRITE(" (where triggered: ");
                   use_as_event *uae;
                   for (uae = ph->usage_data.uses_as_event; uae; uae=uae->next)
      @@ -224,7 +224,7 @@ arguably shouldn't block compilation. Then again...
       
           phrase *ph;
           LOOP_OVER(ph, phrase) {
      -        int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data));
      +        int t = Phrases::Usage::get_timing_of_event(&(ph->usage_data));
               if (t >= 0) {  i.e., an actual time of day in minutes since midnight
                   if (tt_count == 0) {
                       HTML_OPEN("p");
      @@ -233,17 +233,17 @@ arguably shouldn't block compilation. Then again...
                   }
                   tt_count++;
                   HTML_OPEN_WITH("p", "class=\"in2\"");
      -            Phrases::Usage::index_preamble(OUT, &(ph->usage_data));
      -            if ((ph->from->at) &&
      -                (Wordings::nonempty(Node::get_text(ph->from->at))))
      -                Index::link(OUT, Wordings::first_wn(Node::get_text(ph->from->at)));
      +            Phrases::Usage::index_preamble(OUT, &(ph->usage_data));
      +            if ((ph->from->at) &&
      +                (Wordings::nonempty(Node::get_text(ph->from->at))))
      +                Index::link(OUT, Wordings::first_wn(Node::get_text(ph->from->at)));
                   HTML_CLOSE("p");
               }
           }
       
      • This code is used in §6.
      diff --git a/docs/imperative-module/3-tph.html b/docs/imperative-module/3-tph.html index 599fa62c9..33bfcd2cc 100644 --- a/docs/imperative-module/3-tph.html +++ b/docs/imperative-module/3-tph.html @@ -159,7 +159,7 @@ logical order.

      -void Routines::ToPhrases::new(phrase *ph) {
      +void Routines::ToPhrases::new(phrase *ph) {
           phrase *previous_phrase = NULL;
           phrase *current_phrase = first_in_logical_order;
           ph->requests_package = Hierarchy::package(ph->owning_module, PHRASES_HAP);
      @@ -189,17 +189,17 @@ reasons, that is, to make the compiled code more legible.
       

      -void Routines::ToPhrases::register_all(void) {
      +void Routines::ToPhrases::register_all(void) {
           phrase *ph;
           int c = 0;
           for (ph = first_in_logical_order; ph; ph = ph->next_in_logical_order) {
      -        current_sentence = ph->from->at;
      +        current_sentence = ph->from->at;
               Phrases::Parser::register_excerpt(ph);
               ph->sequence_count = c++;
           }
       }
       
      -int Routines::ToPhrases::sequence_count(phrase *ph) {
      +int Routines::ToPhrases::sequence_count(phrase *ph) {
           if (ph == NULL) return 0;
           if (ph->sequence_count == -1) {
               Phrases::log(ph);
      @@ -234,7 +234,7 @@ values in force, so that there is no possible ambiguity in how we read K.
       

      -to_phrase_request *Routines::ToPhrases::make_request(phrase *ph, kind *K,
      +to_phrase_request *Routines::ToPhrases::make_request(phrase *ph, kind *K,
           kind_variable_declaration *kvd, wording W) {
           if ((ph == NULL) || (K == NULL)) internal_error("bad request");
       
      @@ -252,7 +252,7 @@ values in force, so that there is no possible ambiguity in how we read K.
           req->requested_exact_kind = K;
           req->requested_phrase = ph;
           compilation_unit *cm = CompilationUnits::current();
      -    if (ph->from->at) cm = CompilationUnits::find(ph->from->at);
      +    if (ph->from->at) cm = CompilationUnits::find(ph->from->at);
       
           package_request *P = Hierarchy::package_within(REQUESTS_HAP, ph->requests_package);
           req->req_iname = Hierarchy::make_localised_iname_in(PHRASE_FN_HL, P, cm);
      @@ -296,7 +296,7 @@ I6 routine.
       

      -inter_name *Routines::ToPhrases::make_iname(phrase *ph, kind *req_kind) {
      +inter_name *Routines::ToPhrases::make_iname(phrase *ph, kind *req_kind) {
           if (Phrases::TypeData::invoked_inline(ph)) {
               TEMPORARY_TEXT(identifier)
               wchar_t *p = Phrases::get_inline_definition(ph);
      @@ -338,7 +338,7 @@ since the last time it was called.
       
       
       to_phrase_request *latest_request_granted = NULL;
      -int Routines::ToPhrases::compilation_coroutine(int *i, int max_i) {
      +int Routines::ToPhrases::compilation_coroutine(int *i, int max_i) {
           int N = 0;
           while (TRUE) {
               to_phrase_request *req;
      @@ -359,7 +359,7 @@ to write a comment about this:
       

      -void Routines::ToPhrases::comment_on_request(to_phrase_request *req) {
      +void Routines::ToPhrases::comment_on_request(to_phrase_request *req) {
           if (req == NULL) Produce::comment(Emit::tree(), I"No specific request");
           else {
               TEMPORARY_TEXT(C)
      @@ -374,12 +374,12 @@ to write a comment about this:
       

      -kind *Routines::ToPhrases::kind_of_request(to_phrase_request *req) {
      +kind *Routines::ToPhrases::kind_of_request(to_phrase_request *req) {
           if (req == NULL) internal_error("null request");
           return req->requested_exact_kind;
       }
       
      -kind **Routines::ToPhrases::kind_variables_for_request(to_phrase_request *req) {
      +kind **Routines::ToPhrases::kind_variables_for_request(to_phrase_request *req) {
           if (req == NULL) internal_error("null request");
           return req->kind_variables_interpretation;
       }
      @@ -403,7 +403,7 @@ is confined to the current Chapter.
       }
       
      diff --git a/docs/imperative-module/4-lv.html b/docs/imperative-module/4-lv.html index a3523605b..6285ed147 100644 --- a/docs/imperative-module/4-lv.html +++ b/docs/imperative-module/4-lv.html @@ -148,7 +148,7 @@ marks it as deallocated. CLASS_DEFINITION } local_variable;
      -
      • The structure local_variable is accessed in 2/rlb, 2/act, 3/id, 3/phr, 3/prcd, 3/tph, 3/tp, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
      +
      • The structure local_variable is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 3/tp, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.

      §3. A local variable needs to be stored somewhere at run-time. The obvious correspondence is to put these into I6 local variables, which are, in effect, CPU registers. We won't need to do much in the way of register-allocation, @@ -751,7 +751,7 @@ fake up a call parameter pro tem.) phsf->local_value_variables.its_form_allowed = TRUE; } -local_variable *LocalVariables::add_pronoun(ph_stack_frame *phsf, wording W, kind *K) { +local_variable *LocalVariables::add_pronoun(ph_stack_frame *phsf, wording W, kind *K) { phsf->local_value_variables.it_variable_exists = TRUE; return LocalVariables::add_call_parameter(phsf, W, K); } @@ -841,7 +841,7 @@ the text "X":

      -local_variable *LocalVariables::ensure_called_local(wording W, kind *K) {
      +local_variable *LocalVariables::ensure_called_local(wording W, kind *K) {
           ph_stack_frame *phsf = Frames::current_stack_frame();
           if (phsf == NULL) return NULL;  in case callings are made from parsing alone
           <new-called-name>(W);
      @@ -990,7 +990,7 @@ an instance of the kind "bystander".
       

      -int LocalVariables::permit_as_new_local(parse_node *found, int as_calling) {
      +int LocalVariables::permit_as_new_local(parse_node *found, int as_calling) {
           if (Node::is(found, AMBIGUITY_NT)) found = found->down;
           if ((Specifications::is_kind_like(found)) &&
               (Kinds::Behaviour::is_object(Specifications::to_kind(found)) == FALSE)) return FALSE;
      @@ -1009,7 +1009,7 @@ an instance of the kind "bystander".
       

      §34. Logging.

      -void LocalVariables::log(local_variable *lvar) {
      +void LocalVariables::log(local_variable *lvar) {
           LocalVariables::write(DL, lvar);
       }
       
      @@ -1037,7 +1037,7 @@ an instance of the kind "bystander".
       

      -kind *LocalVariables::kind(local_variable *lvar) {
      +kind *LocalVariables::kind(local_variable *lvar) {
           if (lvar == NULL) internal_error("Tried to find kind of nonexistent local variable");
           return lvar->kind_as_declared;
       }
      @@ -1052,7 +1052,7 @@ exists to fix that:
       

      -void LocalVariables::set_kind(local_variable *lvar, kind *K) {
      +void LocalVariables::set_kind(local_variable *lvar, kind *K) {
           if (lvar == NULL) internal_error("Tried to set kind of nonexistent local variable");
           LOGIF(LOCAL_VARIABLES, "Kind of local $k set to %u\n", lvar, K);
           lvar->kind_as_declared = K;
      @@ -1066,12 +1066,12 @@ worth making the change, even though the disruption would be small.)
       

      -void LocalVariables::unprotect(local_variable *lvar) {
      +void LocalVariables::unprotect(local_variable *lvar) {
           if (lvar->lv_purpose == LET_VALUE_LV)
               lvar->protected = FALSE;
       }
       
      -int LocalVariables::protected(local_variable *lvar) {
      +int LocalVariables::protected(local_variable *lvar) {
           if ((lvar->lv_purpose == LET_VALUE_LV) && (lvar->protected)) {
               Problems::quote_source(1, current_sentence);
               Problems::quote_wording(2, lvar->varname);
      @@ -1095,7 +1095,7 @@ and when the block ends it decrements.
       

      -void LocalVariables::set_scope_to(local_variable *lvar, int s) {
      +void LocalVariables::set_scope_to(local_variable *lvar, int s) {
           if ((s > 0) && (lvar) && (lvar->lv_purpose == LET_VALUE_LV)) {
               lvar->block_scope = s;
               LOGIF(LOCAL_VARIABLES, "Setting scope of $k to block level %d\n", lvar, s);
      @@ -1106,11 +1106,11 @@ and when the block ends it decrements.
       

      -void LocalVariables::mark_to_free_at_end_of_scope(local_variable *lvar) {
      +void LocalVariables::mark_to_free_at_end_of_scope(local_variable *lvar) {
           lvar->free_at_end_of_scope = TRUE;
       }
       
      -void LocalVariables::end_scope(int s) {
      +void LocalVariables::end_scope(int s) {
           ph_stack_frame *phsf = Frames::current_stack_frame();
           if (phsf == NULL) internal_error("relinquishing locals where no stack frame exists");
           if (s <= 0) internal_error("the outermost scope cannot end");
      @@ -1173,7 +1173,7 @@ value.
       int callings_session_number[MAX_CALLINGS_IN_MATCH];
       local_variable *callings_in_condition[MAX_CALLINGS_IN_MATCH];
       
      -void LocalVariables::add_calling_to_condition(local_variable *lvar) {
      +void LocalVariables::add_calling_to_condition(local_variable *lvar) {
           if (current_session_number < 0) internal_error("no PM session");
           if (callings_in_condition_sp + 1 == MAX_CALLINGS_IN_MATCH)
               StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),  or very hard, anyway
      @@ -1185,13 +1185,13 @@ value.
           }
       }
       
      -void LocalVariables::begin_condition_emit(void) {
      +void LocalVariables::begin_condition_emit(void) {
           current_session_number++;
           Produce::inv_primitive(Emit::tree(), OR_BIP);
           Produce::down(Emit::tree());
       }
       
      -void LocalVariables::end_condition_emit(void) {
      +void LocalVariables::end_condition_emit(void) {
           if (current_session_number < 0) internal_error("unstarted PM session");
       
           int NC = 0, x = callings_in_condition_sp, downs = 1;
      @@ -1237,7 +1237,7 @@ lvalue which can be used to evaluate or assign to the variable:
       

      -void LocalVariables::writer(OUTPUT_STREAM, char *format_string, void *vL) {
      +void LocalVariables::writer(OUTPUT_STREAM, char *format_string, void *vL) {
           local_variable *lvar = (local_variable *) vL;
           if (lvar == NULL) internal_error("no such variable");
           switch (format_string[0]) {
      @@ -1313,7 +1313,7 @@ need in the compilation of any given routine:
               }
       }
       
      -inter_symbol *LocalVariables::declare_this(local_variable *lvar, int shell_mode, int reason) {
      +inter_symbol *LocalVariables::declare_this(local_variable *lvar, int shell_mode, int reason) {
           inter_symbol *S = Produce::local_exists(Emit::tree(), lvar->lv_lvalue);
           if (S) return S;
       
      @@ -1339,7 +1339,7 @@ need in the compilation of any given routine:
       

      -void LocalVariables::comment_on(OUTPUT_STREAM, local_variable *lvar, int purpose) {
      +void LocalVariables::comment_on(OUTPUT_STREAM, local_variable *lvar, int purpose) {
           switch (purpose) {
               case TOKEN_CALL_PARAMETER_LV:
                   if (Wordings::nonempty(lvar->varname))
      diff --git a/docs/imperative-module/4-sf.html b/docs/imperative-module/4-sf.html
      index 8038841b5..51cdf8d24 100644
      --- a/docs/imperative-module/4-sf.html
      +++ b/docs/imperative-module/4-sf.html
      @@ -159,7 +159,7 @@ wants to compile an I6 routine for some purpose other than to define a phrase.
           return &nonphrasal_stack_frame;
       }
       
      -void Frames::remove_nonphrase_stack_frame(void) {
      +void Frames::remove_nonphrase_stack_frame(void) {
           nonphrasal_stack_frame = Frames::new();  to prevent accidental lucky misuse
           nonphrasal_stack_frame_is_current = FALSE;
           Frames::remove_current();
      @@ -187,16 +187,16 @@ if that's active, and otherwise must be set as needed.
       
       ph_stack_frame *current_frame = NULL;
       
      -ph_stack_frame *Frames::current_stack_frame(void) {
      +ph_stack_frame *Frames::current_stack_frame(void) {
           return current_frame;
       }
       
      -void Frames::make_current(ph_stack_frame *phsf) {
      +void Frames::make_current(ph_stack_frame *phsf) {
           if (phsf == NULL) internal_error("can't select null stack frame");
           current_frame = phsf;
       }
       
      -void Frames::remove_current(void) {
      +void Frames::remove_current(void) {
           current_frame = NULL;
       }
       
      @@ -242,7 +242,7 @@ if that's active, and otherwise must be set as needed.

      §10. Stacked variables.

      -void Frames::set_stvol(ph_stack_frame *phsf, stacked_variable_owner_list *stvol) {
      +void Frames::set_stvol(ph_stack_frame *phsf, stacked_variable_owner_list *stvol) {
           phsf->local_stvol = stvol;
       }
       
      diff --git a/docs/imperative-module/4-sv.html b/docs/imperative-module/4-sv.html
      index 9b64d9b11..86f9551a4 100644
      --- a/docs/imperative-module/4-sv.html
      +++ b/docs/imperative-module/4-sv.html
      @@ -107,7 +107,7 @@ function togglePopup(material_id) {
           CLASS_DEFINITION
       } stacked_variable_owner_list;
       
      -
      • The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/pu, 3/dptd, 3/po, 3/pav, 6/cii, 6/cste and here.
      • The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/id, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
      • The structure stacked_variable_owner is private to this section.
      • The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/id, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
      +
      • The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/pu, 3/dptd, 3/po, 3/pav, 6/cii, 6/cste and here.
      • The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
      • The structure stacked_variable_owner is private to this section.
      • The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.

      §2.

      diff --git a/docs/imperative-module/5-cdp.html b/docs/imperative-module/5-cdp.html
      index b7c298beb..62c4f41a9 100644
      --- a/docs/imperative-module/5-cdp.html
      +++ b/docs/imperative-module/5-cdp.html
      @@ -129,7 +129,7 @@ which create routines which... and so on.
       }
       
       pcalc_prop_deferral *latest_pcd = NULL;
      -int Propositions::Deferred::compilation_coroutine(void) {
      +int Propositions::Deferred::compilation_coroutine(void) {
           int N = 0;
           while (TRUE) {
               pcalc_prop_deferral *pdef;
      @@ -1972,7 +1972,7 @@ then expand it into the output.
       
       
       i6_schema loop_schema;
      -pcalc_prop *Propositions::Deferred::compile_loop_header(int var, local_variable *index_var,
      +pcalc_prop *Propositions::Deferred::compile_loop_header(int var, local_variable *index_var,
           pcalc_prop *proposition,
           int avoid_parent_optimisation, int grouped, pcalc_prop_deferral *pdef) {
       
      diff --git a/docs/imperative-module/6-cii.html b/docs/imperative-module/6-cii.html
      index cd310de9e..6178b2da7 100644
      --- a/docs/imperative-module/6-cii.html
      +++ b/docs/imperative-module/6-cii.html
      @@ -1244,8 +1244,8 @@ rule), and also makes a note for indexing purposes.
       
           if (Rvalues::is_CONSTANT_construction(supplied, CON_rule)) {
               rule *R = Rvalues::to_rule(supplied);
      -        imperative_defn *id = Rules::get_imperative_definition(R);
      -        if (id) Phrases::Timed::note_usage(id->defines, current_sentence);
      +        imperative_defn *id = Rules::get_imperative_definition(R);
      +        if (id) Phrases::Timed::note_usage(id->defines, current_sentence);
           } else {
               Problems::quote_source(1, current_sentence);
               Problems::quote_wording(2, Node::get_text(supplied));
      diff --git a/docs/imperative-module/6-cp.html b/docs/imperative-module/6-cp.html
      index e43a406ba..f61c2c2c5 100644
      --- a/docs/imperative-module/6-cp.html
      +++ b/docs/imperative-module/6-cp.html
      @@ -102,7 +102,7 @@ should always be supplied for "To..." phrases, but left null for rules.
       void Routines::Compile::routine(phrase *ph,
           stacked_variable_owner_list *legible, to_phrase_request *req,
           rule *R) {
      -    parse_node *code_at = ph->from->at;
      +    parse_node *code_at = ph->from->at;
           if (Node::is(code_at->next, DEFN_CONT_NT)) code_at = code_at->next;
           LOGIF(PHRASE_COMPILATION, "Compiling phrase:\n$T", code_at);
       
      @@ -128,7 +128,7 @@ should always be supplied for "To..." phrases, but left null for rules.
       
       
           Routines::ToPhrases::comment_on_request(req);
      -    Phrases::Usage::write_I6_comment_describing(&(ph->usage_data));
      +    Phrases::Usage::write_I6_comment_describing(&(ph->usage_data));
       
      • This code is used in §2.

      §2.2. Set up the stack frame for this compilation request2.2 = @@ -429,8 +429,7 @@ henceforth to be true, so we simply compile empty code in that case. current_sentence = to_compile; named_rulebook_outcome *nrbo = <<rp>>; if (phrase_being_compiled) { - if ((phrase_being_compiled->from->family != RULE_IN_RULEBOOK_EFF_family) && - (phrase_being_compiled->from->family != RULE_NOT_IN_RULEBOOK_EFF_family)) { + if (ImperativeDefinitions::goes_in_rulebooks(phrase_being_compiled->from) == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(to_compile)); StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome2)); diff --git a/docs/imperative-module/6-cste.html b/docs/imperative-module/6-cste.html index 199cc43de..a0568c511 100644 --- a/docs/imperative-module/6-cste.html +++ b/docs/imperative-module/6-cste.html @@ -174,7 +174,7 @@ specified by \((w_1, w_2)\), according to the equation

    • This code is used in §3.

    §3.2. By far the hardest part of the problem is to rearrange the equation so that the variable we want to find is the entire left hand side, but this is done -for us by code in Equations (in assertions), so it looks easy here. +for us by code in Equations (in assertions), so it looks easy here.

    The surprising thing is the fresh round of typechecking: why do we do that? diff --git a/docs/imperative-module/index.html b/docs/imperative-module/index.html index 6dfd450ce..04df26c03 100644 --- a/docs/imperative-module/index.html +++ b/docs/imperative-module/index.html @@ -131,11 +131,6 @@ Introduction to Phrases - An exposition of the data structures used inside Inform to hold phrases, rules and rulebooks.

  • -
  • -

    - Imperative Definitions - - Each IMPERATIVE node in the syntax tree makes a definition of a phrase or rule.

    -
  • Phrases - diff --git a/inform7/Downloads/preform-diagnostics.txt b/inform7/Downloads/preform-diagnostics.txt index ffdcf5516..9015b7257 100644 --- a/inform7/Downloads/preform-diagnostics.txt +++ b/inform7/Downloads/preform-diagnostics.txt @@ -1,10 +1,10 @@ - internal nti 29 constraint (none) extremes [1, 1] + internal nti 28 constraint (none) extremes [1, 1] - internal hits 1134/6136 nti 30 constraint (none) extremes [0, 0] + internal hits 1121/6804 nti 29 constraint (none) extremes [0, 0] - internal hits 3873/7958 nti 31 constraint (none) extremes [0, 0] + internal hits 3873/7958 nti 30 constraint (none) extremes [0, 0] - hits 746/1492 nti 6 constraint (none) extremes [1, infinity) + hits 746/1492 nti 31 constraint (none) extremes [1, infinity) English: {......} (hits 746/746) (matched long text) constraint (none) extremes [1, infinity) @@ -12,26 +12,26 @@ hits 6/28 nti 15 constraint DS = {15} extremes [3, infinity) English: {......} , {......} - (hits 6/13) (matched long text) constraint DS = {15} extremes [3, infinity) + (hits 6/14) (matched long text) constraint DS = {15} extremes [3, infinity) - internal nti 7 constraint (none) extremes [1, 1] + internal nti 6 constraint (none) extremes [1, 1] - internal hits 2898/25476 nti 8 constraint (none) extremes [1, 1] + internal hits 2898/25476 nti 7 constraint (none) extremes [1, 1] - internal nti 9 constraint (none) extremes [1, 1] + internal nti 8 constraint (none) extremes [1, 1] - internal hits 25/50 nti 10 constraint (none) extremes [1, 1] + internal hits 25/50 nti 9 constraint (none) extremes [1, 1] - internal nti 11 constraint (none) extremes [1, 1] + internal nti 10 constraint (none) extremes [1, 1] - internal hits 2/12958 nti 12 constraint (none) extremes [0, 0] + internal hits 2/12958 nti 11 constraint (none) extremes [0, 0] hits 0/18 nti 16 constraint DS = {16} extremes [3, infinity) English: {......} , _or {......} - (hits 0/5) constraint DS = {16} extremes [4, infinity) + (hits 0/9) constraint DS = {16} extremes [4, infinity) {......} _or {......} - (hits 0/5) constraint DS = {16} extremes [3, infinity) + (hits 0/9) constraint DS = {16} extremes [3, infinity) nti 17 constraint DS = {17} extremes [3, infinity) English: @@ -73,11 +73,11 @@ {...} than constraint DS = {22} extremes [2, infinity) - internal nti 13 constraint (none) extremes [1, infinity) + internal nti 12 constraint (none) extremes [1, infinity) - internal nti 14 constraint (none) extremes [1, infinity) + internal nti 13 constraint (none) extremes [1, infinity) - nti 15 constraint CW = {23, 24, 25} extremes [2, 2] + nti 14 constraint CW = {23, 24, 25} extremes [2, 2] English: constraint CS = {23} extremes [2, 2] @@ -339,7 +339,7 @@ yw* an constraint CS = {25} extremes [2, 2] - nti 16 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [3, infinity) + nti 15 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [3, infinity) English: {...} constraint DS = {26} extremes [3, infinity) @@ -1499,7 +1499,7 @@ shouldn't shouldn't constraint CS = {25} extremes [2, 2] - nti 17 constraint DW = {12, 13, 14, 15, 16} extremes [3, infinity) + nti 16 constraint DW = {12, 13, 14, 15, 16} extremes [3, infinity) English: {...} constraint DS = {12} extremes [3, infinity) @@ -2025,7 +2025,7 @@ * 0ing constraint CS = {16} extremes [2, 2] - nti 18 constraint DW = {17, 18, 19, 20, 21, 22} extremes [2, infinity) + nti 17 constraint DW = {17, 18, 19, 20, 21, 22} extremes [2, infinity) English: constraint CS = {17} extremes [2, 2] @@ -2337,7 +2337,7 @@ write written constraint CS = {17} extremes [2, 2] - nti 19 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [2, infinity) + nti 18 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [2, infinity) English: constraint CS = {30} extremes [2, 2] @@ -2353,7 +2353,7 @@ do does constraint CS = {30} extremes [2, 2] - nti 20 constraint DW = {18, 19, 20, 21, 22} extremes [3, infinity) + nti 19 constraint DW = {18, 19, 20, 21, 22} extremes [3, infinity) English: {...} constraint DS = {18} extremes [3, infinity) @@ -3595,7 +3595,7 @@ * 0ed constraint CS = {22} extremes [2, 2] - nti 21 constraint DW = {9, 10, 11} extremes [2, infinity) + nti 20 constraint DW = {9, 10, 11} extremes [2, infinity) English: constraint CS = {9} extremes [2, 2] @@ -4642,7 +4642,7 @@ * 1 constraint CS = {21} extremes [2, 2] - nti 22 constraint CS = {22} extremes [1, 1] + nti 21 constraint CS = {22} extremes [1, 1] English: constraint CS = {22} extremes [1, 1] @@ -4728,45 +4728,45 @@ twelfth constraint CS = {27} extremes [1, 1] - internal hits 200/24548 nti r0 constraint CS = {r0} extremes [1, 1] + internal hits 200/24674 nti r0 constraint CS = {r0} extremes [1, 1] internal nti r1 constraint CS = {r1} extremes [1, 1] - internal hits 36/72 nti 23 constraint (none) extremes [1, 1] + internal hits 36/72 nti 22 constraint (none) extremes [1, 1] - internal hits 0/258 nti 28 constraint (none) extremes [1, infinity) + internal hits 0/258 nti 27 constraint (none) extremes [1, infinity) - hits 36283/72566 nti 24 constraint (none) extremes [1, infinity) + hits 36283/72566 nti 23 constraint (none) extremes [1, infinity) English: {...} (hits 7821/36283) (matched long text) constraint (none) extremes [2, infinity) {...} (hits 28462/28462) (matched long text) constraint (none) extremes [1, infinity) - nti 25 constraint (none) extremes [1, infinity) + nti 24 constraint (none) extremes [1, infinity) English: {...} constraint (none) extremes [2, infinity) {...} constraint (none) extremes [1, infinity) - hits 82853/165706 nti 26 constraint (none) extremes [1, infinity) + hits 82853/165706 nti 25 constraint (none) extremes [1, infinity) English:

    {...} (hits 16065/47390) (matched long text) constraint (none) extremes [2, infinity) {...} (hits 66788/66788) (matched long text) constraint (none) extremes [1, infinity) - nti 27 constraint (none) extremes [2, infinity) + nti 26 constraint (none) extremes [2, infinity) English:
    {...} constraint (none) extremes [2, infinity)
    internal hits 16515/98328 nti r2 constraint (none) extremes [1, 1] - internal hits 20340/236494 nti r2 constraint (none) extremes [1, 1] + internal hits 20340/236274 nti r2 constraint (none) extremes [1, 1] - internal hits 2075/40696 nti r2 constraint (none) extremes [1, 1] + internal hits 2056/40860 nti r2 constraint (none) extremes [1, 1] nti r2 constraint CS = {r2} extremes [6, 6] English: @@ -4830,37 +4830,37 @@ hits 16/21832 nti 29 constraint DS = {29} extremes [2, infinity) English: not {...} - (hits 16/7733) (matched long text) constraint DS = {29} extremes [2, infinity) + (hits 16/5826) (matched long text) constraint DS = {29} extremes [2, infinity) hits 79/158 nti 30 constraint (none) extremes [1, infinity) English: of the {...} (hits 0/8) constraint DS = {30} extremes [3, infinity) of {...} - (hits 0/12) constraint DS = {30} extremes [2, infinity) + (hits 0/8) constraint DS = {30} extremes [2, infinity) {...} (hits 79/79) (matched: 'dvd carried by the person asked') constraint (none) extremes [1, infinity) hits 0/21548 nti 31 constraint DS = {31} extremes [2, infinity) English: no one {***} - (hits 0/1388) constraint DS = {31} extremes [2, infinity) + (hits 0/5928) constraint DS = {31} extremes [2, infinity) - internal hits 92/1206 nti 28 constraint (none) extremes [1, 1] + internal hits 92/1206 nti 27 constraint (none) extremes [1, 1] - internal hits 7/56 nti 29 constraint (none) extremes [1, 1] + internal hits 7/56 nti 28 constraint (none) extremes [1, 1] - internal hits 239/18292 nti 30 constraint (none) extremes [1, 1] + internal hits 239/18292 nti 29 constraint (none) extremes [1, 1] - internal nti 31 constraint (none) extremes [1, 1] + internal nti 30 constraint (none) extremes [1, 1] - internal nti 6 constraint (none) extremes [1, 1] + internal nti 31 constraint (none) extremes [1, 1] - internal hits 0/444 nti 7 constraint (none) extremes [1, 1] + internal hits 0/444 nti 6 constraint (none) extremes [1, 1] - internal hits 0/176 nti 8 constraint (none) extremes [1, 1] + internal hits 0/176 nti 7 constraint (none) extremes [1, 1] - internal hits 0/690 nti 9 constraint (none) extremes [1, 1] + internal hits 0/690 nti 8 constraint (none) extremes [1, 1] nti 6 constraint CS = {6} extremes [6, 6] English: @@ -4911,51 +4911,51 @@ here here here here here here constraint CS = {12} extremes [6, 6] - internal hits 4008/9008 nti 6 constraint FS = {6} extremes [1, infinity) + internal hits 3802/8650 nti 6 constraint FS = {6} extremes [1, infinity) internal hits 16/128 nti 7 constraint FS = {7} extremes [1, infinity) - internal hits 1/8846 nti 8 constraint FS = {8} extremes [1, infinity) + internal hits 1/8192 nti 8 constraint FS = {8} extremes [1, infinity) - internal hits 0/1962 nti 9 constraint FS = {9} extremes [1, infinity) + internal hits 0/2332 nti 9 constraint FS = {9} extremes [1, infinity) internal nti 10 constraint FS = {10} extremes [1, infinity) internal nti 11 constraint FS = {11} extremes [1, infinity) - internal hits 210/5162 nti 10 constraint (none) extremes [1, infinity) + internal hits 210/5162 nti 9 constraint (none) extremes [1, infinity) - internal hits 59/4030 nti 11 constraint (none) extremes [1, infinity) + internal hits 59/4030 nti 10 constraint (none) extremes [1, infinity) - internal hits 1/2 nti 12 constraint (none) extremes [1, infinity) + internal hits 1/2 nti 11 constraint (none) extremes [1, infinity) - internal nti 13 constraint (none) extremes [1, infinity) + internal nti 12 constraint (none) extremes [1, infinity) - internal hits 58/118 nti 14 constraint (none) extremes [1, infinity) + internal hits 58/118 nti 13 constraint (none) extremes [1, infinity) internal nti 12 constraint DS = {12} extremes [1, infinity) - internal hits 635/18762 nti 13 constraint DS = {13} extremes [1, infinity) + internal hits 635/18458 nti 13 constraint DS = {13} extremes [1, infinity) - internal hits 258/8178 nti 14 constraint DS = {14} extremes [1, infinity) + internal hits 258/7566 nti 14 constraint DS = {14} extremes [1, infinity) - hits 67/4500 nti 13 constraint CS = {13} extremes [1, 1] + hits 67/4298 nti 13 constraint CS = {13} extremes [1, 1] English: always/certainly - (hits 10/1033) (matched: 'always') constraint CS = {13} extremes [1, 1] + (hits 10/873) (matched: 'always') constraint CS = {13} extremes [1, 1] usually/normally - (hits 53/1023) (matched: 'usually') constraint CS = {13} extremes [1, 1] + (hits 53/863) (matched: 'usually') constraint CS = {13} extremes [1, 1] rarely/seldom - (hits 0/970) constraint CS = {13} extremes [1, 1] + (hits 0/810) constraint CS = {13} extremes [1, 1] never - (hits 4/970) (matched: 'never') constraint CS = {13} extremes [1, 1] + (hits 4/810) (matched: 'never') constraint CS = {13} extremes [1, 1] initially - (hits 0/966) constraint CS = {13} extremes [1, 1] + (hits 0/806) constraint CS = {13} extremes [1, 1] hits 0/4304 nti 14 constraint DS = {14} extremes [1, infinity) English: {***} once/twice/thrice/turn/turns/time/times - (hits 0/1593) constraint DS = {14} extremes [1, infinity) + (hits 0/1540) constraint DS = {14} extremes [1, infinity) nti 18 constraint DW = {15, 16, 17, 18} extremes [1, 9] English: @@ -4983,7 +4983,7 @@ constraint DW = {15, 16} extremes [1, 6] - nti 15 constraint DW = {15, 16} extremes [1, 6] + nti 14 constraint DW = {15, 16} extremes [1, 6] English: constraint DS = {15} extremes [1, 6] @@ -5010,7 +5010,7 @@ turn/turns constraint DS = {16} extremes [2, 3] - nti 16 constraint (none) extremes [1, 2] + nti 15 constraint (none) extremes [1, 2] English: constraint (none) extremes [2, 2] @@ -5019,24 +5019,24 @@ constraint CS = {r0} extremes [1, 1] - hits 3152/6304 nti 17 constraint (none) extremes [1, infinity) + hits 3152/6304 nti 16 constraint (none) extremes [1, infinity) English: {...} (hits 3152/3152) (matched long text) constraint (none) extremes [1, infinity) - hits 60/120 nti 18 constraint (none) extremes [0, infinity) + hits 60/120 nti 17 constraint (none) extremes [0, infinity) English: ^ (hits 0/60) constraint (none) extremes [0, infinity) (hits 60/60) (matched: 'fixed in place') constraint (none) extremes [1, infinity) - hits 33/110636 nti 19 constraint CS = {19} extremes [1, 1] + hits 33/109564 nti 19 constraint CS = {19} extremes [1, 1] English: there - (hits 33/271) (matched: 'there') constraint CS = {19} extremes [1, 1] + (hits 33/608) (matched: 'there') constraint CS = {19} extremes [1, 1] - hits 2081/4162 nti 19 constraint (none) extremes [1, infinity) + hits 2081/4162 nti 18 constraint (none) extremes [1, infinity) English: {...} (hits 99/2081) (matched: '"(considering the first sixteen objects only)[command clarification break]" ( a )') constraint (none) extremes [1, infinity) @@ -5047,46 +5047,46 @@ (hits 999/999) (matched long text) constraint (none) extremes [1, infinity) - hits 255/510 nti 20 constraint (none) extremes [0, infinity) + hits 255/510 nti 19 constraint (none) extremes [0, infinity) English: ^ (hits 0/255) constraint (none) extremes [0, infinity) (hits 255/255) (matched long text) constraint (none) extremes [1, infinity) - hits 279/558 nti 21 constraint (none) extremes [1, infinity) + hits 279/558 nti 20 constraint (none) extremes [1, infinity) English: {...} (hits 99/279) (matched long text) constraint (none) extremes [1, infinity) - (hits 99/153) (matched long text) constraint DS = {20} extremes [2, infinity) + (hits 99/152) (matched long text) constraint DS = {20} extremes [2, infinity) (hits 81/81) (matched long text) constraint (none) extremes [1, infinity) - hits 198/1294 nti 20 constraint DS = {20} extremes [2, infinity) + hits 198/1292 nti 20 constraint DS = {20} extremes [2, infinity) English: , _{and} (hits 0/538) constraint DS = {20} extremes [3, infinity) _{,/and} - (hits 198/588) (matched long text) constraint DS = {20} extremes [2, infinity) + (hits 198/589) (matched long text) constraint DS = {20} extremes [2, infinity) - hits 103/206 nti 22 constraint (none) extremes [1, infinity) + hits 103/206 nti 21 constraint (none) extremes [1, infinity) English: {...} (hits 30/103) (matched: 'unmarked for listing') constraint (none) extremes [1, infinity) - (hits 30/32) (matched: 'marked for listing or unmarked for listing') constraint DS = {21} extremes [2, infinity) + (hits 30/33) (matched: 'marked for listing or unmarked for listing') constraint DS = {21} extremes [2, infinity) (hits 43/43) (matched: 'pushable between rooms') constraint (none) extremes [1, infinity) - hits 60/142 nti 21 constraint DS = {21} extremes [2, infinity) + hits 60/144 nti 21 constraint DS = {21} extremes [2, infinity) English: , _{or} (hits 0/13) constraint DS = {21} extremes [3, infinity) _{,/or} (hits 60/69) (matched: 'or unmarked for listing') constraint DS = {21} extremes [2, infinity) - hits 460/920 nti 23 constraint (none) extremes [1, infinity) + hits 460/920 nti 22 constraint (none) extremes [1, infinity) English: constraint CS = {19} extremes [1, 1] @@ -5095,23 +5095,23 @@ (hits 460/460) (matched long text) constraint (none) extremes [1, infinity) - hits 576/1152 nti 24 constraint (none) extremes [1, infinity) + hits 576/1152 nti 23 constraint (none) extremes [1, infinity) English: (hits 0/576) constraint (none) extremes [1, infinity) (hits 576/576) (matched long text) constraint (none) extremes [1, infinity) - hits 0/920 nti 25 constraint (none) extremes [1, infinity) + hits 0/920 nti 24 constraint (none) extremes [1, infinity) English: constraint CS = {22} extremes [1, 2] {***} (hits 0/453) constraint (none) extremes [1, infinity) - (hits 0/375) constraint DS = {14} extremes [2, infinity) + (hits 0/361) constraint DS = {14} extremes [2, infinity) - hits 0/1962 nti 26 constraint (none) extremes [1, infinity) + hits 0/1962 nti 25 constraint (none) extremes [1, infinity) English: constraint CS = {22} extremes [1, 2] @@ -5123,7 +5123,7 @@ thing/something (hits 83/83) (matched: 'thing') constraint CS = {29} extremes [1, 1] - internal hits 476/23876 nti 27 constraint (none) extremes [1, 1] + internal hits 476/23876 nti 26 constraint (none) extremes [1, 1] nti 22 constraint CS = {22} extremes [1, 2] English: @@ -5134,27 +5134,27 @@ initially carried constraint CS = {22} extremes [2, 2] - hits 0/2712 nti 28 constraint DS = {14} extremes [2, infinity) + hits 0/2684 nti 28 constraint DS = {14} extremes [2, infinity) English: _,/and {...} - (hits 0/563) constraint DS = {14, 28} extremes [3, infinity) + (hits 0/596) constraint DS = {14, 28} extremes [3, infinity) _,/and - (hits 0/637) constraint DS = {14, 28} extremes [2, infinity) + (hits 0/805) constraint DS = {14, 28} extremes [2, infinity) - (hits 0/918) constraint DS = {14} extremes [2, infinity) + (hits 0/845) constraint DS = {14} extremes [2, infinity) hits 1467/2934 nti 27 constraint (none) extremes [1, infinity) English: {...} (hits 174/1467) (matched long text) constraint (none) extremes [1, infinity) {called} - (hits 57/418) (matched long text) constraint DS = {27} extremes [1, infinity) + (hits 57/599) (matched long text) constraint DS = {27} extremes [1, infinity) - (hits 0/750) constraint DS = {24} extremes [2, infinity) + (hits 0/759) constraint DS = {24} extremes [2, infinity) - (hits 87/340) (matched long text) constraint DS = {25} extremes [1, infinity) + (hits 87/519) (matched long text) constraint DS = {25} extremes [1, infinity) - (hits 30/221) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [1, infinity) + (hits 30/373) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [1, infinity) (hits 4/349) (matched: 'it') constraint (none) extremes [1, 1] @@ -5162,7 +5162,7 @@ (hits 1115/1115) (matched long text) constraint (none) extremes [1, infinity) - hits 431/862 nti 28 constraint (none) extremes [0, infinity) + hits 431/862 nti 27 constraint (none) extremes [0, infinity) English: (hits 0/431) constraint (none) extremes [1, infinity) @@ -5171,18 +5171,18 @@ (hits 431/431) (matched long text) constraint (none) extremes [1, infinity) - hits 0/10908 nti 24 constraint DS = {24} extremes [2, infinity) + hits 0/10960 nti 24 constraint DS = {24} extremes [2, infinity) English: it with action {***} - (hits 0/3911) constraint DS = {24} extremes [3, infinity) + (hits 0/4015) constraint DS = {24} extremes [3, infinity) {with/having} (/) {***} - (hits 0/4111) constraint DS = {24} extremes [2, infinity) + (hits 0/4265) constraint DS = {24} extremes [2, infinity) {with/having} {...} ( ) - (hits 0/3511) constraint DS = {24} extremes [5, infinity) + (hits 0/3540) constraint DS = {24} extremes [5, infinity) {with/having} - (hits 0/4111) constraint DS = {24} extremes [2, infinity) + (hits 0/4265) constraint DS = {24} extremes [2, infinity) - nti 29 constraint (none) extremes [1, infinity) + nti 28 constraint (none) extremes [1, infinity) English: {...} constraint (none) extremes [1, infinity) @@ -5198,55 +5198,55 @@ _{,/and} constraint DS = {23} extremes [2, infinity) - nti 30 constraint (none) extremes [1, infinity) + nti 29 constraint (none) extremes [1, infinity) English: {...} constraint (none) extremes [1, infinity) - hits 174/2766 nti 25 constraint DS = {25} extremes [1, infinity) + hits 174/3618 nti 25 constraint DS = {25} extremes [1, infinity) English: , _{and} - (hits 8/851) (matched: ', and didn't understand addressee's last name error') constraint DS = {25} extremes [2, infinity) + (hits 8/971) (matched: ', and didn't understand addressee's last name error') constraint DS = {25} extremes [2, infinity) _{,/and} - (hits 166/863) (matched long text) constraint DS = {25} extremes [1, infinity) + (hits 166/1014) (matched long text) constraint DS = {25} extremes [1, infinity) - hits 30/442 nti 31 constraint DS = {26} extremes [1, infinity) + hits 30/746 nti 30 constraint DS = {26} extremes [1, infinity) English: - (hits 30/221) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [2, infinity) + (hits 30/373) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [2, infinity) - (hits 0/191) constraint DS = {26} extremes [1, infinity) + (hits 0/343) constraint DS = {26} extremes [1, infinity) - hits 30/472 nti 26 constraint DS = {26} extremes [1, infinity) + hits 30/762 nti 26 constraint DS = {26} extremes [1, infinity) English: kind/kinds (hits 4/4) (matched: 'kind') constraint CS = {26} extremes [1, 1] kind/kinds of - (hits 26/232) (matched: 'kind of supporter that is portable') constraint DS = {26} extremes [2, infinity) + (hits 26/377) (matched: 'kind of supporter that is portable') constraint DS = {26} extremes [2, infinity) - internal nti 6 constraint (none) extremes [1, infinity) + internal nti 31 constraint (none) extremes [1, infinity) - internal hits 1357/2714 nti 7 constraint (none) extremes [1, infinity) + internal hits 1357/2714 nti 6 constraint (none) extremes [1, infinity) - hits 0/2764 nti 8 constraint DS = {13} extremes [2, infinity) + hits 0/2764 nti 7 constraint DS = {13} extremes [2, infinity) English: {...} - (hits 0/1026) constraint DS = {13} extremes [2, infinity) + (hits 0/1010) constraint DS = {13} extremes [2, infinity) - hits 67/2764 nti 9 constraint DS = {13} extremes [2, infinity) + hits 67/2764 nti 8 constraint DS = {13} extremes [2, infinity) English: {...} - (hits 67/1224) (matched: 'usually table of general chitchat') constraint DS = {13} extremes [2, infinity) + (hits 67/1139) (matched: 'usually table of general chitchat') constraint DS = {13} extremes [2, infinity) - hits 795/25992 nti 30 constraint CS = {30} extremes [1, 1] + hits 765/25318 nti 30 constraint CS = {30} extremes [1, 1] English: which/who/that - (hits 795/5943) (matched: 'which') constraint CS = {30} extremes [1, 1] + (hits 765/5704) (matched: 'which') constraint CS = {30} extremes [1, 1] - hits 2/2742 nti 10 constraint DS = {30} extremes [2, infinity) + hits 2/2742 nti 9 constraint DS = {30} extremes [2, infinity) English: {...} - (hits 2/813) (matched: 'answering it that') constraint DS = {30} extremes [2, infinity) + (hits 2/801) (matched: 'answering it that') constraint DS = {30} extremes [2, infinity) nti 31 constraint DS = {31} extremes [3, infinity) English: @@ -5256,7 +5256,7 @@ hits 196/9062 nti 6 constraint DS = {6} extremes [2, infinity) English: of {...} - (hits 196/2523) (matched: 'of day -- documented at var_time --') constraint DS = {6} extremes [2, infinity) + (hits 196/2497) (matched: 'of day -- documented at var_time --') constraint DS = {6} extremes [2, infinity) hits 5/60 nti 7 constraint CS = {7} extremes [2, 2] English: @@ -5271,9 +5271,9 @@ grammatical case (hits 1/1) (matched: 'grammatical case') constraint CS = {7} extremes [2, 2] - internal hits 2474/41934 nti 11 constraint (none) extremes [0, 0] + internal hits 2474/41934 nti 10 constraint (none) extremes [0, 0] - internal hits 164/328 nti 12 constraint (none) extremes [1, infinity) + internal hits 164/328 nti 11 constraint (none) extremes [1, infinity) hits 24/68 nti 9 constraint DS = {9} extremes [3, infinity) English: @@ -5312,7 +5312,7 @@ (hits 359/5851) (matched long text) constraint CW = {r2, r5} extremes [1, infinity) - hits 40/338 nti 13 constraint (none) extremes [1, infinity) + hits 40/338 nti 12 constraint (none) extremes [1, infinity) English: (hits 32/55) (matched: 'an object') constraint (none) extremes [2, infinity) @@ -5406,7 +5406,7 @@ internal hits 220/1414 nti r5 constraint CW = {r2, r5} extremes [1, 1] - internal hits 0/772 nti 14 constraint (none) extremes [1, 1] + internal hits 0/772 nti 13 constraint (none) extremes [1, 1] nti r5 constraint CS = {r5} extremes [1, 1] English: @@ -5463,7 +5463,7 @@ z/zs constraint CS = {r5} extremes [1, 1] - internal hits 47/104 nti 15 constraint (none) extremes [1, infinity) + internal hits 47/104 nti 14 constraint (none) extremes [1, infinity) hits 4/8 nti 10 constraint (none) extremes [1, infinity) English: @@ -5472,34 +5472,34 @@ {...} (hits 1/1) (matched long text) constraint (none) extremes [1, infinity) - internal nti 16 constraint (none) extremes [1, infinity) + internal nti 15 constraint (none) extremes [1, infinity) - hits 199/10188 nti 17 constraint DW = {11, 12} extremes [2, infinity) + hits 199/10188 nti 16 constraint DW = {11, 12} extremes [2, infinity) English: - (hits 191/3054) (matched long text) constraint DS = {11} extremes [2, infinity) + (hits 191/3388) (matched long text) constraint DS = {11} extremes [2, infinity) - (hits 8/3761) (matched long text) constraint DS = {12} extremes [3, infinity) + (hits 8/2759) (matched long text) constraint DS = {12} extremes [3, infinity) - hits 191/2240 nti 11 constraint DS = {11} extremes [2, infinity) + hits 191/2214 nti 11 constraint DS = {11} extremes [2, infinity) English: volume {...} - (hits 6/1120) (matched long text) constraint DS = {11} extremes [2, infinity) + (hits 6/1107) (matched long text) constraint DS = {11} extremes [2, infinity) book {...} - (hits 0/1114) constraint DS = {11} extremes [2, infinity) + (hits 0/1101) constraint DS = {11} extremes [2, infinity) part {...} - (hits 14/1114) (matched: 'part two - the physical world model') constraint DS = {11} extremes [2, infinity) + (hits 14/1101) (matched: 'part two - the physical world model') constraint DS = {11} extremes [2, infinity) chapter {...} - (hits 20/1100) (matched long text) constraint DS = {11} extremes [2, infinity) + (hits 20/1087) (matched long text) constraint DS = {11} extremes [2, infinity) section {...} - (hits 151/1080) (matched long text) constraint DS = {11} extremes [2, infinity) + (hits 151/1067) (matched long text) constraint DS = {11} extremes [2, infinity) - hits 8/7522 nti 12 constraint DS = {12} extremes [3, infinity) + hits 8/5518 nti 12 constraint DS = {12} extremes [3, infinity) English: {...} begin/begins here - (hits 4/3761) (matched long text) constraint DS = {12} extremes [3, infinity) + (hits 4/2759) (matched long text) constraint DS = {12} extremes [3, infinity) {...} end/ends here - (hits 4/3757) (matched: 'the standard rules end here') constraint DS = {12} extremes [3, infinity) + (hits 4/2755) (matched: 'the standard rules end here') constraint DS = {12} extremes [3, infinity) hits 32/12958 nti 14 constraint (none) extremes [1, infinity) English: @@ -5508,41 +5508,41 @@ {...} (hits 0/6459) constraint (none) extremes [2, infinity) - (hits 0/6317) constraint DS = {13} extremes [4, infinity) + (hits 0/6293) constraint DS = {13} extremes [4, infinity) * constraint CS = {14} extremes [1, 1] * constraint DS = {14} extremes [2, 2] table {...} - (hits 14/6276) (matched long text) constraint DS = {14} extremes [2, infinity) + (hits 14/6211) (matched long text) constraint DS = {14} extremes [2, infinity) equation {...} - (hits 0/6262) constraint DS = {14} extremes [2, infinity) + (hits 0/6197) constraint DS = {14} extremes [2, infinity) include the {...} by {...} - (hits 0/6239) constraint DS = {14} extremes [5, infinity) + (hits 0/6175) constraint DS = {14} extremes [5, infinity) include {...} by {...} - (hits 18/6262) (matched long text) constraint DS = {14} extremes [4, infinity) + (hits 18/6197) (matched long text) constraint DS = {14} extremes [4, infinity) include (- {...} - (hits 0/6244) constraint DS = {14} extremes [3, infinity) + (hits 0/6179) constraint DS = {14} extremes [3, infinity) hits 9/2788 nti 15 constraint DS = {15} extremes [2, infinity) English: instead of {...} - (hits 0/977) constraint DS = {15} extremes [3, infinity) + (hits 0/1091) constraint DS = {15} extremes [3, infinity) every turn {***} - (hits 1/977) (matched: 'every turn rules is a rulebook') constraint DS = {15} extremes [2, infinity) + (hits 1/1091) (matched: 'every turn rules is a rulebook') constraint DS = {15} extremes [2, infinity) before {...} - (hits 2/976) (matched long text) constraint DS = {15} extremes [2, infinity) + (hits 2/1090) (matched long text) constraint DS = {15} extremes [2, infinity) after {...} - (hits 2/974) (matched long text) constraint DS = {15} extremes [2, infinity) + (hits 2/1088) (matched long text) constraint DS = {15} extremes [2, infinity) when {...} - (hits 4/972) (matched: 'when scene begins is a scene based rulebook') constraint DS = {15} extremes [2, infinity) + (hits 4/1086) (matched: 'when scene begins is a scene based rulebook') constraint DS = {15} extremes [2, infinity) - hits 0/12634 nti 13 constraint DS = {13} extremes [4, infinity) + hits 0/12586 nti 13 constraint DS = {13} extremes [4, infinity) English: include (- {###} in the preform grammar - (hits 0/134) constraint DS = {13} extremes [7, 7] + (hits 0/129) constraint DS = {13} extremes [7, 7] use {...} language element/elements - (hits 0/6317) constraint DS = {13} extremes [4, infinity) + (hits 0/6293) constraint DS = {13} extremes [4, infinity) hits 30/442 nti 21 constraint DS = {21} extremes [2, infinity) English: @@ -5604,7 +5604,7 @@ {......} by {......} constraint DS = {18} extremes [3, infinity) - internal hits 7/14 nti 18 constraint (none) extremes [1, infinity) + internal hits 7/14 nti 17 constraint (none) extremes [1, infinity) nti 23 constraint (none) extremes [1, infinity) English: @@ -5625,7 +5625,7 @@ use . constraint DS = {26} extremes [3, infinity) - nti 19 constraint (none) extremes [1, infinity) + nti 18 constraint (none) extremes [1, infinity) English: {...} constraint (none) extremes [1, infinity) @@ -5641,7 +5641,7 @@ _,/and constraint DS = {25} extremes [2, infinity) - nti 20 constraint (none) extremes [1, infinity) + nti 19 constraint (none) extremes [1, infinity) English: constraint CS = {24} extremes [1, 3] @@ -5666,14 +5666,14 @@ (hits 10/10) (matched: 'basic inform') constraint (none) extremes [1, infinity) - hits 10/20 nti 21 constraint (none) extremes [1, infinity) + hits 10/20 nti 20 constraint (none) extremes [1, infinity) English: {***} (hits 0/10) constraint (none) extremes [1, infinity) {...} (hits 10/10) (matched: 'basic inform') constraint (none) extremes [1, infinity) - internal hits 6/12 nti 22 constraint (none) extremes [1, 1] + internal hits 6/12 nti 21 constraint (none) extremes [1, 1] hits 4/8 nti 29 constraint (none) extremes [1, infinity) English: @@ -5690,25 +5690,25 @@ hits 2873/18796 nti 31 constraint DS = {31} extremes [1, infinity) English: if {...} is begin - (hits 0/4352) constraint DS = {31} extremes [4, infinity) + (hits 0/4853) constraint DS = {31} extremes [4, infinity) if {...} is - (hits 0/4417) constraint DS = {31} extremes [3, infinity) + (hits 0/5430) constraint DS = {31} extremes [3, infinity) if/unless {...} - (hits 2123/4417) (matched long text) constraint DS = {31} extremes [2, infinity) + (hits 2123/5430) (matched long text) constraint DS = {31} extremes [2, infinity) repeat {...} - (hits 101/2294) (matched long text) constraint DS = {31} extremes [2, infinity) + (hits 101/3307) (matched long text) constraint DS = {31} extremes [2, infinity) while {...} - (hits 31/2193) (matched long text) constraint DS = {31} extremes [2, infinity) + (hits 31/3206) (matched long text) constraint DS = {31} extremes [2, infinity) else/otherwise (hits 330/345) (matched: 'otherwise') constraint CS = {31} extremes [1, 1] else/otherwise if/unless {...} - (hits 231/2162) (matched long text) constraint DS = {31} extremes [3, infinity) + (hits 231/3175) (matched long text) constraint DS = {31} extremes [3, infinity) else/otherwise {...} - (hits 57/1931) (matched long text) constraint DS = {31} extremes [2, infinity) + (hits 57/2944) (matched long text) constraint DS = {31} extremes [2, infinity) -- otherwise constraint CS = {31} extremes [2, 2] -- {...} - (hits 0/1874) constraint DS = {31} extremes [2, infinity) + (hits 0/2887) constraint DS = {31} extremes [2, infinity) hits 0/12004 nti 6 constraint CS = {6} extremes [2, 2] English: @@ -5722,30 +5722,30 @@ hits 756/14584 nti 7 constraint DS = {7} extremes [2, infinity) English: say {...} - (hits 584/3136) (matched: 'say run paragraph on with special look spacing') constraint DS = {7} extremes [2, infinity) + (hits 584/3151) (matched: 'say run paragraph on with special look spacing') constraint DS = {7} extremes [2, infinity) now {...} - (hits 172/2552) (matched long text) constraint DS = {7} extremes [2, infinity) + (hits 172/2567) (matched long text) constraint DS = {7} extremes [2, infinity) hits 2306/7528 nti 8 constraint DS = {8} extremes [3, infinity) English: {......} , {......} - (hits 2306/2583) (matched long text) constraint DS = {8} extremes [3, infinity) + (hits 2306/2581) (matched long text) constraint DS = {8} extremes [3, infinity) hits 30/9858 nti 9 constraint DS = {9} extremes [2, infinity) English: instead {...} - (hits 0/1693) constraint DS = {9} extremes [2, infinity) + (hits 0/1971) constraint DS = {9} extremes [2, infinity) {...} instead - (hits 30/1693) (matched long text) constraint DS = {9} extremes [2, infinity) + (hits 30/1971) (matched long text) constraint DS = {9} extremes [2, infinity) hits 0/880 nti 10 constraint DS = {10} extremes [2, infinity) English: {...} begin - (hits 0/430) constraint DS = {10} extremes [2, infinity) + (hits 0/427) constraint DS = {10} extremes [2, infinity) - internal nti 23 constraint (none) extremes [1, 1] + internal nti 22 constraint (none) extremes [1, 1] - internal hits 7/14 nti 24 constraint (none) extremes [1, infinity) + internal hits 7/14 nti 23 constraint (none) extremes [1, infinity) hits 21/58 nti 24 constraint CS = {24} extremes [1, 3] English: @@ -5792,7 +5792,7 @@ superbrief room descriptions (hits 1/1) (matched: 'superbrief room descriptions') constraint CS = {24} extremes [3, 3] - internal hits 6/12 nti 25 constraint (none) extremes [1, infinity) + internal hits 6/12 nti 24 constraint (none) extremes [1, infinity) nti 11 constraint CS = {11} extremes [1, 1] English: @@ -5861,7 +5861,7 @@ {...} constraint (none) extremes [1, infinity) - nti 26 constraint (none) extremes [2, infinity) + nti 25 constraint (none) extremes [2, infinity) English: {...} constraint DS = {13, 30} extremes [4, infinity) @@ -5882,13 +5882,13 @@ hits 104/208 nti 15 constraint (none) extremes [1, infinity) English: {...} that varies - (hits 0/13) constraint DS = {15} extremes [3, infinity) + (hits 0/8) constraint DS = {15} extremes [3, infinity) {...} variable - (hits 0/13) constraint DS = {15} extremes [2, infinity) + (hits 0/8) constraint DS = {15} extremes [2, infinity) {...} (hits 104/104) (matched: 'the removing it from action') constraint (none) extremes [1, infinity) - hits 40/176 nti 27 constraint DW = {16, 17, 18} extremes [2, infinity) + hits 40/176 nti 26 constraint DW = {16, 17, 18} extremes [2, infinity) English: (hits 26/28) (matched: 'unlocking keylessly action') constraint DS = {16} extremes [2, infinity) @@ -5912,14 +5912,14 @@ {...} rulebook (hits 21/21) (matched: 'specific action-processing rulebook') constraint DS = {18} extremes [2, infinity) - hits 24/48 nti 28 constraint (none) extremes [1, infinity) + hits 24/48 nti 27 constraint (none) extremes [1, infinity) English: - (hits 0/1) constraint DS = {20} extremes [3, infinity) + constraint DS = {20} extremes [3, infinity) (hits 24/24) (matched: 'variable initial value') constraint (none) extremes [1, infinity) - hits 0/4 nti 20 constraint DS = {20} extremes [2, infinity) + nti 20 constraint DS = {20} extremes [2, infinity) English: , _{and} constraint DS = {20} extremes [3, infinity) @@ -5933,7 +5933,7 @@ presence constraint CS = {19} extremes [1, 1] {***} , {***} - (hits 0/2) constraint DS = {19} extremes [1, infinity) + (hits 0/3) constraint DS = {19} extremes [1, infinity) {***} {***} (hits 0/24) constraint (none) extremes [1, infinity) {...} @@ -5978,16 +5978,16 @@ hits 4/1112 nti 25 constraint DS = {25} extremes [3, infinity) English:
    plural of - (hits 4/185) (matched: 'the plural of person') constraint DS = {25} extremes [4, infinity) + (hits 4/270) (matched: 'the plural of person') constraint DS = {25} extremes [4, infinity) plural of - (hits 0/196) constraint DS = {25} extremes [3, infinity) + (hits 0/325) constraint DS = {25} extremes [3, infinity) - nti 29 constraint (none) extremes [1, infinity) + nti 28 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) - nti 30 constraint (none) extremes [1, infinity) + nti 29 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -5999,14 +5999,14 @@ unicode constraint CS = {26} extremes [1, 1] - nti 31 constraint (none) extremes [1, infinity) + nti 30 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - nti 6 constraint (none) extremes [1, infinity) + nti 31 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] @@ -6096,7 +6096,7 @@ {...} constraint (none) extremes [1, infinity) - hits 1/2 nti 7 constraint (none) extremes [1, infinity) + hits 1/2 nti 6 constraint (none) extremes [1, infinity) English: (hits 1/1) (matched: 'go to cold comfort / z / z / z / z / ask vanessa for french vanilla / ask vanessa for chocolate / ask vanessa about flavors / ask vanessa for chocolate chocolate chip') constraint (none) extremes [1, 1] @@ -6105,7 +6105,7 @@ {...} constraint (none) extremes [1, infinity) - nti 8 constraint (none) extremes [1, infinity) + nti 7 constraint (none) extremes [1, infinity) English: {...} constraint (none) extremes [1, infinity) @@ -6130,9 +6130,9 @@ hits 0/856 nti 13 constraint DS = {13} extremes [3, infinity) English: defined by - (hits 0/210) constraint DS = {13} extremes [3, infinity) + (hits 0/190) constraint DS = {13} extremes [3, infinity) - nti 9 constraint (none) extremes [1, infinity) + nti 8 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -6160,26 +6160,26 @@ not listed (hits 1/1) (matched: 'not listed in any rulebook') constraint DS = {16} extremes [3, infinity) - hits 113/932 nti 10 constraint (none) extremes [1, infinity) + hits 113/932 nti 9 constraint (none) extremes [1, infinity) English: {...} (hits 30/466) (matched long text) constraint (none) extremes [1, infinity) - (hits 0/211) constraint DS = {17, 18} extremes [4, infinity) + (hits 0/213) constraint DS = {17, 18} extremes [4, infinity) - (hits 83/244) (matched long text) constraint DS = {17} extremes [2, infinity) + (hits 83/238) (matched long text) constraint DS = {17} extremes [2, infinity) - hits 30/2428 nti 18 constraint DS = {18} extremes [2, infinity) + hits 30/2440 nti 18 constraint DS = {18} extremes [2, infinity) English: , _{and} - (hits 1/699) (matched: ', and the library') constraint DS = {18} extremes [3, infinity) + (hits 1/527) (matched: ', and the library') constraint DS = {18} extremes [3, infinity) _{,/and} - (hits 29/821) (matched long text) constraint DS = {18} extremes [2, infinity) + (hits 29/608) (matched long text) constraint DS = {18} extremes [2, infinity) - hits 83/548 nti 17 constraint DS = {17} extremes [2, infinity) + hits 83/536 nti 17 constraint DS = {17} extremes [2, infinity) English: {...} rule - (hits 83/273) (matched long text) constraint DS = {17} extremes [2, infinity) + (hits 83/263) (matched long text) constraint DS = {17} extremes [2, infinity) nti 19 constraint DS = {17} extremes [2, infinity) English: @@ -6190,14 +6190,14 @@ unless constraint DS = {17, 19} extremes [4, infinity) - nti 11 constraint (none) extremes [1, infinity) + nti 10 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - nti 12 constraint (none) extremes [1, infinity) + nti 11 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -6209,14 +6209,14 @@ nothing constraint CS = {20} extremes [1, 1] - nti 13 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 83/166 nti 14 constraint (none) extremes [1, infinity) + hits 83/166 nti 13 constraint (none) extremes [1, infinity) English: (hits 83/83) (matched long text) constraint (none) extremes [1, infinity) @@ -6260,7 +6260,7 @@ {...} constraint (none) extremes [1, infinity) - hits 78/156 nti 15 constraint (none) extremes [1, infinity) + hits 78/156 nti 14 constraint (none) extremes [1, infinity) English: (hits 78/78) (matched long text) constraint (none) extremes [1, infinity) @@ -6270,7 +6270,7 @@ hits 34/1104 nti 22 constraint DS = {22} extremes [1, 2] English:
    activity - (hits 34/89) (matched: 'an activity') constraint DS = {22} extremes [2, 2] + (hits 34/40) (matched: 'an activity') constraint DS = {22} extremes [2, 2] activity constraint CS = {22} extremes [1, 1] @@ -6285,7 +6285,7 @@ {...} constraint (none) extremes [1, infinity) - nti 16 constraint (none) extremes [1, infinity) + nti 15 constraint (none) extremes [1, infinity) English: constraint DS = {24} extremes [3, infinity) @@ -6312,14 +6312,14 @@ {......} constraint (none) extremes [1, infinity) - nti 17 constraint (none) extremes [1, infinity) + nti 16 constraint (none) extremes [1, infinity) English: constraint DW = {13, 31} extremes [3, infinity) constraint (none) extremes [1, infinity) - nti 18 constraint (none) extremes [1, infinity) + nti 17 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) @@ -6348,7 +6348,7 @@ scaled at constraint DS = {31} extremes [3, infinity) - nti 19 constraint (none) extremes [1, infinity) + nti 18 constraint (none) extremes [1, infinity) English: constraint CS = {r0} extremes [1, 1] @@ -6373,7 +6373,7 @@ constraint (none) extremes [0, infinity) - nti 20 constraint (none) extremes [1, infinity) + nti 19 constraint (none) extremes [1, infinity) English: constraint DS = {27} extremes [3, infinity) @@ -6459,7 +6459,7 @@ hits 0/856 nti 22 constraint DS = {22} extremes [2, infinity) English: either - (hits 0/257) constraint DS = {22} extremes [2, infinity) + (hits 0/117) constraint DS = {22} extremes [2, infinity) hits 0/86 nti 23 constraint (none) extremes [1, 2] English: @@ -6473,11 +6473,11 @@ hits 43/86 nti 26 constraint (none) extremes [1, infinity) English: either ( ) - (hits 0/3) constraint DS = {26} extremes [5, infinity) + constraint DS = {26} extremes [5, infinity) ( ) - (hits 0/3) constraint DS = {26} extremes [4, infinity) + constraint DS = {26} extremes [4, infinity) either - (hits 0/3) constraint DS = {26} extremes [2, infinity) + constraint DS = {26} extremes [2, infinity) (hits 43/43) (matched: 'marked for listing or unmarked for listing') constraint (none) extremes [1, infinity) @@ -6488,7 +6488,7 @@ constraint (none) extremes [1, infinity) - nti 21 constraint (none) extremes [1, infinity) + nti 20 constraint (none) extremes [1, infinity) English:
    constraint (none) extremes [2, infinity) @@ -6504,23 +6504,23 @@ constraint (none) extremes [1, infinity) - hits 74/1260 nti 22 constraint DS = {27} extremes [1, infinity) + hits 74/1260 nti 21 constraint DS = {27} extremes [1, infinity) English: - (hits 74/267) (matched: 'a verb') constraint DS = {27} extremes [2, infinity) + (hits 74/288) (matched: 'a verb') constraint DS = {27} extremes [2, infinity) - (hits 0/205) constraint DS = {27} extremes [1, infinity) + (hits 0/217) constraint DS = {27} extremes [1, infinity) - hits 74/714 nti 27 constraint DS = {27} extremes [1, infinity) + hits 74/800 nti 27 constraint DS = {27} extremes [1, infinity) English: verb - (hits 74/86) (matched: 'verb') constraint CS = {27} extremes [1, 1] + (hits 74/77) (matched: 'verb') constraint CS = {27} extremes [1, 1] verb implying/meaning nounphrase-unparsed> - (hits 0/40) constraint DS = {27} extremes [4, 4] + (hits 0/28) constraint DS = {27} extremes [4, 4] verb implying/meaning - (hits 0/266) constraint DS = {27} extremes [3, infinity) + (hits 0/318) constraint DS = {27} extremes [3, infinity) - hits 82/168 nti 23 constraint DS = {28} extremes [2, infinity) + hits 82/168 nti 22 constraint DS = {28} extremes [2, infinity) English: (hits 82/84) (matched long text) constraint DS = {28} extremes [3, infinity) @@ -6541,7 +6541,7 @@ hits 152/304 nti 31 constraint (none) extremes [1, infinity) English: in - (hits 0/14) constraint DS = {31} extremes [3, infinity) + (hits 0/45) constraint DS = {31} extremes [3, infinity) (hits 152/152) (matched long text) constraint (none) extremes [1, infinity) @@ -6559,9 +6559,9 @@ hits 152/304 nti 29 constraint (none) extremes [1, infinity) English: {be able to ...} - (hits 3/5) (matched: 'be able to be') constraint DS = {29} extremes [4, infinity) + (hits 3/8) (matched: 'be able to be') constraint DS = {29} extremes [4, infinity) {be able to} - (hits 1/2) (matched: 'be able to') constraint CS = {29} extremes [3, 3] + (hits 1/1) (matched: 'be able to') constraint CS = {29} extremes [3, 3] {...} (hits 148/148) (matched: 'translate into + as') constraint (none) extremes [1, infinity) @@ -6591,28 +6591,28 @@ {...} (hits 3/3) (matched: 'he conceals') constraint (none) extremes [2, infinity) - hits 1/4 nti 24 constraint (none) extremes [1, infinity) + hits 1/4 nti 23 constraint (none) extremes [1, infinity) English: {***} (hits 1/2) (matched: 'concealing') constraint (none) extremes [1, infinity) {***} (hits 0/1) constraint (none) extremes [1, infinity) - hits 0/856 nti 25 constraint DS = {8} extremes [1, infinity) + hits 0/856 nti 24 constraint DS = {8} extremes [1, infinity) English: - (hits 0/164) constraint DS = {8} extremes [2, infinity) + (hits 0/81) constraint DS = {8} extremes [2, infinity) - (hits 0/166) constraint DS = {8} extremes [1, infinity) + (hits 0/83) constraint DS = {8} extremes [1, infinity) - hits 0/444 nti 8 constraint DS = {8} extremes [1, infinity) + hits 0/220 nti 8 constraint DS = {8} extremes [1, infinity) English: adjective - (hits 0/19) constraint CS = {8} extremes [1, 1] + (hits 0/2) constraint CS = {8} extremes [1, 1] adjective implying/meaning - (hits 0/148) constraint DS = {8} extremes [4, infinity) + (hits 0/71) constraint DS = {8} extremes [4, infinity) adjective implying/meaning - (hits 0/186) constraint DS = {8} extremes [3, infinity) + (hits 0/104) constraint DS = {8} extremes [3, infinity) nti 9 constraint (none) extremes [1, infinity) English: @@ -6624,9 +6624,9 @@ hits 734/1956 nti 10 constraint (none) extremes [1, infinity) English: variable - (hits 0/13) constraint CS = {10} extremes [1, 1] + (hits 0/39) constraint CS = {10} extremes [1, 1] action of - (hits 0/120) constraint DS = {10} extremes [3, infinity) + (hits 0/122) constraint DS = {10} extremes [3, infinity) (hits 728/978) (matched: 'action name based rule producing nothing that varies') constraint (none) extremes [1, infinity) @@ -6635,7 +6635,7 @@ hits 0/514 nti 12 constraint DS = {11, 12} extremes [4, infinity) English: {...} ( ) - (hits 0/24) constraint DS = {11, 12} extremes [4, infinity) + (hits 0/16) constraint DS = {11, 12} extremes [4, infinity) nti 11 constraint CS = {11} extremes [1, 1] English: @@ -6651,49 +6651,49 @@
    (hits 0/73) constraint (none) extremes [1, 1] (/)/(- {***} - (hits 0/93) constraint DS = {13} extremes [1, infinity) + (hits 0/95) constraint DS = {13} extremes [1, infinity) {***} (/)/(- - (hits 0/93) constraint DS = {13} extremes [1, infinity) + (hits 0/95) constraint DS = {13} extremes [1, infinity) {...} (/)/(- {...} (hits 0/69) constraint DS = {13} extremes [3, infinity) ni--crash--1 - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] ni--crash--10 - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] ni--crash--11 - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] , {...} - (hits 0/81) constraint DS = {13} extremes [2, infinity) + (hits 0/80) constraint DS = {13} extremes [2, infinity) {...} , - (hits 0/81) constraint DS = {13} extremes [2, infinity) + (hits 0/80) constraint DS = {13} extremes [2, infinity) {...} when/while {...} (hits 0/69) constraint DS = {13} extremes [3, infinity) {***} {***} (hits 0/273) constraint (none) extremes [1, infinity) condition - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] conditions - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] storage - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] storages - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] variable - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] variables - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] property-value - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] property-values - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] table-reference - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] table-references - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] list-entry - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] list-entries - (hits 0/12) constraint CS = {13} extremes [1, 1] + (hits 0/15) constraint CS = {13} extremes [1, 1] hits 0/18 nti 14 constraint DS = {14} extremes [5, infinity) English: @@ -6705,14 +6705,14 @@ hits 19/2150 nti 15 constraint DS = {15} extremes [5, infinity) English: {...} ( called {...} ) {***} - (hits 19/391) (matched long text) constraint DS = {15} extremes [5, infinity) + (hits 19/586) (matched long text) constraint DS = {15} extremes [5, infinity) hits 0/2036 nti 16 constraint (none) extremes [1, infinity) English:
    (hits 0/156) constraint (none) extremes [1, 1] {***} (/)/{/}/,/./(- {***} - (hits 0/163) constraint DS = {16} extremes [1, infinity) + (hits 0/142) constraint DS = {16} extremes [1, infinity) {***} {***} (hits 0/948) constraint (none) extremes [1, infinity) @@ -6721,14 +6721,14 @@ (hits 0/661) constraint (none) extremes [1, 1] {***} (/)/{/}/,/. {***} - (hits 0/16) constraint DS = {17} extremes [1, infinity) + (hits 0/28) constraint DS = {17} extremes [1, infinity) {***} {***} (hits 0/806) constraint (none) extremes [1, infinity) hits 0/50 nti 18 constraint (none) extremes [1, infinity) English: {...} with/having/and/or {...} - (hits 0/10) constraint DS = {18} extremes [3, infinity) + (hits 0/12) constraint DS = {18} extremes [3, infinity) (hits 0/25) constraint (none) extremes [1, infinity) @@ -6737,25 +6737,81 @@ {***} something {***} constraint DS = {19} extremes [1, infinity) - hits 28/56 nti 22 constraint (none) extremes [1, infinity) + hits 44/2752 nti 20 constraint CS = {20} extremes [1, 1] + English: + definition + (hits 44/44) (matched: 'definition') constraint CS = {20} extremes [1, 1] + + hits 496/2664 nti 21 constraint DS = {21} extremes [1, infinity) + English: + {to} + constraint CS = {21} extremes [1, 1] + to {...} ( called {...} ) + (hits 0/800) constraint DS = {21} extremes [6, infinity) + {to ...} ( this is the {### function} inverse to {###} ) + (hits 16/674) (matched long text) constraint DS = {21} extremes [12, infinity) + {to ...} ( this is the {### function} ) + (hits 4/717) (matched long text) constraint DS = {21} extremes [9, infinity) + {to ...} ( this is {...} ) + (hits 0/759) constraint DS = {21} extremes [7, infinity) + {to ...} + (hits 476/854) (matched long text) constraint DS = {21} extremes [2, infinity) + + hits 1/992 nti 22 constraint DS = {22} extremes [3, infinity) + English: + to now {...} + (hits 1/495) (matched long text) constraint DS = {22} extremes [3, infinity) + + hits 0/992 nti 23 constraint CS = {23} extremes [2, 2] + English: + to begin + constraint CS = {23} extremes [2, 2] + + hits 29/1672 nti 25 constraint DW = {24, 25} extremes [2, infinity) + English: + this is the {... rule} + (hits 29/354) (matched long text) constraint DS = {25} extremes [5, infinity) + this is the rule + constraint CS = {25} extremes [4, 4] + this is {...} rule + (hits 0/328) constraint DS = {25} extremes [4, infinity) + this is {...} rules + (hits 0/328) constraint DS = {25} extremes [4, infinity) + + (hits 0/358) constraint DS = {24} extremes [2, infinity) + + hits 371/1614 nti 26 constraint (none) extremes [1, infinity) + English: + {...} ( this is the {... rule} ) + (hits 281/302) (matched long text) constraint DS = {26} extremes [8, infinity) + {...} ( this is the rule ) + (hits 0/27) constraint DS = {26} extremes [7, infinity) + {...} ( this is {...} rule ) + (hits 0/27) constraint DS = {26} extremes [7, infinity) + {...} ( this is {...} rules ) + (hits 0/27) constraint DS = {26} extremes [7, infinity) + {...} + (hits 90/90) (matched long text) constraint (none) extremes [1, infinity) + + hits 28/56 nti 29 constraint (none) extremes [1, infinity) English: ( {***} ) - (hits 0/4) constraint DS = {22} extremes [2, infinity) + (hits 0/3) constraint DS = {29} extremes [2, infinity) ( {...} ) - (hits 0/2) constraint DS = {22} extremes [4, infinity) + (hits 0/2) constraint DS = {29} extremes [4, infinity) ( {...} ) - (hits 2/2) (matched: 'locale description priority ( a number )') constraint DS = {22} extremes [4, infinity) + (hits 2/2) (matched: 'locale description priority ( a number )') constraint DS = {29} extremes [4, infinity) (hits 12/26) (matched: 'turn stamp') constraint (none) extremes [1, infinity) (hits 14/14) (matched: 'final question wording') constraint (none) extremes [1, infinity) - hits 16/32 nti 21 constraint (none) extremes [1, infinity) + hits 16/32 nti 28 constraint (none) extremes [1, infinity) English:
    (hits 0/9) constraint (none) extremes [1, 1] {topic} - (hits 1/1) (matched: 'topic') constraint CS = {21} extremes [1, 1] + (hits 1/1) (matched: 'topic') constraint CS = {28} extremes [1, 1] {} (hits 0/15) constraint (none) extremes [1, infinity) {} @@ -6763,53 +6819,53 @@ {...} (hits 15/15) (matched: 'final question wording') constraint (none) extremes [1, infinity) - nti 23 constraint DS = {23} extremes [2, infinity) + nti 30 constraint DS = {30} extremes [2, infinity) English: {...} column - constraint DS = {23} extremes [2, infinity) + constraint DS = {30} extremes [2, infinity) - hits 7/14 nti 25 constraint DS = {24} extremes [2, infinity) + hits 7/14 nti 6 constraint DS = {31} extremes [2, infinity) English: ( continued ) - (hits 0/1) constraint DS = {24, 25} extremes [5, infinity) + (hits 0/1) constraint DS = {6, 31} extremes [5, infinity) ( amended ) - (hits 0/1) constraint DS = {24, 25} extremes [5, infinity) + (hits 0/1) constraint DS = {6, 31} extremes [5, infinity) ( replaced ) - (hits 0/1) constraint DS = {24, 25} extremes [5, infinity) + (hits 0/1) constraint DS = {6, 31} extremes [5, infinity) - (hits 7/7) (matched: 'table of final question options') constraint DS = {24} extremes [2, infinity) + (hits 7/7) (matched: 'table of final question options') constraint DS = {31} extremes [2, infinity) - hits 7/14 nti 24 constraint DS = {24} extremes [2, infinity) + hits 7/14 nti 31 constraint DS = {31} extremes [2, infinity) English: table {...} - {...} - (hits 0/7) constraint DS = {24} extremes [4, infinity) + (hits 0/7) constraint DS = {31} extremes [4, infinity) table {###} - constraint DS = {24} extremes [2, 2] + constraint DS = {31} extremes [2, 2] table of {...} - (hits 7/7) (matched: 'table of final question options') constraint DS = {24} extremes [3, infinity) + (hits 7/7) (matched: 'table of final question options') constraint DS = {31} extremes [3, infinity) table {...} - constraint DS = {24} extremes [2, infinity) + constraint DS = {31} extremes [2, infinity) - nti 26 constraint DS = {26} extremes [2, infinity) + nti 7 constraint DS = {7} extremes [2, infinity) English: table {...} - constraint DS = {26} extremes [2, infinity) + constraint DS = {7} extremes [2, infinity) table of {...} - constraint DS = {26} extremes [3, infinity) + constraint DS = {7} extremes [3, infinity) - hits 3/14 nti 27 constraint DS = {27} extremes [4, infinity) + hits 3/14 nti 8 constraint DS = {8} extremes [4, infinity) English: {***} with blank row/rows - (hits 2/7) (matched long text) constraint DS = {27} extremes [4, infinity) + (hits 2/7) (matched long text) constraint DS = {8} extremes [4, infinity) {***} with {...} blank row/rows - (hits 0/5) constraint DS = {27} extremes [4, infinity) + (hits 0/5) constraint DS = {8} extremes [4, infinity) {***} with blank row/rows for each/every {...} - (hits 1/5) (matched long text) constraint DS = {27} extremes [6, infinity) + (hits 1/5) (matched long text) constraint DS = {8} extremes [6, infinity) - hits 164/328 nti 26 constraint (none) extremes [1, infinity) + hits 164/328 nti 25 constraint (none) extremes [1, infinity) English: - (hits 14/14) (matched: '--') constraint CS = {28} extremes [1, 1] + (hits 14/14) (matched: '--') constraint CS = {9} extremes [1, 1] (hits 28/150) (matched: 'a number') constraint (none) extremes [1, infinity) @@ -6823,19 +6879,19 @@ {...} constraint (none) extremes [1, infinity) - hits 14/28 nti 28 constraint CS = {28} extremes [1, 1] + hits 14/28 nti 9 constraint CS = {9} extremes [1, 1] English: -- - (hits 14/14) (matched: '--') constraint CS = {28} extremes [1, 1] + (hits 14/14) (matched: '--') constraint CS = {9} extremes [1, 1] - hits 116/244 nti 29 constraint (none) extremes [1, infinity) + hits 116/244 nti 10 constraint (none) extremes [1, infinity) English: the action of - (hits 0/6) constraint DS = {29} extremes [4, infinity) + (hits 0/2) constraint DS = {10} extremes [4, infinity) (hits 0/122) constraint (none) extremes [1, infinity) the action of - (hits 0/6) constraint DS = {29} extremes [4, infinity) + (hits 0/2) constraint DS = {10} extremes [4, infinity) (hits 0/122) constraint (none) extremes [1, infinity) @@ -6843,82 +6899,82 @@ (hits 116/122) (matched: 'immediately restart the vm rule') constraint (none) extremes [1, infinity) - hits 12/24 nti 30 constraint (none) extremes [1, infinity) + hits 12/24 nti 11 constraint (none) extremes [1, infinity) English: or - (hits 6/6) (matched: '"forecast/weatherman" or "weather forecast/man"') constraint DS = {30} extremes [3, infinity) + (hits 6/6) (matched: '"forecast/weatherman" or "weather forecast/man"') constraint DS = {11} extremes [3, infinity) (hits 6/6) (matched: '"weather forecast/man"') constraint (none) extremes [1, 1] - nti 31 constraint DS = {31} extremes [1, infinity) + nti 12 constraint DS = {12} extremes [1, infinity) English: equation {} - {...} - constraint DS = {31} extremes [4, infinity) + constraint DS = {12} extremes [4, infinity) equation {} - constraint DS = {31} extremes [2, 2] + constraint DS = {12} extremes [2, 2] equation - {...} - constraint DS = {31} extremes [3, infinity) + constraint DS = {12} extremes [3, infinity) equation {***} - constraint DS = {31} extremes [1, infinity) + constraint DS = {12} extremes [1, infinity) - hits 0/8 nti 6 constraint DS = {6} extremes [2, infinity) + hits 0/8 nti 13 constraint DS = {13} extremes [2, infinity) English: {...} , - (hits 0/3) constraint DS = {6} extremes [2, infinity) + (hits 0/3) constraint DS = {13} extremes [2, infinity) - nti 7 constraint DS = {7} extremes [2, infinity) + nti 14 constraint DS = {14} extremes [2, infinity) English: equation {...} - constraint DS = {7} extremes [2, infinity) + constraint DS = {14} extremes [2, infinity) {...} equation - constraint DS = {7} extremes [2, infinity) + constraint DS = {14} extremes [2, infinity) - nti 8 constraint DS = {8} extremes [3, infinity) + nti 15 constraint DS = {15} extremes [3, infinity) English: {...} where {...} - constraint DS = {8} extremes [3, infinity) + constraint DS = {15} extremes [3, infinity) - hits 4/8 nti 27 constraint (none) extremes [1, infinity) + hits 4/8 nti 26 constraint (none) extremes [1, infinity) English: {...} (hits 0/4) constraint (none) extremes [1, infinity) - (hits 0/4) constraint DS = {10} extremes [3, infinity) + constraint DS = {17} extremes [3, infinity) (hits 4/4) (matched: 'x is a real number') constraint (none) extremes [1, infinity) - hits 0/32 nti 10 constraint DS = {10} extremes [2, infinity) + nti 17 constraint DS = {17} extremes [2, infinity) English: , _and - (hits 0/4) constraint DS = {10} extremes [3, infinity) + constraint DS = {17} extremes [3, infinity) _,/and - (hits 0/4) constraint DS = {10} extremes [2, infinity) + constraint DS = {17} extremes [2, infinity) - hits 4/8 nti 28 constraint (none) extremes [1, infinity) + hits 4/8 nti 27 constraint (none) extremes [1, infinity) English: {...} (hits 0/4) constraint (none) extremes [1, infinity) (hits 4/4) (matched: 'x is a real number') constraint (none) extremes [1, infinity) - hits 4/8 nti 9 constraint (none) extremes [1, infinity) + hits 4/8 nti 16 constraint (none) extremes [1, infinity) English: is/are - (hits 4/4) (matched: 'x is a real number') constraint DS = {9} extremes [3, infinity) + (hits 4/4) (matched: 'x is a real number') constraint DS = {16} extremes [3, infinity) is/are - constraint DS = {9} extremes [3, infinity) + constraint DS = {16} extremes [3, infinity) is/are {...} - constraint DS = {9} extremes [3, infinity) + constraint DS = {16} extremes [3, infinity) = - constraint DS = {9} extremes [3, infinity) + constraint DS = {16} extremes [3, infinity) = - constraint DS = {9} extremes [3, infinity) + constraint DS = {16} extremes [3, infinity) = {...} - constraint DS = {9} extremes [3, infinity) + constraint DS = {16} extremes [3, infinity) constraint (none) extremes [1, infinity) - hits 4/8 nti 29 constraint (none) extremes [1, infinity) + hits 4/8 nti 28 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'x') constraint (none) extremes [1, infinity) @@ -6927,95 +6983,95 @@ {...} constraint (none) extremes [1, infinity) - internal hits 4/8 nti 30 constraint (none) extremes [1, infinity) + internal hits 4/8 nti 29 constraint (none) extremes [1, infinity) - nti 11 constraint CS = {11} extremes [1, 1] + nti 18 constraint CS = {18} extremes [1, 1] English: continue - constraint CS = {11} extremes [1, 1] + constraint CS = {18} extremes [1, 1] - nti 12 constraint (none) extremes [1, infinity) + nti 19 constraint (none) extremes [1, infinity) English: a list of {...} - constraint DS = {12} extremes [4, infinity) + constraint DS = {19} extremes [4, infinity) {...} constraint (none) extremes [1, infinity) - nti 31 constraint (none) extremes [1, infinity) + nti 30 constraint (none) extremes [1, infinity) English: - constraint DS = {14} extremes [3, infinity) + constraint DS = {21} extremes [3, infinity) constraint (none) extremes [1, infinity) - nti 14 constraint DS = {14} extremes [2, infinity) + nti 21 constraint DS = {21} extremes [2, infinity) English: , and/or - constraint DS = {14} extremes [3, infinity) + constraint DS = {21} extremes [3, infinity) ,/and/or - constraint DS = {14} extremes [2, infinity) + constraint DS = {21} extremes [2, infinity) - nti 13 constraint (none) extremes [1, infinity) + nti 20 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) constraint (none) extremes [1, infinity) {...} begins/ends - constraint DS = {13} extremes [2, infinity) + constraint DS = {20} extremes [2, infinity) when/while {***} - constraint DS = {13} extremes [1, infinity) + constraint DS = {20} extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - nti 15 constraint (none) extremes [1, infinity) + nti 22 constraint (none) extremes [1, infinity) English: say {...} - constraint DS = {15} extremes [2, infinity) + constraint DS = {22} extremes [2, infinity) {...} and/or {...} - constraint DS = {15} extremes [3, infinity) + constraint DS = {22} extremes [3, infinity) {...} constraint (none) extremes [1, infinity) - nti 16 constraint (none) extremes [1, infinity) + nti 23 constraint (none) extremes [1, infinity) English: , {...} - constraint DS = {16} extremes [2, infinity) + constraint DS = {23} extremes [2, infinity) unicode {...} - constraint DS = {16} extremes [2, infinity) + constraint DS = {23} extremes [2, infinity) {...} condition - constraint DS = {16} extremes [2, infinity) + constraint DS = {23} extremes [2, infinity) otherwise/else {***} - constraint DS = {16} extremes [1, infinity) + constraint DS = {23} extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - nti 17 constraint (none) extremes [1, infinity) + nti 24 constraint (none) extremes [1, infinity) English: turns - constraint CS = {17} extremes [1, 1] + constraint CS = {24} extremes [1, 1] {...} is/are out of play - constraint DS = {17} extremes [5, infinity) + constraint DS = {24} extremes [5, infinity) unicode {...} - constraint DS = {17} extremes [2, infinity) + constraint DS = {24} extremes [2, infinity) {...} condition - constraint DS = {17} extremes [2, infinity) + constraint DS = {24} extremes [2, infinity) {...} constraint (none) extremes [1, infinity) - nti 6 constraint (none) extremes [1, infinity) + nti 31 constraint (none) extremes [1, infinity) English: {...} ^option constraint (none) extremes [2, infinity) {...} constraint (none) extremes [1, infinity) - nti 18 constraint (none) extremes [1, infinity) + nti 25 constraint (none) extremes [1, infinity) English: {...} of - constraint DS = {18} extremes [2, infinity) + constraint DS = {25} extremes [2, infinity) {...} for - constraint DS = {18} extremes [2, infinity) + constraint DS = {25} extremes [2, infinity) {...} constraint (none) extremes [1, infinity) @@ -7024,9 +7080,9 @@ (hits 171/171) (matched: '100') constraint CS = {r0} extremes [1, 1] minus - (hits 0/1862) constraint DS = {12} extremes [2, 2] + (hits 0/1764) constraint DS = {12} extremes [2, 2] ( ) - (hits 273/846) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4] + (hits 273/823) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4] (hits 1564/5543) (matched: 'Represents geographical locations, both indoor and outdoor, which are not necessarily areas in a building. A player in one @@ -7037,15 +7093,15 @@ (hits 78/259) (matched: 'false') constraint CS = {6} extremes [1, 1] - (hits 0/3326) constraint DS = {8} extremes [2, infinity) + (hits 0/1939) constraint DS = {8} extremes [2, infinity) unicode - (hits 0/4224) constraint DS = {12} extremes [2, infinity) + (hits 0/4155) constraint DS = {12} extremes [2, infinity) (hits 0/3286) constraint DW = {9, 10, 11} extremes [2, 5] (hits 0/9822) constraint (none) extremes [1, infinity) - internal hits 680/1360 nti 7 constraint (none) extremes [1, 1] + internal hits 680/1360 nti 6 constraint (none) extremes [1, 1] hits 78/518 nti 6 constraint CS = {6} extremes [1, 1] English: @@ -7054,49 +7110,49 @@ true (hits 49/230) (matched: 'true') constraint CS = {6} extremes [1, 1] - internal nti 8 constraint (none) extremes [1, infinity) + internal nti 7 constraint (none) extremes [1, infinity) - internal hits 0/19644 nti 9 constraint (none) extremes [1, infinity) + internal hits 0/19644 nti 8 constraint (none) extremes [1, infinity) hits 11/19822 nti 30 constraint (none) extremes [1, infinity) English: _pi - (hits 1/244) (matched: 'pi') constraint CS = {30} extremes [1, 1] + (hits 1/83) (matched: 'pi') constraint CS = {30} extremes [1, 1] _e - (hits 1/243) (matched: 'e') constraint CS = {30} extremes [1, 1] + (hits 1/82) (matched: 'e') constraint CS = {30} extremes [1, 1] plus infinity - (hits 4/10) (matched: 'plus infinity') constraint CS = {30} extremes [2, 2] + (hits 4/8) (matched: 'plus infinity') constraint CS = {30} extremes [2, 2] minus infinity - (hits 4/6) (matched: 'minus infinity') constraint CS = {30} extremes [2, 2] + (hits 4/4) (matched: 'minus infinity') constraint CS = {30} extremes [2, 2] (hits 1/9901) (matched: '0.5') constraint (none) extremes [1, infinity) - internal hits 1/19802 nti 10 constraint (none) extremes [1, infinity) + internal hits 1/19802 nti 9 constraint (none) extremes [1, infinity) hits 0/6572 nti 11 constraint DW = {9, 10, 11} extremes [2, 5] English: minus - (hits 0/741) constraint DS = {9, 11} extremes [3, 5] + (hits 0/705) constraint DS = {9, 11} extremes [3, 5] - (hits 0/856) constraint DS = {9} extremes [2, 4] + (hits 0/2401) constraint DS = {9} extremes [2, 4] - (hits 0/1315) constraint DS = {10} extremes [2, 2] + (hits 0/1378) constraint DS = {10} extremes [2, 2] - hits 0/1712 nti 9 constraint DS = {9} extremes [2, 4] + hits 0/4802 nti 9 constraint DS = {9} extremes [2, 4] English: hour/hours - (hits 0/185) constraint DS = {9} extremes [2, 2] + (hits 0/1302) constraint DS = {9} extremes [2, 2] minute/minutes - (hits 0/185) constraint DS = {9} extremes [2, 2] + (hits 0/1302) constraint DS = {9} extremes [2, 2] hour/hours minute/minutes - (hits 0/390) constraint DS = {9} extremes [4, 4] + (hits 0/545) constraint DS = {9} extremes [4, 4] - hits 0/2630 nti 11 constraint DS = {10} extremes [2, 2] + hits 0/2756 nti 10 constraint DS = {10} extremes [2, 2] English: - (hits 0/1315) constraint DS = {10} extremes [2, 2] + (hits 0/1378) constraint DS = {10} extremes [2, 2] - (hits 0/1315) constraint DS = {10} extremes [2, 2] + (hits 0/1378) constraint DS = {10} extremes [2, 2] nti 10 constraint CS = {10} extremes [1, 1] English: @@ -7105,36 +7161,36 @@ pm constraint CS = {10} extremes [1, 1] - internal hits 0/2630 nti 12 constraint (none) extremes [1, 1] + internal hits 0/2756 nti 11 constraint (none) extremes [1, 1] - internal nti 13 constraint (none) extremes [1, 1] + internal nti 12 constraint (none) extremes [1, 1] - hits 0/3316 nti 19 constraint DS = {19} extremes [2, infinity) + hits 0/1432 nti 24 constraint DS = {24} extremes [2, infinity) English: at - (hits 0/40) constraint DS = {10, 19} extremes [3, 3] + (hits 0/8) constraint DS = {10, 24} extremes [3, 3] at the time when {...} - (hits 0/1556) constraint DS = {19} extremes [5, infinity) + (hits 0/670) constraint DS = {24} extremes [5, infinity) at the time that {...} - (hits 0/1556) constraint DS = {19} extremes [5, infinity) + (hits 0/670) constraint DS = {24} extremes [5, infinity) at {...} - (hits 0/1658) constraint DS = {19} extremes [2, infinity) + (hits 0/716) constraint DS = {24} extremes [2, infinity) - nti 14 constraint (none) extremes [1, infinity) + nti 13 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] constraint (none) extremes [1, infinity) - internal nti 15 constraint (none) extremes [1, infinity) + internal nti 14 constraint (none) extremes [1, infinity) - hits 0/6652 nti 8 constraint DS = {8} extremes [2, infinity) + hits 0/3878 nti 8 constraint DS = {8} extremes [2, infinity) English: { } - (hits 0/20) constraint CS = {8} extremes [2, 2] + (hits 0/1) constraint CS = {8} extremes [2, 2] { } - (hits 0/1976) constraint DS = {8} extremes [3, infinity) + (hits 0/1567) constraint DS = {8} extremes [3, infinity) nti 7 constraint (none) extremes [1, infinity) English: @@ -7143,147 +7199,147 @@ constraint (none) extremes [1, infinity) - nti 16 constraint (none) extremes [1, infinity) + nti 15 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) {......} constraint (none) extremes [1, infinity) - internal hits 4/8 nti 17 constraint (none) extremes [1, infinity) + internal hits 4/8 nti 16 constraint (none) extremes [1, infinity) - internal hits 4/16 nti 18 constraint (none) extremes [1, infinity) + internal hits 4/16 nti 17 constraint (none) extremes [1, infinity) - internal hits 3205/8236 nti 19 constraint (none) extremes [1, infinity) + internal hits 3205/8236 nti 18 constraint (none) extremes [1, infinity) - internal hits 1093/2190 nti 20 constraint (none) extremes [1, infinity) + internal hits 1093/2190 nti 19 constraint (none) extremes [1, infinity) - internal hits 4/8 nti 21 constraint (none) extremes [1, infinity) + internal hits 4/8 nti 20 constraint (none) extremes [1, infinity) - internal hits 1962/5224 nti 22 constraint (none) extremes [1, infinity) + internal hits 1962/5224 nti 21 constraint (none) extremes [1, infinity) - internal hits 1272/3058 nti 23 constraint (none) extremes [1, infinity) + internal hits 1272/3058 nti 22 constraint (none) extremes [1, infinity) - internal hits 529/1072 nti 24 constraint (none) extremes [1, infinity) + internal hits 529/1072 nti 23 constraint (none) extremes [1, infinity) - hits 241/1724 nti 25 constraint (none) extremes [1, infinity) + hits 241/1724 nti 24 constraint (none) extremes [1, infinity) English: (hits 189/792) (matched long text) constraint (none) extremes [1, infinity) (hits 52/603) (matched long text) constraint (none) extremes [1, infinity) - internal hits 0/244 nti 26 constraint (none) extremes [1, infinity) + internal hits 0/244 nti 25 constraint (none) extremes [1, infinity) - internal hits 0/244 nti 27 constraint (none) extremes [1, infinity) + internal hits 0/244 nti 26 constraint (none) extremes [1, infinity) - hits 2370/20902 nti 20 constraint (none) extremes [1, infinity) + hits 2370/20902 nti 27 constraint (none) extremes [1, infinity) English: (hits 1797/10451) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint (none) extremes [1, infinity) nothing - (hits 97/152) (matched: 'nothing') constraint CS = {20} extremes [1, 1] + (hits 97/657) (matched: 'nothing') constraint CS = {27} extremes [1, 1] (hits 449/8557) (matched: 'printing the name of a dark room') constraint (none) extremes [1, infinity) outcome - (hits 0/3498) constraint DS = {20} extremes [2, infinity) + (hits 0/3190) constraint DS = {27} extremes [2, infinity) option - (hits 26/3498) (matched: 'serial comma option') constraint DS = {20} extremes [2, infinity) + (hits 26/3190) (matched: 'serial comma option') constraint DS = {27} extremes [2, infinity) verb - (hits 1/3472) (matched: 'verb are') constraint DS = {20} extremes [2, infinity) + (hits 1/3164) (matched: 'verb are') constraint DS = {27} extremes [2, infinity) response ( ) - (hits 0/778) constraint DS = {20} extremes [5, infinity) + (hits 0/766) constraint DS = {27} extremes [5, infinity) - internal hits 449/17114 nti 28 constraint (none) extremes [1, infinity) + internal hits 449/17114 nti 27 constraint (none) extremes [1, infinity) - internal hits 0/244 nti 29 constraint (none) extremes [1, infinity) + internal hits 0/244 nti 28 constraint (none) extremes [1, infinity) - internal nti 30 constraint (none) extremes [1, infinity) + internal nti 29 constraint (none) extremes [1, infinity) - internal hits 26/52 nti 31 constraint (none) extremes [1, infinity) + internal hits 26/52 nti 30 constraint (none) extremes [1, infinity) - internal nti 6 constraint (none) extremes [1, infinity) + internal nti 31 constraint (none) extremes [1, infinity) - internal hits 165/18574 nti 7 constraint (none) extremes [1, infinity) + internal hits 165/18574 nti 6 constraint (none) extremes [1, infinity) - hits 34/1592 nti 8 constraint DS = {20} extremes [2, infinity) + hits 34/1592 nti 7 constraint DS = {26} extremes [2, infinity) English: - (hits 34/191) (matched: 'the property initial appearance') constraint DS = {20} extremes [3, infinity) + (hits 34/80) (matched: 'the property initial appearance') constraint DS = {26} extremes [3, infinity) - (hits 0/180) constraint DS = {20} extremes [2, infinity) + (hits 0/67) constraint DS = {26} extremes [2, infinity) - internal hits 796/21416 nti 9 constraint (none) extremes [1, infinity) + internal hits 796/21416 nti 8 constraint (none) extremes [1, infinity) - hits 651/21866 nti 10 constraint (none) extremes [1, infinity) + hits 651/21866 nti 9 constraint (none) extremes [1, infinity) English: (hits 651/10933) (matched: 'unmarked for listing') constraint (none) extremes [1, infinity) - hits 1442/27538 nti 22 constraint (none) extremes [1, infinity) + hits 1442/27538 nti 28 constraint (none) extremes [1, infinity) English: not - (hits 0/2934) constraint DS = {22} extremes [3, infinity) + (hits 0/3187) constraint DS = {28} extremes [3, infinity) (hits 0/6944) constraint (none) extremes [2, infinity) (hits 1442/13769) (matched: 'marked for listing other') constraint (none) extremes [1, infinity) - hits 1513/29768 nti 21 constraint (none) extremes [1, infinity) + hits 1513/29768 nti 27 constraint (none) extremes [1, infinity) English: not - (hits 12/5509) (matched: 'not lockable') constraint DS = {21} extremes [2, infinity) + (hits 12/5177) (matched: 'not lockable') constraint DS = {27} extremes [2, infinity) (hits 1430/2252) (matched: 'unmarked for listing') constraint CS = {r3} extremes [1, infinity) not - (hits 0/3299) constraint DS = {21} extremes [3, infinity) + (hits 0/3106) constraint DS = {27} extremes [3, infinity) (hits 71/7271) (matched: 'marked for listing other') constraint (none) extremes [2, infinity) internal hits 2217/19100 nti r3 constraint CS = {r3} extremes [1, infinity) - hits 3634/90352 nti 11 constraint (none) extremes [1, infinity) + hits 3634/90352 nti 10 constraint (none) extremes [1, infinity) English: (hits 2599/45176) (matched: 'value of kind k') constraint (none) extremes [1, infinity) (hits 1035/2038) (matched: 'the alfred cralle pool hall') constraint CW = {r2, r4} extremes [1, infinity) - hits 8/864 nti 12 constraint (none) extremes [1, infinity) + hits 8/864 nti 11 constraint (none) extremes [1, infinity) English: (hits 8/432) (matched: 'person') constraint (none) extremes [1, infinity) - hits 133/7892 nti 13 constraint CW = {r2, r4} extremes [1, infinity) + hits 133/7892 nti 12 constraint CW = {r2, r4} extremes [1, infinity) English: (hits 133/332) (matched: 'alfred cralle pool hall') constraint CW = {r2, r4} extremes [1, infinity) - hits 768/5176 nti 14 constraint (none) extremes [1, infinity) + hits 768/5176 nti 13 constraint (none) extremes [1, infinity) English: (hits 768/2588) (matched: 'marked for listing other') constraint (none) extremes [1, infinity) - hits 1652/38798 nti 15 constraint (none) extremes [1, infinity) + hits 1652/38798 nti 14 constraint (none) extremes [1, infinity) English: (hits 1392/19399) (matched long text) constraint (none) extremes [1, infinity) (hits 260/4823) (matched long text) constraint (none) extremes [3, infinity) - hits 256/2104 nti 16 constraint (none) extremes [1, infinity) + hits 256/2104 nti 15 constraint (none) extremes [1, infinity) English: (hits 256/1052) (matched: 'thing ( called the item being printed )') constraint (none) extremes [1, infinity) - hits 1648/40902 nti 23 constraint (none) extremes [1, infinity) + hits 1648/40902 nti 29 constraint (none) extremes [1, infinity) English: ( called ) - (hits 118/1450) (matched long text) constraint DS = {23} extremes [5, infinity) + (hits 118/1546) (matched long text) constraint DS = {29} extremes [5, infinity) (hits 1530/20333) (matched: 'the alfred cralle pool hall') constraint (none) extremes [1, infinity) - hits 1648/40914 nti 17 constraint (none) extremes [1, infinity) + hits 1648/40914 nti 16 constraint (none) extremes [1, infinity) English: (hits 51/10621) (matched: 'at least two stamped envelopes') constraint (none) extremes [2, infinity) @@ -7302,44 +7358,44 @@ (hits 744/19553) (matched: 'marked for listing other people') constraint (none) extremes [1, infinity) - hits 1412/40880 nti 18 constraint (none) extremes [1, infinity) + hits 1412/40880 nti 17 constraint (none) extremes [1, infinity) English: (hits 1028/20440) (matched: 'nancy johnson memorial square') constraint (none) extremes [1, infinity) (hits 384/10192) (matched: 'marked for listing other people') constraint (none) extremes [2, infinity) - hits 2/300 nti 19 constraint (none) extremes [1, infinity) + hits 2/300 nti 18 constraint (none) extremes [1, infinity) English: (hits 2/150) (matched: 'person') constraint (none) extremes [1, infinity) (hits 0/111) constraint (none) extremes [2, infinity) - hits 56/7194 nti 20 constraint (none) extremes [1, infinity) + hits 56/7194 nti 19 constraint (none) extremes [1, infinity) English: (hits 56/129) (matched: 'alfred cralle pool hall') constraint CW = {r2, r4} extremes [1, infinity) (hits 0/1430) constraint (none) extremes [2, infinity) - internal hits 4743/9700 nti 21 constraint (none) extremes [0, 0] + internal hits 4743/9700 nti 20 constraint (none) extremes [0, 0] - hits 102/544 nti 22 constraint (none) extremes [1, infinity) + hits 102/544 nti 21 constraint (none) extremes [1, infinity) English: (hits 102/272) (matched: 'the dark') constraint (none) extremes [1, infinity) (hits 0/170) constraint (none) extremes [1, infinity) - hits 102/544 nti 24 constraint (none) extremes [1, infinity) + hits 102/544 nti 30 constraint (none) extremes [1, infinity) English: ( called ) - (hits 0/66) constraint DS = {24} extremes [5, infinity) + (hits 0/66) constraint DS = {30} extremes [5, infinity) (hits 102/272) (matched: 'the dark') constraint (none) extremes [1, infinity) - hits 102/544 nti 23 constraint (none) extremes [1, infinity) + hits 102/544 nti 22 constraint (none) extremes [1, infinity) English: (hits 8/153) (matched: 'every dvd') constraint (none) extremes [2, infinity) @@ -7358,7 +7414,7 @@ (hits 94/264) (matched: 'the dark') constraint (none) extremes [1, infinity) - hits 102/566 nti 24 constraint (none) extremes [1, infinity) + hits 102/566 nti 23 constraint (none) extremes [1, infinity) English: (hits 101/283) (matched: 'cold comfort') constraint (none) extremes [1, infinity) @@ -7367,30 +7423,30 @@ (hits 1/182) (matched: 'the dark') constraint (none) extremes [1, infinity) - hits 118/236 nti 25 constraint (none) extremes [1, infinity) + hits 118/236 nti 24 constraint (none) extremes [1, infinity) English:
    {...} (hits 83/95) (matched: 'the item being printed') constraint (none) extremes [2, infinity) {...} (hits 35/35) (matched: 'random bystander') constraint (none) extremes [1, infinity) - internal hits 79/21548 nti 26 constraint (none) extremes [1, infinity) + internal hits 79/21548 nti 25 constraint (none) extremes [1, infinity) - internal hits 288/62770 nti 27 constraint (none) extremes [1, infinity) + internal hits 288/62770 nti 26 constraint (none) extremes [1, infinity) - hits 1947/4830 nti 28 constraint (none) extremes [1, infinity) + hits 1947/4830 nti 27 constraint (none) extremes [1, infinity) English:
    (hits 118/398) (matched long text) constraint (none) extremes [2, infinity) (hits 1829/2297) (matched long text) constraint (none) extremes [1, infinity) - hits 3125/7780 nti 31 constraint (none) extremes [1, infinity) + hits 3125/7780 nti 11 constraint (none) extremes [1, infinity) English: variable/variables - (hits 2/220) (matched: 'text variables') constraint DS = {31} extremes [2, infinity) + (hits 2/425) (matched: 'text variables') constraint DS = {11} extremes [2, infinity) that/which vary/varies - (hits 59/206) (matched: 'action name based rule producing nothing that varies') constraint DS = {31} extremes [3, infinity) + (hits 59/334) (matched: 'action name based rule producing nothing that varies') constraint DS = {11} extremes [3, infinity) (hits 2441/3829) (matched long text) constraint (none) extremes [1, infinity) @@ -7407,30 +7463,30 @@ (hits 27/792) (matched long text) constraint (none) extremes [1, infinity) - hits 1252/3018 nti 29 constraint (none) extremes [1, infinity) + hits 1252/3018 nti 28 constraint (none) extremes [1, infinity) English:
    (hits 162/790) (matched: 'an ice cream cone') constraint (none) extremes [2, infinity) (hits 1090/1347) (matched long text) constraint (none) extremes [1, infinity) - hits 1252/3018 nti 30 constraint (none) extremes [1, infinity) + hits 1252/3018 nti 29 constraint (none) extremes [1, infinity) English: (hits 74/1509) (matched: 'unmarked for listing') constraint (none) extremes [1, infinity) (hits 1178/1435) (matched long text) constraint (none) extremes [1, infinity) - hits 61/124 nti 30 constraint (none) extremes [1, infinity) + hits 61/124 nti 10 constraint (none) extremes [1, infinity) English: global - constraint CS = {30} extremes [1, 1] + constraint CS = {10} extremes [1, 1] global - constraint DS = {30} extremes [2, infinity) + (hits 0/3) constraint DS = {10} extremes [2, infinity) (hits 61/62) (matched: 'action name based rule producing nothing') constraint (none) extremes [1, infinity) - hits 61/124 nti 31 constraint (none) extremes [1, infinity) + hits 61/124 nti 30 constraint (none) extremes [1, infinity) English: (hits 61/62) (matched: 'action name based rule producing nothing') constraint (none) extremes [1, infinity) @@ -7443,18 +7499,18 @@ (hits 0/1) constraint (none) extremes [1, infinity) - internal hits 8/18428 nti 6 constraint (none) extremes [0, 0] + internal hits 8/18428 nti 31 constraint (none) extremes [0, 0] - internal hits 2/9366 nti 7 constraint (none) extremes [0, 0] + internal hits 2/9366 nti 6 constraint (none) extremes [0, 0] - internal hits 9/18536 nti 8 constraint (none) extremes [0, 0] + internal hits 9/18536 nti 7 constraint (none) extremes [0, 0] - internal hits 0/18536 nti 9 constraint (none) extremes [0, 0] + internal hits 0/18536 nti 8 constraint (none) extremes [0, 0] - hits 8451/18824 nti 27 constraint (none) extremes [1, infinity) + hits 8451/18824 nti 7 constraint (none) extremes [1, infinity) English: ( ) - (hits 0/1771) constraint DS = {27} extremes [3, infinity) + (hits 0/2048) constraint DS = {7} extremes [3, infinity) (hits 144/9412) (matched: 'the person reaching') constraint (none) extremes [1, infinity) @@ -7476,17 +7532,17 @@ (hits 116/9167) (matched: 'a supporter ( called the chaise )') constraint (none) extremes [1, infinity) - (hits 0/1612) constraint DS = {26} extremes [2, infinity) + (hits 0/2991) constraint DS = {6} extremes [2, infinity) member/members of - (hits 0/1741) constraint DS = {27} extremes [3, infinity) + (hits 0/1978) constraint DS = {7} extremes [3, infinity) member/members of - (hits 0/1741) constraint DS = {27} extremes [3, infinity) + (hits 0/1978) constraint DS = {7} extremes [3, infinity) of - (hits 2/1741) (matched: 'the destination of the player') constraint DS = {27} extremes [3, infinity) + (hits 2/1978) (matched: 'the destination of the player') constraint DS = {7} extremes [3, infinity) (hits 0/4683) constraint (none) extremes [2, infinity) entry of/in/from - (hits 0/1212) constraint DS = {27} extremes [4, infinity) + (hits 0/1436) constraint DS = {7} extremes [4, infinity) (hits 0/9049) constraint (none) extremes [1, infinity) @@ -7494,16 +7550,16 @@ (hits 0/9049) constraint (none) extremes [1, infinity) - hits 4/18428 nti 25 constraint (none) extremes [1, infinity) + hits 4/18428 nti 31 constraint (none) extremes [1, infinity) English: where - (hits 4/1243) (matched long text) constraint DS = {25} extremes [3, infinity) + (hits 4/1744) (matched long text) constraint DS = {31} extremes [3, infinity) where - (hits 0/1239) constraint DS = {25} extremes [3, infinity) + (hits 0/1740) constraint DS = {31} extremes [3, infinity) (hits 0/9210) constraint (none) extremes [1, infinity) - hits 5811/24112 nti 10 constraint (none) extremes [1, infinity) + hits 5811/24112 nti 9 constraint (none) extremes [1, infinity) English: (hits 1637/6150) (matched: 'the room back the other way') constraint (none) extremes [2, infinity) @@ -7514,102 +7570,102 @@ (hits 2211/8456) (matched: 'current item from the multiple object list') constraint (none) extremes [1, infinity) - nti 6 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: ( ) - constraint DS = {6} extremes [3, infinity) + constraint DS = {12} extremes [3, infinity) constraint (none) extremes [1, infinity) constraint (none) extremes [1, infinity) - hits 173/1130 nti 11 constraint (none) extremes [1, infinity) + hits 173/1130 nti 10 constraint (none) extremes [1, infinity) English: (hits 173/565) (matched: 'the second noun') constraint (none) extremes [1, infinity) - internal hits 1137/27360 nti 12 constraint (none) extremes [1, infinity) + internal hits 1137/27360 nti 11 constraint (none) extremes [1, infinity) - internal hits 897/18706 nti 13 constraint (none) extremes [1, infinity) + internal hits 897/18706 nti 12 constraint (none) extremes [1, infinity) - internal hits 2296/19726 nti 14 constraint (none) extremes [1, infinity) + internal hits 2296/19726 nti 13 constraint (none) extremes [1, infinity) - hits 105/18392 nti 7 constraint DS = {7} extremes [3, infinity) + hits 105/18392 nti 13 constraint DS = {13} extremes [3, infinity) English: of {...} - (hits 105/1379) (matched long text) constraint DS = {7} extremes [3, infinity) + (hits 105/1753) (matched long text) constraint DS = {13} extremes [3, infinity) - internal hits 493/18392 nti 15 constraint (none) extremes [1, infinity) + internal hits 493/18392 nti 14 constraint (none) extremes [1, infinity) - internal hits 477/18098 nti 16 constraint (none) extremes [1, infinity) + internal hits 477/18098 nti 15 constraint (none) extremes [1, infinity) - hits 139/3224 nti 26 constraint DS = {26} extremes [2, infinity) + hits 139/5982 nti 6 constraint DS = {6} extremes [2, infinity) English: entry - (hits 135/1612) (matched: 'a final response rule entry') constraint DS = {26} extremes [2, infinity) + (hits 135/2991) (matched: 'a final response rule entry') constraint DS = {6} extremes [2, infinity) in row of - (hits 0/369) constraint DS = {26} extremes [6, infinity) + (hits 0/430) constraint DS = {6} extremes [6, infinity) listed in - (hits 2/1108) (matched: 'a topic listed in source') constraint DS = {26} extremes [4, infinity) + (hits 2/1390) (matched: 'a topic listed in source') constraint DS = {6} extremes [4, infinity) corresponding to of in - (hits 0/183) constraint DS = {26} extremes [8, infinity) + (hits 0/198) constraint DS = {6} extremes [8, infinity) of in - (hits 2/596) (matched long text) constraint DS = {26} extremes [5, infinity) + (hits 2/671) (matched long text) constraint DS = {6} extremes [5, infinity) - hits 1074/2238 nti 17 constraint (none) extremes [3, infinity) + hits 1074/2238 nti 16 constraint (none) extremes [3, infinity) English: - (hits 0/1089) constraint DS = {19} extremes [3, infinity) + (hits 0/694) constraint DS = {19} extremes [3, infinity) (hits 1074/1108) (matched long text) constraint (none) extremes [3, infinity) - hits 11/22 nti 18 constraint FS = {7} extremes [2, infinity) + hits 11/22 nti 17 constraint FS = {7} extremes [2, infinity) English: (hits 11/11) (matched long text) constraint FS = {7} extremes [2, infinity) - hits 2149/6658 nti 19 constraint (none) extremes [2, infinity) + hits 2149/6658 nti 18 constraint (none) extremes [2, infinity) English: - (hits 0/802) constraint DS = {29} & FS = {9} extremes [4, infinity) + (hits 0/987) constraint DW = {9} & FS = {9} extremes [4, infinity) - (hits 224/1694) (matched long text) constraint DS = {14} & FS = {6} extremes [3, infinity) + (hits 224/1528) (matched long text) constraint DS = {14} & FS = {6} extremes [3, infinity) - (hits 1925/2196) (matched long text) constraint FS = {6} extremes [2, infinity) + (hits 1925/2213) (matched long text) constraint FS = {6} extremes [2, infinity) - nti 29 constraint DS = {29} extremes [3, infinity) + nti 9 constraint DS = {9} extremes [3, infinity) English: to - constraint DS = {29} extremes [3, infinity) + constraint DS = {9} extremes [3, infinity) - hits 260/9986 nti 20 constraint (none) extremes [3, infinity) + hits 260/9986 nti 19 constraint (none) extremes [3, infinity) English: - (hits 169/4238) (matched long text) constraint DS = {13} extremes [3, infinity) + (hits 169/4207) (matched long text) constraint DS = {13} extremes [3, infinity) - (hits 91/2761) (matched long text) constraint DS = {30} extremes [4, infinity) + (hits 91/2728) (matched long text) constraint DS = {30} extremes [4, infinity) - hits 448/31088 nti 28 constraint DS = {13} extremes [2, infinity) + hits 448/30946 nti 8 constraint DS = {13} extremes [2, infinity) English: - (hits 447/9355) (matched long text) constraint DS = {13} extremes [2, infinity) + (hits 447/9203) (matched long text) constraint DS = {13} extremes [2, infinity) not - (hits 1/6230) (matched: 'not carried by the person asked') constraint DS = {13, 28} extremes [3, infinity) + (hits 1/5573) (matched: 'not carried by the person asked') constraint DS = {8, 13} extremes [3, infinity) - hits 183/23738 nti 21 constraint DS = {30} extremes [3, infinity) + hits 183/23504 nti 20 constraint DS = {30} extremes [3, infinity) English: - (hits 0/2560) constraint DS = {29, 30} extremes [5, infinity) + (hits 0/2568) constraint DS = {9, 30} extremes [5, infinity) - (hits 32/3748) (matched long text) constraint DS = {14, 30} extremes [4, infinity) + (hits 32/3607) (matched long text) constraint DS = {14, 30} extremes [4, infinity) - (hits 151/5875) (matched: 'which provide the property initial appearance') constraint DS = {30} extremes [3, infinity) + (hits 151/5683) (matched: 'which provide the property initial appearance') constraint DS = {30} extremes [3, infinity) - internal hits 791/18334 nti 22 constraint (none) extremes [1, infinity) + internal hits 791/18334 nti 21 constraint (none) extremes [1, infinity) - internal hits 1217/34624 nti 23 constraint (none) extremes [0, 0] + internal hits 1217/34624 nti 22 constraint (none) extremes [0, 0] - hits 4662/9672 nti 24 constraint (none) extremes [1, infinity) + hits 4662/9672 nti 23 constraint (none) extremes [1, infinity) English: (hits 30/4836) (matched: 'the person asked') constraint (none) extremes [1, infinity) @@ -7618,7 +7674,7 @@ ^ (hits 4602/4776) (matched long text) constraint (none) extremes [1, infinity) - hits 797/2188 nti 25 constraint (none) extremes [1, infinity) + hits 797/2188 nti 24 constraint (none) extremes [1, infinity) English: (hits 143/1094) (matched: 'the second noun') constraint (none) extremes [1, infinity) @@ -7627,10 +7683,10 @@ ^ (hits 552/849) (matched long text) constraint (none) extremes [1, infinity) - hits 2/496 nti 8 constraint (none) extremes [1, infinity) + hits 2/496 nti 14 constraint (none) extremes [1, infinity) English: ( ) - (hits 0/6) constraint DS = {8} extremes [3, infinity) + (hits 0/10) constraint DS = {14} extremes [3, infinity) constraint CS = {r0} extremes [1, 1] @@ -7638,178 +7694,178 @@ (hits 2/248) (matched: 'switched off') constraint (none) extremes [1, infinity) - hits 1071/2634 nti 26 constraint (none) extremes [0, infinity) + hits 1071/2634 nti 25 constraint (none) extremes [0, infinity) English: (hits 1069/1317) (matched long text) constraint (none) extremes [0, infinity) (hits 2/248) (matched: 'switched off') constraint (none) extremes [1, infinity) - hits 1325/3170 nti 17 constraint (none) extremes [0, infinity) + hits 1325/3170 nti 23 constraint (none) extremes [0, infinity) English: ( ) - (hits 0/1306) constraint DS = {17} extremes [3, infinity) + (hits 0/572) constraint DS = {23} extremes [3, infinity) , and - (hits 0/1193) constraint DS = {17} extremes [4, infinity) + (hits 0/555) constraint DS = {23} extremes [4, infinity) and - (hits 97/1306) (matched long text) constraint DS = {17} extremes [3, infinity) + (hits 97/572) (matched long text) constraint DS = {23} extremes [3, infinity) , or - (hits 0/1096) constraint DS = {17} extremes [4, infinity) + (hits 0/458) constraint DS = {23} extremes [4, infinity) or - (hits 31/1209) (matched long text) constraint DS = {17} extremes [3, infinity) + (hits 31/475) (matched long text) constraint DS = {23} extremes [3, infinity) (hits 0/1457) constraint (none) extremes [1, infinity) (hits 1197/1457) (matched long text) constraint (none) extremes [0, infinity) - internal hits 0/2914 nti 27 constraint (none) extremes [1, infinity) + internal hits 0/2914 nti 26 constraint (none) extremes [1, infinity) - hits 1197/2914 nti 16 constraint (none) extremes [0, infinity) + hits 1197/2914 nti 22 constraint (none) extremes [0, infinity) English: (hits 1/1457) (matched: 'continuing') constraint (none) extremes [1, infinity) not - (hits 0/407) constraint DS = {16} extremes [2, infinity) + (hits 0/835) constraint DS = {22} extremes [2, infinity) (hits 83/1456) (matched long text) constraint (none) extremes [1, infinity) - (hits 0/1091) constraint DS = {11} extremes [3, infinity) + (hits 0/613) constraint DS = {17} extremes [3, infinity) - (hits 0/999) constraint DS = {12} extremes [4, infinity) + (hits 0/997) constraint DS = {18} extremes [4, infinity) (hits 28/1373) (matched long text) constraint (none) extremes [1, infinity) - (hits 0/902) constraint DS = {14} extremes [2, infinity) + (hits 0/878) constraint DS = {20} extremes [2, infinity) (hits 1074/1119) (matched long text) constraint (none) extremes [3, infinity) (hits 11/271) (matched long text) constraint (none) extremes [0, infinity) - hits 83/2912 nti 10 constraint (none) extremes [1, infinity) + hits 83/2912 nti 16 constraint (none) extremes [1, infinity) English: - (hits 0/1157) constraint DS = {9, 19} extremes [3, infinity) + (hits 0/725) constraint DS = {15, 19} extremes [3, infinity) (hits 83/1445) (matched long text) constraint (none) extremes [1, infinity) not - (hits 0/1082) constraint DS = {10} extremes [2, infinity) + (hits 0/1073) constraint DS = {16} extremes [2, infinity) - hits 11/542 nti 15 constraint (none) extremes [0, infinity) + hits 11/542 nti 21 constraint (none) extremes [0, infinity) English: ^ (hits 0/11) constraint (none) extremes [0, infinity) (hits 11/11) (matched long text) constraint (none) extremes [1, infinity) not - constraint DS = {15} extremes [2, infinity) + constraint DS = {21} extremes [2, infinity) - hits 22/2878 nti 9 constraint DS = {9, 19} extremes [3, infinity) + hits 22/2014 nti 15 constraint DS = {15, 19} extremes [3, infinity) English: is/are {...} - (hits 22/1193) (matched long text) constraint DS = {9, 19} extremes [3, infinity) + (hits 22/760) (matched long text) constraint DS = {15, 19} extremes [3, infinity) - internal hits 94/2912 nti 28 constraint (none) extremes [1, infinity) + internal hits 94/2912 nti 27 constraint (none) extremes [1, infinity) - internal hits 1/2914 nti 29 constraint (none) extremes [1, infinity) + internal hits 1/2914 nti 28 constraint (none) extremes [1, infinity) - hits 1374/2748 nti 18 constraint (none) extremes [1, infinity) + hits 1374/2748 nti 24 constraint (none) extremes [1, infinity) English: ( ) - (hits 0/1317) constraint DS = {18} extremes [3, infinity) + (hits 0/1305) constraint DS = {24} extremes [3, infinity) (hits 1374/1374) (matched long text) constraint (none) extremes [1, infinity) - hits 2627/5254 nti 20 constraint (none) extremes [1, infinity) + hits 2627/5254 nti 26 constraint (none) extremes [1, infinity) English: ( ) - (hits 0/501) constraint DS = {20} extremes [3, infinity) + (hits 0/490) constraint DS = {26} extremes [3, infinity) (hits 239/2627) (matched: 'might not appreciate') constraint (none) extremes [1, infinity) (hits 2388/2388) (matched long text) constraint (none) extremes [1, infinity) - hits 239/5254 nti 19 constraint (none) extremes [1, infinity) + hits 239/5254 nti 25 constraint (none) extremes [1, infinity) English: (hits 0/2581) constraint (none) extremes [1, infinity) verb - (hits 0/754) constraint DS = {19} extremes [2, infinity) + (hits 0/702) constraint DS = {25} extremes [2, infinity) adjective - (hits 0/754) constraint DS = {19} extremes [2, infinity) + (hits 0/702) constraint DS = {25} extremes [2, infinity) (hits 210/2581) (matched: 'do not fit') constraint (none) extremes [1, infinity) verb - (hits 0/496) constraint DS = {19} extremes [3, infinity) + (hits 0/483) constraint DS = {25} extremes [3, infinity) (hits 29/855) (matched: 'might not appreciate') constraint (none) extremes [2, infinity) (hits 0/2342) constraint (none) extremes [1, infinity) - internal hits 0/4684 nti 30 constraint (none) extremes [1, infinity) + internal hits 0/4684 nti 29 constraint (none) extremes [1, infinity) - internal hits 1374/2748 nti 31 constraint (none) extremes [1, infinity) + internal hits 1374/2748 nti 30 constraint (none) extremes [1, infinity) - internal hits 2388/4776 nti 6 constraint (none) extremes [1, infinity) + internal hits 2388/4776 nti 31 constraint (none) extremes [1, infinity) internal hits 1168/4912 nti r4 constraint CW = {r2, r4} extremes [1, infinity) - internal hits 4/252 nti 7 constraint (none) extremes [1, infinity) + internal hits 4/252 nti 6 constraint (none) extremes [1, infinity) - nti 8 constraint (none) extremes [0, 0] + nti 7 constraint (none) extremes [0, 0] English: constraint (none) extremes [0, 0] constraint (none) extremes [0, 0] - internal hits 0/172 nti 9 constraint (none) extremes [1, infinity) + internal hits 0/172 nti 8 constraint (none) extremes [1, infinity) - internal hits 4/252 nti 10 constraint (none) extremes [1, infinity) + internal hits 4/252 nti 9 constraint (none) extremes [1, infinity) - nti 11 constraint (none) extremes [1, infinity) + nti 10 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) constraint (none) extremes [1, infinity) - hits 4/292 nti 21 constraint CS = {21} extremes [1, 3] + hits 4/292 nti 27 constraint CS = {27} extremes [1, 3] English: description - (hits 1/2) (matched: 'description') constraint CS = {21} extremes [1, 1] + (hits 1/3) (matched: 'description') constraint CS = {27} extremes [1, 1] specification - (hits 1/1) (matched: 'specification') constraint CS = {21} extremes [1, 1] + (hits 1/2) (matched: 'specification') constraint CS = {27} extremes [1, 1] indefinite appearance text - (hits 1/2) (matched: 'indefinite appearance text') constraint CS = {21} extremes [3, 3] + (hits 1/2) (matched: 'indefinite appearance text') constraint CS = {27} extremes [3, 3] variable initial value - (hits 1/1) (matched: 'variable initial value') constraint CS = {21} extremes [3, 3] + (hits 1/1) (matched: 'variable initial value') constraint CS = {27} extremes [3, 3] - hits 34/520 nti 20 constraint DS = {20} extremes [2, infinity) + hits 34/294 nti 26 constraint DS = {26} extremes [2, infinity) English: property {...} - (hits 34/214) (matched: 'property initial appearance') constraint DS = {20} extremes [2, infinity) + (hits 34/101) (matched: 'property initial appearance') constraint DS = {26} extremes [2, infinity) - internal hits 69/430 nti 12 constraint (none) extremes [1, infinity) + internal hits 69/430 nti 11 constraint (none) extremes [1, infinity) - internal hits 0/44 nti 13 constraint (none) extremes [1, infinity) + internal hits 0/44 nti 12 constraint (none) extremes [1, infinity) - internal hits 127/2212 nti 14 constraint (none) extremes [1, infinity) + internal hits 127/2212 nti 13 constraint (none) extremes [1, infinity) - internal hits 104/392 nti 15 constraint (none) extremes [1, infinity) + internal hits 104/392 nti 14 constraint (none) extremes [1, infinity) - hits 0/292 nti 22 constraint DS = {22} extremes [1, infinity) + hits 0/292 nti 28 constraint DS = {28} extremes [1, infinity) English: {***} of {***} - (hits 0/9) constraint DS = {22} extremes [1, infinity) + (hits 0/8) constraint DS = {28} extremes [1, infinity) - internal nti 16 constraint (none) extremes [1, infinity) + internal nti 15 constraint (none) extremes [1, infinity) - nti 23 constraint DS = {23} extremes [4, infinity) + nti 29 constraint DS = {29} extremes [4, infinity) English: the same {...} as - constraint DS = {23} extremes [4, infinity) + constraint DS = {29} extremes [4, infinity) - hits 22/44 nti 17 constraint (none) extremes [1, infinity) + hits 22/44 nti 16 constraint (none) extremes [1, infinity) English: (hits 0/22) constraint (none) extremes [1, infinity) @@ -7818,86 +7874,86 @@ {...} constraint (none) extremes [1, infinity) - nti 24 constraint DS = {24} extremes [2, infinity) + nti 30 constraint DS = {30} extremes [2, infinity) English: {...} than - constraint DS = {24} extremes [2, infinity) + constraint DS = {30} extremes [2, infinity) - hits 0/82 nti 26 constraint DS = {26} extremes [4, infinity) + hits 0/82 nti 6 constraint DS = {6} extremes [4, infinity) English: {...} is/are not {...} - (hits 0/35) constraint DS = {26} extremes [5, infinity) + (hits 0/37) constraint DS = {6} extremes [5, infinity) {} is/are - (hits 0/35) constraint DS = {26} extremes [4, infinity) + (hits 0/37) constraint DS = {6} extremes [4, infinity) {...} is/are - (hits 0/35) constraint DS = {26} extremes [4, infinity) + (hits 0/37) constraint DS = {6} extremes [4, infinity) - nti 25 constraint (none) extremes [1, infinity) + nti 31 constraint (none) extremes [1, infinity) English: {...} or more - constraint DS = {25} extremes [3, infinity) + constraint DS = {31} extremes [3, infinity) {...} or less - constraint DS = {25} extremes [3, infinity) + constraint DS = {31} extremes [3, infinity) {...} constraint (none) extremes [1, infinity) - hits 10/292 nti 27 constraint CS = {27} extremes [1, 3] + hits 10/292 nti 7 constraint CS = {7} extremes [1, 3] English: indefinite article - (hits 1/2) (matched: 'indefinite article') constraint CS = {27} extremes [2, 2] + (hits 1/2) (matched: 'indefinite article') constraint CS = {7} extremes [2, 2] plural-named - (hits 1/6) (matched: 'plural-named') constraint CS = {27} extremes [1, 1] + (hits 1/10) (matched: 'plural-named') constraint CS = {7} extremes [1, 1] proper-named - (hits 1/5) (matched: 'proper-named') constraint CS = {27} extremes [1, 1] + (hits 1/9) (matched: 'proper-named') constraint CS = {7} extremes [1, 1] printed name - (hits 1/1) (matched: 'printed name') constraint CS = {27} extremes [2, 2] + (hits 1/1) (matched: 'printed name') constraint CS = {7} extremes [2, 2] printed plural name - (hits 1/2) (matched: 'printed plural name') constraint CS = {27} extremes [3, 3] + (hits 1/2) (matched: 'printed plural name') constraint CS = {7} extremes [3, 3] publicly-named - (hits 1/4) (matched: 'publicly-named') constraint CS = {27} extremes [1, 1] + (hits 1/8) (matched: 'publicly-named') constraint CS = {7} extremes [1, 1] privately-named - (hits 1/3) (matched: 'privately-named') constraint CS = {27} extremes [1, 1] + (hits 1/7) (matched: 'privately-named') constraint CS = {7} extremes [1, 1] adaptive text viewpoint - (hits 1/1) (matched: 'adaptive text viewpoint') constraint CS = {27} extremes [3, 3] + (hits 1/1) (matched: 'adaptive text viewpoint') constraint CS = {7} extremes [3, 3] neuter - (hits 1/2) (matched: 'neuter') constraint CS = {27} extremes [1, 1] + (hits 1/6) (matched: 'neuter') constraint CS = {7} extremes [1, 1] female - (hits 1/1) (matched: 'female') constraint CS = {27} extremes [1, 1] + (hits 1/5) (matched: 'female') constraint CS = {7} extremes [1, 1] - hits 1191/2382 nti 28 constraint DS = {28} extremes [2, infinity) + hits 1191/2382 nti 8 constraint DS = {8} extremes [2, infinity) English: {...} rule - (hits 1191/1191) (matched long text) constraint DS = {28} extremes [2, infinity) + (hits 1191/1191) (matched long text) constraint DS = {8} extremes [2, infinity) - internal hits 123/246 nti 18 constraint (none) extremes [1, infinity) + internal hits 123/246 nti 17 constraint (none) extremes [1, infinity) - hits 431/862 nti 29 constraint (none) extremes [1, infinity) + hits 431/862 nti 9 constraint (none) extremes [1, infinity) English: (hits 0/418) constraint (none) extremes [2, infinity) rules/rulebook - (hits 24/386) (matched: 'does the player mean rules') constraint DS = {29} extremes [2, infinity) + (hits 24/276) (matched: 'does the player mean rules') constraint DS = {9} extremes [2, infinity) at {***} - (hits 0/364) constraint DS = {29} extremes [1, infinity) + (hits 0/253) constraint DS = {9} extremes [1, infinity) to {***} - (hits 0/364) constraint DS = {29} extremes [1, infinity) + (hits 0/253) constraint DS = {9} extremes [1, infinity) definition {***} - (hits 0/364) constraint DS = {29} extremes [1, infinity) + (hits 0/253) constraint DS = {9} extremes [1, infinity) {...} (hits 407/407) (matched long text) constraint (none) extremes [1, infinity) - nti 30 constraint DS = {30} extremes [2, infinity) + nti 10 constraint DS = {10} extremes [2, infinity) English: {...} rules - constraint DS = {30} extremes [2, infinity) + constraint DS = {10} extremes [2, infinity) {...} rulebook - constraint DS = {30} extremes [2, infinity) + constraint DS = {10} extremes [2, infinity) - internal hits 82/164 nti 19 constraint (none) extremes [1, infinity) + internal hits 82/164 nti 18 constraint (none) extremes [1, infinity) - internal hits 371/790 nti 20 constraint (none) extremes [1, infinity) + internal hits 371/790 nti 19 constraint (none) extremes [1, infinity) - hits 395/790 nti 21 constraint (none) extremes [1, infinity) + hits 395/790 nti 20 constraint (none) extremes [1, infinity) English: (hits 19/395) (matched: 'a first turn sequence rule') constraint (none) extremes [2, infinity) @@ -7906,389 +7962,320 @@ (hits 373/373) (matched long text) constraint (none) extremes [1, infinity) - hits 395/790 nti 6 constraint (none) extremes [1, infinity) + hits 395/790 nti 12 constraint (none) extremes [1, infinity) English: rule for/about/on - (hits 13/221) (matched long text) constraint DS = {6} extremes [3, infinity) + (hits 13/334) (matched long text) constraint DS = {12} extremes [3, infinity) rule - (hits 0/216) constraint DS = {6} extremes [2, infinity) + (hits 0/325) constraint DS = {12} extremes [2, infinity) first rule - (hits 0/208) constraint DS = {6} extremes [3, infinity) + (hits 0/321) constraint DS = {12} extremes [3, infinity) first - (hits 3/216) (matched: 'first turn sequence rule') constraint DS = {6} extremes [2, infinity) + (hits 3/325) (matched: 'first turn sequence rule') constraint DS = {12} extremes [2, infinity) last rule - (hits 0/205) constraint DS = {6} extremes [3, infinity) + (hits 0/318) constraint DS = {12} extremes [3, infinity) last - (hits 3/213) (matched: 'last turn sequence rule') constraint DS = {6} extremes [2, infinity) + (hits 3/322) (matched: 'last turn sequence rule') constraint DS = {12} extremes [2, infinity) (hits 376/376) (matched long text) constraint (none) extremes [1, infinity) - hits 395/790 nti 31 constraint (none) extremes [1, infinity) + hits 395/790 nti 11 constraint (none) extremes [1, infinity) English: {when ... begins} - (hits 4/63) (matched long text) constraint DS = {31} extremes [3, infinity) + (hits 4/144) (matched long text) constraint DS = {11} extremes [3, infinity) {when ... ends} - (hits 0/59) constraint DS = {31} extremes [3, infinity) + (hits 0/140) constraint DS = {11} extremes [3, infinity) {...} (hits 391/391) (matched long text) constraint (none) extremes [1, infinity) - internal hits 8/1226 nti 22 constraint (none) extremes [1, infinity) + internal hits 8/1226 nti 21 constraint (none) extremes [1, infinity) - hits 7/14 nti 10 constraint (none) extremes [1, infinity) + hits 7/14 nti 16 constraint (none) extremes [1, infinity) English: outcome/outcomes - (hits 7/7) (matched long text) constraint DS = {10} extremes [2, infinity) + (hits 7/7) (matched long text) constraint DS = {16} extremes [2, infinity) default - constraint DS = {10} extremes [2, infinity) + constraint DS = {16} extremes [2, infinity) {...} constraint (none) extremes [1, infinity) - nti 23 constraint (none) extremes [1, infinity) + nti 22 constraint (none) extremes [1, infinity) English: - constraint CS = {7} extremes [1, 2] + constraint CS = {13} extremes [1, 2] {...} constraint (none) extremes [1, infinity) - hits 27/54 nti 24 constraint (none) extremes [1, infinity) + hits 27/54 nti 23 constraint (none) extremes [1, infinity) English: {...} (hits 10/27) (matched long text) constraint (none) extremes [1, infinity) - (hits 10/17) (matched long text) constraint DS = {9} extremes [3, infinity) + (hits 10/17) (matched long text) constraint DS = {15} extremes [3, infinity) (hits 7/7) (matched: 'there is insufficient light ( success )') constraint (none) extremes [1, infinity) - hits 20/170 nti 9 constraint DS = {9} extremes [2, infinity) + hits 20/170 nti 15 constraint DS = {15} extremes [2, infinity) English: , _and/or - (hits 0/71) constraint DS = {9} extremes [3, infinity) + (hits 0/71) constraint DS = {15} extremes [3, infinity) _,/and/or - (hits 20/78) (matched long text) constraint DS = {9} extremes [2, infinity) + (hits 20/77) (matched long text) constraint DS = {15} extremes [2, infinity) - hits 27/54 nti 25 constraint (none) extremes [1, infinity) + hits 27/54 nti 24 constraint (none) extremes [1, infinity) English: {...} (hits 10/27) (matched: 'there is sufficient light ( failure )') constraint (none) extremes [1, infinity) (hits 17/17) (matched: 'there is sufficient light ( failure )') constraint (none) extremes [1, infinity) - hits 17/34 nti 8 constraint (none) extremes [1, infinity) + hits 17/34 nti 14 constraint (none) extremes [1, infinity) English: {...} ( - the default ) - (hits 0/2) constraint DS = {7, 8} extremes [7, infinity) + (hits 0/2) constraint DS = {13, 14} extremes [7, infinity) {...} ( - default ) - (hits 0/3) constraint DS = {7, 8} extremes [6, infinity) + (hits 0/3) constraint DS = {13, 14} extremes [6, infinity) {...} ( ) - (hits 12/14) (matched: 'there is sufficient light ( failure )') constraint DS = {7, 8} extremes [4, infinity) + (hits 12/12) (matched: 'there is sufficient light ( failure )') constraint DS = {13, 14} extremes [4, infinity) {...} ( {...} ) - (hits 0/2) constraint DS = {8} extremes [4, infinity) + constraint DS = {14} extremes [4, infinity) {...} (hits 5/5) (matched: 'it is very likely') constraint (none) extremes [1, infinity) - hits 12/24 nti 7 constraint CS = {7} extremes [1, 2] + hits 12/24 nti 13 constraint CS = {13} extremes [1, 2] English: success - (hits 6/12) (matched: 'success') constraint CS = {7} extremes [1, 1] + (hits 6/12) (matched: 'success') constraint CS = {13} extremes [1, 1] failure - (hits 6/6) (matched: 'failure') constraint CS = {7} extremes [1, 1] + (hits 6/6) (matched: 'failure') constraint CS = {13} extremes [1, 1] no outcome - constraint CS = {7} extremes [2, 2] + constraint CS = {13} extremes [2, 2] - hits 35/70 nti 14 constraint (none) extremes [1, infinity) + hits 35/70 nti 20 constraint (none) extremes [1, infinity) English: ( ) - (hits 32/33) (matched long text) constraint DS = {13, 14} extremes [6, infinity) + (hits 32/33) (matched long text) constraint DS = {19, 20} extremes [6, infinity) -- -- - (hits 1/1) (matched long text) constraint DS = {13, 14} extremes [6, infinity) + (hits 1/1) (matched long text) constraint DS = {19, 20} extremes [6, infinity) (hits 2/2) (matched: 'handling the final question') constraint (none) extremes [1, infinity) - hits 35/70 nti 12 constraint (none) extremes [1, infinity) + hits 35/70 nti 18 constraint (none) extremes [1, infinity) English: ( future action ) - (hits 4/22) (matched long text) constraint DS = {12} extremes [5, infinity) + (hits 4/14) (matched long text) constraint DS = {18} extremes [5, infinity) ( {...} ) - (hits 0/23) constraint DS = {12} extremes [4, infinity) + (hits 0/15) constraint DS = {18} extremes [4, infinity) (hits 31/31) (matched: 'printing a refusal to act in the dark') constraint (none) extremes [1, infinity) - hits 35/70 nti 11 constraint (none) extremes [1, infinity) + hits 35/70 nti 17 constraint (none) extremes [1, infinity) English: {...} of/for something/anything - (hits 14/25) (matched: 'printing the plural name of something') constraint DS = {11} extremes [3, infinity) + (hits 14/25) (matched: 'printing the plural name of something') constraint DS = {17} extremes [3, infinity) {...} something/anything - (hits 5/11) (matched: 'printing a locale paragraph about something') constraint DS = {11} extremes [2, infinity) + (hits 5/11) (matched: 'printing a locale paragraph about something') constraint DS = {17} extremes [2, infinity) {...} (hits 16/16) (matched: 'printing a refusal to act in the dark') constraint (none) extremes [1, infinity) - nti 15 constraint DS = {15} extremes [2, infinity) + nti 21 constraint DS = {21} extremes [2, infinity) English: {...} activity - constraint DS = {15} extremes [2, infinity) + constraint DS = {21} extremes [2, infinity) - nti 16 constraint DS = {16} extremes [2, infinity) + nti 22 constraint DS = {22} extremes [2, infinity) English: before {...} - constraint DS = {16} extremes [2, infinity) + constraint DS = {22} extremes [2, infinity) for {...} - constraint DS = {16} extremes [2, infinity) + constraint DS = {22} extremes [2, infinity) after {...} - constraint DS = {16} extremes [2, infinity) + constraint DS = {22} extremes [2, infinity) - internal hits 1/88 nti 26 constraint (none) extremes [1, infinity) + internal hits 1/88 nti 25 constraint (none) extremes [1, infinity) - hits 44/2752 nti 17 constraint CS = {17} extremes [1, 1] - English: - definition - (hits 44/44) (matched: 'definition') constraint CS = {17} extremes [1, 1] - - hits 29/2664 nti 18 constraint DW = {18, 19} extremes [2, infinity) - English: - this is the {... rule} - (hits 29/804) (matched long text) constraint DS = {18} extremes [5, infinity) - this is the rule - constraint CS = {18} extremes [4, 4] - this is {...} rule - (hits 0/784) constraint DS = {18} extremes [4, infinity) - this is {...} rules - (hits 0/784) constraint DS = {18} extremes [4, infinity) - - (hits 0/829) constraint DS = {19} extremes [2, infinity) - - hits 496/2606 nti 19 constraint DS = {19} extremes [1, infinity) - English: - to - constraint CS = {19} extremes [1, 1] - to {...} ( called {...} ) - (hits 0/766) constraint DS = {19} extremes [6, infinity) - {to ...} ( this is the {### function} inverse to {###} ) - (hits 16/673) (matched long text) constraint DS = {19} extremes [12, infinity) - {to ...} ( this is the {### function} ) - (hits 4/709) (matched long text) constraint DS = {19} extremes [9, infinity) - {to ...} ( this is {...} ) - (hits 0/736) constraint DS = {19} extremes [7, infinity) - to {...} - (hits 476/809) (matched long text) constraint DS = {19} extremes [2, infinity) - - hits 371/1614 nti 20 constraint (none) extremes [1, infinity) - English: - {...} ( this is the {... rule} ) - (hits 281/303) (matched long text) constraint DS = {20} extremes [8, infinity) - {...} ( this is the rule ) - (hits 0/31) constraint DS = {20} extremes [7, infinity) - {...} ( this is {...} rule ) - (hits 0/31) constraint DS = {20} extremes [7, infinity) - {...} ( this is {...} rules ) - (hits 0/31) constraint DS = {20} extremes [7, infinity) - {...} - (hits 90/90) (matched long text) constraint (none) extremes [1, infinity) - - nti 21 constraint DS = {21} extremes [5, infinity) - English: - {to ...} ( this is the {### function} inverse to {###} ) - constraint DS = {21} extremes [12, infinity) - {to ...} ( this is the {### function} ) - constraint DS = {21} extremes [9, infinity) - {to ...} ( this is {...} ) - constraint DS = {21} extremes [7, infinity) - this is the {... rule} - constraint DS = {21} extremes [5, infinity) - {...} ( this is the {... rule} ) - constraint DS = {21} extremes [8, infinity) - - hits 432/1426 nti 22 constraint DS = {22} extremes [2, infinity) + hits 432/1426 nti 23 constraint DS = {23} extremes [2, infinity) English: (- {###} - in to only - (hits 16/26) (matched: '(- rtrue; - in to only') constraint DS = {22} extremes [6, 6] + (hits 16/19) (matched: '(- rtrue; - in to only') constraint DS = {23} extremes [6, 6] (- {###} - in to decide if only - (hits 4/12) (matched: '(- rtrue; - in to decide if only') constraint DS = {22} extremes [8, 8] + (hits 4/7) (matched: '(- rtrue; - in to decide if only') constraint DS = {23} extremes [8, 8] (- {###} - in to decide only - (hits 0/6) constraint DS = {22} extremes [7, 7] + (hits 0/4) constraint DS = {23} extremes [7, 7] (- {###} - (hits 412/412) (matched: '(- {-say:val:K} ') constraint DS = {22} extremes [2, 2] + (hits 412/413) (matched: '(- {-say:val:K} ') constraint DS = {23} extremes [2, 2] (- {###} {...} - (hits 0/63) constraint DS = {22} extremes [3, infinity) + (hits 0/35) constraint DS = {23} extremes [3, infinity) - hits 940/1880 nti 23 constraint (none) extremes [1, infinity) + hits 444/888 nti 24 constraint (none) extremes [1, infinity) English: definition - (hits 44/44) (matched: 'definition') constraint CS = {23} extremes [1, 1] + (hits 44/44) (matched: 'definition') constraint CS = {24} extremes [1, 1] this is the {... rule} - (hits 29/818) (matched long text) constraint DS = {23} extremes [5, infinity) + (hits 29/364) (matched long text) constraint DS = {24} extremes [5, infinity) this is the rule - constraint CS = {23} extremes [4, 4] + constraint CS = {24} extremes [4, 4] this is {...} rule - (hits 0/800) constraint DS = {23} extremes [4, infinity) + (hits 0/348) constraint DS = {24} extremes [4, infinity) this is {...} rules - (hits 0/800) constraint DS = {23} extremes [4, infinity) + (hits 0/348) constraint DS = {24} extremes [4, infinity) - (hits 0/829) constraint DS = {19} extremes [2, infinity) + (hits 0/358) constraint DS = {24} extremes [2, infinity) to - constraint CS = {23} extremes [1, 1] + constraint CS = {24} extremes [1, 1] to {...} ( called {...} ) - (hits 0/774) constraint DS = {23} extremes [6, infinity) + (hits 0/322) constraint DS = {24} extremes [6, infinity) {to ...} ( this is the {### function} inverse to {###} ) - (hits 16/673) (matched long text) constraint DS = {23} extremes [12, infinity) + (hits 0/290) constraint DS = {24} extremes [12, infinity) {to ...} ( this is the {### function} ) - (hits 4/709) (matched long text) constraint DS = {23} extremes [9, infinity) + (hits 0/300) constraint DS = {24} extremes [9, infinity) {to ...} ( this is {...} ) - (hits 0/739) constraint DS = {23} extremes [7, infinity) + (hits 0/311) constraint DS = {24} extremes [7, infinity) to {...} - (hits 476/821) (matched long text) constraint DS = {23} extremes [2, infinity) + (hits 0/358) constraint DS = {24} extremes [2, infinity) {...} ( this is the {... rule} ) - (hits 281/303) (matched long text) constraint DS = {23} extremes [8, infinity) + (hits 281/303) (matched long text) constraint DS = {24} extremes [8, infinity) {...} ( this is the rule ) - (hits 0/31) constraint DS = {23} extremes [7, infinity) + (hits 0/30) constraint DS = {24} extremes [7, infinity) {...} ( this is {...} rule ) - (hits 0/31) constraint DS = {23} extremes [7, infinity) + (hits 0/30) constraint DS = {24} extremes [7, infinity) {...} ( this is {...} rules ) - (hits 0/31) constraint DS = {23} extremes [7, infinity) + (hits 0/30) constraint DS = {24} extremes [7, infinity) {...} (hits 90/90) (matched long text) constraint (none) extremes [1, infinity) - hits 1/992 nti 24 constraint DS = {24} extremes [3, infinity) - English: - to now {...} - (hits 1/495) (matched long text) constraint DS = {24} extremes [3, infinity) - - hits 0/992 nti 25 constraint CS = {25} extremes [2, 2] - English: - to begin - constraint CS = {25} extremes [2, 2] - - hits 371/742 nti 28 constraint (none) extremes [1, infinity) + hits 371/742 nti 27 constraint (none) extremes [1, infinity) English: during - (hits 0/181) constraint DS = {28} extremes [3, infinity) + (hits 0/143) constraint DS = {27} extremes [3, infinity) (hits 371/371) (matched long text) constraint (none) extremes [1, infinity) - hits 371/742 nti 27 constraint (none) extremes [1, infinity) + hits 371/742 nti 26 constraint (none) extremes [1, infinity) English: {} {when/while ...} - (hits 23/107) (matched long text) constraint DS = {27} extremes [3, infinity) + (hits 23/106) (matched long text) constraint DS = {26} extremes [3, infinity) {} (hits 348/348) (matched long text) constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 371/750 nti 26 constraint (none) extremes [1, infinity) + hits 371/750 nti 25 constraint (none) extremes [1, infinity) English: {***} (hits 359/371) (matched long text) constraint (none) extremes [1, infinity)
    rule for {***} - (hits 0/12) constraint DS = {26} extremes [4, infinity) + (hits 0/12) constraint DS = {25} extremes [4, infinity)
    rule {***} - (hits 0/12) constraint DS = {26} extremes [3, infinity) + (hits 0/12) constraint DS = {25} extremes [3, infinity) rule for {***} - (hits 0/12) constraint DS = {26} extremes [3, infinity) + (hits 0/12) constraint DS = {25} extremes [3, infinity) rule {***} - (hits 12/12) (matched long text) constraint DS = {26} extremes [2, infinity) + (hits 12/12) (matched long text) constraint DS = {25} extremes [2, infinity) - hits 92/1496 nti 29 constraint DS = {29} extremes [1, infinity) + hits 92/1496 nti 28 constraint DS = {28} extremes [1, infinity) English: of/for {...} - (hits 48/592) (matched long text) constraint DS = {29} extremes [2, infinity) + (hits 48/592) (matched long text) constraint DS = {28} extremes [2, infinity) rule about/for/on {...} - (hits 0/534) constraint DS = {29} extremes [3, infinity) + (hits 0/534) constraint DS = {28} extremes [3, infinity) rule - (hits 44/44) (matched: 'rule') constraint CS = {29} extremes [1, 1] + (hits 44/44) (matched: 'rule') constraint CS = {28} extremes [1, 1] - nti 30 constraint (none) extremes [1, infinity) + nti 29 constraint (none) extremes [1, infinity) English: when {***} - constraint DS = {30} extremes [1, infinity) + constraint DS = {29} extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 3/464 nti 31 constraint DS = {31} extremes [3, infinity) + hits 3/464 nti 30 constraint DS = {30} extremes [3, infinity) English: {...} when/while {...} - (hits 3/11) (matched long text) constraint DS = {31} extremes [3, infinity) + (hits 3/29) (matched long text) constraint DS = {30} extremes [3, infinity) - nti 6 constraint (none) extremes [1, infinity) + nti 31 constraint (none) extremes [1, infinity) English: when the play begins/ends - constraint CS = {6} extremes [4, 4] + constraint CS = {31} extremes [4, 4] {...} constraint (none) extremes [1, infinity) - nti 7 constraint DS = {7} extremes [2, infinity) + nti 6 constraint DS = {6} extremes [2, infinity) English: in the presence of {...} - constraint DS = {7} extremes [5, infinity) + constraint DS = {6} extremes [5, infinity) in {...} - constraint DS = {7} extremes [2, infinity) + constraint DS = {6} extremes [2, infinity) - nti 8 constraint DS = {8} extremes [3, infinity) + nti 7 constraint DS = {7} extremes [3, infinity) English: {...} called {...} {when/while ...} - constraint DS = {8} extremes [5, infinity) + constraint DS = {7} extremes [5, infinity) {...} {when/while *** nothing ***} - constraint DS = {8} extremes [3, infinity) + constraint DS = {7} extremes [3, infinity) {...} {when/while *** nowhere ***} - constraint DS = {8} extremes [3, infinity) + constraint DS = {7} extremes [3, infinity) {...} and {when/while ...} - constraint DS = {8} extremes [4, infinity) + constraint DS = {7} extremes [4, infinity) {...} {when/while ...} - constraint DS = {8} extremes [3, infinity) + constraint DS = {7} extremes [3, infinity) - nti 10 constraint (none) extremes [1, infinity) + nti 9 constraint (none) extremes [1, infinity) English: when/while {...} - constraint DS = {10} extremes [3, infinity) + constraint DS = {9} extremes [3, infinity) constraint (none) extremes [1, infinity) - nti 27 constraint (none) extremes [1, infinity) + nti 26 constraint (none) extremes [1, infinity) English: - constraint DS = {9} extremes [3, infinity) + constraint DS = {8} extremes [3, infinity) constraint (none) extremes [1, infinity) - nti 9 constraint DS = {9} extremes [2, infinity) + nti 8 constraint DS = {8} extremes [2, infinity) English: , _or - constraint DS = {9} extremes [3, infinity) + constraint DS = {8} extremes [3, infinity) _,/or - constraint DS = {9} extremes [2, infinity) + constraint DS = {8} extremes [2, infinity) - nti 28 constraint (none) extremes [1, infinity) + nti 27 constraint (none) extremes [1, infinity) English: {......} constraint (none) extremes [1, infinity) - hits 41/82 nti 14 constraint (none) extremes [1, infinity) + hits 41/82 nti 13 constraint (none) extremes [1, infinity) English: not - (hits 1/26) (matched: 'not opening or closing or locking or unlocking') constraint DS = {14} extremes [2, infinity) + (hits 1/26) (matched: 'not opening or closing or locking or unlocking') constraint DS = {13} extremes [2, infinity) (hits 40/40) (matched: 'dropping or throwing or inserting or putting') constraint (none) extremes [1, infinity) - hits 41/82 nti 29 constraint (none) extremes [1, infinity) + hits 41/82 nti 28 constraint (none) extremes [1, infinity) English: {...} (hits 14/41) (matched: 'throwing or inserting or putting') constraint (none) extremes [1, infinity) - (hits 14/17) (matched: 'dropping or throwing or inserting or putting') constraint DS = {13} extremes [3, infinity) + (hits 14/17) (matched: 'dropping or throwing or inserting or putting') constraint DS = {12} extremes [3, infinity) (hits 13/13) (matched: 'an actor smelling') constraint (none) extremes [1, infinity) - hits 28/76 nti 13 constraint DS = {13} extremes [2, infinity) + hits 28/76 nti 12 constraint DS = {12} extremes [2, infinity) English: , _or - (hits 0/20) constraint DS = {13} extremes [3, infinity) + (hits 0/20) constraint DS = {12} extremes [3, infinity) _,/or - (hits 28/35) (matched: 'or throwing or inserting or putting') constraint DS = {13} extremes [2, infinity) + (hits 28/35) (matched: 'or throwing or inserting or putting') constraint DS = {12} extremes [2, infinity) - hits 41/82 nti 12 constraint (none) extremes [1, infinity) + hits 41/82 nti 11 constraint (none) extremes [1, infinity) English: (hits 1/41) (matched: 'listing contents') constraint (none) extremes [1, infinity) of/for - (hits 0/3) constraint DS = {12} extremes [3, infinity) + constraint DS = {11} extremes [3, infinity) (hits 0/12) constraint (none) extremes [2, infinity) ^ {...} @@ -8296,232 +8283,232 @@ (hits 40/40) (matched: 'an actor smelling') constraint (none) extremes [1, infinity) - hits 3/30 nti 11 constraint (none) extremes [1, infinity) + hits 3/30 nti 10 constraint (none) extremes [1, infinity) English: something/anything - constraint CS = {11} extremes [1, 1] + constraint CS = {10} extremes [1, 1] something/anything else - constraint CS = {11} extremes [2, 2] + constraint CS = {10} extremes [2, 2] (hits 3/15) (matched: 'smelling') constraint (none) extremes [1, infinity) - internal hits 80/160 nti 30 constraint (none) extremes [0, 0] + internal hits 80/160 nti 29 constraint (none) extremes [0, 0] - hits 517/1034 nti 17 constraint (none) extremes [1, infinity) + hits 517/1034 nti 16 constraint (none) extremes [1, infinity) English: ( deprecated ) - (hits 1/432) (matched long text) constraint DS = {17} extremes [4, infinity) + (hits 1/425) (matched long text) constraint DS = {16} extremes [4, infinity) - (hits 138/478) (matched long text) constraint DS = {15} extremes [2, infinity) + (hits 138/489) (matched long text) constraint DS = {14} extremes [2, infinity) (hits 378/378) (matched long text) constraint (none) extremes [1, infinity) - hits 400/800 nti 16 constraint (none) extremes [1, infinity) + hits 400/800 nti 15 constraint (none) extremes [1, infinity) English: ( arithmetic operation ) - (hits 16/344) (matched long text) constraint DS = {16} extremes [6, infinity) + (hits 16/343) (matched long text) constraint DS = {15} extremes [6, infinity) ( assignment operation ) - (hits 6/336) (matched long text) constraint DS = {16} extremes [5, infinity) + (hits 6/334) (matched long text) constraint DS = {15} extremes [5, infinity) {let ... be given by ...} - (hits 2/322) (matched long text) constraint DS = {16} extremes [6, infinity) + (hits 2/321) (matched long text) constraint DS = {15} extremes [6, infinity) {let ...} - (hits 4/341) (matched long text) constraint DS = {16} extremes [2, infinity) + (hits 4/335) (matched long text) constraint DS = {15} extremes [2, infinity) {...} -- end - (hits 0/335) constraint DS = {16} extremes [3, infinity) + (hits 0/330) constraint DS = {15} extremes [3, infinity) {...} -- end conditional - (hits 3/331) (matched long text) constraint DS = {16} extremes [4, infinity) + (hits 3/329) (matched long text) constraint DS = {15} extremes [4, infinity) {...} -- end loop - (hits 9/328) (matched long text) constraint DS = {16} extremes [4, infinity) + (hits 9/326) (matched long text) constraint DS = {15} extremes [4, infinity) {...} -- in loop - (hits 2/319) (matched: 'break -- in loop') constraint DS = {16} extremes [4, infinity) + (hits 2/317) (matched: 'break -- in loop') constraint DS = {15} extremes [4, infinity) {...} -- in {###} - (hits 0/317) constraint DS = {16} extremes [4, infinity) + (hits 0/315) constraint DS = {15} extremes [4, infinity) {...} (hits 358/358) (matched long text) constraint (none) extremes [1, infinity) - hits 0/1032 nti 18 constraint DS = {13, 18} extremes [8, infinity) + hits 0/1032 nti 17 constraint DS = {13, 17} extremes [8, infinity) English: ( {......} ) {} ( {......} ) - (hits 0/338) constraint DS = {13, 18} extremes [8, infinity) + (hits 0/337) constraint DS = {13, 17} extremes [8, infinity) - hits 154/988 nti 15 constraint DS = {15} extremes [2, infinity) + hits 154/1010 nti 14 constraint DS = {14} extremes [2, infinity) English: -- running on - (hits 16/439) (matched long text) constraint DS = {15} extremes [4, infinity) + (hits 16/447) (matched long text) constraint DS = {14} extremes [4, infinity) {say otherwise/else} - (hits 2/2) (matched: 'say otherwise') constraint CS = {15} extremes [2, 2] + (hits 2/2) (matched: 'say otherwise') constraint CS = {14} extremes [2, 2] {say otherwise/else if/unless ...} - (hits 0/423) constraint DS = {15} extremes [4, infinity) + (hits 0/431) constraint DS = {14} extremes [4, infinity) {say if/unless ...} - (hits 2/437) (matched: 'say if ( c - condition )') constraint DS = {15} extremes [3, infinity) + (hits 2/447) (matched: 'say if ( c - condition )') constraint DS = {14} extremes [3, infinity) {say end if/unless} - (hits 2/2) (matched: 'say end if') constraint CS = {15} extremes [3, 3] + (hits 2/3) (matched: 'say end if') constraint CS = {14} extremes [3, 3] {say ...} -- beginning {###} - (hits 2/402) (matched: 'say one of -- beginning say_one_of') constraint DS = {15} extremes [5, infinity) + (hits 2/408) (matched: 'say one of -- beginning say_one_of') constraint DS = {14} extremes [5, infinity) {say ...} -- continuing {###} - (hits 1/400) (matched: 'say or -- continuing say_one_of') constraint DS = {15} extremes [5, infinity) + (hits 1/406) (matched: 'say or -- continuing say_one_of') constraint DS = {14} extremes [5, infinity) {say ...} -- ending {###} with marker {###} - (hits 9/350) (matched long text) constraint DS = {15} extremes [8, infinity) + (hits 9/350) (matched long text) constraint DS = {14} extremes [8, infinity) {say ...} -- ending {###} - (hits 1/390) (matched: 'say only -- ending say_first_time') constraint DS = {15} extremes [5, infinity) + (hits 1/396) (matched: 'say only -- ending say_first_time') constraint DS = {14} extremes [5, infinity) {say ...} - (hits 119/459) (matched long text) constraint DS = {15} extremes [2, infinity) + (hits 119/470) (matched long text) constraint DS = {14} extremes [2, infinity) - hits 516/1032 nti 19 constraint DS = {19} extremes [2, infinity) + hits 516/1032 nti 18 constraint DS = {18} extremes [2, infinity) English: to {decide yes/no} - (hits 2/2) (matched: 'to decide yes') constraint CS = {19} extremes [3, 3] + (hits 2/4) (matched: 'to decide yes') constraint CS = {18} extremes [3, 3] to {decide on ...} - (hits 1/467) (matched: 'to decide on ( something - value )') constraint DS = {19} extremes [4, infinity) + (hits 1/467) (matched: 'to decide on ( something - value )') constraint DS = {18} extremes [4, infinity) to decide whether/if the {...} - (hits 12/453) (matched long text) constraint DS = {19} extremes [5, infinity) + (hits 12/453) (matched long text) constraint DS = {18} extremes [5, infinity) to decide whether/if {...} - (hits 39/454) (matched long text) constraint DS = {19} extremes [4, infinity) + (hits 39/454) (matched long text) constraint DS = {18} extremes [4, infinity) to decide what/which is the {...} - (hits 86/380) (matched long text) constraint DS = {19} extremes [7, infinity) + (hits 86/380) (matched long text) constraint DS = {18} extremes [7, infinity) to decide what/which is {...} - (hits 74/304) (matched long text) constraint DS = {19} extremes [6, infinity) + (hits 74/304) (matched long text) constraint DS = {18} extremes [6, infinity) to {...} - (hits 302/302) (matched long text) constraint DS = {19} extremes [2, infinity) + (hits 302/302) (matched long text) constraint DS = {18} extremes [2, infinity) - hits 160/320 nti 31 constraint (none) extremes [1, infinity) + hits 160/320 nti 30 constraint (none) extremes [1, infinity) English: (hits 160/160) (matched: 'relation of objects') constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 2231/4462 nti 21 constraint (none) extremes [1, infinity) + hits 2231/4462 nti 20 constraint (none) extremes [1, infinity) English: ( ) {***} - (hits 0/1785) constraint DS = {21} extremes [2, infinity) + (hits 0/1762) constraint DS = {20} extremes [2, infinity) ( ) {***} - (hits 579/1741) (matched long text) constraint DS = {21} extremes [3, infinity) + (hits 579/1727) (matched long text) constraint DS = {20} extremes [3, infinity) ( {***} - (hits 0/1220) constraint DS = {21} extremes [1, infinity) + (hits 0/1195) constraint DS = {20} extremes [1, infinity) ) {***} - (hits 0/1220) constraint DS = {21} extremes [1, infinity) + (hits 0/1195) constraint DS = {20} extremes [1, infinity) {###} {***} (hits 1652/1652) (matched long text) constraint (none) extremes [1, infinity) - hits 579/1168 nti 20 constraint (none) extremes [1, infinity) + hits 579/1168 nti 19 constraint (none) extremes [1, infinity) English: {***} ( {***} - {......} - (hits 0/584) constraint DS = {20} extremes [3, infinity) + (hits 0/584) constraint DS = {19} extremes [3, infinity) {......} - a nonexisting variable - (hits 0/193) constraint DS = {20} extremes [5, infinity) + (hits 0/193) constraint DS = {19} extremes [5, infinity) {......} - a nonexisting variable - (hits 0/104) constraint DS = {20} extremes [6, infinity) + (hits 0/104) constraint DS = {19} extremes [6, infinity) {......} - a nonexisting that/which varies - (hits 0/65) constraint DS = {20} extremes [7, infinity) + (hits 0/65) constraint DS = {19} extremes [7, infinity) {......} - nonexisting variable - (hits 4/359) (matched: 't - nonexisting variable') constraint DS = {20} extremes [4, infinity) + (hits 4/359) (matched: 't - nonexisting variable') constraint DS = {19} extremes [4, infinity) {......} - nonexisting variable - (hits 4/193) (matched: 'loopvar - nonexisting k variable') constraint DS = {20} extremes [5, infinity) + (hits 4/193) (matched: 'loopvar - nonexisting k variable') constraint DS = {19} extremes [5, infinity) {......} - nonexisting that/which varies - (hits 0/104) constraint DS = {20} extremes [6, infinity) + (hits 0/104) constraint DS = {19} extremes [6, infinity) {......} - {an existing variable} - (hits 0/189) constraint DS = {20} extremes [5, infinity) + (hits 0/189) constraint DS = {19} extremes [5, infinity) {......} - {an existing variable} - (hits 0/104) constraint DS = {20} extremes [6, infinity) + (hits 0/104) constraint DS = {19} extremes [6, infinity) {......} - {an existing that/which varies} - (hits 0/65) constraint DS = {20} extremes [7, infinity) + (hits 0/65) constraint DS = {19} extremes [7, infinity) {......} - {existing variable} - (hits 2/351) (matched: 't - existing variable') constraint DS = {20} extremes [4, infinity) + (hits 2/351) (matched: 't - existing variable') constraint DS = {19} extremes [4, infinity) {......} - {existing variable} - (hits 0/189) constraint DS = {20} extremes [5, infinity) + (hits 0/189) constraint DS = {19} extremes [5, infinity) {......} - {existing that/which varies} - (hits 0/104) constraint DS = {20} extremes [6, infinity) + (hits 0/104) constraint DS = {19} extremes [6, infinity) {......} - a condition - (hits 0/349) constraint DS = {20} extremes [4, infinity) + (hits 0/349) constraint DS = {19} extremes [4, infinity) {......} - condition - (hits 9/574) (matched: 'c - condition') constraint DS = {20} extremes [3, infinity) + (hits 9/574) (matched: 'c - condition') constraint DS = {19} extremes [3, infinity) {......} - a phrase - (hits 0/349) constraint DS = {20} extremes [4, infinity) + (hits 0/349) constraint DS = {19} extremes [4, infinity) {......} - phrase - (hits 0/565) constraint DS = {20} extremes [3, infinity) + (hits 0/565) constraint DS = {19} extremes [3, infinity) {......} - storage - (hits 4/565) (matched: 's - storage') constraint DS = {20} extremes [3, infinity) + (hits 4/565) (matched: 's - storage') constraint DS = {19} extremes [3, infinity) {......} - a table-reference - (hits 0/349) constraint DS = {20} extremes [4, infinity) + (hits 0/349) constraint DS = {19} extremes [4, infinity) {......} - table-reference - (hits 3/561) (matched: 'tr - table-reference') constraint DS = {20} extremes [3, infinity) + (hits 3/561) (matched: 'tr - table-reference') constraint DS = {19} extremes [3, infinity) {......} - - (hits 529/558) (matched long text) constraint DS = {20} extremes [3, infinity) + (hits 529/558) (matched long text) constraint DS = {19} extremes [3, infinity) {......} - - (hits 2/29) (matched long text) constraint DS = {20} extremes [3, infinity) + (hits 2/29) (matched long text) constraint DS = {19} extremes [3, infinity) {......} - {......} - (hits 0/27) constraint DS = {20} extremes [3, infinity) + (hits 0/27) constraint DS = {19} extremes [3, infinity) (hits 22/27) (matched: 'name of kind of enumerated value k') constraint (none) extremes [1, infinity) {......} (hits 0/5) constraint (none) extremes [1, infinity) - internal hits 24/68 nti 6 constraint (none) extremes [1, infinity) + internal hits 24/68 nti 31 constraint (none) extremes [1, infinity) - hits 65/130 nti 7 constraint (none) extremes [1, infinity) + hits 65/130 nti 6 constraint (none) extremes [1, infinity) English: {...} (hits 20/65) (matched long text) constraint (none) extremes [1, infinity) - (hits 20/23) (matched long text) constraint DS = {22} extremes [3, infinity) + (hits 20/23) (matched long text) constraint DS = {21} extremes [3, infinity) (hits 25/25) (matched: 'printing an abbreviated room description') constraint (none) extremes [1, infinity) - hits 40/162 nti 22 constraint DS = {22} extremes [2, infinity) + hits 40/162 nti 21 constraint DS = {21} extremes [2, infinity) English: , _or - (hits 0/73) constraint DS = {22} extremes [3, infinity) + (hits 0/73) constraint DS = {21} extremes [3, infinity) , and/or - (hits 2/73) (matched: ', and/or capitalized') constraint DS = {22} extremes [3, infinity) + (hits 2/73) (matched: ', and/or capitalized') constraint DS = {21} extremes [3, infinity) _,/or - (hits 38/75) (matched long text) constraint DS = {22} extremes [2, infinity) + (hits 38/75) (matched long text) constraint DS = {21} extremes [2, infinity) and/or - (hits 0/37) constraint DS = {22} extremes [2, infinity) + (hits 0/37) constraint DS = {21} extremes [2, infinity) - hits 65/130 nti 8 constraint (none) extremes [1, infinity) + hits 65/130 nti 7 constraint (none) extremes [1, infinity) English: {...} (hits 20/65) (matched: 'without printing a room description') constraint (none) extremes [1, infinity) {...} (hits 45/45) (matched: 'without printing a room description') constraint (none) extremes [1, infinity) - hits 102/204 nti 9 constraint (none) extremes [1, infinity) + hits 102/204 nti 8 constraint (none) extremes [1, infinity) English: {...} (hits 43/102) (matched long text) constraint (none) extremes [1, infinity) - (hits 43/43) (matched long text) constraint DS = {23} extremes [3, infinity) + (hits 43/44) (matched long text) constraint DS = {22} extremes [3, infinity) (hits 16/16) (matched: 'listing marked items only') constraint (none) extremes [1, infinity) - hits 86/314 nti 23 constraint DS = {23} extremes [2, infinity) + hits 86/320 nti 22 constraint DS = {22} extremes [2, infinity) English: , _and - (hits 0/157) constraint DS = {23} extremes [3, infinity) + (hits 0/157) constraint DS = {22} extremes [3, infinity) _,/and - (hits 86/157) (matched long text) constraint DS = {23} extremes [2, infinity) + (hits 86/157) (matched long text) constraint DS = {22} extremes [2, infinity) - hits 102/204 nti 10 constraint (none) extremes [1, infinity) + hits 102/204 nti 9 constraint (none) extremes [1, infinity) English: (hits 102/102) (matched: 'giving brief inventory information') constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - internal hits 102/3322 nti 11 constraint (none) extremes [1, infinity) + internal hits 102/3322 nti 10 constraint (none) extremes [1, infinity) - hits 209/418 nti 12 constraint (none) extremes [1, infinity) + hits 209/418 nti 11 constraint (none) extremes [1, infinity) English: (hits 14/74) (matched: 'the current working sack') constraint (none) extremes [2, infinity) (hits 195/195) (matched: 'item being printed') constraint (none) extremes [1, infinity) - hits 209/418 nti 24 constraint (none) extremes [1, infinity) + hits 209/418 nti 23 constraint (none) extremes [1, infinity) English: {***} - {***} - constraint DS = {24} extremes [1, infinity) + constraint DS = {23} extremes [1, infinity) (hits 136/209) (matched: 'item being printed') constraint (none) extremes [1, infinity) @@ -8529,17 +8516,17 @@ {...} (hits 73/73) (matched: 'item being printed') constraint (none) extremes [1, infinity) - internal hits 136/418 nti 13 constraint (none) extremes [1, infinity) + internal hits 136/418 nti 12 constraint (none) extremes [1, infinity) - nti 25 constraint DS = {25} extremes [2, infinity) + nti 24 constraint DS = {24} extremes [2, infinity) English: end {...} - constraint DS = {25} extremes [2, infinity) + constraint DS = {24} extremes [2, infinity) - hits 1576/3152 nti 26 constraint (none) extremes [1, infinity) + hits 1576/3152 nti 25 constraint (none) extremes [1, infinity) English: phrase options - (hits 17/17) (matched: 'phrase options') constraint CS = {26} extremes [2, 2] + (hits 17/17) (matched: 'phrase options') constraint CS = {25} extremes [2, 2] (hits 0/1559) constraint (none) extremes [1, infinity) @@ -8547,86 +8534,86 @@ {...} constraint (none) extremes [1, infinity) - internal hits 1559/3118 nti 14 constraint (none) extremes [1, infinity) + internal hits 1559/3118 nti 13 constraint (none) extremes [1, infinity) - hits 44/88 nti 27 constraint CS = {27} extremes [1, 1] + hits 44/88 nti 26 constraint CS = {26} extremes [1, 1] English: definition - (hits 44/44) (matched: 'definition') constraint CS = {27} extremes [1, 1] + (hits 44/44) (matched: 'definition') constraint CS = {26} extremes [1, 1] - hits 44/88 nti 30 constraint DS = {30} extremes [3, infinity) + hits 44/88 nti 29 constraint DS = {29} extremes [3, infinity) English: is/are if {...} - (hits 41/41) (matched long text) constraint DS = {30} extremes [5, infinity) + (hits 41/41) (matched long text) constraint DS = {29} extremes [5, infinity) is/are unless {...} - constraint DS = {30} extremes [5, infinity) + constraint DS = {29} extremes [5, infinity) is/are - (hits 3/3) (matched: 'a room is air-conditioned') constraint DS = {30} extremes [3, infinity) + (hits 3/3) (matched: 'a room is air-conditioned') constraint DS = {29} extremes [3, infinity) - hits 44/88 nti 28 constraint (none) extremes [1, infinity) + hits 44/88 nti 27 constraint (none) extremes [1, infinity) English: {...} ( called the {...} ) - (hits 1/1) (matched: 'a thing ( called the item )') constraint DS = {28} extremes [6, infinity) + (hits 1/1) (matched: 'a thing ( called the item )') constraint DS = {27} extremes [6, infinity) {...} ( called {...} ) - constraint DS = {28} extremes [5, infinity) + constraint DS = {27} extremes [5, infinity) {...} (hits 43/43) (matched: 'a list of values') constraint (none) extremes [1, infinity) - hits 44/88 nti 29 constraint (none) extremes [1, infinity) + hits 44/88 nti 28 constraint (none) extremes [1, infinity) English: {...} rather than {...} - (hits 18/18) (matched: 'even rather than odd') constraint DS = {29} extremes [4, infinity) + (hits 18/18) (matched: 'even rather than odd') constraint DS = {28} extremes [4, infinity) {...} (hits 26/26) (matched: 'going on') constraint (none) extremes [1, infinity) - hits 18/86 nti 31 constraint DS = {31} extremes [8, infinity) + hits 18/86 nti 30 constraint DS = {30} extremes [8, infinity) English: i6 routine {} says so ( {...} ) - (hits 10/24) (matched long text) constraint DS = {31} extremes [8, infinity) + (hits 10/24) (matched long text) constraint DS = {30} extremes [8, infinity) i6 routine {} makes it so ( {...} ) - (hits 8/14) (matched long text) constraint DS = {31} extremes [9, infinity) + (hits 8/14) (matched long text) constraint DS = {30} extremes [9, infinity) - hits 1/80 nti 6 constraint DS = {6} extremes [8, infinity) + hits 1/80 nti 31 constraint DS = {31} extremes [8, infinity) English: i6 condition says so ( {...} ) - (hits 1/24) (matched long text) constraint DS = {6} extremes [8, infinity) + (hits 1/24) (matched long text) constraint DS = {31} extremes [8, infinity) - nti 8 constraint DW = {7, 8} extremes [2, infinity) + nti 7 constraint DW = {6, 7} extremes [2, infinity) English: {} - constraint DS = {7} extremes [2, 3] + constraint DS = {6} extremes [2, 3] {} in {} - constraint DS = {7, 8} extremes [4, 5] + constraint DS = {6, 7} extremes [4, 5] when defining - constraint DS = {8} extremes [3, infinity) + constraint DS = {7} extremes [3, infinity) when defining {...} - constraint DS = {8} extremes [3, infinity) + constraint DS = {7} extremes [3, infinity) before the library - constraint CS = {8} extremes [3, 3] + constraint CS = {7} extremes [3, 3] in the preform grammar - constraint CS = {8} extremes [4, 4] + constraint CS = {7} extremes [4, 4] - nti 7 constraint CS = {7} extremes [1, 2] + nti 6 constraint CS = {6} extremes [1, 2] English: before - constraint CS = {7} extremes [1, 1] + constraint CS = {6} extremes [1, 1] instead of - constraint CS = {7} extremes [2, 2] + constraint CS = {6} extremes [2, 2] after - constraint CS = {7} extremes [1, 1] + constraint CS = {6} extremes [1, 1] - hits 5/30 nti 9 constraint CS = {9} extremes [3, 4] + hits 5/30 nti 8 constraint CS = {8} extremes [3, 4] English: it is very likely - (hits 1/2) (matched: 'it is very likely') constraint CS = {9} extremes [4, 4] + (hits 1/2) (matched: 'it is very likely') constraint CS = {8} extremes [4, 4] it is likely - (hits 1/4) (matched: 'it is likely') constraint CS = {9} extremes [3, 3] + (hits 1/4) (matched: 'it is likely') constraint CS = {8} extremes [3, 3] it is possible - (hits 1/3) (matched: 'it is possible') constraint CS = {9} extremes [3, 3] + (hits 1/3) (matched: 'it is possible') constraint CS = {8} extremes [3, 3] it is unlikely - (hits 1/2) (matched: 'it is unlikely') constraint CS = {9} extremes [3, 3] + (hits 1/2) (matched: 'it is unlikely') constraint CS = {8} extremes [3, 3] it is very unlikely - (hits 1/1) (matched: 'it is very unlikely') constraint CS = {9} extremes [4, 4] + (hits 1/1) (matched: 'it is very unlikely') constraint CS = {8} extremes [4, 4] nti 10 constraint CS = {10} extremes [1, 1] English: @@ -8661,579 +8648,579 @@ pattern constraint CS = {10} extremes [1, 1] - nti 13 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: list {...} - constraint DS = {13} extremes [2, infinity) + constraint DS = {12} extremes [2, infinity) constraint (none) extremes [1, infinity) ~~ - constraint DS = {13} extremes [3, infinity) + constraint DS = {12} extremes [3, infinity) {...} constraint (none) extremes [1, infinity) - nti 12 constraint (none) extremes [1, infinity) + nti 11 constraint (none) extremes [1, infinity) English: is {...} - constraint DS = {12} extremes [3, infinity) + constraint DS = {11} extremes [3, infinity) = - constraint DS = {10, 12} extremes [3, infinity) + constraint DS = {9, 11} extremes [3, infinity) constraint (none) extremes [1, infinity) - constraint CS = {10} extremes [1, 1] + constraint CS = {9} extremes [1, 1] experimental {...} - constraint DS = {12} extremes [2, infinity) + constraint DS = {11} extremes [2, infinity) - nti 10 constraint CS = {10} extremes [1, 1] + nti 9 constraint CS = {9} extremes [1, 1] English: r1 - constraint CS = {10} extremes [1, 1] + constraint CS = {9} extremes [1, 1] r2 - constraint CS = {10} extremes [1, 1] + constraint CS = {9} extremes [1, 1] r3 - constraint CS = {10} extremes [1, 1] + constraint CS = {9} extremes [1, 1] r4 - constraint CS = {10} extremes [1, 1] + constraint CS = {9} extremes [1, 1] r5 - constraint CS = {10} extremes [1, 1] + constraint CS = {9} extremes [1, 1] - hits 4/186 nti 14 constraint CS = {14} extremes [1, 2] + hits 4/186 nti 13 constraint CS = {13} extremes [1, 2] English: i6-varying-global - (hits 1/4) (matched: 'i6-varying-global') constraint CS = {14} extremes [1, 1] + (hits 1/3) (matched: 'i6-varying-global') constraint CS = {13} extremes [1, 1] i6-nothing-constant - (hits 1/3) (matched: 'i6-nothing-constant') constraint CS = {14} extremes [1, 1] + (hits 1/2) (matched: 'i6-nothing-constant') constraint CS = {13} extremes [1, 1] command prompt - (hits 1/2) (matched: 'command prompt') constraint CS = {14} extremes [2, 2] + (hits 1/1) (matched: 'command prompt') constraint CS = {13} extremes [2, 2] parameter-object - (hits 1/2) (matched: 'parameter-object') constraint CS = {14} extremes [1, 1] + (hits 1/1) (matched: 'parameter-object') constraint CS = {13} extremes [1, 1] - hits 0/688 nti 15 constraint DS = {15} extremes [1, 2] + hits 0/688 nti 14 constraint DS = {14} extremes [1, 2] English: story - (hits 0/4) constraint DS = {15} extremes [2, 2] + (hits 0/90) constraint DS = {14} extremes [2, 2] this story - constraint CS = {15} extremes [2, 2] + (hits 0/2) constraint CS = {14} extremes [2, 2] story - constraint CS = {15} extremes [1, 1] + constraint CS = {14} extremes [1, 1] - nti 16 constraint DS = {16} extremes [2, infinity) + nti 15 constraint DS = {15} extremes [2, infinity) English: episode of - constraint DS = {16} extremes [4, 4] + constraint DS = {15} extremes [4, 4] episode {...} - constraint DS = {16} extremes [2, infinity) + constraint DS = {15} extremes [2, infinity) - hits 7/186 nti 17 constraint CS = {17} extremes [2, 3] + hits 7/186 nti 16 constraint CS = {16} extremes [2, 3] English: story title - (hits 1/9) (matched: 'story title') constraint CS = {17} extremes [2, 2] + (hits 1/9) (matched: 'story title') constraint CS = {16} extremes [2, 2] story author - (hits 1/8) (matched: 'story author') constraint CS = {17} extremes [2, 2] + (hits 1/8) (matched: 'story author') constraint CS = {16} extremes [2, 2] story headline - (hits 1/7) (matched: 'story headline') constraint CS = {17} extremes [2, 2] + (hits 1/7) (matched: 'story headline') constraint CS = {16} extremes [2, 2] story genre - (hits 1/6) (matched: 'story genre') constraint CS = {17} extremes [2, 2] + (hits 1/6) (matched: 'story genre') constraint CS = {16} extremes [2, 2] story description - (hits 1/5) (matched: 'story description') constraint CS = {17} extremes [2, 2] + (hits 1/5) (matched: 'story description') constraint CS = {16} extremes [2, 2] story creation year - (hits 1/1) (matched: 'story creation year') constraint CS = {17} extremes [3, 3] + (hits 1/1) (matched: 'story creation year') constraint CS = {16} extremes [3, 3] release number - (hits 1/4) (matched: 'release number') constraint CS = {17} extremes [2, 2] + (hits 1/4) (matched: 'release number') constraint CS = {16} extremes [2, 2] - nti 20 constraint DW = {18, 19, 20} extremes [1, infinity) + nti 19 constraint DW = {17, 18, 19} extremes [1, infinity) English: - constraint DS = {18, 19} & CW = {18, 19} extremes [2, 3] + constraint DS = {17, 18} & CW = {17, 18} extremes [2, 3] {...} - constraint DS = {18} extremes [2, infinity) + constraint DS = {17} extremes [2, infinity) - constraint CS = {19} extremes [1, 2] + constraint CS = {18} extremes [1, 2] cover art ( ) - constraint DS = {20} extremes [5, 5] + constraint DS = {19} extremes [5, 5] cover art - constraint CS = {20} extremes [2, 2] + constraint CS = {19} extremes [2, 2] existing story file - constraint CS = {20} extremes [3, 3] + constraint CS = {19} extremes [3, 3] existing story file called {} - constraint DS = {20} extremes [5, 5] + constraint DS = {19} extremes [5, 5] file of {} called {} - constraint DS = {20} extremes [5, 5] + constraint DS = {19} extremes [5, 5] file {} in {} - constraint DS = {20} extremes [4, 4] + constraint DS = {19} extremes [4, 4] file {} - constraint DS = {20} extremes [2, 2] + constraint DS = {19} extremes [2, 2] style sheet {} - constraint DS = {20} extremes [3, 3] + constraint DS = {19} extremes [3, 3] javascript {} - constraint DS = {20} extremes [2, 2] + constraint DS = {19} extremes [2, 2] introductory booklet - constraint CS = {20} extremes [2, 2] + constraint CS = {19} extremes [2, 2] introductory postcard - constraint CS = {20} extremes [2, 2] + constraint CS = {19} extremes [2, 2] website - constraint CS = {20} extremes [1, 1] + constraint CS = {19} extremes [1, 1] separate figures - constraint CS = {20} extremes [2, 2] + constraint CS = {19} extremes [2, 2] separate sounds - constraint CS = {20} extremes [2, 2] + constraint CS = {19} extremes [2, 2] {} website - constraint DS = {20} extremes [2, 2] + constraint DS = {19} extremes [2, 2] interpreter - constraint CS = {20} extremes [1, 1] + constraint CS = {19} extremes [1, 1] {} interpreter - constraint DS = {20} extremes [2, 2] + constraint DS = {19} extremes [2, 2] - nti 18 constraint CS = {18} extremes [1, 1] + nti 17 constraint CS = {17} extremes [1, 1] English: private - constraint CS = {18} extremes [1, 1] + constraint CS = {17} extremes [1, 1] public - constraint CS = {18} extremes [1, 1] + constraint CS = {17} extremes [1, 1] - nti 19 constraint CS = {19} extremes [1, 2] + nti 18 constraint CS = {18} extremes [1, 2] English: solution - constraint CS = {19} extremes [1, 1] + constraint CS = {18} extremes [1, 1] source text - constraint CS = {19} extremes [2, 2] + constraint CS = {18} extremes [2, 2] library card - constraint CS = {19} extremes [2, 2] + constraint CS = {18} extremes [2, 2] - hits 12/210 nti 21 constraint CS = {21} extremes [1, 2] + hits 12/210 nti 20 constraint CS = {20} extremes [1, 2] English: room - (hits 2/10) (matched: 'room') constraint CS = {21} extremes [1, 1] + (hits 2/10) (matched: 'room') constraint CS = {20} extremes [1, 1] thing - (hits 2/8) (matched: 'thing') constraint CS = {21} extremes [1, 1] + (hits 2/8) (matched: 'thing') constraint CS = {20} extremes [1, 1] container - (hits 2/6) (matched: 'container') constraint CS = {21} extremes [1, 1] + (hits 2/6) (matched: 'container') constraint CS = {20} extremes [1, 1] supporter - (hits 2/4) (matched: 'supporter') constraint CS = {21} extremes [1, 1] + (hits 2/4) (matched: 'supporter') constraint CS = {20} extremes [1, 1] person - (hits 2/2) (matched: 'person') constraint CS = {21} extremes [1, 1] + (hits 2/2) (matched: 'person') constraint CS = {20} extremes [1, 1] player's holdall - (hits 2/2) (matched: 'player's holdall') constraint CS = {21} extremes [2, 2] + (hits 2/2) (matched: 'player's holdall') constraint CS = {20} extremes [2, 2] - hits 4/292 nti 22 constraint CS = {22} extremes [1, 3] + hits 4/292 nti 21 constraint CS = {21} extremes [1, 3] English: initial appearance - (hits 1/2) (matched: 'initial appearance') constraint CS = {22} extremes [2, 2] + (hits 1/2) (matched: 'initial appearance') constraint CS = {21} extremes [2, 2] wearable - (hits 1/1) (matched: 'wearable') constraint CS = {22} extremes [1, 1] + (hits 1/1) (matched: 'wearable') constraint CS = {21} extremes [1, 1] fixed in place - (hits 1/1) (matched: 'fixed in place') constraint CS = {22} extremes [3, 3] + (hits 1/1) (matched: 'fixed in place') constraint CS = {21} extremes [3, 3] matching key - (hits 1/1) (matched: 'matching key') constraint CS = {22} extremes [2, 2] + (hits 1/1) (matched: 'matching key') constraint CS = {21} extremes [2, 2] - hits 288/61566 nti 23 constraint DS = {23} extremes [1, infinity) + hits 288/61566 nti 22 constraint DS = {22} extremes [1, infinity) English: _something/anything {***} - (hits 207/14151) (matched long text) constraint DS = {23} extremes [1, infinity) + (hits 207/13631) (matched long text) constraint DS = {22} extremes [1, infinity) _somewhere/anywhere {***} - (hits 0/13944) constraint DS = {23} extremes [1, infinity) + (hits 0/13424) constraint DS = {22} extremes [1, infinity) _someone/anyone/somebody/anybody {***} - (hits 57/13944) (matched: 'someone') constraint DS = {23} extremes [1, infinity) + (hits 57/13424) (matched: 'someone') constraint DS = {22} extremes [1, infinity) _everything {***} - (hits 0/13887) constraint DS = {23} extremes [1, infinity) + (hits 0/13367) constraint DS = {22} extremes [1, infinity) _everywhere {***} - (hits 0/13887) constraint DS = {23} extremes [1, infinity) + (hits 0/13367) constraint DS = {22} extremes [1, infinity) _everyone/everybody {***} - (hits 0/13887) constraint DS = {23} extremes [1, infinity) + (hits 0/13367) constraint DS = {22} extremes [1, infinity) _nowhere {***} - (hits 24/13887) (matched: 'nowhere') constraint DS = {23} extremes [1, infinity) + (hits 24/13367) (matched: 'nowhere') constraint DS = {22} extremes [1, infinity) _nobody/no-one {***} - (hits 0/13863) constraint DS = {23} extremes [1, infinity) + (hits 0/13343) constraint DS = {22} extremes [1, infinity) _no _one {***} - (hits 0/13464) constraint DS = {23} extremes [2, infinity) + (hits 0/13066) constraint DS = {22} extremes [2, infinity) - hits 0/2166 nti 24 constraint CS = {24} extremes [1, 1] + hits 0/2166 nti 23 constraint CS = {23} extremes [1, 1] English: nowhere - (hits 0/20) constraint CS = {24} extremes [1, 1] + (hits 0/1) constraint CS = {23} extremes [1, 1] - hits 2/186 nti 25 constraint CS = {25} extremes [1, 3] + hits 2/186 nti 24 constraint CS = {24} extremes [1, 3] English: player - (hits 1/1) (matched: 'player') constraint CS = {25} extremes [1, 1] + (hits 1/1) (matched: 'player') constraint CS = {24} extremes [1, 1] time of day - (hits 1/1) (matched: 'time of day') constraint CS = {25} extremes [3, 3] + (hits 1/1) (matched: 'time of day') constraint CS = {24} extremes [3, 3] - hits 1/334 nti 26 constraint CS = {26} extremes [1, 1] + hits 1/334 nti 25 constraint CS = {25} extremes [1, 1] English: yourself - (hits 1/1) (matched: 'yourself') constraint CS = {26} extremes [1, 1] + (hits 1/1) (matched: 'yourself') constraint CS = {25} extremes [1, 1] - nti 27 constraint CS = {27} extremes [1, 2] + nti 26 constraint CS = {26} extremes [1, 2] English: worn - constraint CS = {27} extremes [1, 1] + constraint CS = {26} extremes [1, 1] carried - constraint CS = {27} extremes [1, 1] + constraint CS = {26} extremes [1, 1] initially carried - constraint CS = {27} extremes [2, 2] + constraint CS = {26} extremes [2, 2] - hits 1/136 nti 28 constraint CS = {28} extremes [1, 1] + hits 1/136 nti 27 constraint CS = {27} extremes [1, 1] English: device - (hits 1/1) (matched: 'device') constraint CS = {28} extremes [1, 1] + (hits 1/1) (matched: 'device') constraint CS = {27} extremes [1, 1] - hits 1/138 nti 29 constraint CS = {29} extremes [1, 1] + hits 1/138 nti 28 constraint CS = {28} extremes [1, 1] English: backdrop - (hits 1/1) (matched: 'backdrop') constraint CS = {29} extremes [1, 1] + (hits 1/1) (matched: 'backdrop') constraint CS = {28} extremes [1, 1] - hits 1/292 nti 30 constraint CS = {30} extremes [1, 1] + hits 1/292 nti 29 constraint CS = {29} extremes [1, 1] English: scenery - (hits 1/1) (matched: 'scenery') constraint CS = {30} extremes [1, 1] + (hits 1/1) (matched: 'scenery') constraint CS = {29} extremes [1, 1] - nti 31 constraint CS = {31} extremes [1, 1] + nti 30 constraint CS = {30} extremes [1, 1] English: everywhere - constraint CS = {31} extremes [1, 1] + constraint CS = {30} extremes [1, 1] - hits 2/190 nti 6 constraint CS = {6} extremes [1, 1] + hits 2/190 nti 31 constraint CS = {31} extremes [1, 1] English: region - (hits 2/2) (matched: 'region') constraint CS = {6} extremes [1, 1] + (hits 2/2) (matched: 'region') constraint CS = {31} extremes [1, 1] - hits 1/292 nti 7 constraint CS = {7} extremes [2, 2] + hits 1/292 nti 6 constraint CS = {6} extremes [2, 2] English: map region - (hits 1/1) (matched: 'map region') constraint CS = {7} extremes [2, 2] + (hits 1/1) (matched: 'map region') constraint CS = {6} extremes [2, 2] - hits 19/2128 nti 8 constraint CS = {8} extremes [1, 1] + hits 19/2128 nti 7 constraint CS = {7} extremes [1, 1] English: direction - (hits 13/20) (matched: 'direction') constraint CS = {8} extremes [1, 1] + (hits 13/30) (matched: 'direction') constraint CS = {7} extremes [1, 1] door - (hits 6/7) (matched: 'door') constraint CS = {8} extremes [1, 1] + (hits 6/17) (matched: 'door') constraint CS = {7} extremes [1, 1] - hits 2/24 nti 9 constraint CS = {9} extremes [1, 1] + hits 2/24 nti 8 constraint CS = {8} extremes [1, 1] English: up - (hits 1/2) (matched: 'up') constraint CS = {9} extremes [1, 1] + (hits 1/2) (matched: 'up') constraint CS = {8} extremes [1, 1] down - (hits 1/1) (matched: 'down') constraint CS = {9} extremes [1, 1] + (hits 1/1) (matched: 'down') constraint CS = {8} extremes [1, 1] - hits 2/292 nti 10 constraint CS = {10} extremes [1, 2] + hits 2/292 nti 9 constraint CS = {9} extremes [1, 2] English: opposite - (hits 1/6) (matched: 'opposite') constraint CS = {10} extremes [1, 1] + (hits 1/6) (matched: 'opposite') constraint CS = {9} extremes [1, 1] other side - (hits 1/1) (matched: 'other side') constraint CS = {10} extremes [2, 2] + (hits 1/1) (matched: 'other side') constraint CS = {9} extremes [2, 2] - hits 0/2166 nti 11 constraint CS = {11} extremes [1, 1] + hits 0/2166 nti 10 constraint CS = {10} extremes [1, 1] English: below - (hits 0/19) constraint CS = {11} extremes [1, 1] + (hits 0/51) constraint CS = {10} extremes [1, 1] above - (hits 0/19) constraint CS = {11} extremes [1, 1] + (hits 0/51) constraint CS = {10} extremes [1, 1] - nti 12 constraint DS = {12} extremes [2, infinity) + nti 11 constraint DS = {11} extremes [2, infinity) English: mapping {...} - constraint DS = {12} extremes [2, infinity) + constraint DS = {11} extremes [2, infinity) - nti 13 constraint DS = {13} extremes [2, infinity) + nti 12 constraint DS = {12} extremes [2, infinity) English: mapped {...} of - constraint DS = {13} extremes [3, infinity) + constraint DS = {12} extremes [3, infinity) mapped {...} - constraint DS = {13} extremes [2, infinity) + constraint DS = {12} extremes [2, infinity) {...} of - constraint DS = {13} extremes [2, infinity) + constraint DS = {12} extremes [2, infinity) {...} from - constraint DS = {13} extremes [2, infinity) + constraint DS = {12} extremes [2, infinity) - hits 2/24 nti 14 constraint CS = {14} extremes [1, 1] + hits 2/24 nti 13 constraint CS = {13} extremes [1, 1] English: inside - (hits 1/2) (matched: 'inside') constraint CS = {14} extremes [1, 1] + (hits 1/2) (matched: 'inside') constraint CS = {13} extremes [1, 1] outside - (hits 1/1) (matched: 'outside') constraint CS = {14} extremes [1, 1] + (hits 1/1) (matched: 'outside') constraint CS = {13} extremes [1, 1] - hits 1/292 nti 15 constraint CS = {15} extremes [1, 1] + hits 1/292 nti 14 constraint CS = {14} extremes [1, 1] English: recurring - (hits 1/1) (matched: 'recurring') constraint CS = {15} extremes [1, 1] + (hits 1/4) (matched: 'recurring') constraint CS = {14} extremes [1, 1] - hits 1/2 nti 16 constraint CS = {16} extremes [2, 2] + hits 1/2 nti 15 constraint CS = {15} extremes [2, 2] English: entire game - (hits 1/1) (matched: 'entire game') constraint CS = {16} extremes [2, 2] + (hits 1/1) (matched: 'entire game') constraint CS = {15} extremes [2, 2] - hits 4/8 nti 15 constraint (none) extremes [1, infinity) + hits 4/8 nti 14 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'the entire game') constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - nti 16 constraint (none) extremes [1, infinity) + nti 15 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) - hits 0/4 nti 17 constraint (none) extremes [1, infinity) + hits 0/4 nti 16 constraint (none) extremes [1, infinity) English: (hits 0/1) constraint DS = {15} extremes [5, infinity) play begins - constraint CS = {17} extremes [2, 2] + constraint CS = {16} extremes [2, 2] play ends - constraint CS = {17} extremes [2, 2] + constraint CS = {16} extremes [2, 2] begins - (hits 0/2) constraint DS = {17} extremes [2, infinity) + (hits 0/2) constraint DS = {16} extremes [2, infinity) ends - (hits 0/2) constraint DS = {17} extremes [2, infinity) + (hits 0/2) constraint DS = {16} extremes [2, infinity) ends - (hits 0/2) constraint DS = {17} extremes [3, infinity) + (hits 0/2) constraint DS = {16} extremes [3, infinity) ends {...} - (hits 0/2) constraint DS = {17} extremes [3, infinity) + (hits 0/2) constraint DS = {16} extremes [3, infinity) (hits 0/2) constraint (none) extremes [1, infinity) - hits 4/8 nti 17 constraint (none) extremes [1, infinity) + hits 4/8 nti 16 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'the entire game') constraint (none) extremes [2, infinity) constraint (none) extremes [1, infinity) - hits 4/8 nti 18 constraint (none) extremes [1, infinity) + hits 4/8 nti 17 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'entire game') constraint (none) extremes [1, infinity) - internal nti 19 constraint (none) extremes [1, infinity) + internal nti 18 constraint (none) extremes [1, infinity) - internal nti 20 constraint (none) extremes [1, infinity) + internal nti 19 constraint (none) extremes [1, infinity) - nti 21 constraint (none) extremes [1, infinity) + nti 20 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) - hits 2/186 nti 18 constraint CS = {18} extremes [1, 2] + hits 2/186 nti 17 constraint CS = {17} extremes [1, 2] English: score - (hits 1/1) (matched: 'score') constraint CS = {18} extremes [1, 1] + (hits 1/2) (matched: 'score') constraint CS = {17} extremes [1, 1] maximum score - (hits 1/1) (matched: 'maximum score') constraint CS = {18} extremes [2, 2] + (hits 1/1) (matched: 'maximum score') constraint CS = {17} extremes [2, 2] - hits 0/14 nti 19 constraint CS = {19} extremes [1, 1] + hits 0/14 nti 18 constraint CS = {18} extremes [1, 1] English: rankings - constraint CS = {19} extremes [1, 1] + constraint CS = {18} extremes [1, 1] - hits 1/180 nti 20 constraint CS = {20} extremes [1, 1] + hits 1/180 nti 19 constraint CS = {19} extremes [1, 1] English: waiting - (hits 1/1) (matched: 'waiting') constraint CS = {20} extremes [1, 1] + (hits 1/1) (matched: 'waiting') constraint CS = {19} extremes [1, 1] - hits 90/1036 nti 22 constraint DS = {21} extremes [1, infinity) + hits 90/1036 nti 21 constraint DS = {20} extremes [1, infinity) English: - (hits 90/283) (matched long text) constraint DS = {21} extremes [2, infinity) + (hits 90/275) (matched long text) constraint DS = {20} extremes [2, infinity) - (hits 0/196) constraint DS = {21} extremes [1, infinity) + (hits 0/186) constraint DS = {20} extremes [1, infinity) - hits 90/740 nti 21 constraint DS = {21} extremes [1, infinity) + hits 90/692 nti 20 constraint DS = {20} extremes [1, infinity) English: action - (hits 90/370) (matched long text) constraint DS = {21} extremes [1, infinity) + (hits 90/327) (matched long text) constraint DS = {20} extremes [1, infinity) action - (hits 0/32) constraint CS = {21} extremes [1, 1] + (hits 0/4) constraint CS = {20} extremes [1, 1] - hits 90/182 nti 23 constraint (none) extremes [0, infinity) + hits 90/182 nti 22 constraint (none) extremes [0, infinity) English: ^ (hits 90/91) (matched long text) constraint (none) extremes [0, infinity) - hits 1/182 nti 22 constraint DS = {22} extremes [1, infinity) + hits 1/182 nti 21 constraint DS = {21} extremes [1, infinity) English: {***} that/which vary/varies - (hits 1/91) (matched: 'name based rule producing nothing that varies') constraint DS = {22} extremes [2, infinity) + (hits 1/91) (matched: 'name based rule producing nothing that varies') constraint DS = {21} extremes [2, infinity) {***} variable - (hits 0/90) constraint DS = {22} extremes [1, infinity) + (hits 0/90) constraint DS = {21} extremes [1, infinity) - hits 90/180 nti 24 constraint (none) extremes [1, infinity) + hits 90/180 nti 23 constraint (none) extremes [1, infinity) English: (hits 0/90) constraint (none) extremes [1, infinity) {...} (hits 90/90) (matched: 'switching the story transcript on') constraint (none) extremes [1, infinity) - hits 90/180 nti 25 constraint (none) extremes [1, infinity) + hits 90/180 nti 24 constraint (none) extremes [1, infinity) English: (hits 90/90) (matched long text) constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 128/256 nti 26 constraint (none) extremes [1, infinity) + hits 128/256 nti 25 constraint (none) extremes [1, infinity) English: {...} (hits 19/128) (matched: 'applying to nothing or one thing and') constraint (none) extremes [1, infinity) - (hits 19/109) (matched: 'applying to one visible thing and requiring light') constraint DS = {25} extremes [2, infinity) + (hits 19/109) (matched: 'applying to one visible thing and requiring light') constraint DS = {24} extremes [2, infinity) - (hits 90/90) (matched long text) constraint DS = {25} extremes [1, infinity) + (hits 90/90) (matched long text) constraint DS = {24} extremes [1, infinity) - hits 128/1002 nti 26 constraint DS = {25} extremes [1, infinity) + hits 128/1002 nti 25 constraint DS = {24} extremes [1, infinity) English: , and - (hits 0/304) constraint DS = {25, 26} extremes [3, infinity) + (hits 0/302) constraint DS = {24, 25} extremes [3, infinity) and - (hits 19/340) (matched: 'applying to nothing or one thing and') constraint DS = {25, 26} extremes [2, infinity) + (hits 19/338) (matched: 'applying to nothing or one thing and') constraint DS = {24, 25} extremes [2, infinity) , - (hits 0/321) constraint DS = {25, 26} extremes [2, infinity) + (hits 0/319) constraint DS = {24, 25} extremes [2, infinity) - (hits 109/349) (matched long text) constraint DS = {25} extremes [1, infinity) + (hits 109/347) (matched long text) constraint DS = {24} extremes [1, infinity) - hits 128/828 nti 25 constraint DS = {25} extremes [1, infinity) + hits 128/824 nti 24 constraint DS = {24} extremes [1, infinity) English: out of world - (hits 16/34) (matched: 'out of world') constraint CS = {25} extremes [3, 3] + (hits 16/34) (matched: 'out of world') constraint CS = {24} extremes [3, 3] abbreviable - (hits 2/37) (matched: 'abbreviable') constraint CS = {25} extremes [1, 1] + (hits 2/37) (matched: 'abbreviable') constraint CS = {24} extremes [1, 1] with past participle {...} - (hits 0/177) constraint DS = {25} extremes [4, infinity) + (hits 0/175) constraint DS = {24} extremes [4, infinity) applying to - (hits 104/294) (matched long text) constraint DS = {25} extremes [3, infinity) + (hits 104/290) (matched long text) constraint DS = {24} extremes [3, infinity) requiring light - (hits 6/38) (matched: 'requiring light') constraint CS = {25} extremes [2, 2] + (hits 6/38) (matched: 'requiring light') constraint CS = {24} extremes [2, 2] - hits 104/208 nti 24 constraint (none) extremes [1, infinity) + hits 104/208 nti 23 constraint (none) extremes [1, infinity) English: nothing - (hits 45/45) (matched: 'nothing') constraint CS = {24} extremes [1, 1] + (hits 45/45) (matched: 'nothing') constraint CS = {23} extremes [1, 1] one and one - (hits 11/11) (matched: 'one carried thing and one visible thing') constraint DS = {24} extremes [5, infinity) + (hits 11/11) (matched: 'one carried thing and one visible thing') constraint DS = {23} extremes [5, infinity) one and - (hits 0/2) constraint DS = {24} extremes [4, infinity) + (hits 0/2) constraint DS = {23} extremes [4, infinity) and one - (hits 0/2) constraint DS = {24} extremes [4, infinity) + (hits 0/2) constraint DS = {23} extremes [4, infinity) and - (hits 0/7) constraint DS = {24} extremes [3, infinity) + (hits 0/7) constraint DS = {23} extremes [3, infinity) nothing or one - (hits 2/2) (matched: 'nothing or one thing') constraint DS = {24} extremes [4, infinity) + (hits 2/2) (matched: 'nothing or one thing') constraint DS = {23} extremes [4, infinity) one - (hits 40/46) (matched: 'one visible thing') constraint DS = {24} extremes [2, infinity) + (hits 40/46) (matched: 'one visible thing') constraint DS = {23} extremes [2, infinity) two - (hits 6/6) (matched: 'two things') constraint DS = {24} extremes [2, infinity) + (hits 6/6) (matched: 'two things') constraint DS = {23} extremes [2, infinity) constraint (none) extremes [1, infinity) {...} constraint (none) extremes [1, infinity) - hits 70/140 nti 27 constraint (none) extremes [1, infinity) + hits 70/140 nti 26 constraint (none) extremes [1, infinity) English: (hits 70/70) (matched: 'visible thing') constraint (none) extremes [1, infinity) - hits 70/140 nti 28 constraint (none) extremes [1, infinity) + hits 70/140 nti 27 constraint (none) extremes [1, infinity) English: - (hits 12/12) (matched: 'visible thing') constraint DS = {23} extremes [2, infinity) + (hits 12/12) (matched: 'visible thing') constraint DS = {22} extremes [2, infinity) (hits 58/58) (matched: 'infection color') constraint (none) extremes [1, infinity) - hits 12/24 nti 23 constraint CS = {23} extremes [1, 1] + hits 12/24 nti 22 constraint CS = {22} extremes [1, 1] English: visible - (hits 6/12) (matched: 'visible') constraint CS = {23} extremes [1, 1] + (hits 6/12) (matched: 'visible') constraint CS = {22} extremes [1, 1] touchable - (hits 0/6) constraint CS = {23} extremes [1, 1] + (hits 0/6) constraint CS = {22} extremes [1, 1] carried - (hits 6/6) (matched: 'carried') constraint CS = {23} extremes [1, 1] + (hits 6/6) (matched: 'carried') constraint CS = {22} extremes [1, 1] - hits 13/26 nti 27 constraint (none) extremes [1, infinity) + hits 13/26 nti 26 constraint (none) extremes [1, infinity) English: ( matched as {} ) - (hits 6/6) (matched: 'room gone from ( matched as from )') constraint DS = {27} extremes [6, infinity) + (hits 6/6) (matched: 'room gone from ( matched as from )') constraint DS = {26} extremes [6, infinity) ( {...} ) - constraint DS = {27} extremes [4, infinity) + constraint DS = {26} extremes [4, infinity) (hits 7/7) (matched: 'abbreviated form allowed') constraint (none) extremes [1, infinity) - hits 13/26 nti 29 constraint (none) extremes [1, infinity) + hits 13/26 nti 28 constraint (none) extremes [1, infinity) English: (hits 0/13) constraint (none) extremes [1, infinity) {...} (hits 13/13) (matched: 'room gone from') constraint (none) extremes [1, infinity) - nti 28 constraint DS = {28} extremes [2, infinity) + nti 27 constraint DS = {27} extremes [2, infinity) English: {...} action - constraint DS = {28} extremes [2, infinity) + constraint DS = {27} extremes [2, infinity) - nti 29 constraint DS = {29} extremes [2, infinity) + nti 28 constraint DS = {28} extremes [2, infinity) English: check {...} - constraint DS = {29} extremes [2, infinity) + constraint DS = {28} extremes [2, infinity) carry out {...} - constraint DS = {29} extremes [3, infinity) + constraint DS = {28} extremes [3, infinity) report {...} - constraint DS = {29} extremes [2, infinity) + constraint DS = {28} extremes [2, infinity) - internal hits 227/664 nti 30 constraint (none) extremes [1, infinity) + internal hits 227/664 nti 29 constraint (none) extremes [1, infinity) - hits 378/10710 nti 30 constraint DS = {30} extremes [2, infinity) + hits 378/10710 nti 29 constraint DS = {29} extremes [2, infinity) English: {...} to - (hits 378/845) (matched: 'giving it to') constraint DS = {30} extremes [2, infinity) + (hits 378/967) (matched: 'giving it to') constraint DS = {29} extremes [2, infinity) - hits 595/1406 nti 8 constraint (none) extremes [1, infinity) + hits 595/1406 nti 7 constraint (none) extremes [1, infinity) English: doing something/anything other than - (hits 0/99) constraint DS = {8} extremes [5, infinity) + (hits 0/100) constraint DS = {7} extremes [5, infinity) doing something/anything except - (hits 0/135) constraint DS = {8} extremes [4, infinity) + (hits 0/136) constraint DS = {7} extremes [4, infinity) doing something/anything to/with {...} - (hits 0/135) constraint DS = {8} extremes [4, infinity) + (hits 0/136) constraint DS = {7} extremes [4, infinity) doing something/anything - constraint CS = {8} extremes [2, 2] + constraint CS = {7} extremes [2, 2] doing something/anything {...} - (hits 0/277) constraint DS = {8} extremes [3, infinity) + (hits 0/278) constraint DS = {7} extremes [3, infinity) (hits 595/703) (matched long text) constraint (none) extremes [1, infinity) - nti 7 constraint (none) extremes [1, infinity) + nti 6 constraint (none) extremes [1, infinity) English: to/with {} - constraint DS = {7} extremes [3, infinity) + constraint DS = {6} extremes [3, infinity) constraint (none) extremes [1, infinity) - nti 6 constraint (none) extremes [1, infinity) + nti 31 constraint (none) extremes [1, infinity) English: _,/or {...} - constraint DS = {6} extremes [2, infinity) + constraint DS = {31} extremes [2, infinity) {...} to/with {...} - constraint DS = {6} extremes [3, infinity) + constraint DS = {31} extremes [3, infinity) {...} constraint (none) extremes [1, infinity) - hits 595/1406 nti 31 constraint (none) extremes [1, infinity) + hits 595/1406 nti 30 constraint (none) extremes [1, infinity) English: - (hits 0/63) constraint DS = {31} extremes [3, infinity) + (hits 0/169) constraint DS = {30} extremes [3, infinity) (hits 595/703) (matched long text) constraint (none) extremes [1, infinity) - hits 0/850 nti 31 constraint DS = {31} extremes [2, infinity) + hits 0/1512 nti 30 constraint DS = {30} extremes [2, infinity) English: , _or - (hits 0/243) constraint DS = {31} extremes [3, infinity) + (hits 0/391) constraint DS = {30} extremes [3, infinity) _,/or - (hits 0/265) constraint DS = {31} extremes [2, infinity) + (hits 0/503) constraint DS = {30} extremes [2, infinity) - hits 595/1406 nti 6 constraint (none) extremes [1, infinity) + hits 595/1406 nti 31 constraint (none) extremes [1, infinity) English: (hits 0/703) constraint (none) extremes [1, infinity) @@ -9242,33 +9229,33 @@ (hits 595/703) (matched long text) constraint (none) extremes [1, infinity) - internal hits 0/1406 nti 7 constraint (none) extremes [1, infinity) + internal hits 0/1406 nti 6 constraint (none) extremes [1, infinity) - internal hits 595/1406 nti 8 constraint (none) extremes [1, infinity) + internal hits 595/1406 nti 7 constraint (none) extremes [1, infinity) - hits 7/676 nti 9 constraint CS = {9} extremes [1, 1] + hits 7/676 nti 8 constraint CS = {8} extremes [1, 1] English: is - (hits 7/44) (matched: 'is') constraint CS = {9} extremes [1, 1] + (hits 7/42) (matched: 'is') constraint CS = {8} extremes [1, 1] not - (hits 0/37) constraint CS = {9} extremes [1, 1] + (hits 0/35) constraint CS = {8} extremes [1, 1] - hits 0/662 nti 10 constraint (none) extremes [2, infinity) + hits 0/662 nti 9 constraint (none) extremes [2, infinity) English: _in _the _presence _of {...} - (hits 0/80) constraint DS = {10} extremes [5, infinity) + (hits 0/80) constraint DS = {9} extremes [5, infinity) _in {...} - (hits 0/210) constraint DS = {10} extremes [2, infinity) + (hits 0/227) constraint DS = {9} extremes [2, infinity) {...} (hits 0/331) constraint (none) extremes [2, infinity) - internal hits 0/662 nti 9 constraint (none) extremes [1, infinity) + internal hits 0/662 nti 8 constraint (none) extremes [1, infinity) - internal hits 1197/31612 nti 10 constraint (none) extremes [0, 0] + internal hits 1197/31612 nti 9 constraint (none) extremes [0, 0] - internal hits 1268/2536 nti 11 constraint (none) extremes [0, 0] + internal hits 1268/2536 nti 10 constraint (none) extremes [0, 0] - hits 300/1268 nti 12 constraint (none) extremes [1, infinity) + hits 300/1268 nti 11 constraint (none) extremes [1, infinity) English: ^ (hits 0/634) constraint (none) extremes [1, infinity) @@ -9281,299 +9268,299 @@ (hits 233/567) (matched long text) constraint (none) extremes [1, infinity) - internal hits 3/19982 nti 13 constraint (none) extremes [1, infinity) + internal hits 3/19982 nti 12 constraint (none) extremes [1, infinity) - hits 28/2746 nti 14 constraint (none) extremes [1, infinity) + hits 28/2746 nti 13 constraint (none) extremes [1, infinity) English: (hits 28/1373) (matched long text) constraint (none) extremes [1, infinity) - hits 0/1804 nti 15 constraint DS = {14} extremes [2, infinity) + hits 0/1756 nti 14 constraint DS = {20} extremes [2, infinity) English: - (hits 0/902) constraint DS = {14} extremes [2, infinity) + (hits 0/878) constraint DS = {20} extremes [2, infinity) - hits 0/2182 nti 16 constraint DS = {11} extremes [3, infinity) + hits 0/1226 nti 15 constraint DS = {17} extremes [3, infinity) English: - (hits 0/1091) constraint DS = {11} extremes [3, infinity) + (hits 0/613) constraint DS = {17} extremes [3, infinity) - hits 0/1998 nti 17 constraint DS = {12} extremes [4, infinity) + hits 0/1994 nti 16 constraint DS = {18} extremes [4, infinity) English: - (hits 0/999) constraint DS = {12} extremes [4, infinity) + (hits 0/997) constraint DS = {18} extremes [4, infinity) - hits 556/21330 nti 11 constraint (none) extremes [1, infinity) + hits 556/21330 nti 10 constraint (none) extremes [1, infinity) English: asking to try - (hits 0/961) constraint DS = {11} extremes [5, infinity) + (hits 0/1029) constraint DS = {10} extremes [5, infinity) trying - (hits 23/2110) (matched long text) constraint DS = {11} extremes [3, infinity) + (hits 23/2525) (matched long text) constraint DS = {10} extremes [3, infinity) an actor trying - (hits 0/1564) constraint DS = {11} extremes [4, infinity) + (hits 0/1841) constraint DS = {10} extremes [4, infinity) an actor - (hits 408/2087) (matched long text) constraint DS = {11} extremes [3, infinity) + (hits 408/2502) (matched long text) constraint DS = {10} extremes [3, infinity) trying - (hits 0/2138) constraint DS = {11} extremes [2, infinity) + (hits 0/3306) constraint DS = {10} extremes [2, infinity) (hits 60/10234) (matched long text) constraint (none) extremes [1, infinity) (hits 65/5425) (matched long text) constraint (none) extremes [2, infinity) - hits 28/2746 nti 13 constraint (none) extremes [1, infinity) + hits 28/2746 nti 19 constraint (none) extremes [1, infinity) English: we are asking to try - (hits 0/231) constraint DS = {13} extremes [7, infinity) + (hits 0/178) constraint DS = {19} extremes [7, infinity) asking to try - (hits 0/526) constraint DS = {13} extremes [5, infinity) + (hits 0/425) constraint DS = {19} extremes [5, infinity) trying - (hits 0/893) constraint DS = {13} extremes [3, infinity) + (hits 0/709) constraint DS = {19} extremes [3, infinity) an actor trying - (hits 0/864) constraint DS = {13} extremes [4, infinity) + (hits 0/690) constraint DS = {19} extremes [4, infinity) an actor - (hits 3/893) (matched: 'an actor smelling') constraint DS = {13} extremes [3, infinity) + (hits 3/709) (matched: 'an actor smelling') constraint DS = {19} extremes [3, infinity) we are trying - (hits 0/864) constraint DS = {13} extremes [4, infinity) + (hits 0/690) constraint DS = {19} extremes [4, infinity) trying - (hits 0/896) constraint DS = {13} extremes [2, infinity) + (hits 0/706) constraint DS = {19} extremes [2, infinity) we are - (hits 0/890) constraint DS = {13} extremes [3, infinity) + (hits 0/706) constraint DS = {19} extremes [3, infinity) (hits 25/1370) (matched long text) constraint (none) extremes [1, infinity) (hits 0/1120) constraint (none) extremes [2, infinity) - hits 0/1804 nti 14 constraint DS = {14} extremes [2, infinity) + hits 0/1756 nti 20 constraint DS = {20} extremes [2, infinity) English: we are not asking to try - (hits 0/135) constraint DS = {14} extremes [8, infinity) + (hits 0/134) constraint DS = {20} extremes [8, infinity) not asking to try - (hits 0/341) constraint DS = {14} extremes [6, infinity) + (hits 0/383) constraint DS = {20} extremes [6, infinity) not trying - (hits 0/871) constraint DS = {14} extremes [4, infinity) + (hits 0/873) constraint DS = {20} extremes [4, infinity) an actor not trying - (hits 0/525) constraint DS = {14} extremes [5, infinity) + (hits 0/561) constraint DS = {20} extremes [5, infinity) an actor not - (hits 0/871) constraint DS = {14} extremes [4, infinity) + (hits 0/873) constraint DS = {20} extremes [4, infinity) we are not trying - (hits 0/525) constraint DS = {14} extremes [5, infinity) + (hits 0/561) constraint DS = {20} extremes [5, infinity) not trying - (hits 0/901) constraint DS = {14} extremes [3, infinity) + (hits 0/878) constraint DS = {20} extremes [3, infinity) we are not - (hits 0/871) constraint DS = {14} extremes [4, infinity) + (hits 0/873) constraint DS = {20} extremes [4, infinity) not - (hits 0/902) constraint DS = {14} extremes [2, infinity) + (hits 0/878) constraint DS = {20} extremes [2, infinity) not - (hits 0/901) constraint DS = {14} extremes [3, infinity) + (hits 0/878) constraint DS = {20} extremes [3, infinity) - hits 0/2182 nti 11 constraint DS = {11} extremes [3, infinity) + hits 0/1226 nti 17 constraint DS = {17} extremes [3, infinity) English: we have asked to try - (hits 0/231) constraint DS = {11} extremes [7, infinity) + (hits 0/191) constraint DS = {17} extremes [7, infinity) has tried - (hits 0/994) constraint DS = {11} extremes [4, infinity) + (hits 0/597) constraint DS = {17} extremes [4, infinity) an actor has tried - (hits 0/619) constraint DS = {11} extremes [5, infinity) + (hits 0/374) constraint DS = {17} extremes [5, infinity) an actor has - (hits 0/994) constraint DS = {11} extremes [4, infinity) + (hits 0/597) constraint DS = {17} extremes [4, infinity) we have tried - (hits 0/994) constraint DS = {11} extremes [4, infinity) + (hits 0/597) constraint DS = {17} extremes [4, infinity) we have - (hits 0/1091) constraint DS = {11} extremes [3, infinity) + (hits 0/613) constraint DS = {17} extremes [3, infinity) - hits 0/1998 nti 12 constraint DS = {12} extremes [4, infinity) + hits 0/1994 nti 18 constraint DS = {18} extremes [4, infinity) English: we have not asked to try - (hits 0/136) constraint DS = {12} extremes [8, infinity) + (hits 0/136) constraint DS = {18} extremes [8, infinity) has not tried - (hits 0/621) constraint DS = {12} extremes [5, infinity) + (hits 0/623) constraint DS = {18} extremes [5, infinity) an actor has not tried - (hits 0/404) constraint DS = {12} extremes [6, infinity) + (hits 0/404) constraint DS = {18} extremes [6, infinity) an actor has not - (hits 0/621) constraint DS = {12} extremes [5, infinity) + (hits 0/623) constraint DS = {18} extremes [5, infinity) we have not tried - (hits 0/621) constraint DS = {12} extremes [5, infinity) + (hits 0/623) constraint DS = {18} extremes [5, infinity) we have not - (hits 0/999) constraint DS = {12} extremes [4, infinity) + (hits 0/997) constraint DS = {18} extremes [4, infinity) - internal hits 94/13090 nti 18 constraint (none) extremes [1, infinity) + internal hits 94/13090 nti 17 constraint (none) extremes [1, infinity) - internal hits 584/24264 nti 19 constraint (none) extremes [1, infinity) + internal hits 584/24264 nti 18 constraint (none) extremes [1, infinity) - internal nti 20 constraint (none) extremes [1, infinity) + internal nti 19 constraint (none) extremes [1, infinity) - hits 0/1390 nti 11 constraint CS = {11} extremes [2, 2] + hits 0/1390 nti 10 constraint CS = {10} extremes [2, 2] English: doing it - constraint CS = {11} extremes [2, 2] + constraint CS = {10} extremes [2, 2] - hits 584/1390 nti 12 constraint (none) extremes [1, infinity) + hits 584/1390 nti 11 constraint (none) extremes [1, infinity) English: when/while - (hits 11/323) (matched long text) constraint DS = {12} extremes [3, infinity) + (hits 11/82) (matched long text) constraint DS = {11} extremes [3, infinity) (hits 573/684) (matched long text) constraint (none) extremes [1, infinity) {...} when/while - (hits 0/84) constraint DS = {12} extremes [3, infinity) + (hits 0/38) constraint DS = {11} extremes [3, infinity) {...} when/while {...} - (hits 0/84) constraint DS = {12} extremes [3, infinity) + (hits 0/38) constraint DS = {11} extremes [3, infinity) - internal hits 19/38 nti 21 constraint (none) extremes [1, infinity) + internal hits 19/38 nti 20 constraint (none) extremes [1, infinity) - internal hits 584/1406 nti 22 constraint (none) extremes [1, infinity) + internal hits 584/1406 nti 21 constraint (none) extremes [1, infinity) - hits 200/406 nti 13 constraint (none) extremes [1, infinity) + hits 200/406 nti 12 constraint (none) extremes [1, infinity) English: something/anything - (hits 79/79) (matched: 'something') constraint CS = {13} extremes [1, 1] + (hits 79/79) (matched: 'something') constraint CS = {12} extremes [1, 1] something/anything else - (hits 0/1) constraint CS = {13} extremes [2, 2] + (hits 0/3) constraint CS = {12} extremes [2, 2] (hits 121/124) (matched long text) constraint (none) extremes [1, infinity) - hits 5/10 nti 14 constraint CS = {14} extremes [1, 1] + hits 5/10 nti 13 constraint CS = {13} extremes [1, 1] English: something/anything - (hits 4/5) (matched: 'something') constraint CS = {14} extremes [1, 1] + (hits 4/5) (matched: 'something') constraint CS = {13} extremes [1, 1] it - (hits 1/1) (matched: 'it') constraint CS = {14} extremes [1, 1] + (hits 1/1) (matched: 'it') constraint CS = {13} extremes [1, 1] - internal hits 0/4000 nti 23 constraint (none) extremes [1, infinity) + internal hits 0/4000 nti 22 constraint (none) extremes [1, infinity) - hits 1/180 nti 15 constraint CS = {15} extremes [1, 1] + hits 1/180 nti 14 constraint CS = {14} extremes [1, 1] English: going - (hits 1/1) (matched: 'going') constraint CS = {15} extremes [1, 1] + (hits 1/20) (matched: 'going') constraint CS = {14} extremes [1, 1] - hits 0/16 nti 16 constraint CS = {16} extremes [1, 1] + hits 0/16 nti 15 constraint CS = {15} extremes [1, 1] English: nowhere - (hits 0/3) constraint CS = {16} extremes [1, 1] + constraint CS = {15} extremes [1, 1] somewhere - (hits 0/3) constraint CS = {16} extremes [1, 1] + constraint CS = {15} extremes [1, 1] - hits 21/186 nti 17 constraint DS = {17} extremes [1, infinity) + hits 21/186 nti 16 constraint DS = {16} extremes [1, infinity) English: understood - (hits 16/40) (matched: 'command parser error understood') constraint DS = {17} extremes [2, infinity) + (hits 16/36) (matched: 'command parser error understood') constraint DS = {16} extremes [2, infinity) noun - (hits 1/3) (matched: 'noun') constraint CS = {17} extremes [1, 1] + (hits 1/3) (matched: 'noun') constraint CS = {16} extremes [1, 1] location - (hits 1/2) (matched: 'location') constraint CS = {17} extremes [1, 1] + (hits 1/2) (matched: 'location') constraint CS = {16} extremes [1, 1] actor-location - (hits 1/1) (matched: 'actor-location') constraint CS = {17} extremes [1, 1] + (hits 1/1) (matched: 'actor-location') constraint CS = {16} extremes [1, 1] second noun - (hits 1/8) (matched: 'second noun') constraint CS = {17} extremes [2, 2] + (hits 1/8) (matched: 'second noun') constraint CS = {16} extremes [2, 2] person asked - (hits 1/7) (matched: 'person asked') constraint CS = {17} extremes [2, 2] + (hits 1/7) (matched: 'person asked') constraint CS = {16} extremes [2, 2] - hits 208/416 nti 21 constraint (none) extremes [1, infinity) + hits 208/416 nti 20 constraint (none) extremes [1, infinity) English: nothing - constraint CS = {21} extremes [1, 1] + constraint CS = {20} extremes [1, 1] (hits 1/208) (matched: 'the infection color property') constraint (none) extremes [1, infinity) the command/commands - (hits 40/67) (matched long text) constraint DS = {21} extremes [3, infinity) + (hits 40/40) (matched long text) constraint DS = {20} extremes [3, infinity) the verb/verbs {...} - (hits 0/27) constraint DS = {21} extremes [3, infinity) + constraint DS = {20} extremes [3, infinity) (hits 167/167) (matched long text) constraint (none) extremes [1, infinity) - hits 383/766 nti 24 constraint (none) extremes [1, infinity) + hits 383/766 nti 23 constraint (none) extremes [1, infinity) English: {...} (hits 88/383) (matched long text) constraint (none) extremes [1, infinity) - (hits 88/88) (matched long text) constraint DS = {20} extremes [3, infinity) + (hits 88/88) (matched long text) constraint DS = {19} extremes [3, infinity) (hits 207/207) (matched: '"n"') constraint (none) extremes [1, infinity) - hits 176/352 nti 20 constraint DS = {20} extremes [2, infinity) + hits 176/352 nti 19 constraint DS = {19} extremes [2, infinity) English: , _and/or - (hits 0/74) constraint DS = {20} extremes [3, infinity) + (hits 0/74) constraint DS = {19} extremes [3, infinity) _,/and/or - (hits 176/176) (matched long text) constraint DS = {20} extremes [2, infinity) + (hits 176/176) (matched long text) constraint DS = {19} extremes [2, infinity) - hits 383/766 nti 25 constraint (none) extremes [1, infinity) + hits 383/766 nti 24 constraint (none) extremes [1, infinity) English: {...} (hits 383/383) (matched: '"n"') constraint (none) extremes [1, infinity) - hits 70/554 nti 26 constraint (none) extremes [1, infinity) + hits 50/514 nti 25 constraint (none) extremes [1, infinity) English: {...} - (hits 69/277) (matched long text) constraint (none) extremes [1, infinity) + (hits 49/257) (matched long text) constraint (none) extremes [1, infinity) - (hits 0/33) constraint DS = {18, 19} extremes [4, infinity) + (hits 0/25) constraint DS = {17, 18} extremes [4, infinity) - (hits 1/68) (matched: 'the infection color property') constraint DS = {18} extremes [2, infinity) + (hits 1/25) (matched: 'the infection color property') constraint DS = {17} extremes [2, infinity) - hits 69/378 nti 19 constraint DS = {19} extremes [2, infinity) + hits 49/298 nti 18 constraint DS = {18} extremes [2, infinity) English: , _and/or - (hits 0/122) constraint DS = {19} extremes [3, infinity) + (hits 0/98) constraint DS = {18} extremes [3, infinity) _,/and/or - (hits 69/154) (matched long text) constraint DS = {19} extremes [2, infinity) + (hits 49/122) (matched long text) constraint DS = {18} extremes [2, infinity) - hits 1/274 nti 18 constraint DS = {18} extremes [2, infinity) + hits 1/148 nti 17 constraint DS = {17} extremes [2, infinity) English: property - (hits 1/129) (matched: 'the infection color property') constraint DS = {18} extremes [2, infinity) + (hits 1/50) (matched: 'the infection color property') constraint DS = {17} extremes [2, infinity) {...} property - (hits 0/128) constraint DS = {18} extremes [2, infinity) + (hits 0/49) constraint DS = {17} extremes [2, infinity) - hits 167/334 nti 24 constraint (none) extremes [1, infinity) + hits 167/334 nti 23 constraint (none) extremes [1, infinity) English: when/while {...} - (hits 1/57) (matched: 'yourself when the player is not yourself') constraint DS = {24} extremes [3, infinity) + (hits 1/12) (matched: 'yourself when the player is not yourself') constraint DS = {23} extremes [3, infinity) (hits 166/166) (matched: 'giving it to ( with nouns reversed )') constraint (none) extremes [1, infinity) - hits 167/334 nti 27 constraint (none) extremes [1, infinity) + hits 167/334 nti 26 constraint (none) extremes [1, infinity) English: {...} (hits 0/167) constraint (none) extremes [1, infinity) - (hits 0/26) constraint DS = {23} extremes [3, infinity) + (hits 0/28) constraint DS = {22} extremes [3, infinity) (hits 167/167) (matched: 'giving it to ( with nouns reversed )') constraint (none) extremes [1, infinity) - hits 0/188 nti 23 constraint DS = {23} extremes [2, infinity) + hits 0/196 nti 22 constraint DS = {22} extremes [2, infinity) English: , _and/or - (hits 0/39) constraint DS = {23} extremes [3, infinity) + (hits 0/39) constraint DS = {22} extremes [3, infinity) _,/and/or - (hits 0/60) constraint DS = {23} extremes [2, infinity) + (hits 0/62) constraint DS = {22} extremes [2, infinity) - hits 167/334 nti 28 constraint (none) extremes [1, infinity) + hits 167/334 nti 27 constraint (none) extremes [1, infinity) English: (hits 167/167) (matched: 'giving it to ( with nouns reversed )') constraint (none) extremes [1, infinity) - hits 167/334 nti 22 constraint (none) extremes [1, infinity) + hits 167/334 nti 21 constraint (none) extremes [1, infinity) English: {...} (hits 0/167) constraint (none) extremes [1, infinity) a mistake - constraint CS = {22} extremes [2, 2] + constraint CS = {21} extremes [2, 2] a mistake ( ) - (hits 0/3) constraint DS = {22} extremes [5, 5] + (hits 0/3) constraint DS = {21} extremes [5, 5] a mistake {...} - (hits 0/42) constraint DS = {22} extremes [3, infinity) + (hits 0/44) constraint DS = {21} extremes [3, infinity) the plural of - (hits 0/11) constraint DS = {22} extremes [4, infinity) + (hits 0/11) constraint DS = {21} extremes [4, infinity) plural of - (hits 0/42) constraint DS = {22} extremes [3, infinity) + (hits 0/44) constraint DS = {21} extremes [3, infinity) (hits 2/73) (matched: '"[ice cream]"') constraint (none) extremes [1, 1] ( with nouns reversed ) - (hits 6/6) (matched: 'giving it to ( with nouns reversed )') constraint DS = {22} extremes [6, infinity) + (hits 6/6) (matched: 'giving it to ( with nouns reversed )') constraint DS = {21} extremes [6, infinity) (hits 159/159) (matched: 'requesting the story file version') constraint (none) extremes [1, infinity) - hits 165/330 nti 29 constraint (none) extremes [1, infinity) + hits 165/330 nti 28 constraint (none) extremes [1, infinity) English: (hits 150/165) (matched: 'requesting the story file version') constraint (none) extremes [1, infinity) @@ -9584,34 +9571,34 @@ {...} constraint (none) extremes [1, infinity) - hits 40/80 nti 25 constraint (none) extremes [1, infinity) + hits 40/80 nti 24 constraint (none) extremes [1, infinity) English: {...} when/while {...} - constraint DS = {25} extremes [3, infinity) + constraint DS = {24} extremes [3, infinity) something new - (hits 3/3) (matched: 'something new') constraint CS = {25} extremes [2, 2] + (hits 3/3) (matched: 'something new') constraint CS = {24} extremes [2, 2] (hits 37/37) (matched: 'take') constraint (none) extremes [1, 1] {...} constraint (none) extremes [1, infinity) - hits 1/2 nti 27 constraint (none) extremes [1, infinity) + hits 1/2 nti 26 constraint (none) extremes [1, infinity) English: when/while {...} - constraint DS = {27} extremes [3, infinity) + constraint DS = {26} extremes [3, infinity) (hits 1/1) (matched: 'referring to an ice cream cone') constraint (none) extremes [1, infinity) - hits 1/2 nti 26 constraint (none) extremes [1, infinity) + hits 1/2 nti 25 constraint (none) extremes [1, infinity) English: referring to - (hits 1/1) (matched: 'referring to an ice cream cone') constraint DS = {26} extremes [3, infinity) + (hits 1/1) (matched: 'referring to an ice cream cone') constraint DS = {25} extremes [3, infinity) describing - constraint DS = {26} extremes [2, infinity) + constraint DS = {25} extremes [2, infinity) {...} constraint (none) extremes [1, infinity) - hits 1/2 nti 30 constraint (none) extremes [1, infinity) + hits 1/2 nti 29 constraint (none) extremes [1, infinity) English: (hits 1/1) (matched: 'an ice cream cone') constraint (none) extremes [1, infinity) @@ -9620,7 +9607,7 @@ {...} constraint (none) extremes [1, infinity) - hits 4/8 nti 31 constraint (none) extremes [1, infinity) + hits 4/8 nti 30 constraint (none) extremes [1, infinity) English: (hits 4/4) (matched: 'the player is not yourself') constraint (none) extremes [1, infinity) @@ -9629,39 +9616,39 @@ {...} constraint (none) extremes [1, infinity) - hits 910/1820 nti 28 constraint (none) extremes [1, infinity) + hits 910/1820 nti 27 constraint (none) extremes [1, infinity) English: {...} , {...} - (hits 340/370) (matched long text) constraint DS = {28} extremes [3, infinity) + (hits 340/370) (matched long text) constraint DS = {27} extremes [3, infinity) (hits 400/526) (matched: 'n') constraint (none) extremes [1, 1] {...} (hits 170/170) (matched: 'a locked lockable thing') constraint (none) extremes [1, infinity) - hits 163/326 nti 30 constraint (none) extremes [1, infinity) + hits 163/326 nti 29 constraint (none) extremes [1, infinity) English: (hits 3/163) (matched: 'flavored ice cream') constraint (none) extremes [1, infinity) any things - constraint CS = {30} extremes [2, 2] + constraint CS = {29} extremes [2, 2] any - (hits 2/26) (matched: 'any room') constraint DS = {30} extremes [2, infinity) + (hits 2/36) (matched: 'any room') constraint DS = {29} extremes [2, infinity) anything - (hits 0/92) constraint CS = {30} extremes [1, 1] + (hits 0/92) constraint CS = {29} extremes [1, 1] anybody - (hits 0/92) constraint CS = {30} extremes [1, 1] + (hits 0/92) constraint CS = {29} extremes [1, 1] anyone - (hits 0/92) constraint CS = {30} extremes [1, 1] + (hits 0/92) constraint CS = {29} extremes [1, 1] anywhere - (hits 0/92) constraint CS = {30} extremes [1, 1] + (hits 0/92) constraint CS = {29} extremes [1, 1] something related by reversed - constraint DS = {30} extremes [5, infinity) + constraint DS = {29} extremes [5, infinity) something related by - constraint DS = {30} extremes [4, infinity) + (hits 0/5) constraint DS = {29} extremes [4, infinity) something related by {...} - constraint DS = {30} extremes [4, infinity) + (hits 0/5) constraint DS = {29} extremes [4, infinity) - (hits 138/138) (matched: 'something preferably held') constraint CS = {29} extremes [1, 3] + (hits 138/138) (matched: 'something preferably held') constraint CS = {28} extremes [1, 3] (hits 0/13) constraint (none) extremes [2, infinity) @@ -9671,307 +9658,307 @@ {...} constraint (none) extremes [1, infinity) - hits 138/276 nti 29 constraint CS = {29} extremes [1, 3] + hits 138/276 nti 28 constraint CS = {28} extremes [1, 3] English: something - (hits 88/115) (matched: 'something') constraint CS = {29} extremes [1, 1] + (hits 88/115) (matched: 'something') constraint CS = {28} extremes [1, 1] things - (hits 4/27) (matched: 'things') constraint CS = {29} extremes [1, 1] + (hits 4/27) (matched: 'things') constraint CS = {28} extremes [1, 1] things inside - (hits 4/9) (matched: 'things inside') constraint CS = {29} extremes [2, 2] + (hits 4/9) (matched: 'things inside') constraint CS = {28} extremes [2, 2] things preferably held - (hits 3/14) (matched: 'things preferably held') constraint CS = {29} extremes [3, 3] + (hits 3/14) (matched: 'things preferably held') constraint CS = {28} extremes [3, 3] something preferably held - (hits 11/11) (matched: 'something preferably held') constraint CS = {29} extremes [3, 3] + (hits 11/11) (matched: 'something preferably held') constraint CS = {28} extremes [3, 3] other things - (hits 5/5) (matched: 'other things') constraint CS = {29} extremes [2, 2] + (hits 5/5) (matched: 'other things') constraint CS = {28} extremes [2, 2] someone - (hits 15/23) (matched: 'someone') constraint CS = {29} extremes [1, 1] + (hits 15/23) (matched: 'someone') constraint CS = {28} extremes [1, 1] somebody - (hits 0/8) constraint CS = {29} extremes [1, 1] + (hits 0/8) constraint CS = {28} extremes [1, 1] text - (hits 8/8) (matched: 'text') constraint CS = {29} extremes [1, 1] + (hits 8/8) (matched: 'text') constraint CS = {28} extremes [1, 1] topic - constraint CS = {29} extremes [1, 1] + constraint CS = {28} extremes [1, 1] a topic - constraint CS = {29} extremes [2, 2] + constraint CS = {28} extremes [2, 2] object - constraint CS = {29} extremes [1, 1] + constraint CS = {28} extremes [1, 1] an object - constraint CS = {29} extremes [2, 2] + constraint CS = {28} extremes [2, 2] something held - constraint CS = {29} extremes [2, 2] + constraint CS = {28} extremes [2, 2] things held - constraint CS = {29} extremes [2, 2] + constraint CS = {28} extremes [2, 2] - internal hits 3/326 nti 6 constraint (none) extremes [1, infinity) + internal hits 3/326 nti 31 constraint (none) extremes [1, infinity) - hits 1/4 nti 7 constraint DS = {31} extremes [2, infinity) + hits 1/4 nti 6 constraint DS = {30} extremes [2, infinity) English: - (hits 1/2) (matched: 'the file of cover art ( The cover art. )') constraint DS = {31} extremes [3, infinity) + (hits 1/2) (matched: 'the file of cover art ( The cover art. )') constraint DS = {30} extremes [3, infinity) - (hits 0/1) constraint DS = {31} extremes [2, infinity) + (hits 0/1) constraint DS = {30} extremes [2, infinity) - hits 1/4 nti 31 constraint DS = {31} extremes [2, infinity) + hits 1/4 nti 30 constraint DS = {30} extremes [2, infinity) English: file - (hits 1/2) (matched: 'file of cover art ( The cover art. )') constraint DS = {31} extremes [2, infinity) + (hits 1/2) (matched: 'file of cover art ( The cover art. )') constraint DS = {30} extremes [2, infinity) - hits 2/690 nti 6 constraint DS = {6} extremes [2, infinity) + hits 2/690 nti 31 constraint DS = {31} extremes [2, infinity) English: figure {...} - (hits 2/230) (matched: 'figure of cover') constraint DS = {6} extremes [2, infinity) + (hits 2/215) (matched: 'figure of cover') constraint DS = {31} extremes [2, infinity) - hits 1/2 nti 8 constraint (none) extremes [1, infinity) + hits 1/2 nti 7 constraint (none) extremes [1, infinity) English: ( ) - (hits 1/1) (matched: 'of cover art ( The cover art. )') constraint DS = {8} extremes [4, infinity) + (hits 1/1) (matched: 'of cover art ( The cover art. )') constraint DS = {7} extremes [4, infinity) constraint (none) extremes [1, infinity) - hits 1/2 nti 7 constraint (none) extremes [1, infinity) + hits 1/2 nti 6 constraint (none) extremes [1, infinity) English: of cover art - (hits 1/1) (matched: 'of cover art') constraint CS = {7} extremes [3, 3] + (hits 1/1) (matched: 'of cover art') constraint CS = {6} extremes [3, 3] constraint (none) extremes [1, 1] {...} constraint (none) extremes [1, infinity) - nti 9 constraint CS = {9} extremes [3, 3] + nti 8 constraint CS = {8} extremes [3, 3] English: of cover art - constraint CS = {9} extremes [3, 3] + constraint CS = {8} extremes [3, 3] - hits 0/2 nti 8 constraint DS = {10} extremes [2, infinity) + hits 0/2 nti 7 constraint DS = {9} extremes [2, infinity) English: - constraint DS = {10} extremes [3, infinity) + (hits 0/1) constraint DS = {9} extremes [3, infinity) - constraint DS = {10} extremes [2, infinity) + (hits 0/1) constraint DS = {9} extremes [2, infinity) - nti 10 constraint DS = {10} extremes [2, infinity) + hits 0/2 nti 9 constraint DS = {9} extremes [2, infinity) English: file - constraint DS = {10} extremes [2, infinity) + (hits 0/1) constraint DS = {9} extremes [2, infinity) - hits 1/688 nti 11 constraint DS = {11} extremes [2, infinity) + hits 1/688 nti 10 constraint DS = {10} extremes [2, infinity) English: sound {...} - (hits 1/150) (matched: 'sound name understood') constraint DS = {11} extremes [2, infinity) + (hits 1/249) (matched: 'sound name understood') constraint DS = {10} extremes [2, infinity) - nti 12 constraint (none) extremes [1, infinity) + nti 11 constraint (none) extremes [1, infinity) English: ( ) - constraint DS = {12} extremes [4, infinity) + constraint DS = {11} extremes [4, infinity) constraint (none) extremes [1, infinity) - nti 9 constraint (none) extremes [1, infinity) + nti 8 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] {...} constraint (none) extremes [1, infinity) - hits 0/1070 nti 15 constraint (none) extremes [2, infinity) + hits 0/1070 nti 14 constraint (none) extremes [2, infinity) English: (hits 0/509) constraint (none) extremes [2, infinity) text - (hits 0/255) constraint DS = {14, 15} extremes [3, infinity) + (hits 0/337) constraint DS = {13, 14} extremes [3, infinity) binary - (hits 0/255) constraint DS = {14, 15} extremes [3, infinity) + (hits 0/337) constraint DS = {13, 14} extremes [3, infinity) - (hits 0/442) constraint DS = {14} extremes [2, infinity) + (hits 0/441) constraint DS = {13} extremes [2, infinity) - hits 0/884 nti 14 constraint DS = {14} extremes [2, infinity) + hits 0/882 nti 13 constraint DS = {13} extremes [2, infinity) English: {file ...} ( owned by ) - (hits 0/77) constraint DS = {14} extremes [7, infinity) + (hits 0/77) constraint DS = {13} extremes [7, infinity) {file ...} - (hits 0/442) constraint DS = {14} extremes [2, infinity) + (hits 0/441) constraint DS = {13} extremes [2, infinity) - nti 13 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: another project - constraint CS = {13} extremes [2, 2] + constraint CS = {12} extremes [2, 2] project {} - constraint DS = {13} extremes [2, 2] + constraint DS = {12} extremes [2, 2] {...} constraint (none) extremes [1, infinity) - nti 10 constraint (none) extremes [1, infinity) + nti 9 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, 1] {...} constraint (none) extremes [1, infinity) - nti 11 constraint DS = {16} extremes [2, infinity) + nti 10 constraint DS = {15} extremes [2, infinity) English: - constraint DS = {16} extremes [3, infinity) + constraint DS = {15} extremes [3, infinity) - constraint DS = {16} extremes [2, infinity) + constraint DS = {15} extremes [2, infinity) - nti 16 constraint DS = {16} extremes [2, infinity) + nti 15 constraint DS = {15} extremes [2, infinity) English: called - constraint DS = {16} extremes [2, infinity) + constraint DS = {15} extremes [2, infinity) - hits 0/688 nti 12 constraint (none) extremes [2, infinity) + hits 0/688 nti 11 constraint (none) extremes [2, infinity) English: (hits 0/330) constraint (none) extremes [2, infinity) - hits 447/2552 nti 17 constraint DS = {13, 17} extremes [6, infinity) + hits 447/2552 nti 16 constraint DS = {16, 19} extremes [6, infinity) English: {...} ( ) - (hits 424/885) (matched long text) constraint DS = {13, 17} extremes [6, infinity) + (hits 424/872) (matched long text) constraint DS = {16, 19} extremes [6, infinity) {...} -- -- - (hits 23/461) (matched long text) constraint DS = {13, 17} extremes [6, infinity) + (hits 23/448) (matched long text) constraint DS = {16, 19} extremes [6, infinity) - hits 480/1188 nti 13 constraint DS = {13} extremes [3, 3] + hits 480/1188 nti 19 constraint DS = {19} extremes [3, 3] English: documented at {###} - (hits 480/504) (matched: 'documented at act_startvm') constraint DS = {13} extremes [3, 3] + (hits 480/579) (matched: 'documented at act_startvm') constraint DS = {19} extremes [3, 3] - nti 18 constraint DS = {18} extremes [2, infinity) + nti 17 constraint DS = {17} extremes [2, infinity) English: understood - constraint DS = {18} extremes [2, infinity) + constraint DS = {17} extremes [2, infinity) - nti 20 constraint (none) extremes [1, infinity) + nti 19 constraint (none) extremes [1, infinity) English: {} ( {...} ) - constraint DS = {20} extremes [5, infinity) + constraint DS = {19} extremes [5, infinity) {} ( {...} ) - constraint DS = {20} extremes [4, infinity) + constraint DS = {19} extremes [4, infinity) {} constraint (none) extremes [1, infinity) - nti 19 constraint (none) extremes [1, infinity) + nti 18 constraint (none) extremes [1, infinity) English: {...} - {...} - {...} - constraint DS = {19} extremes [5, infinity) + constraint DS = {18} extremes [5, infinity) {...} - {...} - constraint DS = {19} extremes [3, infinity) + constraint DS = {18} extremes [3, infinity) {...} constraint (none) extremes [1, infinity) - nti 21 constraint (none) extremes [1, 1] + nti 20 constraint (none) extremes [1, 1] English: in - constraint CS = {21} extremes [1, 1] + constraint CS = {20} extremes [1, 1] of - constraint CS = {21} extremes [1, 1] + constraint CS = {20} extremes [1, 1]
    constraint (none) extremes [1, 1] - nti 13 constraint (none) extremes [1, infinity) + nti 12 constraint (none) extremes [1, infinity) English: constraint (none) extremes [1, infinity) - nti 26 constraint (none) extremes [1, infinity) + nti 25 constraint (none) extremes [1, infinity) English: eps file - constraint CS = {26} extremes [2, 2] + constraint CS = {25} extremes [2, 2] mapped as - constraint DS = {26} extremes [4, infinity) + constraint DS = {25} extremes [4, infinity) {...} mapped as {...} - constraint DS = {26} extremes [4, infinity) + constraint DS = {25} extremes [4, infinity) mapped - constraint DS = {22, 26} extremes [4, infinity) + constraint DS = {21, 25} extremes [4, infinity) {...} mapped {...} - constraint DS = {26} extremes [3, infinity) + constraint DS = {25} extremes [3, infinity) set to - constraint DS = {26} extremes [4, infinity) + constraint DS = {25} extremes [4, infinity) set to {...} - constraint DS = {26} extremes [4, infinity) + constraint DS = {25} extremes [4, infinity) {...} set to {...} - constraint DS = {26} extremes [4, infinity) + constraint DS = {25} extremes [4, infinity) rubric {} {***} - constraint DS = {26} extremes [2, infinity) + constraint DS = {25} extremes [2, infinity) {...} constraint (none) extremes [1, infinity) - nti 22 constraint DS = {22} extremes [2, infinity) + nti 21 constraint DS = {21} extremes [2, infinity) English: of/from - constraint DS = {22} extremes [3, infinity) + constraint DS = {21} extremes [3, infinity) above - constraint DS = {22} extremes [2, infinity) + constraint DS = {21} extremes [2, infinity) below - constraint DS = {22} extremes [2, infinity) + constraint DS = {21} extremes [2, infinity) - nti 24 constraint (none) extremes [1, infinity) + nti 23 constraint (none) extremes [1, infinity) English: of - constraint DS = {24} extremes [3, infinity) + constraint DS = {23} extremes [3, infinity) constraint (none) extremes [1, infinity) {...} of - constraint DS = {24} extremes [3, infinity) + constraint DS = {23} extremes [3, infinity) - nti 14 constraint (none) extremes [1, infinity) + nti 13 constraint (none) extremes [1, infinity) English: constraint (none) extremes [2, infinity) constraint (none) extremes [1, infinity) - nti 23 constraint (none) extremes [1, infinity) + nti 22 constraint (none) extremes [1, infinity) English: first room - constraint CS = {23} extremes [2, 2] + constraint CS = {22} extremes [2, 2] level - constraint DS = {23} extremes [2, 2] + constraint DS = {22} extremes [2, 2] constraint (none) extremes [1, infinity) constraint (none) extremes [1, infinity) - internal nti 15 constraint (none) extremes [1, infinity) + internal nti 14 constraint (none) extremes [1, infinity) - nti 16 constraint (none) extremes [1, 1] + nti 15 constraint (none) extremes [1, 1] English: constraint CS = {r0} extremes [1, 1] constraint (none) extremes [1, 1] - constraint CS = {25} extremes [1, 1] + constraint CS = {24} extremes [1, 1] constraint (none) extremes [1, 1] {###} constraint (none) extremes [1, 1] - nti 25 constraint CS = {25} extremes [1, 1] + nti 24 constraint CS = {24} extremes [1, 1] English: on - constraint CS = {25} extremes [1, 1] + constraint CS = {24} extremes [1, 1] off - constraint CS = {25} extremes [1, 1] + constraint CS = {24} extremes [1, 1] - internal nti 17 constraint (none) extremes [1, 1] + internal nti 16 constraint (none) extremes [1, 1] - nti 27 constraint DS = {27} extremes [2, infinity) + nti 26 constraint DS = {26} extremes [2, infinity) English: size {***} - constraint DS = {27} extremes [2, infinity) + constraint DS = {26} extremes [2, infinity) font {} {***} - constraint DS = {27} extremes [2, infinity) + constraint DS = {26} extremes [2, infinity) colour {} {***} - constraint DS = {27} extremes [2, infinity) + constraint DS = {26} extremes [2, infinity) at from {...} - constraint DS = {27} extremes [4, infinity) + constraint DS = {26} extremes [4, infinity) at {***} - constraint DS = {27} extremes [2, infinity) + constraint DS = {26} extremes [2, infinity) - nti 18 constraint (none) extremes [0, 0] + nti 17 constraint (none) extremes [0, 0] - nti 19 constraint (none) extremes [0, 0] + nti 18 constraint (none) extremes [0, 0] diff --git a/inform7/Figures/memory-diagnostics.txt b/inform7/Figures/memory-diagnostics.txt index 352855d78..7e601494e 100644 --- a/inform7/Figures/memory-diagnostics.txt +++ b/inform7/Figures/memory-diagnostics.txt @@ -1,6 +1,6 @@ Total memory consumption was 259998K = 254 MB -62.7% was used for 1339202 objects, in 281437 frames in 204 x 800K = 163200K = 159 MB: +62.7% was used for 1340054 objects, in 282289 frames in 204 x 800K = 163200K = 159 MB: 9.7% inter_tree_node_array 36 x 8192 = 294912 objects, 25953408 bytes 5.4% text_stream_array 2583 x 100 = 258300 objects, 14547456 bytes @@ -20,8 +20,8 @@ Total memory consumption was 259998K = 254 MB 0.3% excerpt_meaning 3098 objects, 966576 bytes 0.3% inter_name_array 20 x 1000 = 20000 objects, 960640 bytes 0.3% inter_package 13227 objects, 952344 bytes - 0.3% production 3910 objects, 907120 bytes - 0.3% ptoken 8519 objects, 885976 bytes + 0.3% production 3905 objects, 905960 bytes + 0.3% ptoken 8478 objects, 881712 bytes 0.3% grammatical_usage 3610 objects, 866400 bytes 0.3% individual_form 2560 objects, 860160 bytes 0.3% inter_symbols_table 13227 objects, 846528 bytes @@ -29,8 +29,8 @@ Total memory consumption was 259998K = 254 MB 0.2% dictionary 16372 objects, 785856 bytes 0.2% dict_entry_array 232 x 100 = 23200 objects, 749824 bytes 0.2% package_request 7954 objects, 699952 bytes - 0.2% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes 0.2% inter_name_generator_array 16 x 1000 = 16000 objects, 640512 bytes + 0.2% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes 0.1% local_variable_array 45 x 100 = 4500 objects, 505440 bytes 0.1% verb_usage 1128 objects, 388032 bytes 0.1% rule 469 objects, 363944 bytes @@ -44,19 +44,19 @@ Total memory consumption was 259998K = 254 MB ---- binary_predicate 321 objects, 156648 bytes ---- stacked_variable_owner_list_array 38 x 100 = 3800 objects, 153216 bytes ---- index_lexicon_entry 395 objects, 142200 bytes - ---- nonterminal 764 objects, 140576 bytes + ---- nonterminal 763 objects, 140392 bytes ---- documentation_ref 1275 objects, 112200 bytes ---- inference 1703 objects, 108992 bytes ---- hierarchy_location 730 objects, 105120 bytes ---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes ---- noun_usage 2401 objects, 96040 bytes + ---- imperative_defn 1376 objects, 88064 bytes ---- preposition 273 objects, 87360 bytes ---- lexical_cluster 2516 objects, 80512 bytes ---- pcalc_term_array 2 x 1000 = 2000 objects, 80064 bytes ---- kind_variable_declaration 1652 objects, 79296 bytes ---- inter_tree 6 objects, 78624 bytes ---- inter_schema 1509 objects, 72432 bytes - ---- imperative_defn 1376 objects, 66048 bytes ---- rulebook 407 objects, 65120 bytes ---- spatial_data 670 objects, 64320 bytes ---- kind_macro_definition 9 objects, 62280 bytes @@ -75,7 +75,7 @@ Total memory consumption was 259998K = 254 MB ---- activity_list_array 1 x 1000 objects, 40032 bytes ---- anl_clause_array 1 x 1000 objects, 40032 bytes ---- response_message 407 objects, 35816 bytes - ---- production_list 622 objects, 34832 bytes + ---- production_list 621 objects, 34776 bytes ---- regions_data 670 objects, 32160 bytes ---- HTML_tag_array 1 x 1000 objects, 32032 bytes ---- property_permission 96 objects, 30720 bytes @@ -84,6 +84,7 @@ Total memory consumption was 259998K = 254 MB ---- heading 198 objects, 28512 bytes ---- action_pattern_array 7 x 100 = 700 objects, 28224 bytes ---- counting_data 670 objects, 26800 bytes + ---- to_family_data 496 objects, 23808 bytes ---- parsing_data 670 objects, 21440 bytes ---- bp_runtime_implementation 321 objects, 20544 bytes ---- instance 167 objects, 20040 bytes @@ -93,10 +94,10 @@ Total memory consumption was 259998K = 254 MB ---- action_name 90 objects, 18000 bytes ---- parse_node_tree 20 objects, 17280 bytes ---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes - ---- match_avinue_array 1 x 1000 objects, 16032 bytes ---- linked_list_item_array 1 x 1000 objects, 16032 bytes ---- action_name_list_array 1 x 1000 objects, 16032 bytes - ---- method 327 objects, 15696 bytes + ---- match_avinue_array 1 x 1000 objects, 16032 bytes + ---- method 331 objects, 15888 bytes ---- to_phrase_request 59 objects, 15576 bytes ---- adjective 137 objects, 14248 bytes ---- booking_list 407 objects, 13024 bytes @@ -104,6 +105,7 @@ Total memory consumption was 259998K = 254 MB ---- adjective_iname_holder 320 objects, 12800 bytes ---- stopwatch_timer 141 objects, 11280 bytes ---- pathname 262 objects, 10480 bytes + ---- rule_family_data 400 objects, 9600 bytes ---- filename 208 objects, 8320 bytes ---- equation_node 68 objects, 7616 bytes ---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes @@ -128,10 +130,10 @@ Total memory consumption was 259998K = 254 MB ---- command_line_switch 43 objects, 3440 bytes ---- method_set 105 objects, 3360 bytes ---- property_setting_bp_data 84 objects, 3360 bytes - ---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes ---- instance_usage_array 1 x 200 objects, 3232 bytes - ---- definition 44 objects, 3168 bytes + ---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes ---- compatibility_specification 66 objects, 3168 bytes + ---- definition 44 objects, 3168 bytes ---- inform_extension 19 objects, 3040 bytes ---- property_of_value_storage 93 objects, 2976 bytes ---- either_or_property_data 62 objects, 2976 bytes @@ -146,8 +148,8 @@ Total memory consumption was 259998K = 254 MB ---- scene 1 object, 2096 bytes ---- use_option 29 objects, 1856 bytes ---- pronoun_usage 42 objects, 1680 bytes - ---- table_contribution_array 1 x 100 objects, 1632 bytes ---- activity_crossref_array 1 x 100 objects, 1632 bytes + ---- table_contribution_array 1 x 100 objects, 1632 bytes ---- kind_interaction 39 objects, 1560 bytes ---- plugin 24 objects, 1536 bytes ---- inter_annotation_form 37 objects, 1480 bytes @@ -162,20 +164,20 @@ Total memory consumption was 259998K = 254 MB ---- quantifier 16 objects, 1024 bytes ---- table_column 16 objects, 896 bytes ---- inbuild_requirement 22 objects, 880 bytes - ---- code_generation 1 object, 864 bytes ---- control_structure_phrase 12 objects, 864 bytes + ---- code_generation 1 object, 864 bytes ---- cached_understanding 21 objects, 840 bytes ---- runtime_kind_structure 13 objects, 832 bytes ---- phrase_option_array 1 x 100 objects, 824 bytes - ---- pipeline_stage 17 objects, 816 bytes ---- target_vm 6 objects, 816 bytes + ---- pipeline_stage 17 objects, 816 bytes ---- generated_segment 25 objects, 800 bytes ---- inter_data_type 14 objects, 784 bytes ---- submodule_identity 23 objects, 736 bytes ---- inform_language 6 objects, 672 bytes - ---- I6T_intervention 8 objects, 640 bytes - ---- relation_guard 5 objects, 640 bytes ---- inter_warehouse_room 10 objects, 640 bytes + ---- relation_guard 5 objects, 640 bytes + ---- I6T_intervention 8 objects, 640 bytes ---- nascent_array 7 objects, 616 bytes ---- named_rulebook_outcome 15 objects, 600 bytes ---- inbuild_search_result 15 objects, 600 bytes @@ -194,12 +196,12 @@ Total memory consumption was 259998K = 254 MB ---- source_file 5 objects, 360 bytes ---- inbuild_genre 7 objects, 336 bytes ---- grammatical_category 8 objects, 320 bytes - ---- pronoun 8 objects, 320 bytes ---- door_dir_notice 5 objects, 320 bytes + ---- pronoun 8 objects, 320 bytes ---- up_family 9 objects, 288 bytes ---- build_step 4 objects, 288 bytes - ---- explicit_bp_data 5 objects, 280 bytes ---- door_to_notice 5 objects, 280 bytes + ---- explicit_bp_data 5 objects, 280 bytes ---- inform_pipeline 4 objects, 256 bytes ---- verb_usage_tier 5 objects, 240 bytes ---- adjective_meaning_family 7 objects, 224 bytes @@ -208,8 +210,8 @@ Total memory consumption was 259998K = 254 MB ---- imperative_defn_family 5 objects, 200 bytes ---- build_skill 5 objects, 200 bytes ---- compilation_unit 5 objects, 200 bytes - ---- kit_dependency 4 objects, 192 bytes ---- plural_dictionary_entry 4 objects, 192 bytes + ---- kit_dependency 4 objects, 192 bytes ---- inform_project 1 object, 176 bytes ---- link_instruction 4 objects, 160 bytes ---- inter_architecture 4 objects, 160 bytes @@ -221,17 +223,17 @@ Total memory consumption was 259998K = 254 MB ---- inbuild_nest 3 objects, 120 bytes ---- inform_kit_ittt 2 objects, 96 bytes ---- compile_task_data 1 object, 80 bytes - ---- article 2 objects, 80 bytes ---- list_together_routine 2 objects, 80 bytes + ---- article 2 objects, 80 bytes ---- build_methodology 1 object, 56 bytes ---- inter_warehouse 1 object, 56 bytes - ---- star_invention 1 object, 48 bytes ---- figures_data 1 object, 48 bytes + ---- star_invention 1 object, 48 bytes ---- HTML_file_state 1 object, 48 bytes - ---- parse_name_notice 1 object, 40 bytes - ---- kind_template_definition 1 object, 40 bytes - ---- loop_over_scope 1 object, 40 bytes ---- by_routine_bp_data 1 object, 40 bytes + ---- loop_over_scope 1 object, 40 bytes + ---- kind_template_definition 1 object, 40 bytes + ---- parse_name_notice 1 object, 40 bytes 37.2% was used for memory not allocated for objects: @@ -251,5 +253,5 @@ Total memory consumption was 259998K = 254 MB ---- emitter array storage 12320 bytes in 8 claims ---- code generation workspace for objects 9200 bytes in 9 claims -20.4% was overhead - 54364824 bytes = 53090K = 51 MB +20.4% was overhead - 54314872 bytes = 53041K = 51 MB diff --git a/inform7/Figures/preform-summary.txt b/inform7/Figures/preform-summary.txt index 90989534f..dd4680110 100644 --- a/inform7/Figures/preform-summary.txt +++ b/inform7/Figures/preform-summary.txt @@ -3,9 +3,9 @@ (@1)=1 (hits 171/171) (matched: '100') constraint CS = {r0} extremes [1, 1] (@1)minus (@2)=1 - (hits 0/1862) constraint DS = {12} extremes [2, 2] + (hits 0/1764) constraint DS = {12} extremes [2, 2] (@1)=1 (@2)( (@3)=2 (@4)) - (hits 273/846) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4] + (hits 273/823) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4] (@1)=1 (hits 1564/5543) (matched: 'Represents geographical locations, both indoor and outdoor, which are not necessarily areas in a building. A player in one @@ -16,9 +16,9 @@ (@1)=1 (hits 78/259) (matched: 'false') constraint CS = {6} extremes [1, 1] =1 - (hits 0/3326) constraint DS = {8} extremes [2, infinity) + (hits 0/1939) constraint DS = {8} extremes [2, infinity) (@1)unicode =1 - (hits 0/4224) constraint DS = {12} extremes [2, infinity) + (hits 0/4155) constraint DS = {12} extremes [2, infinity) =1 (hits 0/3286) constraint DW = {9, 10, 11} extremes [2, 5] =1 diff --git a/inform7/Figures/timings-diagnostics.txt b/inform7/Figures/timings-diagnostics.txt index 33b6ef3d3..b77d81433 100644 --- a/inform7/Figures/timings-diagnostics.txt +++ b/inform7/Figures/timings-diagnostics.txt @@ -1,15 +1,15 @@ 100.0% in inform7 run - 67.3% in compilation to Inter - 25.9% in //ImperativeDefinitions::compile_first_block// - 8.5% in //ImperativeDefinitions::compile_as_needed// - 6.9% in //Strings::compile_responses// - 6.2% in //InferenceSubjects::emit_all// - 4.2% in //MajorNodes::pre_pass// + 66.8% in compilation to Inter + 25.8% in //ImperativeDefinitions::compile_first_block// + 8.7% in //ImperativeDefinitions::compile_as_needed// + 6.8% in //Strings::compile_responses// + 6.1% in //InferenceSubjects::emit_all// + 4.0% in //MajorNodes::pre_pass// 3.3% in //MajorNodes::pass_1// - 2.1% in //RTRules::RulePrintingRule_routine// - 1.9% in //RTRules::rulebooks_array_array// - 1.5% in //ImperativeDefinitions::find_phrases_and_rules// - 1.0% in //RTVerbs::ConjugateVerb// + 2.0% in //RTRules::RulePrintingRule_routine// + 1.8% in //RTRules::rulebooks_array_array// + 1.6% in //ImperativeDefinitions::find_phrases_and_rules// + 0.9% in //RTVerbs::ConjugateVerb// 0.3% in //MajorNodes::pass_2// 0.3% in //RTRelations::compile_defined_relations// 0.3% in //RTRules::compile_rulebooks// @@ -17,12 +17,11 @@ 0.1% in //RTCommandGrammars::compile_all// 0.1% in //RTKinds::compile_data_type_support_routines// 0.1% in //Task::make_built_in_kind_constructors// - 0.1% in //World::stages_II_and_III// 3.2% not specifically accounted for - 30.3% in running Inter pipeline - 9.5% in inter step 2/12: link - 9.5% in step preparation - 7.1% in inter step 12/12: generate inform6 -> auto.inf + 30.7% in running Inter pipeline + 9.8% in inter step 2/12: link + 9.8% in step preparation + 7.0% in inter step 12/12: generate inform6 -> auto.inf 0.3% in inter step 9/12: make-identifiers-unique 0.1% in inter step 10/12: reconcile-verbs 0.1% in inter step 11/12: eliminate-redundant-labels @@ -30,6 +29,6 @@ 0.1% in inter step 6/12: assimilate 0.1% in inter step 7/12: resolve-external-symbols 0.1% in inter step 8/12: inspect-plugs - 2.6% not specifically accounted for - 2.1% in supervisor - 0.2% not specifically accounted for + 2.4% not specifically accounted for + 2.0% in supervisor + 0.4% not specifically accounted for diff --git a/inform7/assertions-module/Chapter 5/Adjectival Definition Family.w b/inform7/assertions-module/Chapter 5/Adjectival Definition Family.w new file mode 100644 index 000000000..6b9938c75 --- /dev/null +++ b/inform7/assertions-module/Chapter 5/Adjectival Definition Family.w @@ -0,0 +1,55 @@ +[AdjectivalDefinitionFamily::] Adjectival Definition Family. + +Imperative definitions of "Definition: X is Y: ..." adjectives. + +@ + += (early code) +imperative_defn_family *DEFINITIONAL_PHRASE_EFF_family = NULL; /* "Definition: a container is roomy if: ..." */ + +@ + += +void AdjectivalDefinitionFamily::create_family(void) { + DEFINITIONAL_PHRASE_EFF_family = ImperativeDefinitions::new_family(I"DEFINITIONAL_PHRASE_EFF"); + METHOD_ADD(DEFINITIONAL_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, AdjectivalDefinitionFamily::claim); + METHOD_ADD(DEFINITIONAL_PHRASE_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, AdjectivalDefinitionFamily::new_phrase); +} + +@ = + ::= + definition + +@ = +void AdjectivalDefinitionFamily::claim(imperative_defn_family *self, imperative_defn *id) { + wording W = Node::get_text(id->at); + if ((W)) { + id->family = DEFINITIONAL_PHRASE_EFF_family; + if ((id->at->next) && (id->at->down == NULL) && + (Node::get_type(id->at->next) == IMPERATIVE_NT)) { + ImperativeSubtrees::accept_body(id->at->next); + Node::set_type(id->at->next, DEFN_CONT_NT); + } + Phrases::Adjectives::look_for_headers(id->at); + } +} + +@ If a phrase defines an adjective, like so: + +>> Definition: A container is capacious if: ... + +we need to make the pronoun "it" a local variable of kind "container" in the +stack frame used to compile the "..." part. If it uses a calling, like so: + +>> Definition: A container (called the sack) is capacious if: ... + +then we also want the name "sack" to refer to this. Here's where we take care +of it: + += +void AdjectivalDefinitionFamily::new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) { + wording CW = EMPTY_WORDING; + kind *K = NULL; + Phrases::Phrasal::define_adjective_by_phrase(id->at, new_ph, &CW, &K); + LocalVariables::add_pronoun(&(new_ph->stack_frame), CW, K); +} diff --git a/inform7/imperative-module/Chapter 3/Imperative Definitions.w b/inform7/assertions-module/Chapter 5/Imperative Definitions.w similarity index 62% rename from inform7/imperative-module/Chapter 3/Imperative Definitions.w rename to inform7/assertions-module/Chapter 5/Imperative Definitions.w index b63142cb4..088193406 100644 --- a/inform7/imperative-module/Chapter 3/Imperative Definitions.w +++ b/inform7/assertions-module/Chapter 5/Imperative Definitions.w @@ -10,6 +10,7 @@ they define. Some will be rules, some will define To... phrases, and so on. = typedef struct imperative_defn { struct imperative_defn_family *family; + struct general_pointer family_specific_data; struct parse_node *at; struct phrase *defines; CLASS_DEFINITION @@ -22,10 +23,6 @@ typedef struct imperative_defn_family { } imperative_defn_family; imperative_defn_family *AS_YET_UNKNOWN_EFF_family = NULL; /* used only temporarily */ -imperative_defn_family *DEFINITIONAL_PHRASE_EFF_family = NULL; /* "Definition: a container is roomy if: ..." */ -imperative_defn_family *RULE_NOT_IN_RULEBOOK_EFF_family = NULL; /* "At 9 PM: ...", "This is the zap rule: ..." */ -imperative_defn_family *TO_PHRASE_EFF_family = NULL; /* "To award (some - number) points: ..." */ -imperative_defn_family *RULE_IN_RULEBOOK_EFF_family = NULL; /* "Before taking a container, ..." */ imperative_defn_family *ImperativeDefinitions::new_family(text_stream *name) { imperative_defn_family *family = CREATE(imperative_defn_family); @@ -49,142 +46,37 @@ void ImperativeDefinitions::identify(imperative_defn *id) { VOID_METHOD_CALL(f, CLAIM_IMP_DEFN_MTID, id); } +@ |NEW_PHRASE_IMP_DEFN_MTID| is for deciding from the syntax of a preamble whether +this definition should belong to the family or not. + +@e NEW_PHRASE_IMP_DEFN_MTID + += +VOID_METHOD_TYPE(NEW_PHRASE_IMP_DEFN_MTID, imperative_defn_family *f, imperative_defn *id, phrase *new_ph) + +void ImperativeDefinitions::new_phrase(imperative_defn *id, phrase *new_ph) { + VOID_METHOD_CALL(id->family, NEW_PHRASE_IMP_DEFN_MTID, id, new_ph); +} + +@ + += +int ImperativeDefinitions::goes_in_rulebooks(imperative_defn *id) { + if (RuleFamily::is(id)) return TRUE; + return FALSE; +} + @ = void ImperativeDefinitions::create_families(void) { AS_YET_UNKNOWN_EFF_family = ImperativeDefinitions::new_family(I"AS_YET_UNKNOWN_EFF"); - DEFINITIONAL_PHRASE_EFF_family = ImperativeDefinitions::new_family(I"DEFINITIONAL_PHRASE_EFF"); - METHOD_ADD(DEFINITIONAL_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::Defn_claim); + AdjectivalDefinitionFamily::create_family(); - RULE_NOT_IN_RULEBOOK_EFF_family = ImperativeDefinitions::new_family(I"RULE_NOT_IN_RULEBOOK_EFF"); - METHOD_ADD(RULE_NOT_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::RNIR_claim); + ToPhraseFamily::create_family(); - TO_PHRASE_EFF_family = ImperativeDefinitions::new_family(I"TO_PHRASE_EFF"); - METHOD_ADD(TO_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::To_claim); - - RULE_IN_RULEBOOK_EFF_family = ImperativeDefinitions::new_family(I"RULE_IN_RULEBOOK_EFF"); - METHOD_ADD(RULE_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, ImperativeDefinitions::RIR_claim); -} - -@ = - ::= - definition ==> { -, DEFINITIONAL_PHRASE_EFF_family } - -@ = -void ImperativeDefinitions::Defn_claim(imperative_defn_family *self, imperative_defn *id) { - wording W = Node::get_text(id->at); - if ((W)) { - id->family = DEFINITIONAL_PHRASE_EFF_family; - if ((id->at->next) && (id->at->down == NULL) && - (Node::get_type(id->at->next) == IMPERATIVE_NT)) { - ImperativeSubtrees::accept_body(id->at->next); - Node::set_type(id->at->next, DEFN_CONT_NT); - } - Phrases::Adjectives::look_for_headers(id->at); - } -} - -@ = - ::= - this is the {... rule} | ==> { TRUE, - } - this is the rule | ==> @ - this is ... rule | ==> @ - this is ... rules | ==> @ - ==> { FALSE, - } - -= -void ImperativeDefinitions::RNIR_claim(imperative_defn_family *self, imperative_defn *id) { - wording W = Node::get_text(id->at); - if ((W)) { - id->family = RULE_NOT_IN_RULEBOOK_EFF_family; - if (<>) { - wording RW = GET_RW(, 1); - if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE); - } - } -} - -@ = - ::= - to | ==> @ - to ... ( called ... ) | ==> @ - {to ...} ( this is the {### function} inverse to ### ) | ==> { TRUE, -, <> = TRUE, <> = TRUE } - {to ...} ( this is the {### function} ) | ==> { TRUE, -, <> = TRUE, <> = FALSE } - {to ...} ( this is ... ) | ==> { TRUE, -, <> = FALSE } - to ... ==> { FALSE, - } - -@ = - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo), - "'to' what? No name is given", - "which means that this would not define a new phrase."); - ==> { FALSE, - }; - -@ = - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled), - "phrases aren't named using 'called'", - "and instead use 'this is...'. For example, 'To salute (called saluting)' " - "isn't allowed, but 'To salute (this is saluting)' is."); - ==> { FALSE, - }; - -@ = -void ImperativeDefinitions::To_claim(imperative_defn_family *self, imperative_defn *id) { - wording W = Node::get_text(id->at); - if ((W)) { - id->family = TO_PHRASE_EFF_family; - if (<>) { - wording RW = GET_RW(, 2); - if ((RW)) - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated), - "that name for this new phrase is not allowed", - "because it already has a meaning."); - if (Phrases::Constants::parse(RW) == NULL) - Phrases::Constants::create(RW, GET_RW(, 1)); - } - } -} - -@ = - ::= - ... ( this is the {... rule} ) | ==> { TRUE, - } - ... ( this is the rule ) | ==> @ - ... ( this is ... rule ) | ==> @ - ... ( this is ... rules ) | ==> @ - ... ==> { FALSE, - } - -@ = - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule), - "there are many rules in Inform", - "so you need to give a name: 'this is the abolish dancing rule', say, " - "not just 'this is the rule'."); - ==> { FALSE, - } - -@ = - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule), - "a rule must be given a definite name", - "which begins with 'the', just to emphasise that it is the only one " - "with this name: 'this is the promote dancing rule', say, not just " - "'this is promote dancing rule'."); - ==> { FALSE, - } - -@ = - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule), - "a rule must be given a definite name ending in 'rule' not 'rules'", - "since the plural is only used for rulebooks, which can of course " - "contain many rules at once."); - ==> { FALSE, - } - -@ = -void ImperativeDefinitions::RIR_claim(imperative_defn_family *self, imperative_defn *id) { - wording W = Node::get_text(id->at); - if ((W)) { - id->family = RULE_IN_RULEBOOK_EFF_family; - if (<>) { - wording RW = GET_RW(, 2); - if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE); - } - } + RuleFamily::create_family(); } @ @@ -195,22 +87,12 @@ imperative_defn *ImperativeDefinitions::make_imperative_definition(parse_node *p id->at = p; id->defines = NULL; id->family = AS_YET_UNKNOWN_EFF_family; + id->family_specific_data = NULL_GENERAL_POINTER; current_sentence = p; ImperativeDefinitions::identify(id); return id; } -@ Here we look at the preamble for a rule name: if we find it, we declare this -as a rule. - -= - ::= - {to ...} ( this is the {### function} inverse to ### ) | ==> { 2, - } - {to ...} ( this is the {### function} ) | ==> { 2, - } - {to ...} ( this is ... ) | ==> { 2, - } - this is the {... rule} | ==> { -1, - } - ... ( this is the {... rule} ) ==> { -2, - } - @ = void ImperativeDefinitions::find_phrases_and_rules(void) { int initial_problem_count = problem_count; diff --git a/inform7/assertions-module/Chapter 5/Rule Family.w b/inform7/assertions-module/Chapter 5/Rule Family.w new file mode 100644 index 000000000..cdfe9c159 --- /dev/null +++ b/inform7/assertions-module/Chapter 5/Rule Family.w @@ -0,0 +1,125 @@ +[RuleFamily::] Rule Family. + +Imperative definitions of rules. + +@ + += +imperative_defn_family *RULE_NOT_IN_RULEBOOK_EFF_family = NULL; /* "At 9 PM: ...", "This is the zap rule: ..." */ +imperative_defn_family *RULE_IN_RULEBOOK_EFF_family = NULL; /* "Before taking a container, ..." */ + +typedef struct rule_family_data { + int not_in_rulebook; + CLASS_DEFINITION +} rule_family_data; + +@ + += +void RuleFamily::create_family(void) { + RULE_NOT_IN_RULEBOOK_EFF_family = ImperativeDefinitions::new_family(I"RULE_NOT_IN_RULEBOOK_EFF"); + METHOD_ADD(RULE_NOT_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, RuleFamily::RNIR_claim); + METHOD_ADD(RULE_NOT_IN_RULEBOOK_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, RuleFamily::rnir_new_phrase); + RULE_IN_RULEBOOK_EFF_family = ImperativeDefinitions::new_family(I"RULE_IN_RULEBOOK_EFF"); + METHOD_ADD(RULE_IN_RULEBOOK_EFF_family, CLAIM_IMP_DEFN_MTID, RuleFamily::RIR_claim); + METHOD_ADD(RULE_IN_RULEBOOK_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, RuleFamily::rir_new_phrase); +} + +@ = + ::= + this is the {... rule} | ==> { TRUE, - } + this is the rule | ==> @ + this is ... rule | ==> @ + this is ... rules | ==> @ + ==> { FALSE, - } + += +void RuleFamily::RNIR_claim(imperative_defn_family *self, imperative_defn *id) { + wording W = Node::get_text(id->at); + if ((W)) { + id->family = RULE_NOT_IN_RULEBOOK_EFF_family; + rule_family_data *rfd = CREATE(rule_family_data); + rfd->not_in_rulebook = TRUE; + id->family_specific_data = STORE_POINTER_rule_family_data(rfd); + if (<>) { + wording RW = GET_RW(, 1); + if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE); + } + } +} + +@ = + ::= + ... ( this is the {... rule} ) | ==> { TRUE, - } + ... ( this is the rule ) | ==> @ + ... ( this is ... rule ) | ==> @ + ... ( this is ... rules ) | ==> @ + ... ==> { FALSE, - } + +@ = + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NamelessRule), + "there are many rules in Inform", + "so you need to give a name: 'this is the abolish dancing rule', say, " + "not just 'this is the rule'."); + ==> { FALSE, - } + +@ = + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnarticledRule), + "a rule must be given a definite name", + "which begins with 'the', just to emphasise that it is the only one " + "with this name: 'this is the promote dancing rule', say, not just " + "'this is promote dancing rule'."); + ==> { FALSE, - } + +@ = + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PluralisedRule), + "a rule must be given a definite name ending in 'rule' not 'rules'", + "since the plural is only used for rulebooks, which can of course " + "contain many rules at once."); + ==> { FALSE, - } + +@ = +void RuleFamily::RIR_claim(imperative_defn_family *self, imperative_defn *id) { + wording W = Node::get_text(id->at); + if ((W)) { + id->family = RULE_IN_RULEBOOK_EFF_family; + rule_family_data *rfd = CREATE(rule_family_data); + rfd->not_in_rulebook = FALSE; + id->family_specific_data = STORE_POINTER_rule_family_data(rfd); + if (<>) { + wording RW = GET_RW(, 2); + if (Rules::vet_name(RW)) Rules::obtain(RW, TRUE); + } + } +} + +int RuleFamily::is(imperative_defn *id) { + if ((id->family == RULE_IN_RULEBOOK_EFF_family) || + (id->family == RULE_NOT_IN_RULEBOOK_EFF_family)) return TRUE; + return FALSE; +} + +int RuleFamily::not_in_rulebook(imperative_defn *id) { + if (RuleFamily::is(id)) { + rule_family_data *rfd = RETRIEVE_POINTER_rule_family_data(id->family_specific_data); + return rfd->not_in_rulebook; + } + return FALSE; +} + +@ + += +void RuleFamily::rir_new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) { + Rules::request_automatic_placement( + Phrases::Usage::to_rule(&(new_ph->usage_data), id)); + new_ph->compile_with_run_time_debugging = TRUE; +} + +@ + += +void RuleFamily::rnir_new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) { + Phrases::Usage::to_rule(&(new_ph->usage_data), id); + new_ph->compile_with_run_time_debugging = TRUE; +} diff --git a/inform7/assertions-module/Chapter 5/To Phrase Family.w b/inform7/assertions-module/Chapter 5/To Phrase Family.w new file mode 100644 index 000000000..3ebafa3c1 --- /dev/null +++ b/inform7/assertions-module/Chapter 5/To Phrase Family.w @@ -0,0 +1,154 @@ +[ToPhraseFamily::] To Phrase Family. + +Imperative definitions of "To..." phrases. + +@ + += +imperative_defn_family *TO_PHRASE_EFF_family = NULL; /* "To award (some - number) points: ..." */ + +typedef struct to_family_data { + struct wording pattern; + struct wording constant_name; + int explicit_name_used_in_maths; + struct wording explicit_name_for_inverse; + CLASS_DEFINITION +} to_family_data; + +@ + += +void ToPhraseFamily::create_family(void) { + TO_PHRASE_EFF_family = ImperativeDefinitions::new_family(I"TO_PHRASE_EFF"); + METHOD_ADD(TO_PHRASE_EFF_family, CLAIM_IMP_DEFN_MTID, ToPhraseFamily::claim); + METHOD_ADD(TO_PHRASE_EFF_family, NEW_PHRASE_IMP_DEFN_MTID, ToPhraseFamily::new_phrase); +} + +@ = + ::= + {to} | ==> @ + to ... ( called ... ) | ==> @ + {to ...} ( this is the {### function} inverse to ### ) | ==> { 1, - } + {to ...} ( this is the {### function} ) | ==> { 2, - } + {to ...} ( this is ... ) | ==> { 3, - } + {to ...} ==> { 4, - } + +@ = + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BareTo), + "'to' what? No name is given", + "which means that this would not define a new phrase."); + ==> { 4, - }; + +@ = + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DontCallPhrasesWithCalled), + "phrases aren't named using 'called'", + "and instead use 'this is...'. For example, 'To salute (called saluting)' " + "isn't allowed, but 'To salute (this is saluting)' is."); + ==> { 4, - }; + +@ + += +int no_now_phrases = 0; + +void ToPhraseFamily::claim(imperative_defn_family *self, imperative_defn *id) { + wording W = Node::get_text(id->at); + if ((W)) { + id->family = TO_PHRASE_EFF_family; + to_family_data *tfd = CREATE(to_family_data); + tfd->constant_name = EMPTY_WORDING; + tfd->explicit_name_used_in_maths = FALSE; + tfd->explicit_name_for_inverse = EMPTY_WORDING; + id->family_specific_data = STORE_POINTER_to_family_data(tfd); + int form = <>; + if (form != 4) { + wording RW = GET_RW(, 2); + if ((RW)) { + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated), + "that name for this new phrase is not allowed", + "because it already has a meaning."); + } else { + tfd->constant_name = RW; + if (Phrases::Constants::parse(RW) == NULL) + Phrases::Constants::create(RW, GET_RW(, 1)); + } + if ((form == 1) || (form == 2)) tfd->explicit_name_used_in_maths = TRUE; + if (form == 1) tfd->explicit_name_for_inverse = Wordings::first_word(GET_RW(, 3)); + } + tfd->pattern = GET_RW(, 1); + } +} + +@ As a safety measure, to avoid ambiguities, Inform only allows one phrase +definition to begin with "now". It recognises such phrases as those whose +preambles match: + += + ::= + to now ... + +@ In basic mode (only), the To phrase "to begin" acts as something like +|main| in a C-like language, so we need to take note of where it's defined: + += + ::= + to begin + +@ = +void ToPhraseFamily::phud(imperative_defn *id, ph_usage_data *phud) { + to_family_data *tfd = RETRIEVE_POINTER_to_family_data(id->family_specific_data); + wording W = tfd->pattern; + phud->rule_preamble = W; + + if (Wordings::nonempty(tfd->constant_name)) @; + if ((W)) { + if (no_now_phrases++ == 1) { + StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow), + "creating new variants on 'now' is not allowed", + "because 'now' plays a special role in the language. " + "It has a wide-ranging ability to make a condition " + "become immediately true. (To give it wider abilities, " + "the idea is to create new relations.)"); + } + } + if ((W)) { + phud->to_begin = TRUE; + } +} + +@ When we parse a named phrase in coarse mode, we need to make sure that +name is registered as a constant value; when we parse it again in fine +mode, we can get that value back again if we look it up by name. + +@ = + wording NW = tfd->constant_name; + + constant_phrase *cphr = Phrases::Constants::parse(NW); + if (Kinds::Behaviour::definite(cphr->cphr_kind) == FALSE) { + phrase *ph = Phrases::Constants::as_phrase(cphr); + if (ph) current_sentence = Phrases::declaration_node(ph); + Problems::quote_source(1, Diagrams::new_UNPARSED_NOUN(Nouns::nominative_singular(cphr->name))); + Problems::quote_wording(2, Nouns::nominative_singular(cphr->name)); + StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric)); + Problems::issue_problem_segment( + "I can't allow %1, because the phrase it gives a name to " + "is generic, that is, it has a kind which is too vague. " + "That means there isn't any single phrase which '%2' " + "could refer to - there would have to be different versions " + "for every setting where it might be needed, and we can't " + "predict in advance which one '%2' might need to be."); + Problems::issue_problem_end(); + LOG("CPHR failed at %d, %u\n", cphr->allocation_id, cphr->cphr_kind); + } + phud->explicit_name_used_in_maths = tfd->explicit_name_used_in_maths; + phud->explicit_name_for_inverse = tfd->explicit_name_for_inverse; + phud->explicit_name_used_in_maths = tfd->explicit_name_used_in_maths; + phud->constant_phrase_holder = cphr; + +@ + += +void ToPhraseFamily::new_phrase(imperative_defn_family *self, imperative_defn *id, phrase *new_ph) { + if (new_ph->usage_data.to_begin) new_ph->to_begin = TRUE; + Routines::ToPhrases::new(new_ph); +} diff --git a/inform7/assertions-module/Chapter 5/Equations.w b/inform7/assertions-module/Chapter 6/Equations.w similarity index 100% rename from inform7/assertions-module/Chapter 5/Equations.w rename to inform7/assertions-module/Chapter 6/Equations.w diff --git a/inform7/assertions-module/Chapter 5/Table Columns.w b/inform7/assertions-module/Chapter 6/Table Columns.w similarity index 100% rename from inform7/assertions-module/Chapter 5/Table Columns.w rename to inform7/assertions-module/Chapter 6/Table Columns.w diff --git a/inform7/assertions-module/Chapter 5/Tables.w b/inform7/assertions-module/Chapter 6/Tables.w similarity index 100% rename from inform7/assertions-module/Chapter 5/Tables.w rename to inform7/assertions-module/Chapter 6/Tables.w diff --git a/inform7/assertions-module/Chapter 6/Adjective Ambiguity.w b/inform7/assertions-module/Chapter 7/Adjective Ambiguity.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Adjective Ambiguity.w rename to inform7/assertions-module/Chapter 7/Adjective Ambiguity.w diff --git a/inform7/assertions-module/Chapter 6/Adjective Meaning Domains.w b/inform7/assertions-module/Chapter 7/Adjective Meaning Domains.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Adjective Meaning Domains.w rename to inform7/assertions-module/Chapter 7/Adjective Meaning Domains.w diff --git a/inform7/assertions-module/Chapter 6/Adjective Meanings.w b/inform7/assertions-module/Chapter 7/Adjective Meanings.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Adjective Meanings.w rename to inform7/assertions-module/Chapter 7/Adjective Meanings.w diff --git a/inform7/assertions-module/Chapter 6/Calculus Utilities.w b/inform7/assertions-module/Chapter 7/Calculus Utilities.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Calculus Utilities.w rename to inform7/assertions-module/Chapter 7/Calculus Utilities.w diff --git a/inform7/assertions-module/Chapter 6/Explicit Relations.w b/inform7/assertions-module/Chapter 7/Explicit Relations.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Explicit Relations.w rename to inform7/assertions-module/Chapter 7/Explicit Relations.w diff --git a/inform7/assertions-module/Chapter 6/Kind Predicates Revisited.w b/inform7/assertions-module/Chapter 7/Kind Predicates Revisited.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Kind Predicates Revisited.w rename to inform7/assertions-module/Chapter 7/Kind Predicates Revisited.w diff --git a/inform7/assertions-module/Chapter 6/Listed-In Relations.w b/inform7/assertions-module/Chapter 7/Listed-In Relations.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Listed-In Relations.w rename to inform7/assertions-module/Chapter 7/Listed-In Relations.w diff --git a/inform7/assertions-module/Chapter 6/Quasinumeric Relations.w b/inform7/assertions-module/Chapter 7/Quasinumeric Relations.w similarity index 100% rename from inform7/assertions-module/Chapter 6/Quasinumeric Relations.w rename to inform7/assertions-module/Chapter 7/Quasinumeric Relations.w diff --git a/inform7/assertions-module/Chapter 6/The Adjectival Predicates.w b/inform7/assertions-module/Chapter 7/The Adjectival Predicates.w similarity index 100% rename from inform7/assertions-module/Chapter 6/The Adjectival Predicates.w rename to inform7/assertions-module/Chapter 7/The Adjectival Predicates.w diff --git a/inform7/assertions-module/Chapter 6/The Creation Predicates.w b/inform7/assertions-module/Chapter 7/The Creation Predicates.w similarity index 100% rename from inform7/assertions-module/Chapter 6/The Creation Predicates.w rename to inform7/assertions-module/Chapter 7/The Creation Predicates.w diff --git a/inform7/assertions-module/Chapter 6/The Equality Relation Revisited.w b/inform7/assertions-module/Chapter 7/The Equality Relation Revisited.w similarity index 100% rename from inform7/assertions-module/Chapter 6/The Equality Relation Revisited.w rename to inform7/assertions-module/Chapter 7/The Equality Relation Revisited.w diff --git a/inform7/assertions-module/Chapter 6/The Universal Relation.w b/inform7/assertions-module/Chapter 7/The Universal Relation.w similarity index 100% rename from inform7/assertions-module/Chapter 6/The Universal Relation.w rename to inform7/assertions-module/Chapter 7/The Universal Relation.w diff --git a/inform7/assertions-module/Contents.w b/inform7/assertions-module/Contents.w index 331cd6f63..1796b06c4 100644 --- a/inform7/assertions-module/Contents.w +++ b/inform7/assertions-module/Contents.w @@ -48,13 +48,20 @@ Chapter 4: Assertions Assemblies Implications -Chapter 5: Other Gadgets +Chapter 5: Imperative Code +"What happens to preambles, colons, and blocks of imperative code." + Imperative Definitions + Adjectival Definition Family + To Phrase Family + Rule Family + +Chapter 6: Other Gadgets "Tables and equations do not look like sentences, but are also top-level." Table Columns Tables Equations -Chapter 6: Predicates +Chapter 7: Predicates "Unary and then binary predicates for the calculus module to conjure with." Kind Predicates Revisited The Adjectival Predicates diff --git a/inform7/core-module/Chapter 1/Class Predeclarations.w b/inform7/core-module/Chapter 1/Class Predeclarations.w index ddd8f67a2..e134b0182 100644 --- a/inform7/core-module/Chapter 1/Class Predeclarations.w +++ b/inform7/core-module/Chapter 1/Class Predeclarations.w @@ -30,9 +30,11 @@ DECLARE_CLASS(compile_task_data) @e imperative_defn_family_CLASS @e implication_CLASS @e relation_guard_CLASS +@e rule_family_data_CLASS @e table_CLASS @e table_column_CLASS @e table_contribution_CLASS +@e to_family_data_CLASS @e use_option_CLASS = @@ -48,9 +50,11 @@ DECLARE_CLASS(imperative_defn) DECLARE_CLASS(imperative_defn_family) DECLARE_CLASS(implication) DECLARE_CLASS(relation_guard) +DECLARE_CLASS(rule_family_data) DECLARE_CLASS(table) DECLARE_CLASS(table_column) DECLARE_CLASS_ALLOCATED_IN_ARRAYS(table_contribution, 100) +DECLARE_CLASS(to_family_data) DECLARE_CLASS(use_option) @ //values// -- diff --git a/inform7/imperative-module/Chapter 3/Describing Phrase Type Data.w b/inform7/imperative-module/Chapter 3/Describing Phrase Type Data.w index bd5b521dc..46e3ec45e 100644 --- a/inform7/imperative-module/Chapter 3/Describing Phrase Type Data.w +++ b/inform7/imperative-module/Chapter 3/Describing Phrase Type Data.w @@ -561,7 +561,10 @@ wording Phrases::TypeData::Textual::phtd_parse_return_data(ph_type_data *phtd, w case TO_RANN: mor = DECIDES_NOTHING_MOR; break; } if (mor >= 0) Phrases::TypeData::set_mor(phtd, mor, K); - } else internal_error("to phrase without to"); + } else { + WRITE_TO(STDERR, "XW = %W\n", XW); + internal_error("to phrase without to"); + } if (Kinds::eq(phtd->return_kind, K_truth_state)) { if (no_truth_state_returns++ > 0) StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TruthStateToDecide), diff --git a/inform7/imperative-module/Chapter 3/Phrase Usage.w b/inform7/imperative-module/Chapter 3/Phrase Usage.w index db85c112c..49ef2cc6f 100644 --- a/inform7/imperative-module/Chapter 3/Phrase Usage.w +++ b/inform7/imperative-module/Chapter 3/Phrase Usage.w @@ -107,38 +107,23 @@ just enough from the wording to tell what sort of rule/phrase is to follow. = ::= - definition | ==> { -, DEFINITIONAL_PHRASE_EFF_family } - this is the {... rule} | ==> { -, RULE_NOT_IN_RULEBOOK_EFF_family, <> = NOT_AN_EVENT, <> = FALSE } + definition | ==> { -, - } + this is the {... rule} | ==> { -, -, <> = NOT_AN_EVENT, <> = FALSE } this is the rule | ==> { fail production } this is ... rule | ==> { fail production } this is ... rules | ==> { fail production } - | ==> { -, RULE_NOT_IN_RULEBOOK_EFF_family, <> = R[1] } + | ==> { -, -, <> = R[1] } to | ==> { fail production } to ... ( called ... ) | ==> { fail production } - {to ...} ( this is the {### function} inverse to ### ) | ==> { -, TO_PHRASE_EFF_family, <> = TRUE, <> = TRUE, <> = TRUE } - {to ...} ( this is the {### function} ) | ==> { -, TO_PHRASE_EFF_family, <> = TRUE, <> = TRUE, <> = FALSE } - {to ...} ( this is ... ) | ==> { -, TO_PHRASE_EFF_family, <> = TRUE, <> = FALSE } - to ... | ==> { -, TO_PHRASE_EFF_family, <> = FALSE } - ... ( this is the {... rule} ) | ==> { -, RULE_IN_RULEBOOK_EFF_family, <> = TRUE, <> = FALSE } + {to ...} ( this is the {### function} inverse to ### ) | ==> { -, -, <> = TRUE, <> = TRUE, <> = TRUE } + {to ...} ( this is the {### function} ) | ==> { -, -, <> = TRUE, <> = TRUE, <> = FALSE } + {to ...} ( this is ... ) | ==> { -, -, <> = TRUE, <> = FALSE } + to ... | ==> { -, -, <> = FALSE } + ... ( this is the {... rule} ) | ==> { -, -, <> = TRUE, <> = FALSE } ... ( this is the rule ) | ==> { fail production } ... ( this is ... rule ) | ==> { fail production } ... ( this is ... rules ) | ==> { fail production } - ... ==> { -, RULE_IN_RULEBOOK_EFF_family, <> = FALSE } - -@ As a safety measure, to avoid ambiguities, Inform only allows one phrase -definition to begin with "now". It recognises such phrases as those whose -preambles match: - -= - ::= - to now ... - -@ In basic mode (only), the To phrase "to begin" acts as something like -|main| in a C-like language, so we need to take note of where it's defined: - -= - ::= - to begin + ... ==> { -, -, <> = FALSE } @ Much later on, Inform returns to the definition. If the preamble matches either of the final two productions of , then we definitely @@ -181,17 +166,17 @@ removing the possibility of "when" introducing rules of two different effects -- see below.) = -int no_now_phrases = 0; - -ph_usage_data Phrases::Usage::new(wording W, int coarse_mode, imperative_defn *id) { +ph_usage_data Phrases::Usage::new(wording W, imperative_defn *id) { ph_usage_data phud; @; + if (id->family == TO_PHRASE_EFF_family) { ToPhraseFamily::phud(id, &phud); return phud; } + if ((W)) { - imperative_defn_family *family = <>; - if (family == TO_PHRASE_EFF_family) @; - if (family == RULE_IN_RULEBOOK_EFF_family) @; - if (family == RULE_NOT_IN_RULEBOOK_EFF_family) @; + if (RuleFamily::is(id)) { + if (RuleFamily::not_in_rulebook(id)) @ + else @; + } } return phud; @@ -217,77 +202,13 @@ ph_usage_data Phrases::Usage::new(wording W, int coarse_mode, imperative_defn *i phud.owning_rulebook_placement = MIDDLE_PLACEMENT; phud.explicit_name_for_inverse = EMPTY_WORDING; -@ = - phud.rule_preamble = W; - - if (<>) @; - if ((W)) { - if (no_now_phrases++ == 1) { - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_RedefinedNow), - "creating new variants on 'now' is not allowed", - "because 'now' plays a special role in the language. " - "It has a wide-ranging ability to make a condition " - "become immediately true. (To give it wider abilities, " - "the idea is to create new relations.)"); - } - } - if ((W)) { - phud.to_begin = TRUE; - } - -@ When we parse a named phrase in coarse mode, we need to make sure that -name is registered as a constant value; when we parse it again in fine -mode, we can get that value back again if we look it up by name. - -@ = - wording RW = GET_RW(, 1); - wording NW = GET_RW(, 2); - - if (coarse_mode) { - if ((NW)) { - StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_PhraseNameDuplicated), - "that name for this new phrase is not allowed", - "because it already has a meaning."); - } - phud.constant_phrase_holder = Phrases::Constants::parse(NW); - if (phud.constant_phrase_holder == NULL) - phud.constant_phrase_holder = - Phrases::Constants::create(NW, RW); - } else { - constant_phrase *cphr = Phrases::Constants::parse(NW); - if (Kinds::Behaviour::definite(cphr->cphr_kind) == FALSE) { - phrase *ph = Phrases::Constants::as_phrase(cphr); - if (ph) current_sentence = Phrases::declaration_node(ph); - Problems::quote_source(1, Diagrams::new_UNPARSED_NOUN(Nouns::nominative_singular(cphr->name))); - Problems::quote_wording(2, Nouns::nominative_singular(cphr->name)); - StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric)); - Problems::issue_problem_segment( - "I can't allow %1, because the phrase it gives a name to " - "is generic, that is, it has a kind which is too vague. " - "That means there isn't any single phrase which '%2' " - "could refer to - there would have to be different versions " - "for every setting where it might be needed, and we can't " - "predict in advance which one '%2' might need to be."); - Problems::issue_problem_end(); - LOG("CPHR failed at %d, %u\n", cphr->allocation_id, cphr->cphr_kind); - } - if (<>) { - phud.explicit_name_used_in_maths = TRUE; - if (<>) { - wording IW = GET_RW(, 3); - phud.explicit_name_for_inverse = Wordings::first_word(IW); - } - } - phud.constant_phrase_holder = cphr; - } - phud.rule_preamble = RW; @ = if (<>) { W = GET_RW(, 1); phud.explicit_name = GET_RW(, 2); } - if (coarse_mode == FALSE) @; + @; @ = if (<> == NOT_AN_EVENT) { @@ -588,12 +509,12 @@ int issuing_ANL_problem = FALSE; /* pertains to Action Name Lists */ ph_runtime_context_data Phrases::Usage::to_runtime_context_data(ph_usage_data *phud) { ph_runtime_context_data phrcd = Phrases::Context::new(); - if (phud->from->family == RULE_NOT_IN_RULEBOOK_EFF_family) - phrcd.permit_all_outcomes = TRUE; - - if (phud->from->family == RULE_IN_RULEBOOK_EFF_family) - @; - + if (RuleFamily::is(phud->from)) { + if (RuleFamily::not_in_rulebook(phud->from)) + phrcd.permit_all_outcomes = TRUE; + else + @; + } return phrcd; } diff --git a/inform7/imperative-module/Chapter 3/Phrases.w b/inform7/imperative-module/Chapter 3/Phrases.w index 9fede2623..b45e9c498 100644 --- a/inform7/imperative-module/Chapter 3/Phrases.w +++ b/inform7/imperative-module/Chapter 3/Phrases.w @@ -116,7 +116,7 @@ void Phrases::create_from_preamble(imperative_defn *id) { } @ = - phud = Phrases::Usage::new(Node::get_text(p), FALSE, id); + phud = Phrases::Usage::new(Node::get_text(p), id); @ = wording XW = Phrases::Usage::get_preamble_text(&phud); @@ -154,40 +154,7 @@ inline definitions. phrcd = Phrases::Context::new(); @ = - if (id->family == TO_PHRASE_EFF_family) { - if (phud.to_begin) new_ph->to_begin = TRUE; - Routines::ToPhrases::new(new_ph); - } - if (id->family == DEFINITIONAL_PHRASE_EFF_family) { - @; - } - if (id->family == RULE_IN_RULEBOOK_EFF_family) { - Rules::request_automatic_placement( - Phrases::Usage::to_rule(&(new_ph->usage_data), id)); - new_ph->compile_with_run_time_debugging = TRUE; - } - if (id->family == RULE_NOT_IN_RULEBOOK_EFF_family) { - Phrases::Usage::to_rule(&(new_ph->usage_data), id); - new_ph->compile_with_run_time_debugging = TRUE; - } - -@ If a phrase defines an adjective, like so: - ->> Definition: A container is capacious if: ... - -we need to make the pronoun "it" a local variable of kind "container" in the -stack frame used to compile the "..." part. If it uses a calling, like so: - ->> Definition: A container (called the sack) is capacious if: ... - -then we also want the name "sack" to refer to this. Here's where we take care -of it: - -@ = - wording CW = EMPTY_WORDING; - kind *K = NULL; - Phrases::Phrasal::define_adjective_by_phrase(p, new_ph, &CW, &K); - LocalVariables::add_pronoun(&(new_ph->stack_frame), CW, K); + ImperativeDefinitions::new_phrase(id, new_ph); @ = wording XW = Phrases::Usage::get_preamble_text(&phud); diff --git a/inform7/imperative-module/Chapter 6/Compile Phrases.w b/inform7/imperative-module/Chapter 6/Compile Phrases.w index bb3d6a18a..e5910c5c7 100644 --- a/inform7/imperative-module/Chapter 6/Compile Phrases.w +++ b/inform7/imperative-module/Chapter 6/Compile Phrases.w @@ -292,8 +292,7 @@ henceforth to be true, so we simply compile empty code in that case. current_sentence = to_compile; named_rulebook_outcome *nrbo = <>; if (phrase_being_compiled) { - if ((phrase_being_compiled->from->family != RULE_IN_RULEBOOK_EFF_family) && - (phrase_being_compiled->from->family != RULE_NOT_IN_RULEBOOK_EFF_family)) { + if (ImperativeDefinitions::goes_in_rulebooks(phrase_being_compiled->from) == FALSE) { Problems::quote_source(1, current_sentence); Problems::quote_wording(2, Node::get_text(to_compile)); StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisplacedRulebookOutcome2)); diff --git a/inform7/imperative-module/Contents.w b/inform7/imperative-module/Contents.w index 9233c140d..6de0e6c83 100644 --- a/inform7/imperative-module/Contents.w +++ b/inform7/imperative-module/Contents.w @@ -26,7 +26,6 @@ with specific changes in the world) have their preambles parsed and their premisses worked out, and are then collected together into rulebooks, before being compiled as a great mass of Inform 6 routines and arrays." Introduction to Phrases - Imperative Definitions Phrases Phrase Usage Phrase Runtime Context Data diff --git a/services/lexicon-module/Figures/excerpts-diagnostics.txt b/services/lexicon-module/Figures/excerpts-diagnostics.txt index bd9776317..f280050f4 100644 --- a/services/lexicon-module/Figures/excerpts-diagnostics.txt +++ b/services/lexicon-module/Figures/excerpts-diagnostics.txt @@ -1,5 +1,5 @@ Size of lexicon: 3098 excerpt meanings - Stored among 840 words out of total vocabulary of 10565 + Stored among 840 words out of total vocabulary of 10564 710 words have a start list: longest belongs to report (with 293 meanings) 15 words have an end list: longest belongs to case (with 6 meanings) 29 words have a middle list: longest belongs to to (with 4 meanings)