§1. A "binary predicate" (the term comes from logic) is a property \(B\)
such that for any combination \(x\) and \(y\), and at any given moment at
@@ -232,12 +232,18 @@ container (if any) is at present directly containing \(y\).
together in a sub-structure called bp_term_details.
+
(For Inform, the following will be an inference subject, which is a wider
+category than kinds.)
+
+
+
defaultTERM_DOMAIN_CALCULUS_TYPEstructkind
+
typedefstructbp_term_details {structwordingcalled_name; "(called...)" name, if any exists
-structinference_subject *implies_infs; the domain of values allowed
+TERM_DOMAIN_CALCULUS_TYPE *implies_infs; the domain of values allowedstructkind *implies_kind; the kind of these values
-structi6_schema *function_of_other; the function \(f_0\) or \(f_1\) as above
+structi6_schema *function_of_other; the function \(f_0\) or \(f_1\) as abovechar *index_term_as; usually null, but if not, used in Phrasebook index} bp_term_details;
@@ -320,10 +326,15 @@ and "inside" the wrong way round.
structword_assemblagerelation_name; (which might have length 0)structparse_node *bp_created_at; where declared in the source textstructtext_stream *debugging_log_name; used when printing propositions to the debug log
+
+ #ifdefCORE_MODULEstructpackage_request *bp_package;structinter_name *bp_iname; when referred to as a constantstructinter_name *handler_iname;structinter_name *v2v_bitmap_iname; only relevant for some relations
+structinter_name *bp_by_routine_iname; for relations by routine
+structinter_name *initialiser_iname; if stored in dynamically allocated memory
+ #endifstructbp_term_detailsterm_details[2]; term 0 is the left term, 1 is the right
@@ -331,23 +342,23 @@ and "inside" the wrong way round.
intright_way_round; was this BP created directly? or is it a reversal of another? how to compile code which tests or forces this BP to be true or false:
-structinter_name *bp_by_routine_iname; for relations by routine
-structi6_schema *test_function; I6 schema for (a) testing \(B(x, y)\)...
+structi6_schema *test_function; I6 schema for (a) testing \(B(x, y)\)...structwordingcondition_defn_text; ...unless this I7 condition is used instead
-structi6_schema *make_true_function; I6 schema for (b) "now \(B(x, y)\)"
-structi6_schema *make_false_function; I6 schema for (c) "now \({\rm not}(B(x, y))\)"
+structi6_schema *make_true_function; I6 schema for (b) "now \(B(x, y)\)"
+structi6_schema *make_false_function; I6 schema for (c) "now \({\rm not}(B(x, y))\)" for use in the A-parser:intarbitrary; allow source to assert \(B(x, y)\) for any arbitrary pairs \(x, y\)
structproperty *set_property; asserting \(B(x, v)\) sets this prop. of \(x\) to \(v\)
structwordingproperty_pending_text; temp. version used until props createdintrelates_values_not_objects; true if either term is necessarily a value...
-structinference_subject *knowledge_about_bp; ...and if so, here's the list of known assertions
+TERM_DOMAIN_CALCULUS_TYPE *knowledge_about_bp; ...and if so, here's the list of known assertions for optimisation of run-time code:intdynamic_memory; stored in dynamically allocated memory
-structinter_name *initialiser_iname; and if so, this is the name of its initialiser
+ #ifdefCORE_MODULEstructproperty *i6_storage_property; provides run-time storage
+ #endifstructkind *storage_kind; kind of property ownerintallow_function_simplification; allow Inform to make use of any \(f_i\) functions?intfast_route_finding; use fast rather than slow route-finding algorithm?
@@ -357,11 +368,10 @@ and "inside" the wrong way round.
details, filled in for right-way-round BPs only, for particular kinds of BP:inta_listed_in_predicate; (if right way) was this generated from a table column?
-structproperty *same_property; (if right way) if a "same property as..."
-structproperty *comparative_property; (if right way) if a comparative adjective
-intcomparison_sign; ...and +1 or -1 according to sign of definitionint *equivalence_partition; (if right way) partition array of equivalence classes
+general_pointerfamily_specific;
+
CLASS_DEFINITION} binary_predicate;
@@ -431,9 +441,8 @@ one of the tables which has a column of this name.
§16. Creating term details. The essential point in defining a term is to describe the domain of values it
@@ -444,7 +453,7 @@ numbers", or "all rooms".
-bp_term_detailsBinaryPredicates::new_term(inference_subject *infs) {
+bp_term_detailsBinaryPredicates::new_term(TERM_DOMAIN_CALCULUS_TYPE *infs) {bp_term_detailsbptd;bptd.called_name = EMPTY_WORDING;bptd.function_of_other = NULL;
@@ -458,8 +467,8 @@ numbers", or "all rooms".
-bp_term_detailsBinaryPredicates::full_new_term(inference_subject *infs, kind *K,
-wordingCW, i6_schema *f) {
+bp_term_detailsBinaryPredicates::full_new_term(TERM_DOMAIN_CALCULUS_TYPE *infs, kind *K,
+wordingCW, i6_schema *f) {bp_term_detailsbptd = BinaryPredicates::new_term(infs);bptd.implies_kind = K;bptd.called_name = CW;
@@ -475,19 +484,19 @@ so that we must fill them in later, using the following:
voidBinaryPredicates::set_term_domain(bp_term_details *bptd, kind *K) {if (bptd == NULL) internal_error("no BPTD");bptd->implies_kind = K;
-bptd->implies_infs = Kinds::Knowledge::as_subject(K);
+bptd->implies_infs = TERM_DOMAIN_FROM_KIND_FUNCTION(K);}
§19. Similarly:
-voidBinaryPredicates::set_term_function(bp_term_details *bptd, i6_schema *f) {
+voidBinaryPredicates::set_term_function(bp_term_details *bptd, i6_schema *f) {if (bptd == NULL) internal_error("no BPTD");bptd->function_of_other = f;}
-i6_schema *BinaryPredicates::get_term_function(bp_term_details *bptd) {
+i6_schema *BinaryPredicates::get_term_function(bp_term_details *bptd) {if (bptd == NULL) internal_error("no BPTD");returnbptd->function_of_other;}
@@ -509,10 +518,10 @@ so that we must fill them in later, using the following:
§22. The table of relations in the index uses the textual name of an INFS, so:
@@ -522,7 +531,7 @@ so that we must fill them in later, using the following:
voidBinaryPredicates::index_term_details(OUTPUT_STREAM, bp_term_details *bptd) {if (bptd->index_term_as) { WRITE("%s", bptd->index_term_as); return; }wordingW = EMPTY_WORDING;
-if (bptd->implies_infs) W = InferenceSubjects::get_name_text(bptd->implies_infs);
+if (bptd->implies_infs) W = TERM_DOMAIN_WORDING_FUNCTION(bptd->implies_infs);if (Wordings::nonempty(W)) WRITE("%W", W); elseWRITE("--");}
@@ -564,7 +573,7 @@ matches the specific necessary kind of object if there is one.
-voidBinaryPredicates::set_index_details(binary_predicate *bp, char *left, char *right) {
+voidBinaryPredicates::set_index_details(binary_predicate *bp, char *left, char *right) {if (left) {bp->term_details[0].index_term_as = left;bp->reversal->term_details[1].index_term_as = left;
@@ -593,13 +602,14 @@ this effect. For now, we give \(EQ\) entirely blank term details.
voidBinaryPredicates::log_term_details(bp_term_details *bptd, inti) {LOG(" function(%d): $i\n", i, bptd->function_of_other);if (Wordings::nonempty(bptd->called_name)) LOG(" term %d is '%W'\n", i, bptd->called_name);if (bptd->implies_infs) {
-wordingW = InferenceSubjects::get_name_text(bptd->implies_infs);
+wordingW = TERM_DOMAIN_WORDING_FUNCTION(bptd->implies_infs);if (Wordings::nonempty(W)) LOG(" term %d has domain %W\n", i, W); }}
@@ -869,15 +796,17 @@ would always be NULLif (bp == NULL) { LOG("<null-BP>\n"); return; }LOG("BP%d <%S> - %s way round - %s\n",bp->allocation_id, bp->debugging_log_name, bp->right_way_round?"right":"wrong",
-BinaryPredicates::form_to_text(bp));
-for (i=0; i<2; i++) BinaryPredicates::log_term_details(&bp->term_details[i], i);
+BinaryPredicates::form_to_text(bp));
+for (i=0; i<2; i++) BinaryPredicates::log_term_details(&bp->term_details[i], i);LOG(" test: $i\n", bp->test_function);LOG(" make true: $i\n", bp->make_true_function);LOG(" make false: $i\n", bp->make_false_function);
+ #ifdefCORE_MODULELOG(" storage property: $Y\n", bp->i6_storage_property);
+ #endif}
-
§33. Relation names. A useful little nonterminal to spot the names of relation, such as
+
§32. Relation names. A useful little nonterminal to spot the names of relation, such as
"adjacency". (Note: not "adjacency relation".) This is only used when there
is good reason to suspect that the word in question is the name of a relation,
so the fact that it runs relatively slowly does not matter.
@@ -893,17 +822,17 @@ so the fact that it runs relatively slowly does not matter.
==> { failnonterminal };}
-intBinaryPredicates::get_form_of_relation(binary_predicate *bp) {
+intBinaryPredicates::get_form_of_relation(binary_predicate *bp) {returnbp->form_of_relation;}intBinaryPredicates::is_explicit_with_runtime_storage(binary_predicate *bp) {
@@ -912,7 +841,7 @@ so the fact that it runs relatively slowly does not matter.
if (bp->form_of_relation == Relation_ByRoutine) returnFALSE;returnTRUE;}
-char *BinaryPredicates::form_to_text(binary_predicate *bp) {
+char *BinaryPredicates::form_to_text(binary_predicate *bp) {switch(bp->form_of_relation) {caseRelation_Implicit:return"Relation_Implicit";caseRelation_OtoO:return"Relation_OtoO";
@@ -931,24 +860,24 @@ so the fact that it runs relatively slowly does not matter.
returnbp->bp_created_at;}
-
§36. Details of the terms:
+
§35. Details of the terms:
-kind *BinaryPredicates::term_kind(binary_predicate *bp, intt) {
+kind *BinaryPredicates::term_kind(binary_predicate *bp, intt) {if (bp == NULL) internal_error("tried to find kind of null relation");returnBinaryPredicates::kind_of_term(&(bp->term_details[t]));}
-i6_schema *BinaryPredicates::get_term_as_function_of_other(binary_predicate *bp, intt) {
+i6_schema *BinaryPredicates::get_term_as_function_of_other(binary_predicate *bp, intt) {if (bp == NULL) internal_error("tried to find function of null relation");returnbp->term_details[t].function_of_other;}
-
§37. Reversing:
+
§36. Reversing:
-binary_predicate *BinaryPredicates::get_reversal(binary_predicate *bp) {
+binary_predicate *BinaryPredicates::get_reversal(binary_predicate *bp) {if (bp == NULL) internal_error("tried to find reversal of null relation");returnbp->reversal;}
@@ -957,11 +886,11 @@ so the fact that it runs relatively slowly does not matter.
returnFALSE;}
-
§38. For compiling code from conditions:
+
§37. For compiling code from conditions:
-i6_schema *BinaryPredicates::get_test_function(binary_predicate *bp) {
+i6_schema *BinaryPredicates::get_test_function(binary_predicate *bp) {returnbp->test_function;}intBinaryPredicates::can_be_made_true_at_runtime(binary_predicate *bp) {
@@ -970,7 +899,7 @@ so the fact that it runs relatively slowly does not matter.
returnFALSE;}
-
§39. For the A-parser. The real code is all elsewhere; note that the
+
§38. For the A-parser. The real code is all elsewhere; note that the
assertions field, which is used only for relations between values rather
than objects, is a linked list. (Information about objects is stored in
linked lists pointed to from the instance structure in question; that
@@ -982,28 +911,31 @@ relation itself.)
intBinaryPredicates::allow_arbitrary_assertions(binary_predicate *bp) {returnbp->arbitrary;}
-intBinaryPredicates::store_dynamically(binary_predicate *bp) {
+intBinaryPredicates::store_dynamically(binary_predicate *bp) {returnbp->dynamic_memory;}intBinaryPredicates::relates_values_not_objects(binary_predicate *bp) {returnbp->relates_values_not_objects;}
-inference_subject *BinaryPredicates::as_subject(binary_predicate *bp) {
+TERM_DOMAIN_CALCULUS_TYPE *BinaryPredicates::as_subject(binary_predicate *bp) {returnbp->knowledge_about_bp;}
§42. The predicate-calculus engine compiles much better loops if
+
§40. The predicate-calculus engine compiles much better loops if
we can help it by providing an I6 schema of a loop header solving the
following problem:
@@ -1045,33 +971,33 @@ of looping over all \(x\) in the left domain of \(R\) and testing every possible
§42.1. Some relations \(R\) provide a "ranger" routine, R, which is such that
+
§40.1. Some relations \(R\) provide a "ranger" routine, R, which is such that
R(t) supplies the first "child" of \(t\) and R(t, n) supplies the next
"child" after \(n\). Thus R iterates through some linked list of all the
objects \(x\) such that \(R(x, t)\).
-
Try loop ranger optimisation42.1 =
+
Try loop ranger optimisation40.1 =
if (bp->loop_parent_optimisation_ranger) {
-Calculus::Schemas::modify(sch,
+Calculus::Schemas::modify(sch,"for (*1=%s(*2): *1: *1=%s(*2,*1))",bp->loop_parent_optimisation_ranger,bp->loop_parent_optimisation_ranger);returnTRUE; }
§40.2. Other relations make use of the I6 object tree, in cases where \(R(x, t)\)
is true if and only if \(t\) is an object which is the parent of \(x\) in the
I6 object tree and some routine associated with \(R\), called its
proviso P, is such that P(x) == t. For example, \({\it worn-by}(x, t)\)
@@ -1080,20 +1006,20 @@ ensures that we don't falsely pick up, say, items carried by \(t\) which
aren't being worn, or aren't even clothing.
-
Try loop parent optimisation subject to a proviso42.2 =
+
Try loop parent optimisation subject to a proviso40.2 =
if (bp->loop_parent_optimisation_proviso) {
-Calculus::Schemas::modify(sch,
+Calculus::Schemas::modify(sch,"objectloop (*1 in *2) if (%s(*1)==parent(*1))",bp->loop_parent_optimisation_proviso);returnTRUE; }
diff --git a/docs/calculus-module/2-bpf.html b/docs/calculus-module/2-bpf.html
index f2b816e94..0d38b8d48 100644
--- a/docs/calculus-module/2-bpf.html
+++ b/docs/calculus-module/2-bpf.html
@@ -87,7 +87,7 @@ the predicate's implementation.
CLASS_DEFINITION} bp_family;
-bp_family *BinaryPredicateFamilies::new(void) {
+bp_family *BinaryPredicateFamilies::new(void) {bp_family *f = CREATE(bp_family);f->methods = Methods::new_set();returnf;
@@ -126,17 +126,26 @@ such as "if 19 is false", where the terms of the relation do not fit.
defineNEVER_MATCH_SAYING_WHY_NOT1001 not one of the three legal *_MATCH values
§5. This is for compiling run-time code to either test, make true, or make false.
-
enumSCHEMA_BPF_MTID
+
Some constants here enumerate the three cases of what we are to do. This
+looks asymmetrical — shouldn't we also test to see whether an atom is false,
+a fourth case?
+
+
+
The answer is that there's no need, since "test false" can be done by
+compiling "test true" and then negating. No similar trick can be used to
+combine making something true or false into a single operation.
+
§1. An I6 schema is an intermediate-level code for the final stages of
compiling to Inform 6 syntax. Its "prototype" is a C string encoded as
@@ -116,13 +116,27 @@ error.
typedefstructi6_schema {wchar_tprototype_storage[TYPICAL_I6_SCHEMA_LENGTH];structtext_streamprototype;
-structinter_schema *compiled;intno_quoted_inames;
+ #ifdefCORE_MODULE
+structinter_schema *compiled;structinter_name *quoted_inames[2];
+ #endif} i6_schema;
The structure i6_schema is private to this section.
-
§3. Building schemas. The following makes up a new schema from a printf-style formatted string:
+
§3.
+
+
+typedefstructannotated_i6_schema {
+structi6_schema *schema;
+intnegate_schema; true if atom is to be tested with the opposite parity
+structpcalc_termpt0; terms on which the I6 schema is to be expanded
+structpcalc_termpt1;
+intinvolves_action_variables;
+} annotated_i6_schema;
+
+
The structure annotated_i6_schema is accessed in 2/bpf.
+
§4. Building schemas. The following makes up a new schema from a printf-style formatted string:
defineMAX_I6_SCHEMA_ATTEMPT1024 plenty of room for conjectural schema overruns
@@ -130,48 +144,54 @@ error.
intunique_qi_counter = 0;
-i6_schema *Calculus::Schemas::new(char *fmt, ...) {
+i6_schema *Calculus::Schemas::new(char *fmt, ...) {va_listap; the variable argument list signified by the dotsi6_schema *sch = CREATE(i6_schema);sch->prototype = Streams::new_buffer(TYPICAL_I6_SCHEMA_LENGTH, sch->prototype_storage);sch->no_quoted_inames = 0;text_stream *OUT = &(sch->prototype);
-Process the varargs into schema prototype text3.3;
+Process the varargs into schema prototype text4.3;va_end(ap); macro to end variable argument processing
+ #ifdefCORE_MODULEsch->compiled = InterSchemas::from_i6s(&(sch->prototype), sch->no_quoted_inames, (void **) sch->quoted_inames);
+ #endifreturnsch;}
-
§3.1. And this is a variation for modifying an existing schema:
+
§4.1. And this is a variation for modifying an existing schema:
-voidCalculus::Schemas::modify(i6_schema *sch, char *fmt, ...) {
+voidCalculus::Schemas::modify(i6_schema *sch, char *fmt, ...) {va_listap; the variable argument list signified by the dotssch->prototype = Streams::new_buffer(TYPICAL_I6_SCHEMA_LENGTH, sch->prototype_storage);sch->no_quoted_inames = 0;text_stream *OUT = &(sch->prototype);
-Process the varargs into schema prototype text3.3;
+Process the varargs into schema prototype text4.3;va_end(ap); macro to end variable argument processing
+ #ifdefCORE_MODULEsch->compiled = InterSchemas::from_i6s(&(sch->prototype), sch->no_quoted_inames, (void **) sch->quoted_inames);
+ #endif}
-
§3.2. And another:
+
§4.2. And another:
-voidCalculus::Schemas::append(i6_schema *sch, char *fmt, ...) {
+voidCalculus::Schemas::append(i6_schema *sch, char *fmt, ...) {va_listap; the variable argument list signified by the dotstext_stream *OUT = &(sch->prototype);
-Process the varargs into schema prototype text3.3;
+Process the varargs into schema prototype text4.3;va_end(ap); macro to end variable argument processing
+ #ifdefCORE_MODULEsch->compiled = InterSchemas::from_i6s(&(sch->prototype), sch->no_quoted_inames, (void **) sch->quoted_inames);
+ #endif}
-
§3.3. Either way, the schema's prototype is written as follows:
+
§4.3. Either way, the schema's prototype is written as follows:
-
Process the varargs into schema prototype text3.3 =
+
Process the varargs into schema prototype text4.3 =
§3. Initial stock. This relation is hard-wired in, and it is made in a slightly special way
+since (alone among binary predicates) it has no distinct reversal.
+
+
+
+
+
+
+
diff --git a/docs/calculus-module/2-trm.html b/docs/calculus-module/2-trm.html
index 1e2ee9d04..c9b750a35 100644
--- a/docs/calculus-module/2-trm.html
+++ b/docs/calculus-module/2-trm.html
@@ -117,7 +117,7 @@ to work it out once.
structkind *term_checked_as_kind; or NULL if unchecked} pcalc_term;
-
The structure pcalc_term is accessed in 2/ap and here.
+
The structure pcalc_term is accessed in 2/cs, 2/ap and here.
§2. The pcalc_func structure represents a usage of a function inside a term.
Terms such as \(f_A(f_B(f_C(x)))\) often occur, so a typical term might be
stored as
@@ -152,7 +152,7 @@ field is
returnpt;}
-pcalc_termCalculus::Terms::new_constant(parse_node *c) {
+pcalc_termCalculus::Terms::new_constant(parse_node *c) {pcalc_termpt; Make new blank term structure pt3.1;pt.constant = c;returnpt;
@@ -298,7 +298,7 @@ value, because this might not yet have been checked otherwise.
diff --git a/docs/calculus-module/2-up.html b/docs/calculus-module/2-up.html
index f8d32b14d..a491623e0 100644
--- a/docs/calculus-module/2-up.html
+++ b/docs/calculus-module/2-up.html
@@ -134,7 +134,7 @@ reverse its sense.
}
diff --git a/docs/calculus-module/P-htitm.html b/docs/calculus-module/P-htitm.html
index 1de798063..aa0f3fbf6 100644
--- a/docs/calculus-module/P-htitm.html
+++ b/docs/calculus-module/P-htitm.html
@@ -84,6 +84,9 @@ module:
CalculusModule::end() just before it shuts down. (But just after, and just
before, the corresponding calls to foundation.)
+
§3. REGISTER_RELATIONS_CALCULUS_CALLBACK.
+
+
diff --git a/docs/calculus-module/index.html b/docs/calculus-module/index.html
index 72d3cc9dc..f67617877 100644
--- a/docs/calculus-module/index.html
+++ b/docs/calculus-module/index.html
@@ -98,6 +98,11 @@
Unary Predicates -
A lightweight structure to record uses of an adjective, either positively or negatively.
+
+
+ Compilation Schemas -
+ To create, and later expand upon, short prototypes of I6 syntax for such run-time tasks as the setting, unsetting or testing of a relation.
+
Binary Predicate Families -
@@ -108,6 +113,11 @@
Binary Predicates -
To create and manage binary predicates, which are the underlying data structures beneath Inform's relations.
§1. This test tool uses the linguistics module, and it needs to have some
-concept of what relationships are — that is, of what might be meant by
-"X sees Y" or "X is on top of Y".
-
-
-
Inform uses a class called binary_predicate for this, but we will use a
-class simply called rel.
-
§2. linguistics also needs us to make annotation functions for one special
-annotation it uses. (It can't do this itself without knowing the type.) But
-we don't need to create the annotation or give it permissions.
-
The structure rel is accessed in 1/dgr, 3/vm and here.
-
§5. linguistics requires that whatever this is, it has to be "reversible".
-(This transposes the two terms. The reversal of "X sees Y" is "X is seen by Y".)
-
§6. linguistics also wants to know the identities of two special meanings,
-roughly those of the verbs "to be" and "to have". So it requires us to define
-these two macros:
-
This program also incorporates the following web(s) as module(s):
+
+
+ services/calculus
+ - Storing and simplifying propositions in predicate calculus.
+
services/inflections
diff --git a/docs/core-module/1-cm.html b/docs/core-module/1-cm.html
index e0a84c1cc..c64d70132 100644
--- a/docs/core-module/1-cm.html
+++ b/docs/core-module/1-cm.html
@@ -114,7 +114,6 @@ which use this module:
enumpcalc_prop_deferral_CLASSenumliteral_pattern_CLASSenumgeneralisation_CLASS
-enumi6_schema_CLASSenumlist_together_routine_CLASSenumpast_tense_condition_record_CLASSenumpast_tense_action_record_CLASS
@@ -167,6 +166,7 @@ which use this module:
enumadjective_iname_holder_CLASSenumlabel_namespace_CLASSenumcompile_task_data_CLASS
+enumcomparative_bp_data_CLASS
§3. Deep breath, then: the following macros define several hundred functions.
@@ -230,6 +230,7 @@ which use this module:
DECLARE_CLASS(adjective_iname_holder)DECLARE_CLASS(label_namespace)DECLARE_CLASS(compile_task_data)
+DECLARE_CLASS(comparative_bp_data)
§4. So much for the managed structures: now for the unmanaged structures.
diff --git a/docs/core-module/1-cp.html b/docs/core-module/1-cp.html
index 62b17146c..83f653f37 100644
--- a/docs/core-module/1-cp.html
+++ b/docs/core-module/1-cp.html
@@ -172,7 +172,7 @@ bit or the <k-kind> bit set, which as we see above is }
diff --git a/docs/core-module/1-cs.html b/docs/core-module/1-cs.html
index 71c2e91a9..c98af9387 100644
--- a/docs/core-module/1-cs.html
+++ b/docs/core-module/1-cs.html
@@ -239,7 +239,7 @@ the above settings can be changed.)
}
diff --git a/docs/core-module/1-htc.html b/docs/core-module/1-htc.html
index 0606d8b72..3a6bcac60 100644
--- a/docs/core-module/1-htc.html
+++ b/docs/core-module/1-htc.html
@@ -387,7 +387,7 @@ so on. Those absolute basics are made here.
diff --git a/docs/core-module/1-pp.html b/docs/core-module/1-pp.html
index 6e7b3ab69..7a93e8b2e 100644
--- a/docs/core-module/1-pp.html
+++ b/docs/core-module/1-pp.html
@@ -139,7 +139,7 @@ a final status indicator.
}
diff --git a/docs/core-module/1-wtc.html b/docs/core-module/1-wtc.html
index 569f89d6f..5398774a2 100644
--- a/docs/core-module/1-wtc.html
+++ b/docs/core-module/1-wtc.html
@@ -232,11 +232,11 @@ rough stages. Twenty is plenty.
returninform7_task->project->as_copy->edition;}
-parse_node_tree *Task::syntax_tree(void) {
+parse_node_tree *Task::syntax_tree(void) {returnlatest_syntax_tree;}
-inform_language *Task::language_of_syntax(void) {
+inform_language *Task::language_of_syntax(void) {returnProjects::get_language_of_syntax(Task::project());}
@@ -517,7 +517,7 @@ it can all be generated again.
}
diff --git a/docs/core-module/10-aots.html b/docs/core-module/10-aots.html
index e3fa689fd..da5bd6a4d 100644
--- a/docs/core-module/10-aots.html
+++ b/docs/core-module/10-aots.html
@@ -438,7 +438,7 @@ back into the original tree but throw away the S-node head.
}
diff --git a/docs/core-module/10-cad.html b/docs/core-module/10-cad.html
index bbaee7236..c77a3e9b3 100644
--- a/docs/core-module/10-cad.html
+++ b/docs/core-module/10-cad.html
@@ -829,7 +829,7 @@ to the kind "thing", whereas "somebody" does refer to people and
diff --git a/docs/core-module/10-cap.html b/docs/core-module/10-cap.html
index 5bfdab36a..5071c8549 100644
--- a/docs/core-module/10-cap.html
+++ b/docs/core-module/10-cap.html
@@ -502,7 +502,7 @@ limit that we were unable to construct a test case for it.
diff --git a/docs/core-module/10-varc.html b/docs/core-module/10-varc.html
index 923a0b448..0c5b61d75 100644
--- a/docs/core-module/10-varc.html
+++ b/docs/core-module/10-varc.html
@@ -586,7 +586,7 @@ pattern) plus "in the Home" (a description).
}
diff --git a/docs/core-module/11-bas.html b/docs/core-module/11-bas.html
index e653cdff3..41a9fa530 100644
--- a/docs/core-module/11-bas.html
+++ b/docs/core-module/11-bas.html
@@ -151,7 +151,7 @@ the quantifier has finished. We set the defineBOUND_VST3
-voidCalculus::Variables::determine_status(pcalc_prop *prop, int *var_states, int *valid) {
+voidCalculus::Variables::determine_status(pcalc_prop *prop, int *var_states, int *valid) {TRAVERSE_VARIABLE(p);intj, unavailable[26], blevel = 0, dummy;if (valid == NULL) valid = &dummy;
@@ -189,7 +189,7 @@ the quantifier has finished. We set the
-intCalculus::Variables::is_well_formed(pcalc_prop *prop) {
+intCalculus::Variables::is_well_formed(pcalc_prop *prop) {intstatus, var_states[26];if (Calculus::Propositions::is_syntactically_valid(prop) == FALSE) returnFALSE;Calculus::Variables::determine_status(prop, var_states, &status);
@@ -598,7 +598,7 @@ since the time with which the proposition is concerned.
}
diff --git a/docs/core-module/11-pr.html b/docs/core-module/11-pr.html
index e915efc8a..5204f02ca 100644
--- a/docs/core-module/11-pr.html
+++ b/docs/core-module/11-pr.html
@@ -930,12 +930,12 @@ created in Inform go through type-checking, so:
diff --git a/docs/core-module/11-sm.html b/docs/core-module/11-sm.html
index 1c5ff90ac..e63ce86b2 100644
--- a/docs/core-module/11-sm.html
+++ b/docs/core-module/11-sm.html
@@ -1411,7 +1411,7 @@ have no other consequence.
}
diff --git a/docs/core-module/11-tc.html b/docs/core-module/11-tc.html
index 75695d32a..848ca990c 100644
--- a/docs/core-module/11-tc.html
+++ b/docs/core-module/11-tc.html
@@ -354,7 +354,7 @@ which is by now inside the "creation proposition".
Predicate calculus is a largely symbolic exercise, and its rules of working tend to assume that all predicates are meaningful for all terms: this means, for instance, that "if blue is 14" is likely to make a well-formed sentence in predicate calculus. In this section we reject such propositions on the grounds that they violate type-checking requirements on relations -- in this example, the equality relation.
§1. We can unambiguously find the kind of value of any constant \(C\), so if a
proposition's terms are all constant then type-checking is easy. ${\it is}(4, score)$
@@ -99,47 +99,34 @@ on the stack while we work.
} variable_type_assignment;
The structure variable_type_assignment is private to this section.
-
§2. Another convenience is a sort of kit for preparing problem messages:
-
§4. A version used only for the internal testing mode, when we print the outcome
+
§3. A version used only for the internal testing mode, when we print the outcome
into the debugging log, but diverted to an I6 string in the compiled code.
§5. Type-checking whole propositions. This section provides a single routine to the rest of Inform: Calculus::Propositions::Checker::type_check.
+
§4. Type-checking whole propositions. This section provides a single routine to the rest of Inform: Calculus::Propositions::Checker::type_check.
We determine the kinds for all variables, then work through the proposition,
ensuring that every predicate-like atom has terms which match at least one
possible reading of the meaning of the atom.
@@ -150,10 +137,10 @@ sense of the proposition by changing it, it will do so.
§5.1. Finding kinds for variables. Every specification compiled by Inform has to pass through type-checking.
+
§4.1. Finding kinds for variables. Every specification compiled by Inform has to pass through type-checking.
That includes the ones which occur as constants inside propositions, and this is
where.
@@ -215,7 +202,7 @@ since it can be the subject of inferences all by itself. So it can legitimately
be a term in a proposition.
-
First make sure any constants in the proposition have themselves been typechecked5.1 =
+
First make sure any constants in the proposition have themselves been typechecked4.1 =
§4.2. If the proposition contains contradictory KIND atoms, it automatically fails
type-checking, even if there is no implication that both apply at once. This
throws out, for instance:
@@ -250,7 +237,7 @@ throws out, for instance:
treat it as a piece of nonsense, like "if Wednesday is not custard".
-
Look at KIND atoms to see what kinds of value are asserted for the variables5.2 =
+
Look at KIND atoms to see what kinds of value are asserted for the variables4.2 =
@@ -265,7 +252,7 @@ treat it as a piece of nonsense, like "if Wednesday is not custard".
if (Kinds::compatible(old_kind, new_kind) == NEVER_MATCH) {if (tck->log_to_I6_text)LOG("%c is both %u and %u\n", pcalc_vars[v], old_kind, new_kind);
-Calculus::Propositions::Checker::issue_kind_typecheck_error(old_kind, new_kind, tck, pl);
+Calculus::Propositions::Checker::issue_kind_typecheck_error(old_kind, new_kind, tck, pl);returnNEVER_MATCH; }if (Kinds::Behaviour::definite(new_kind) == FALSE) new_kind = old_kind;
@@ -274,21 +261,21 @@ treat it as a piece of nonsense, like "if Wednesday is not custard".
} }
§4.3. The following is arguably a problem which should have been thrown earlier,
but it's a very subtle one, and we want to use it only when everything else
(more or less) has worked.
-
Look at KIND atoms to reject unarticled shockers5.3 =
+
Look at KIND atoms to reject unarticled shockers4.3 =
TRAVERSE_PROPOSITION(pl, prop)if ((pl->element == KIND_ATOM) && (pl->unarticled)) {
-if (tck->log_to_I6_text)
+if (tck->log_to_I6_text)LOG("Rejecting as unarticled\n");
-if (tck->issue_error == FALSE) returnNEVER_MATCH;
+if (tck->issue_error == FALSE) returnNEVER_MATCH;Problems::quote_source(1, current_sentence);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BareKindVariable));Problems::issue_problem_segment(
@@ -302,8 +289,8 @@ but it's a very subtle one, and we want to use it only when everything else
returnNEVER_MATCH; }
§4.4. It's possible for a proposition to specify nothing about the kind of a
variable (usually a free one). If so, it's assumed to be an object. For
instance, if we define
@@ -324,7 +311,7 @@ instance, if we define
or various other kinds of value.
-
Assume any still-unfathomable variables represent objects5.4 =
+
Assume any still-unfathomable variables represent objects4.4 =
@@ -333,18 +320,18 @@ or various other kinds of value.
if (vta.assigned_kinds[j] == NULL)vta.assigned_kinds[j] = K_object;
§4.5. Type-checking enforced on predicate-like atoms. As with contradictory KIND atoms applied to variables, we will reject any
KIND atom applied to a constant if it necessarily fails — even when the
sense of the proposition is arguably correct. For example:
@@ -372,35 +359,35 @@ sense of the proposition is arguably correct. For example:
but not meaningless.
-
A KIND atom is not allowed if it can be proved to be false5.5 =
+
A KIND atom is not allowed if it can be proved to be false4.5 =
§4.7. The BP case is interesting because it forgives a failure in one case: of
\({\it is}(t, C)\), where \(C\) is a constant representing a value of an enumerated
kind. Sentence conversion is actually quite good at distinguishing these cases
and can see the difference between "the bus is red" and "the fashionable hue
@@ -411,52 +398,52 @@ Rally" is a scene rather than an object, for instance. We first try requiring
would work instead. If it would, we make the change within the proposition.
-
A binary predicate is required to apply to terms of the right kinds5.7 =
+
A binary predicate is required to apply to terms of the right kinds4.7 =
§4.9. An EVERYWHERE atom needs its term to be an object4.9 =
-kind *actually_find = Calculus::Propositions::Checker::kind_of_term(&(pl->terms[0]), &vta, tck);
+kind *actually_find = Calculus::Propositions::Checker::kind_of_term(&(pl->terms[0]), &vta, tck);if (Kinds::compatible(actually_find, K_object) == NEVER_MATCH) {
-if (tck->log_to_I6_text)
+if (tck->log_to_I6_text)LOG("Term $0 is %u not an object\n", &(pl->terms[0]), actually_find);Problems::quote_kind(4, actually_find);StandardProblems::tcp_problem(_p_(PM_EverywhereMisapplied), tck,
@@ -468,14 +455,14 @@ would work instead. If it would, we make the change within the proposition.
returnNEVER_MATCH; }
§4.10. A NOWHERE atom needs its term to be an object4.10 =
-kind *actually_find = Calculus::Propositions::Checker::kind_of_term(&(pl->terms[0]), &vta, tck);
+kind *actually_find = Calculus::Propositions::Checker::kind_of_term(&(pl->terms[0]), &vta, tck);if (Kinds::compatible(actually_find, K_object) == NEVER_MATCH) {
-if (tck->log_to_I6_text)
+if (tck->log_to_I6_text)LOG("Term $0 is %u not an object\n", &(pl->terms[0]), actually_find);Problems::quote_kind(4, actually_find);StandardProblems::tcp_problem(_p_(PM_NowhereMisapplied), tck,
@@ -486,18 +473,18 @@ would work instead. If it would, we make the change within the proposition.
returnNEVER_MATCH; }
§4.12. Not so much for the debugging log as for the internal test, in fact, which
prints the log to an I6 string. This is the type-checking report in the case
of success.
-
Show the variable assignment in the debugging log5.12 =
+
Show the variable assignment in the debugging log4.12 =
@@ -527,23 +514,23 @@ of success.
}if (c>0) LOG("\n");
§5. The kind of a term. The following routine works out the kind of value stored in a term, something
which requires contextual information: unless we know the kind of value stored
in each variable, we cannot know the kind of value a general term represents,
which is why the routine is here and not in the Terms section.
§7. The case needing attention is a term in the form \(t = f_B(s)\). By recursion
+
§6. The case needing attention is a term in the form \(t = f_B(s)\). By recursion
we can know the kind of \(s\), but we must check that \(f_B\) can validly be applied
to a value of that kind. If \(B\) is a binary predicate with domains \(R\) and \(S\)
(i.e., a subset of \(R\times S\)) then we will either have \(f_B:R\to S\) or vice
@@ -551,19 +538,19 @@ versa; so we have to check that \(s\) lies in \(R\) (or \(S\), respectively).
§8. Some relations specify a kind for their terms, others do not. When they do
+
§7. Some relations specify a kind for their terms, others do not. When they do
specify a kind of object, we usually want to be forgiving about nuances of
the kind of object — for our purposes here, any object will do. (Run-time
type checking takes care of those nuances better.)
@@ -584,27 +571,27 @@ function.
§9. Type-checking predicates. We take unary predicates first, then binary. Unary predicates are just
+
§8. Type-checking predicates. We take unary predicates first, then binary. Unary predicates are just
adjectives, and all of the work for that has already been done, so we need
only produce a problem message when the worst happens.
-intCalculus::Propositions::Checker::type_check_unary_predicate(pcalc_prop *pl, variable_type_assignment *vta,
-tc_problem_kit *tck) {
+intCalculus::Propositions::Checker::type_check_unary_predicate(pcalc_prop *pl, variable_type_assignment *vta,
+tc_problem_kit *tck) {unary_predicate *tr = RETRIEVE_POINTER_unary_predicate(pl->predicate);adjective *aph = UnaryPredicates::get_adj(tr);
-kind *K = Calculus::Propositions::Checker::kind_of_term(&(pl->terms[0]), vta, tck);
+kind *K = Calculus::Propositions::Checker::kind_of_term(&(pl->terms[0]), vta, tck);if ((aph) && (Adjectives::Meanings::applicable_to(aph, K) == FALSE)) {wordingW = Adjectives::get_nominative_singular(aph);
-if (tck->log_to_I6_text)
+if (tck->log_to_I6_text)LOG("Adjective '%W' undefined on %u\n", W, K);Problems::quote_wording(4, W);Problems::quote_kind(5, K);
@@ -619,21 +606,21 @@ only produce a problem message when the worst happens.
returnALWAYS_MATCH;}
-
§10. Binary predicates (BPs) are both easier and harder. Easier because they
+
§9. Binary predicates (BPs) are both easier and harder. Easier because they
have only one definition at a time (unlike, say, the adjective "empty"),
harder because the work hasn't already been done and because some BPs —
like "is" — are polymorphic. Here goes:
§10.1. Once again we treat any kind of object as just "object", but we do take
+
§9.1. Once again we treat any kind of object as just "object", but we do take
note that some BPs — like "is" — specify no kinds at all, and so
produce a kinds_required which is NULL.
-
Work out what kinds we should have found10.1 =
+
Work out what kinds we should have found9.1 =
@@ -692,17 +679,17 @@ produce a kinds_required kinds_required[i] = K; }
diff --git a/docs/core-module/12-ap.html b/docs/core-module/12-ap.html
index e35bc9fe9..6b4bb544d 100644
--- a/docs/core-module/12-ap.html
+++ b/docs/core-module/12-ap.html
@@ -349,8 +349,8 @@ in any case, so it doesn't matter that we wouldn't know what text to use in them
In this section, given an atom of a proposition we compile I6 code as required for any of three possible outcomes: (i) to test whether it is true, (ii) to make it henceforth true, or (iii) to make it henceforth false.
§1. The compilation method is to look at the atom, work out a suitable I6
schema involving code to be applied to the one or two terms attaching to
@@ -92,32 +92,7 @@ track of that; and also of whether a condition is being regarded
negatively.
-
-typedefstructannotated_i6_schema {
-structi6_schema *schema;
-intnegate_schema; true if atom is to be tested with the opposite parity
-structpcalc_termpt0; terms on which the I6 schema is to be expanded
-structpcalc_termpt1;
-intinvolves_action_variables;
-} annotated_i6_schema;
-
-
The structure annotated_i6_schema is accessed in 7/tur, 12/ter, 12/qr, 15/tpr, 15/cr, 15/spr2 and here.
-
§2. Some constants to enumerate the three cases of what we are to do. This
-looks asymmetrical — shouldn't we also test to see whether an atom is false,
-a fourth case?
-
-
-
The answer is that there's no need, since "test false" can be done by
-compiling "test true" and applying the I7 negation operator ~~ to the
-result. No similar trick can be used to combine making something
-true or false into a single operation.
-
§3. For its internal purposes, Inform is sometimes able to compile atoms which
+
§2. For its internal purposes, Inform is sometimes able to compile atoms which
wouldn't be allowed in a typical use of "now" from the source text; so it
can suppress the following problem messages:
@@ -126,18 +101,18 @@ can suppress the following problem messages:
intsuppress_C14CantChangeKind = FALSE;intsuppress_C14ActionVarsPastTense = FALSE;
-
§3.1.1. Issue a fallback problem message, since the schema-maker evidently didn't3.1.1 =
LOG("Failed on task: $o\n", pl);
-if (task == TEST_ATOM_TASK)
+if (task == TEST_ATOM_TASK)StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),"this is not a condition I am able to test","or at any rate not during play.");
@@ -178,15 +153,15 @@ can suppress the following problem messages:
"because it is too vague about the underlying cause which would ""need to be arranged.");
§3.2. Stage 2. A valid I6 condition has to be bracketed, so we surround the output with
brackets if testing; and a valid I6 statement has to end with a semicolon,
so we terminate with that if making true or false.
-
Stage 2: expand that schema to the output stream4.2 =
+
Stage 2: expand that schema to the output stream3.2 =
§5.1. We are now able to look at the different types of atom one at a time.
+
§4.1. We are now able to look at the different types of atom one at a time.
CALLED atoms cannot be asserted, and to test them, we simply copy the
@@ -267,22 +242,22 @@ to throw away the result of the assignment, and evaluate the condition
to true.
§4.2. In any type-checked proposition, a KIND atom can only exist where it is
always at least sometimes true. In particular, if \(K\) is a kind of value, then
the atom \(K(v)\) can only exist where \(v\) is of that kind of value, so that the
atom is always true when tested. But if \(K\) is a kind of object, then \(K(O)\)
@@ -291,14 +266,14 @@ to \(K\) at all: so there is something substantive to check, which we do using
the I6 ofclass operator.
-
Make an annotated schema for a KIND atom5.2 =
+
Make an annotated schema for a KIND atom4.2 =
switch(task) {caseTEST_ATOM_TASK:if (Kinds::Behaviour::is_subkind_of_object(pl->assert_kind))
-Calculus::Schemas::modify(sch, "*1 ofclass %n",
+Calculus::Schemas::modify(sch, "*1 ofclass %n",Kinds::RunTime::I6_classname(pl->assert_kind));else {if ((Kinds::get_construct(pl->assert_kind) == CON_list_of) && (problem_count == 0)) {
@@ -314,7 +289,7 @@ the I6 ofclass"not allowed.");Problems::issue_problem_end(); }
-Calculus::Schemas::modify(sch, "true");
+Calculus::Schemas::modify(sch, "true"); }returnasch;caseNOW_ATOM_TRUE_TASK:
@@ -323,83 +298,83 @@ the I6 ofclassStandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeKind),"the kind of something is fixed","and cannot be changed during play with a 'now'.");
-asch.schema = NULL;
- } elseCalculus::Schemas::modify(sch, " ");
+asch.schema = NULL;
+ } elseCalculus::Schemas::modify(sch, " ");returnasch; }
§4.3. An easy case. Note that FoundEverywhere is a template routine existing
to provide a common value of the I6 found_in property — common that is
to all backdrops which are currently everywhere.
-
Make an annotated schema for an EVERYWHERE atom5.3 =
+
Make an annotated schema for an EVERYWHERE atom4.3 =
switch(task) {caseTEST_ATOM_TASK:
-Calculus::Schemas::modify(sch, "BackdropEverywhere(*1)");
+Calculus::Schemas::modify(sch, "BackdropEverywhere(*1)");returnasch;caseNOW_ATOM_TRUE_TASK:
-Calculus::Schemas::modify(sch, "MoveObject(*1, FoundEverywhere); MoveFloatingObjects();");
+Calculus::Schemas::modify(sch, "MoveObject(*1, FoundEverywhere); MoveFloatingObjects();");returnasch;caseNOW_ATOM_FALSE_TASK:StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeEverywhere),"not being 'everywhere' is not something which can be changed ""during play using 'now'","because it's not exact enough about what needs to be done.");
-asch.schema = NULL; returnasch;
+asch.schema = NULL; returnasch; }
§4.5. And another. (In fact, at present HERE atoms are never included in
propositions to be compiled, so this code is never used.)
-
Make an annotated schema for a HERE atom5.5 =
+
Make an annotated schema for a HERE atom4.5 =
switch(task) {caseTEST_ATOM_TASK:
-Calculus::Schemas::modify(sch, "LocationOf(*1) == location");
+Calculus::Schemas::modify(sch, "LocationOf(*1) == location");returnasch;caseNOW_ATOM_TRUE_TASK:caseNOW_ATOM_FALSE_TASK:StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),"being 'here' is not something which can be changed during play","so it cannot be brought about or cancelled out with 'now'.");
-asch.schema = NULL; returnasch;
+asch.schema = NULL; returnasch; }
§4.7.1. When a relation \(R(x, y)\) has been simplified to \(is(x, f_R(y))\)
or \(is(g_R(x), y)\), it can be tested but not asserted true or false;
we have to re-establish \(R(x, y)\) before we can proceed.
-
Undo any functional simplification of the relation5.7.1 =
+
Undo any functional simplification of the relation4.7.1 =
-intCalculus::Atoms::Compile::atom_involves_action_variables(pcalc_prop *pl) {
+intCalculus::Atoms::Compile::atom_involves_action_variables(pcalc_prop *pl) { #ifdefIF_MODULEfor (inti=0; i<pl->arity; i++) {parse_node *operand = Calculus::Terms::constant_underlying(&(pl->terms[i]));
@@ -474,21 +449,21 @@ we have to re-establish \(R(x, y)\) before we can proceed.
returnFALSE;}
diff --git a/docs/core-module/12-cad.html b/docs/core-module/12-cad.html
index b28cb0e0a..b4be28cdd 100644
--- a/docs/core-module/12-cad.html
+++ b/docs/core-module/12-cad.html
@@ -276,7 +276,7 @@ kind is then part of the information recorded at deferral time.
-kind *Calculus::Deferrals::Cinders::kind_of_value_of_term(pcalc_termpt) {
+kind *Calculus::Deferrals::Cinders::kind_of_value_of_term(pcalc_termpt) {if (pt.variable >= 0) {if (pt.term_checked_as_kind) returnpt.term_checked_as_kind;returnK_object;
@@ -306,7 +306,7 @@ kind is then part of the information recorded at deferral time.
}
§2.1.6.1.2.3.5. Quantifiers and the Q-stack. It remains to deal with quantifiers, and to show that the Invariant is
@@ -1967,7 +1967,7 @@ then expand it into the output.
§3. Initial stock. This relation is hard-wired in, and it is made in a slightly special way
-since (alone among binary predicates) it has no distinct reversal.
-
§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
and scenes are not.
-
Allow comparison only where left domain and right domain are not disjoint4.2 =
+
Allow comparison only where left domain and right domain are not disjoint2.2 =
§7. Compilation. Since we are compiling to I6, which is itself a C-level programming
+
§5. Compilation. Since we are compiling to I6, which is itself a C-level programming
language, it looks at first as if we can compile is into == when
testing equality and = when asserting it: thus
§5.4. Make a further check that kinds permit this assignment5.4 =
@@ -444,22 +394,22 @@ lantern is bright".
"In the line %1, you seem to be asking me to put %2 into %3, ""which can't safely be done.");Problems::issue_problem_end();
-asch->schema = NULL;
+asch->schema = NULL;returnTRUE; } }
§5.5. Rather than just returning FALSE for a generic problem message, we issue
one that's more helpfully specific and return TRUE.
-
Issue problem message for being unable to set equal7.5 =
+
Issue problem message for being unable to set equal5.5 =
-if (Rvalues::to_instance(asch->pt0.constant)) {
-if (Kinds::Behaviour::is_object(Specifications::to_kind(asch->pt0.constant)))
+if (Rvalues::to_instance(asch->pt0.constant)) {
+if (Kinds::Behaviour::is_object(Specifications::to_kind(asch->pt0.constant)))StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantEquateValues),"equality is not something I can change","so either those are already the same or are different, and I "
@@ -475,8 +425,8 @@ one that's more helpfully specific and return "just as the number '7' is fixed."); }
diff --git a/docs/core-module/13-ca.html b/docs/core-module/13-ca.html
index bf5c99fbb..fab28f7bd 100644
--- a/docs/core-module/13-ca.html
+++ b/docs/core-module/13-ca.html
@@ -440,7 +440,7 @@ always be small, partly because of the need for scaling to come out right.
diff --git a/docs/core-module/13-rsfk.html b/docs/core-module/13-rsfk.html
index f2ce75ad1..868160158 100644
--- a/docs/core-module/13-rsfk.html
+++ b/docs/core-module/13-rsfk.html
@@ -120,7 +120,7 @@ kinds being compiled to an I6
-inter_name *Kinds::RunTime::I6_classname(kind *K) {
+inter_name *Kinds::RunTime::I6_classname(kind *K) {if (Kinds::Behaviour::is_object(K)) returnKinds::RunTime::iname(K);internal_error("no I6 classname available");returnNULL;
@@ -447,7 +447,7 @@ data, not merely the pointer to them, which is a "deep copy".
-text_stream *Kinds::RunTime::interpret_test_equality(kind *left, kind *right) {
+text_stream *Kinds::RunTime::interpret_test_equality(kind *left, kind *right) {LOGIF(KIND_CHECKING, "Interpreting equality test of kinds %u, %u\n", left, right);if ((Kinds::eq(left, K_truth_state)) || (Kinds::eq(right, K_truth_state)))
@@ -522,7 +522,7 @@ data, not merely the pointer to them, which is a "deep copy".
returnFALSE;}
-intKinds::RunTime::emit_cast_call(kind *from, kind *to, int *down) {
+intKinds::RunTime::emit_cast_call(kind *from, kind *to, int *down) {if (Kinds::RunTime::cast_possible(from, to)) {if (Str::len(Kinds::Behaviour::get_name_in_template_code(to)) == 0) {returnTRUE;
@@ -596,14 +596,14 @@ which might occupy up to 31 characters, the maximum length of an I6 identifier:
-voidKinds::RunTime::compile_weak_id(OUTPUT_STREAM, kind *K) {
+voidKinds::RunTime::compile_weak_id(OUTPUT_STREAM, kind *K) {if (K == NULL) { WRITE("UNKNOWN_TY"); return; }kind_constructor *con = Kinds::get_construct(K);text_stream *sn = Kinds::Constructors::name_in_template_code(con);if (Str::len(sn) > 0) WRITE("%S", sn); elseWRITE("%d", Kinds::RunTime::weak_id(K));}
-voidKinds::RunTime::emit_weak_id(kind *K) {
+voidKinds::RunTime::emit_weak_id(kind *K) {if (K == NULL) { Emit::array_iname_entry(Kinds::Constructors::UNKNOWN_iname()); return; }kind_constructor *con = Kinds::get_construct(K);inter_name *iname = Kinds::Constructors::iname(con);
@@ -611,7 +611,7 @@ which might occupy up to 31 characters, the maximum length of an I6 identifier:
elseEmit::array_numeric_entry((inter_ti) (Kinds::RunTime::weak_id(K)));}
-voidKinds::RunTime::emit_weak_id_as_val(kind *K) {
+voidKinds::RunTime::emit_weak_id_as_val(kind *K) {if (K == NULL) internal_error("cannot emit null kind as val");kind_constructor *con = Kinds::get_construct(K);inter_name *iname = Kinds::Constructors::iname(con);
@@ -668,7 +668,7 @@ turns up. This means remembering everything we've seen, using a new structure:
-voidKinds::RunTime::emit_strong_id(kind *K) {
+voidKinds::RunTime::emit_strong_id(kind *K) {runtime_kind_structure *rks = Kinds::RunTime::get_rks(K);if (rks) {Emit::array_iname_entry(rks->rks_iname);
@@ -677,7 +677,7 @@ turns up. This means remembering everything we've seen, using a new structure:
}}
-voidKinds::RunTime::emit_strong_id_as_val(kind *K) {
+voidKinds::RunTime::emit_strong_id_as_val(kind *K) {runtime_kind_structure *rks = Kinds::RunTime::get_rks(K);if (rks) {Produce::val_iname(Emit::tree(), K_value, rks->rks_iname);
@@ -700,7 +700,7 @@ here except as a result of recursion.
-runtime_kind_structure *Kinds::RunTime::get_rks(kind *K) {
+runtime_kind_structure *Kinds::RunTime::get_rks(kind *K) {kind *divert = Kinds::Behaviour::stored_as(K);if (divert) K = divert;runtime_kind_structure *rks = NULL;
@@ -772,14 +772,14 @@ values for kinds, since both involve tracking constructions uniquely.
-inter_name *Kinds::RunTime::compile_default_value_inner(kind *K) {
+inter_name *Kinds::RunTime::compile_default_value_inner(kind *K) {Kinds::RunTime::precompile_default_value(K);runtime_kind_structure *rks = Kinds::RunTime::get_rks(K);if (rks == NULL) returnNULL;returnrks->rks_dv_iname;}
-intKinds::RunTime::precompile_default_value(kind *K) {
+intKinds::RunTime::precompile_default_value(kind *K) {runtime_kind_structure *rks = Kinds::RunTime::get_rks(K);if (rks == NULL) returnFALSE;rks->make_default = TRUE;
@@ -825,7 +825,7 @@ recursively scanned through for us, so that if we have seen a construction
-voidKinds::RunTime::compile_structures(void) {
+voidKinds::RunTime::compile_structures(void) {runtime_kind_structure *rks;LOOP_OVER(rks, runtime_kind_structure) {kind *K = rks->kind_described;
@@ -975,7 +975,7 @@ how the job is done.
inttotal_heap_allocation = 0;
-voidKinds::RunTime::ensure_basic_heap_present(void) {
+voidKinds::RunTime::ensure_basic_heap_present(void) {total_heap_allocation += 256; enough for the initial free-space block}
@@ -985,7 +985,7 @@ property values, table entries, list items) of pointer-value kinds:
@@ -1032,7 +1032,7 @@ list of 20 texts. For the cases above, it's always 1.
intstack_offset;} heap_allocation;
-heap_allocationKinds::RunTime::make_heap_allocation(kind *K, intmultiplier,
+heap_allocationKinds::RunTime::make_heap_allocation(kind *K, intmultiplier,intstack_offset) {if (Kinds::Behaviour::uses_pointer_values(K) == FALSE)internal_error("unable to allocate heap storage for this kind of value");
@@ -1050,7 +1050,7 @@ list of 20 texts. For the cases above, it's always 1.
returnha;}
-voidKinds::RunTime::emit_heap_allocation(heap_allocationha) {
+voidKinds::RunTime::emit_heap_allocation(heap_allocationha) {if (ha.stack_offset >= 0) {inter_name *iname = Hierarchy::find(BLKVALUECREATEONSTACK_HL);Produce::inv_call_iname(Emit::tree(), iname);
@@ -1077,7 +1077,7 @@ list of 20 texts. For the cases above, it's always 1.
defineBLK_FLAG_TRUNCMULT0x00000010
-voidKinds::RunTime::emit_block_value_header(kind *K, intindividual, intsize) {
+voidKinds::RunTime::emit_block_value_header(kind *K, intindividual, intsize) {if (individual == FALSE) Emit::array_numeric_entry(0);intn = 0, c = 1, w = 4;if (TargetVMs::is_16_bit(Task::vm())) w = 2;
@@ -1099,7 +1099,7 @@ each such kind, and needed at run-time.
-intKinds::RunTime::base_represented_in_inter(kind *K) {
+intKinds::RunTime::base_represented_in_inter(kind *K) {if ((Kinds::Behaviour::is_kind_of_kind(K) == FALSE) && (Kinds::is_proper_constructor(K) == FALSE) && (K != K_void) &&
@@ -1120,7 +1120,7 @@ each such kind, and needed at run-time.
defineMAX_KIND_ARITY32
-inter_name *Kinds::RunTime::iname(kind *K) {
+inter_name *Kinds::RunTime::iname(kind *K) {if (Kinds::RunTime::base_represented_in_inter(K) == FALSE) {kind_interaction *KI;LOOP_OVER(KI, kind_interaction)
@@ -1232,7 +1232,7 @@ each such kind, and needed at run-time.
intobject_kind_count = 1;
-inter_name *Kinds::RunTime::iname_inner(kind *K) {
+inter_name *Kinds::RunTime::iname_inner(kind *K) {if (Kinds::is_proper_constructor(K)) {returnKinds::RunTime::constructed_kind_name(K); }
@@ -1242,7 +1242,7 @@ each such kind, and needed at run-time.
returnNULL;}
-inter_name *Kinds::RunTime::assure_iname_exists(kind *K) {
+inter_name *Kinds::RunTime::assure_iname_exists(kind *K) {noun *nt = Kinds::Behaviour::get_noun(K);if (nt) {if (UseNouns::iname_set(nt) == FALSE) {
@@ -1289,7 +1289,7 @@ each such kind, and needed at run-time.
}}
-voidKinds::RunTime::kind_declarations(void) {
+voidKinds::RunTime::kind_declarations(void) {kind *K; inter_tic = 0;LOOP_OVER_BASE_KINDS(K)if (Kinds::RunTime::base_represented_in_inter(K)) {
@@ -1300,12 +1300,12 @@ each such kind, and needed at run-time.
}}
-voidKinds::RunTime::compile_nnci(inter_name *name, intval) {
+voidKinds::RunTime::compile_nnci(inter_name *name, intval) {Emit::named_numeric_constant(name, (inter_ti) val);Hierarchy::make_available(Emit::tree(), name);}
-voidKinds::RunTime::compile_instance_counts(void) {
+voidKinds::RunTime::compile_instance_counts(void) {kind *K;LOOP_OVER_BASE_KINDS(K) {if ((Kinds::Behaviour::is_an_enumeration(K)) || (Kinds::Behaviour::is_object(K))) {
@@ -1334,7 +1334,7 @@ each such kind, and needed at run-time.
Kinds::RunTime::compile_nnci(Hierarchy::find(RNG_SEED_AT_START_OF_PLAY_HL), Task::rng_seed());}
-voidKinds::RunTime::compile_data_type_support_routines(void) {
+voidKinds::RunTime::compile_data_type_support_routines(void) {kind *K;LOOP_OVER_BASE_KINDS(K) {if (Kinds::Behaviour::is_subkind_of_object(K)) continue;
@@ -2097,7 +2097,7 @@ Z-machine array space.
diff --git a/docs/core-module/14-cfs.html b/docs/core-module/14-cfs.html
index 67428f29f..57ad27965 100644
--- a/docs/core-module/14-cfs.html
+++ b/docs/core-module/14-cfs.html
@@ -200,7 +200,7 @@ a value in a context where a particular kind of value is expected:
-voidSpecifications::Compiler::emit_to_kind(parse_node *value, kind *K_wanted) {
+voidSpecifications::Compiler::emit_to_kind(parse_node *value, kind *K_wanted) {Kinds::RunTime::notify_of_use(K_wanted);kind *K_found = Specifications::to_kind(value);Kinds::RunTime::notify_of_use(K_found);
@@ -278,13 +278,13 @@ a value in a context where a particular kind of value is expected:
Emit::array_generic_entry(v1, v2);}
-voidSpecifications::Compiler::emit_as_val(kind *K, parse_node *spec) {
+voidSpecifications::Compiler::emit_as_val(kind *K, parse_node *spec) {value_holsterVH = Holsters::new(INTER_VAL_VHMODE);Specifications::Compiler::compile_inner(&VH, spec);}
diff --git a/docs/core-module/14-cn.html b/docs/core-module/14-cn.html
index 342534ac5..8aeb723d3 100644
--- a/docs/core-module/14-cn.html
+++ b/docs/core-module/14-cn.html
@@ -447,7 +447,7 @@ type-checker won't allow these specifications to be compiled anywhere else.
-kind *Rvalues::to_kind(parse_node *spec) {
+kind *Rvalues::to_kind(parse_node *spec) {if (spec == NULL) internal_error("Rvalues::to_kind on NULL");switch (Node::get_type(spec)) {caseCONSTANT_NT:
@@ -684,7 +684,7 @@ some problem message.
-voidRvalues::compile(value_holster *VH, parse_node *spec_found) {
+voidRvalues::compile(value_holster *VH, parse_node *spec_found) {switch(Node::get_type(spec_found)) {casePHRASE_TO_DECIDE_VALUE_NT:Invocations::Compiler::compile_invocation_list(VH,
@@ -942,7 +942,7 @@ in several contexts by using a tilde:
diff --git a/docs/core-module/14-sp.html b/docs/core-module/14-sp.html
index 6e62aa282..31ae768f2 100644
--- a/docs/core-module/14-sp.html
+++ b/docs/core-module/14-sp.html
@@ -96,7 +96,7 @@ for creating and using them.
returnDescriptions::from_kind(K, FALSE);}
-kind *Specifications::to_kind(parse_node *spec) {
+kind *Specifications::to_kind(parse_node *spec) {if (Node::is(spec, AMBIGUITY_NT)) spec = spec->down;if (Specifications::is_description(spec))returnDescriptions::to_kind(spec);
@@ -413,7 +413,7 @@ meaning could be found.
}
diff --git a/docs/core-module/15-cp.html b/docs/core-module/15-cp.html
index d61e9238d..b48b50809 100644
--- a/docs/core-module/15-cp.html
+++ b/docs/core-module/15-cp.html
@@ -232,12 +232,12 @@ becomes the name of a property.
-intProperties::Conditions::name_can_coincide_with_property(kind *K) {
+intProperties::Conditions::name_can_coincide_with_property(kind *K) {if (K == NULL) returnFALSE;returnK->construct->can_coincide_with_property;}
-property *Properties::Conditions::get_coinciding_property(kind *K) {
+property *Properties::Conditions::get_coinciding_property(kind *K) {if (K == NULL) returnNULL;returnK->construct->coinciding_property;}
@@ -248,7 +248,7 @@ becomes the name of a property.
}
diff --git a/docs/core-module/15-cr.html b/docs/core-module/15-cr.html
index c4844b5a3..33d3d7378 100644
--- a/docs/core-module/15-cr.html
+++ b/docs/core-module/15-cr.html
@@ -106,29 +106,44 @@ the previous section.
Properties::Measurement::create_comparatives(); }}
+
+typedefstructcomparative_bp_data {
+structproperty *comparative_property; (if right way) if a comparative adjective
+intcomparison_sign; ...and +1 or -1 according to sign of definition
+CLASS_DEFINITION
+} comparative_bp_data;
+
+voidProperties::ComparativeRelations::initialise(binary_predicate *bp,
+intsign, property *prn) {
+comparative_bp_data *D = CREATE(comparative_bp_data);
+D->comparison_sign = sign; D->comparative_property = prn;
+bp->family_specific = STORE_POINTER_comparative_bp_data(D);
+}
+
The structure comparative_bp_data is private to this section.
§3. Typechecking. Because of the ambiguity between absolute and relative comparisons (see
below), we'll typecheck this asymmetrically; the left term is typechecked
as usual, but the right is more leniently handled.
-intProperties::ComparativeRelations::REL_typecheck(bp_family *self, binary_predicate *bp,
-kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
+intProperties::ComparativeRelations::REL_typecheck(bp_family *self, binary_predicate *bp,
+kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {if ((kinds_required[0]) && (Kinds::compatible(kinds_of_terms[0], kinds_required[0]) == NEVER_MATCH)) {LOG("Term 0 is %u not %u\n", kinds_of_terms[0], kinds_required[0]);
-Calculus::Propositions::Checker::issue_bp_typecheck_error(bp,
+Calculus::Propositions::Checker::issue_bp_typecheck_error(bp,kinds_of_terms[0], kinds_of_terms[1], tck);returnNEVER_MATCH; }property *prn = Properties::Conditions::get_coinciding_property(kinds_of_terms[1]);
-if ((prn) && (prn != bp->comparative_property)) {
-if (tck->log_to_I6_text)
-LOG("Comparative misapplied to $Y not $Y\n", prn, bp->comparative_property);
-Problems::quote_property(4, bp->comparative_property);
+comparative_bp_data *D = RETRIEVE_POINTER_comparative_bp_data(bp->family_specific);
+if ((prn) && (prn != D->comparative_property)) {
+if (tck->log_to_I6_text)
+LOG("Comparative misapplied to $Y not $Y\n", prn, D->comparative_property);
+Problems::quote_property(4, D->comparative_property);Problems::quote_property(5, prn);StandardProblems::tcp_problem(_p_(PM_ComparativeMisapplied), tck,"that ought to make a comparison of %4 not %5.");
@@ -140,7 +155,7 @@ as usual, but the right is more leniently handled.
§4. Assertion.
-intProperties::ComparativeRelations::REL_assert(bp_family *self, binary_predicate *bp,
+intProperties::ComparativeRelations::REL_assert(bp_family *self, binary_predicate *bp,inference_subject *infs0, parse_node *spec0,inference_subject *infs1, parse_node *spec1) {returnFALSE;
@@ -150,9 +165,9 @@ as usual, but the right is more leniently handled.
-intProperties::ComparativeRelations::REL_compile(bp_family *self, inttask, binary_predicate *bp,
-annotated_i6_schema *asch) {
-if (task == TEST_ATOM_TASK)
+intProperties::ComparativeRelations::REL_compile(bp_family *self, inttask, binary_predicate *bp,
+annotated_i6_schema *asch) {
+if (task == TEST_ATOM_TASK)Rewrite the annotated schema if it turns out to be an absolute comparison5.1;returnFALSE;}
@@ -174,15 +189,16 @@ so symmetrically; we rewrite the annotated schema on the fly.
§13.2. The relation arising from "tall" would be called the "tallness relation", for
@@ -651,10 +651,10 @@ behaviour despite being of mutually incompatible kinds.)
WRITE_TO(relname, "%V", quiddity);bp = BinaryPredicates::make_pair(property_comparison_bp_family,BinaryPredicates::new_term(NULL), BinaryPredicates::new_term(NULL),
-relname, NULL, NULL, NULL,
+relname, NULL, NULL,schema_to_compare_property_values, WordAssemblages::lit_1(quiddity));DISCARD_TEXT(relname)
-BinaryPredicates::set_comparison_details(bp, mdef->region_shape, mdef->prop);
+Properties::ComparativeRelations::initialise(bp, mdef->region_shape, mdef->prop);Properties::Measurement::register_comparative(comparative_form, bp);
diff --git a/docs/core-module/15-pov.html b/docs/core-module/15-pov.html
index dd899b646..d838ee9aa 100644
--- a/docs/core-module/15-pov.html
+++ b/docs/core-module/15-pov.html
@@ -177,7 +177,7 @@ and it seems best to reject the extra complexity needed.
diff --git a/docs/core-module/15-pr.html b/docs/core-module/15-pr.html
index e884023da..b17dadf07 100644
--- a/docs/core-module/15-pr.html
+++ b/docs/core-module/15-pr.html
@@ -813,7 +813,7 @@ we find it, we compile it and return §26. Emitting to Inter.
-inter_name *Properties::iname(property *prn) {
+inter_name *Properties::iname(property *prn) {if (prn == NULL) internal_error("tried to find iname for null property");if ((Properties::is_either_or(prn)) && (prn->stored_in_negation))returnProperties::iname(Properties::EitherOr::get_negation(prn));
@@ -916,7 +916,7 @@ we find it, we compile it and return }
diff --git a/docs/core-module/15-ps.html b/docs/core-module/15-ps.html
index ef39096a1..a112eda35 100644
--- a/docs/core-module/15-ps.html
+++ b/docs/core-module/15-ps.html
@@ -159,9 +159,6 @@ a noun, we write it in the formal way "taking action".
<activity-name-formal>::=...activity
-<relation-name-formal>::=
-...relation
-
<rule-name-formal>::=...rule
@@ -229,7 +226,7 @@ production of <has-property-name>.
@@ -223,7 +225,7 @@ truncate to a reasonable length, ensuring that the result doesn't exceed
}
diff --git a/docs/core-module/15-spr2.html b/docs/core-module/15-spr2.html
index 47d8e79cd..3125b14a1 100644
--- a/docs/core-module/15-spr2.html
+++ b/docs/core-module/15-spr2.html
@@ -124,7 +124,7 @@ therefore store the text of the property name (say, "weight") in
binary_predicate *bp = BinaryPredicates::make_pair(property_setting_bp_family,BinaryPredicates::new_term(Kinds::Knowledge::as_subject(K_object)),BinaryPredicates::new_term(NULL),
-I"set-property", NULL, NULL, NULL, NULL, WordAssemblages::lit_0());
+I"set-property", NULL, NULL, NULL, WordAssemblages::lit_0());bp->property_pending_text = W;bp->reversal->property_pending_text = W;returnbp;
@@ -226,9 +226,9 @@ and simplicity.
intProperties::SettingRelations::REL_typecheck(bp_family *self, binary_predicate *bp,
-kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {
+kind **kinds_of_terms, kind **kinds_required, tc_problem_kit *tck) {property *prn = bp->set_property;kind *val_kind = Properties::Valued::kind(prn);Require the value to be type-safe for storage in the property9.1;
@@ -341,21 +341,21 @@ be caught later on Inform's run.
diff --git a/docs/core-module/15-tpr.html b/docs/core-module/15-tpr.html
index 5e1d163ae..80401234a 100644
--- a/docs/core-module/15-tpr.html
+++ b/docs/core-module/15-tpr.html
@@ -106,7 +106,7 @@ grant permission to hold a property within the world model.
R_provision =BinaryPredicates::make_pair(provision_bp_family,BinaryPredicates::new_term(NULL), BinaryPredicates::new_term(NULL),
-I"provides", NULL, NULL, NULL, NULL,
+I"provides", NULL, NULL, NULL,PreformUtilities::wording(<relation-names>, PROVISION_RELATION_NAME));BinaryPredicates::set_index_details(R_provision, "value", "property"); }
@@ -119,7 +119,7 @@ The right term, of course, has to be a property.
diff --git a/docs/core-module/16-is.html b/docs/core-module/16-is.html
index fce13376f..b2d94ea30 100644
--- a/docs/core-module/16-is.html
+++ b/docs/core-module/16-is.html
@@ -135,6 +135,11 @@ words, we often want to know what a given subject S inherits from, but we never
ask what other subjects inherit from S.
+
+
+
+
+
+
+
diff --git a/docs/core-module/16-pp.html b/docs/core-module/16-pp.html
index 5670f88eb..530c50db7 100644
--- a/docs/core-module/16-pp.html
+++ b/docs/core-module/16-pp.html
@@ -329,7 +329,7 @@ property — when indexing who can own it.
}
diff --git a/docs/core-module/17-rs.html b/docs/core-module/17-rs.html
index e10ffa380..bd0618270 100644
--- a/docs/core-module/17-rs.html
+++ b/docs/core-module/17-rs.html
@@ -585,7 +585,7 @@ text to assert a change:
§10.
-intStrings::get_marker_from_response_spec(parse_node *rs) {
+intStrings::get_marker_from_response_spec(parse_node *rs) {if (Rvalues::is_CONSTANT_of_kind(rs, K_response)) {wordingSW = Node::get_text(rs);if ((Wordings::length(SW) >= 2) && (<response-letter>(Wordings::one_word(Wordings::last_wn(SW)-1))))
@@ -609,7 +609,7 @@ but to something like an XML description of its metadata, where again the
text needs to be printed in a particular way.
-voidStrings::compile_general(value_holster *VH, parse_node *str) {
+voidStrings::compile_general(value_holster *VH, parse_node *str) {wordingSW = Node::get_text(str);if (Annotations::read_int(str, explicit_literal_ANNOT)) {if (Node::get_explicit_iname(str)) {
@@ -692,7 +692,7 @@ text needs to be printed in a particular way.
@@ -159,7 +159,7 @@ the table reference for any successful lookup.
}
diff --git a/docs/core-module/19-rsft.html b/docs/core-module/19-rsft.html
index 1443f2e20..be0ec8e4e 100644
--- a/docs/core-module/19-rsft.html
+++ b/docs/core-module/19-rsft.html
@@ -463,7 +463,7 @@ should return FALSE}
diff --git a/docs/core-module/19-tb.html b/docs/core-module/19-tb.html
index d763d2c7b..cd689947d 100644
--- a/docs/core-module/19-tb.html
+++ b/docs/core-module/19-tb.html
@@ -1732,7 +1732,7 @@ given extension:
}
diff --git a/docs/core-module/19-tc.html b/docs/core-module/19-tc.html
index 3ed1d6d01..28d01769f 100644
--- a/docs/core-module/19-tc.html
+++ b/docs/core-module/19-tc.html
@@ -689,7 +689,7 @@ happens:
}
diff --git a/docs/core-module/2-pwst.html b/docs/core-module/2-pwst.html
index ee70f6ae7..e5b15d8e9 100644
--- a/docs/core-module/2-pwst.html
+++ b/docs/core-module/2-pwst.html
@@ -485,7 +485,7 @@ group.
}
diff --git a/docs/core-module/2-si.html b/docs/core-module/2-si.html
index ae75b7669..eb297c93d 100644
--- a/docs/core-module/2-si.html
+++ b/docs/core-module/2-si.html
@@ -208,19 +208,19 @@ table we are in, yet still only cite a small part of it —
-voidStandardProblems::tcp_problem(SIGIL_ARGUMENTS, tc_problem_kit *tck, char *prototype) {
-if (tck->issue_error) {
+voidStandardProblems::tcp_problem(SIGIL_ARGUMENTS, tc_problem_kit *tck, char *prototype) {
+if (tck->issue_error) {ACT_ON_SIGILProblems::quote_source(1, current_sentence);
-Problems::quote_wording(2, tck->ew_text);
-Problems::quote_text(3, tck->intention);
+Problems::quote_wording(2, tck->ew_text);
+Problems::quote_text(3, tck->intention);Problems::issue_problem_begin(Task::syntax_tree(), "");Problems::issue_problem_segment("In the sentence %1, it looks as if you intend '%2' to %3, but ");Problems::issue_problem_segment(prototype);Problems::issue_problem_end(); }
-tck->flag_problem = TRUE;
+tck->flag_problem = TRUE;}
§7. Instance problems. Instances can be created rather indirectly (for instance, in the course of
@@ -417,7 +417,7 @@ own quaint syntax, and where there is syntax, there are error messages:
}
diff --git a/docs/core-module/2-sq.html b/docs/core-module/2-sq.html
index 6b87e8f56..10ea8e144 100644
--- a/docs/core-module/2-sq.html
+++ b/docs/core-module/2-sq.html
@@ -80,7 +80,7 @@ wouldn't auto-predeclare them; and there aren't so very many of them.)
voidProblems::expand_spec(OUTPUT_STREAM, void *p) {Specifications::write_out_in_English(OUT, (parse_node *) p);}
-voidProblems::quote_relation(intt, binary_predicate *p) {
+voidProblems::quote_relation(intt, binary_predicate *p) {Problems::problem_quote(t, (void *) p, Problems::expand_relation);}voidProblems::expand_relation(OUTPUT_STREAM, void *p) {
@@ -176,7 +176,7 @@ this as some kind of marginal will-never-happen case.
diff --git a/docs/core-module/2-up.html b/docs/core-module/2-up.html
index 9465dbfa7..21cbc8dcf 100644
--- a/docs/core-module/2-up.html
+++ b/docs/core-module/2-up.html
@@ -373,7 +373,7 @@ a message which diagnoses the problem rather better.
}
diff --git a/docs/core-module/20-eq.html b/docs/core-module/20-eq.html
index 9bd8ebba4..c41bf6c77 100644
--- a/docs/core-module/20-eq.html
+++ b/docs/core-module/20-eq.html
@@ -2521,7 +2521,7 @@ parse the equation, then rearrange to solve it for each variable in turn.
}
diff --git a/docs/core-module/21-ac.html b/docs/core-module/21-ac.html
index 8a38a9180..3d45a8ab8 100644
--- a/docs/core-module/21-ac.html
+++ b/docs/core-module/21-ac.html
@@ -783,7 +783,7 @@ values, of the kind to which the activity applies.
}
diff --git a/docs/core-module/21-fao.html b/docs/core-module/21-fao.html
index 42cb8f21a..e68a9bd64 100644
--- a/docs/core-module/21-fao.html
+++ b/docs/core-module/21-fao.html
@@ -621,7 +621,7 @@ can be used in a void context as a sort of return-from-rule phrase.
}
diff --git a/docs/core-module/21-rb.html b/docs/core-module/21-rb.html
index 88dbc3cc8..3807e129a 100644
--- a/docs/core-module/21-rb.html
+++ b/docs/core-module/21-rb.html
@@ -1184,7 +1184,7 @@ its rule requires:
#endif
diff --git a/docs/core-module/21-rl.html b/docs/core-module/21-rl.html
index c0cc6f4f0..a4c4cd75c 100644
--- a/docs/core-module/21-rl.html
+++ b/docs/core-module/21-rl.html
@@ -1181,7 +1181,7 @@ optionally be used.)
diff --git a/docs/core-module/21-sv.html b/docs/core-module/21-sv.html
index 63ace35e6..4f8e86882 100644
--- a/docs/core-module/21-sv.html
+++ b/docs/core-module/21-sv.html
@@ -369,7 +369,7 @@ function togglePopup(material_id) {
}
diff --git a/docs/core-module/22-cs.html b/docs/core-module/22-cs.html
index 5d850c693..b93118d11 100644
--- a/docs/core-module/22-cs.html
+++ b/docs/core-module/22-cs.html
@@ -593,7 +593,7 @@ can be called multiple times in the course of the evening.)
}
diff --git a/docs/core-module/22-dptd.html b/docs/core-module/22-dptd.html
index 3bfef051b..190f00428 100644
--- a/docs/core-module/22-dptd.html
+++ b/docs/core-module/22-dptd.html
@@ -1226,7 +1226,7 @@ in exactly one place: for example,
diff --git a/docs/core-module/22-ph.html b/docs/core-module/22-ph.html
index 71bf95298..7830b23ed 100644
--- a/docs/core-module/22-ph.html
+++ b/docs/core-module/22-ph.html
@@ -588,7 +588,7 @@ response to "requests". All other phrases are compiled just once.
}
diff --git a/docs/core-module/22-pi.html b/docs/core-module/22-pi.html
index 421b00ab1..a72899fd5 100644
--- a/docs/core-module/22-pi.html
+++ b/docs/core-module/22-pi.html
@@ -338,7 +338,7 @@ above, it may as well go here.
}
diff --git a/docs/core-module/22-po.html b/docs/core-module/22-po.html
index f6178de89..40ee296e2 100644
--- a/docs/core-module/22-po.html
+++ b/docs/core-module/22-po.html
@@ -402,7 +402,7 @@ by "and":
-local_variable *LocalVariables::ensure_called_local(wordingW, kind *K) {
+local_variable *LocalVariables::ensure_called_local(wordingW, kind *K) {ph_stack_frame *phsf = Frames::current_stack_frame();if (phsf == NULL) returnNULL; in case callings are made from parsing alone<new-called-name>(W);
@@ -1363,7 +1363,7 @@ need in the compilation of any given routine:
}
diff --git a/docs/core-module/24-pb.html b/docs/core-module/24-pb.html
index 16551ba44..6f7951bdb 100644
--- a/docs/core-module/24-pb.html
+++ b/docs/core-module/24-pb.html
@@ -372,7 +372,7 @@ phrase:
}
diff --git a/docs/core-module/24-sf.html b/docs/core-module/24-sf.html
index bfc673b59..d202917da 100644
--- a/docs/core-module/24-sf.html
+++ b/docs/core-module/24-sf.html
@@ -260,7 +260,7 @@ reference to the past.
LOGIF(LOCAL_VARIABLES, "Stack frame determines past\n");}
-intFrames::used_for_past_tense(void) {
+intFrames::used_for_past_tense(void) {ph_stack_frame *phsf = Frames::current_stack_frame();if (phsf == NULL) returnFALSE;if (phsf->determines_past_conditions) returnTRUE;
@@ -338,8 +338,8 @@ The following is the routine called to make this note.
voidFrames::emit_allocation(kind *K) {pointer_allocation *pall = Frames::add_allocation(K, NULL);
-i6_schema *all_sch = Calculus::Schemas::new("%S", pall->escaped_local_reference_code);
-Calculus::Schemas::emit_expand_from_terms(all_sch, NULL, NULL, FALSE);
+i6_schema *all_sch = Calculus::Schemas::new("%S", pall->escaped_local_reference_code);
+Calculus::Schemas::emit_expand_from_terms(all_sch, NULL, NULL, FALSE);}
§14.1. The following works out a call to BlkValueCreate which will return a
@@ -404,7 +404,7 @@ a subarray of short blocks, indexed by the offset.
}
diff --git a/docs/core-module/25-ci.html b/docs/core-module/25-ci.html
index b733abe6b..163b72095 100644
--- a/docs/core-module/25-ci.html
+++ b/docs/core-module/25-ci.html
@@ -826,7 +826,7 @@ stop automatically generates a newline:
diff --git a/docs/core-module/25-ciac.html b/docs/core-module/25-ciac.html
index afcd248c5..5da7c0a7c 100644
--- a/docs/core-module/25-ciac.html
+++ b/docs/core-module/25-ciac.html
@@ -165,7 +165,7 @@ then follow, and finally the optional bitmap of phrase options.
-voidRoutines::end(packaging_statesave) {
+voidRoutines::end(packaging_statesave) {kind *R_kind = LocalVariables::deduced_function_kind(currently_compiling_in_frame);inter_name *kernel_name = NULL, *public_name = currently_compiling_iname;
@@ -302,7 +302,7 @@ after the call parameters, and is used only as a scratch variable.
diff --git a/docs/core-module/3-ar.html b/docs/core-module/3-ar.html
index d8849be74..02ac8bb51 100644
--- a/docs/core-module/3-ar.html
+++ b/docs/core-module/3-ar.html
@@ -229,7 +229,7 @@ conclusion we would have reached.
}
diff --git a/docs/core-module/3-bv.html b/docs/core-module/3-bv.html
index 83d0508ed..ddfe1010a 100644
--- a/docs/core-module/3-bv.html
+++ b/docs/core-module/3-bv.html
@@ -240,7 +240,7 @@ anything. We need to give the build-in "verb-means" meaning to "to mean":
diff --git a/docs/core-module/3-cs.html b/docs/core-module/3-cs.html
index d10c5eda1..9c9d2a904 100644
--- a/docs/core-module/3-cs.html
+++ b/docs/core-module/3-cs.html
@@ -436,7 +436,7 @@ property of something.
}
diff --git a/docs/core-module/3-ptmn.html b/docs/core-module/3-ptmn.html
index 598a28950..c78b498e6 100644
--- a/docs/core-module/3-ptmn.html
+++ b/docs/core-module/3-ptmn.html
@@ -384,7 +384,7 @@ followed by double-quoted text is a note for the telemetry file.
}
diff --git a/docs/core-module/4-dbtr.html b/docs/core-module/4-dbtr.html
index f13d262ea..50f5a9251 100644
--- a/docs/core-module/4-dbtr.html
+++ b/docs/core-module/4-dbtr.html
@@ -612,7 +612,7 @@ also ordinary sentences about the property value, and the former won't.
diff --git a/docs/core-module/4-dlr.html b/docs/core-module/4-dlr.html
index 3959786b0..99ea0fbdc 100644
--- a/docs/core-module/4-dlr.html
+++ b/docs/core-module/4-dlr.html
@@ -179,7 +179,7 @@ modifiers and a pointer to a Preform nonterminal if one has been named.
}
diff --git a/docs/core-module/4-nar.html b/docs/core-module/4-nar.html
index fdbb493ab..7af50c4c4 100644
--- a/docs/core-module/4-nar.html
+++ b/docs/core-module/4-nar.html
@@ -120,7 +120,7 @@ matches:
}
diff --git a/docs/core-module/4-nar2.html b/docs/core-module/4-nar2.html
index 343b8c28f..82f27f3a2 100644
--- a/docs/core-module/4-nar2.html
+++ b/docs/core-module/4-nar2.html
@@ -116,7 +116,7 @@ function togglePopup(material_id) {
}
diff --git a/docs/core-module/4-nlpr.html b/docs/core-module/4-nlpr.html
index 2ee714c71..b3175354a 100644
--- a/docs/core-module/4-nlpr.html
+++ b/docs/core-module/4-nlpr.html
@@ -464,7 +464,7 @@ by a bracketed list of up to three options in any order.
}
diff --git a/docs/core-module/4-npr.html b/docs/core-module/4-npr.html
index 77d38a8b6..a3b695ae2 100644
--- a/docs/core-module/4-npr.html
+++ b/docs/core-module/4-npr.html
@@ -652,7 +652,7 @@ there would be horrible ambiguities in parsing.
diff --git a/docs/core-module/4-nrr.html b/docs/core-module/4-nrr.html
index bf725e16d..2c63abc52 100644
--- a/docs/core-module/4-nrr.html
+++ b/docs/core-module/4-nrr.html
@@ -127,7 +127,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.");elseNode::set_new_relation_here(V->next,
-BinaryPredicates::make_pair_sketchily(
+BinaryPredicates::make_pair_sketchily(explicit_bp_family,WordAssemblages::from_wording(RW), Relation_OtoO));returnTRUE; }
@@ -450,7 +450,7 @@ at this moment, and have no currency beyond that context.
}
diff --git a/docs/core-module/4-nuor.html b/docs/core-module/4-nuor.html
index 065483bc4..c7960b0e9 100644
--- a/docs/core-module/4-nuor.html
+++ b/docs/core-module/4-nuor.html
@@ -383,7 +383,7 @@ by hand with a sentence in the source text.
diff --git a/docs/core-module/4-nvr.html b/docs/core-module/4-nvr.html
index a0c270452..05d436a3a 100644
--- a/docs/core-module/4-nvr.html
+++ b/docs/core-module/4-nvr.html
@@ -677,7 +677,7 @@ in the case of ambiguity, with lower numbers preferred. See
diff --git a/docs/core-module/4-pr.html b/docs/core-module/4-pr.html
index 917d1d17a..439df1bbc 100644
--- a/docs/core-module/4-pr.html
+++ b/docs/core-module/4-pr.html
@@ -144,7 +144,7 @@ text anyway, so the following problem messages are not too gratuitous.
diff --git a/docs/core-module/4-rpr.html b/docs/core-module/4-rpr.html
index 567dabc04..990eb82f5 100644
--- a/docs/core-module/4-rpr.html
+++ b/docs/core-module/4-rpr.html
@@ -554,7 +554,7 @@ a given rule appears in, and (within limits) where. A simple example:
diff --git a/docs/core-module/4-uor.html b/docs/core-module/4-uor.html
index 8454d11e1..7e2c63029 100644
--- a/docs/core-module/4-uor.html
+++ b/docs/core-module/4-uor.html
@@ -206,7 +206,7 @@ since the compiler next down the chain may no longer be I6.
diff --git a/docs/core-module/5-ass.html b/docs/core-module/5-ass.html
index f9935c18c..5d28f682c 100644
--- a/docs/core-module/5-ass.html
+++ b/docs/core-module/5-ass.html
@@ -2549,7 +2549,7 @@ can also be used adjectivally.
}
diff --git a/docs/core-module/5-ass2.html b/docs/core-module/5-ass2.html
index bbc52480e..45e1aeb5d 100644
--- a/docs/core-module/5-ass2.html
+++ b/docs/core-module/5-ass2.html
@@ -506,7 +506,7 @@ machinery is in infinite regress, e.g., because each \(K\) must contain an
diff --git a/docs/core-module/5-rk.html b/docs/core-module/5-rk.html
index 7ab0b999a..7951b3e70 100644
--- a/docs/core-module/5-rk.html
+++ b/docs/core-module/5-rk.html
@@ -301,7 +301,7 @@ that subtrees \(T_X\) and \(T_Y\), where \(T_X\) is a single value or object and
diff --git a/docs/core-module/6-ipw.html b/docs/core-module/6-ipw.html
index 5597107cb..bd912d292 100644
--- a/docs/core-module/6-ipw.html
+++ b/docs/core-module/6-ipw.html
@@ -500,7 +500,7 @@ table of Kinds.
}
diff --git a/docs/core-module/6-lp.html b/docs/core-module/6-lp.html
index 87dc6f636..db40b6311 100644
--- a/docs/core-module/6-lp.html
+++ b/docs/core-module/6-lp.html
@@ -3278,7 +3278,7 @@ attached to the same kind, and they become alternative syntaxes.)
}
diff --git a/docs/core-module/6-nv.html b/docs/core-module/6-nv.html
index 38607914c..77c7a5a06 100644
--- a/docs/core-module/6-nv.html
+++ b/docs/core-module/6-nv.html
@@ -454,7 +454,7 @@ I6 schema for how to change a variable:
nlv->nlv_write_schema = sch;}
-char *NonlocalVariables::get_write_schema(nonlocal_variable *nlv) {
+char *NonlocalVariables::get_write_schema(nonlocal_variable *nlv) {NonlocalVariables::warn_about_change(nlv);if (nlv == NULL) returnNULL;returnnlv->nlv_write_schema;
@@ -508,7 +508,7 @@ there's very little to say.
voidNonlocalVariables::SUBJ_compile(inference_subject *infs) {}
-inference_subject *NonlocalVariables::get_knowledge(nonlocal_variable *nlv) {
+inference_subject *NonlocalVariables::get_knowledge(nonlocal_variable *nlv) {returnnlv->nlv_knowledge;}
@@ -742,12 +742,12 @@ means that a value can be set by an assertion in the source text.
nlv->var_is_initialisable_anyway = TRUE;}
-intNonlocalVariables::is_constant(nonlocal_variable *nlv) {
+intNonlocalVariables::is_constant(nonlocal_variable *nlv) {if (nlv == NULL) internal_error("no such var");returnnlv->constant_at_run_time;}
-intNonlocalVariables::must_be_constant(nonlocal_variable *nlv) {
+intNonlocalVariables::must_be_constant(nonlocal_variable *nlv) {if (nlv->constant_at_run_time) {StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantChangeConstants),"this is a name for a value which never changes during the story",
@@ -998,7 +998,7 @@ the following:
}
diff --git a/docs/core-module/6-tod.html b/docs/core-module/6-tod.html
index d6f3df26a..421d414e2 100644
--- a/docs/core-module/6-tod.html
+++ b/docs/core-module/6-tod.html
@@ -273,7 +273,7 @@ a specific time of day, or when a named event occurs.
diff --git a/docs/core-module/6-uem.html b/docs/core-module/6-uem.html
index 00bd2fb10..e7a213e0c 100644
--- a/docs/core-module/6-uem.html
+++ b/docs/core-module/6-uem.html
@@ -193,7 +193,7 @@ following. (The six highest bits are defined in the }
diff --git a/docs/core-module/6-ul.html b/docs/core-module/6-ul.html
index da9d6adf0..5f6a212e4 100644
--- a/docs/core-module/6-ul.html
+++ b/docs/core-module/6-ul.html
@@ -116,7 +116,7 @@ the player types either of these:
}
diff --git a/docs/core-module/6-un.html b/docs/core-module/6-un.html
index 1d107b9a4..7174b217f 100644
--- a/docs/core-module/6-un.html
+++ b/docs/core-module/6-un.html
@@ -154,7 +154,7 @@ instance, the Standard Rules want the player-character object to be called
}
diff --git a/docs/core-module/7-am.html b/docs/core-module/7-am.html
index 4080e58da..6dbccddbb 100644
--- a/docs/core-module/7-am.html
+++ b/docs/core-module/7-am.html
@@ -167,8 +167,8 @@ rather than TRUEintadjective_form; one of the *_KADJ constants: see belowgeneral_pointerdetailed_meaning; to the relevant structureinttask_via_support_routine[NO_ADJECTIVE_TASKS + 1];
-structi6_schemai6s_to_transfer_to_SR[NO_ADJECTIVE_TASKS + 1]; where TRUE
-structi6_schemai6s_for_runtime_task[NO_ADJECTIVE_TASKS + 1]; where TRUE
+structi6_schemai6s_to_transfer_to_SR[NO_ADJECTIVE_TASKS + 1]; where TRUE
+structi6_schemai6s_for_runtime_task[NO_ADJECTIVE_TASKS + 1]; where TRUEintam_ready_flag; optional flag to mark whether schemas prepared yetintdefined_already; temporary workspace used when compiling support routines
@@ -386,7 +386,7 @@ early in the run when sorting cannot yet be done.
-intAdjectives::Meanings::applicable_to(adjective *aph,
+intAdjectives::Meanings::applicable_to(adjective *aph,kind *K) {if (aph) {adjective_meaning *am;
@@ -593,8 +593,8 @@ below) — this makes coding what the adjective compiles to much easier.
am->am_ready_flag = FALSE;for (inti=1; i<=NO_ADJECTIVE_TASKS; i++) {am->task_via_support_routine[i] = NOT_APPLICABLE;
-Calculus::Schemas::modify(&(am->i6s_for_runtime_task[i]), "");
-Calculus::Schemas::modify(&(am->i6s_to_transfer_to_SR[i]), "");
+Calculus::Schemas::modify(&(am->i6s_for_runtime_task[i]), "");
+Calculus::Schemas::modify(&(am->i6s_to_transfer_to_SR[i]), ""); }am->am_negated_from = NULL;returnam;
@@ -631,7 +631,7 @@ those are inherited.
if (i == NOW_ADJECTIVE_FALSE_TASK) j = NOW_ADJECTIVE_TRUE_TASK;neg->task_via_support_routine[j] = am->task_via_support_routine[i];neg->i6s_for_runtime_task[j] = am->i6s_for_runtime_task[i];
-Calculus::Schemas::modify(&(neg->i6s_to_transfer_to_SR[j]), "");
+Calculus::Schemas::modify(&(neg->i6s_to_transfer_to_SR[j]), ""); }neg->am_negated_from = am;returnneg;
@@ -1036,7 +1036,7 @@ can choose to go via a support routine or not.
-i6_schema *Adjectives::Meanings::set_i6_schema(adjective_meaning *am,
+i6_schema *Adjectives::Meanings::set_i6_schema(adjective_meaning *am,intT, intvia_support) {kind *K = Adjectives::Meanings::get_domain(am);if (K == NULL) K = K_object;
@@ -1058,7 +1058,7 @@ that to issue a suitable problem message.
-i6_schema *Adjectives::Meanings::get_i6_schema(adjective *aph,
+i6_schema *Adjectives::Meanings::get_i6_schema(adjective *aph,kind *kind_domain, intT) {adjective_meaning *am;if (kind_domain == NULL) kind_domain = K_object;
@@ -1071,7 +1071,7 @@ that to issue a suitable problem message.
switch (am->task_via_support_routine[T]) {caseFALSE:return &(am->i6s_for_runtime_task[T]);caseTRUE:
-if (Calculus::Schemas::empty(&(am->i6s_to_transfer_to_SR[T])))
+if (Calculus::Schemas::empty(&(am->i6s_to_transfer_to_SR[T])))Construct a schema for this adjective, using the standard routine naming30.1;return &(am->i6s_to_transfer_to_SR[T]); }
@@ -1099,7 +1099,7 @@ negation does not, and so must use those of the original.
} }inter_name *iname = Adjectives::Meanings::iname(use_aph, task, Kinds::RunTime::weak_id(am_kind));
-Calculus::Schemas::modify(&(am->i6s_to_transfer_to_SR[T]), "*=-(%s%n(*1))",
+Calculus::Schemas::modify(&(am->i6s_to_transfer_to_SR[T]), "*=-(%s%n(*1))",negation_operator, iname);
§1. Managing the BPs generated. The relations created in this section belong to the family,
-named so because their definitions are explicit in the source text. Initially,
+
§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,
there are none.
§3. They are asserted thus. Note that if we have a symmetric relation then we need
+
§4. They are asserted thus. Note that if we have a symmetric relation then we need
to behave as if \(B(y, x)\) had also been asserted whenever \(B(x, y)\) has, if
\(x\neq y\).
@@ -159,8 +174,8 @@ 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.");returnTRUE;
§5. 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
of ox. The beauty of this is that the "only thing related to" business
@@ -170,7 +185,7 @@ inferences for \(y\) and \(z\).
What Inform internally calls "binary predicates", the user calls "relations". In this section, we parse definitions of new relations and create the resulting |binary_predicate| objects.
-voidRelations::equivalence_relation_make_singleton_partitions(binary_predicate *bp,
+voidRelations::equivalence_relation_make_singleton_partitions(binary_predicate *bp,intdomain_size) {inti;int *partition_array = Memory::calloc(domain_size, sizeof(int), PARTITION_MREASON);
@@ -2101,7 +2101,7 @@ users to set up these relations in a stylistically poor way.
-voidRelations::equivalence_relation_merge_classes(binary_predicate *bp,
+voidRelations::equivalence_relation_merge_classes(binary_predicate *bp,intdomain_size, intix1, intix2) {if (bp->form_of_relation != Relation_Equiv)internal_error("attempt to merge classes for a non-equivalence relation");
@@ -2126,7 +2126,7 @@ in turn.
§7. Compilation. Run-time is too late to change which verbs mean what, so this relation
+
§6. Compilation. Run-time is too late to change which verbs mean what, so this relation
can't be changed at compile time, but the universal relation can.
diff --git a/docs/core-module/7-vart.html b/docs/core-module/7-vart.html
index d50eaa5ba..2c3aef122 100644
--- a/docs/core-module/7-vart.html
+++ b/docs/core-module/7-vart.html
@@ -645,7 +645,7 @@ usages to the debugging log.
}
diff --git a/docs/core-module/8-hdn.html b/docs/core-module/8-hdn.html
index 2d87ced70..244792eba 100644
--- a/docs/core-module/8-hdn.html
+++ b/docs/core-module/8-hdn.html
@@ -725,7 +725,7 @@ but should this arise then the best recourse is to ignore the heading.
diff --git a/docs/core-module/8-ptu.html b/docs/core-module/8-ptu.html
index b51132034..1825097b9 100644
--- a/docs/core-module/8-ptu.html
+++ b/docs/core-module/8-ptu.html
@@ -475,7 +475,7 @@ be such that their head nodes each pass this test:
}
diff --git a/docs/core-module/8-rs.html b/docs/core-module/8-rs.html
index b9638f809..1fb762c01 100644
--- a/docs/core-module/8-rs.html
+++ b/docs/core-module/8-rs.html
@@ -1611,7 +1611,7 @@ match a given begin node.
}
diff --git a/docs/core-module/P-wtmd.html b/docs/core-module/P-wtmd.html
index f97e0b00b..934ccdef7 100644
--- a/docs/core-module/P-wtmd.html
+++ b/docs/core-module/P-wtmd.html
@@ -140,7 +140,7 @@ hat is indeed spatially on top of the can.
more Linux-aware students to drink.
↩
diff --git a/docs/core-module/index.html b/docs/core-module/index.html
index 673a6c74d..afa526d86 100644
--- a/docs/core-module/index.html
+++ b/docs/core-module/index.html
@@ -481,9 +481,9 @@
This is where the propositions generated by the A-parser and the S-parser are at last acted upon, either immediately (generating inferences) or at run-time (by causing code to be compiled which will some day test or assert the truth of the proposition).
-
To declare that a given proposition is a true statement about the state of the world when play begins.
-
-
- I6 Schemas -
- To create, and later expand upon, short prototypes of I6 syntax for such run-time tasks as the setting, unsetting or testing of a relation.
-
Compile Atoms -
@@ -673,6 +668,11 @@
Inference Subjects -
The different data structures for elements of the model world are all unified by a single concept, the inference subject, about which facts can be known.