1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/docs/core-module/6-bp.html
2020-05-03 01:01:21 +01:00

1299 lines
258 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Binary Predicates</title>
<link href="Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="index.html"><span class="selectedlink">core</span></a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Binary Predicates' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#6">Chapter 6: Verbs</a></li><li><b>Binary Predicates</b></li></ul></div>
<p class="purpose">To create and manage binary predicates, which are the underlying data structures beneath Inform's relations.</p>
<ul class="toc"><li><a href="6-bp.html#SP1">&#167;1. Definitions</a></li><li><a href="6-bp.html#SP18">&#167;18. Creating term details</a></li><li><a href="6-bp.html#SP27">&#167;27. Making the equality relation</a></li><li><a href="6-bp.html#SP28">&#167;28. Making a pair of relations</a></li><li><a href="6-bp.html#SP30">&#167;30. BP construction</a></li><li><a href="6-bp.html#SP31">&#167;31. The package</a></li><li><a href="6-bp.html#SP32">&#167;32. The handler</a></li><li><a href="6-bp.html#SP33">&#167;33. As an INFS</a></li><li><a href="6-bp.html#SP34">&#167;34. BP and term logging</a></li><li><a href="6-bp.html#SP35">&#167;35. Relation names</a></li><li><a href="6-bp.html#SP37">&#167;37. Miscellaneous access routines</a></li><li><a href="6-bp.html#SP45">&#167;45. The built-in BPs</a></li><li><a href="6-bp.html#SP46">&#167;46. Other property-based relations</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>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
run-time, \(B(x, y)\) is either true or false.
</p>
<p class="commentary">Examples used in Inform include equality, where \(EQ(x, y)\) is true if and
only if \(x = y\), and containment, where \(C(x, y)\) is true if and only if the
thing \(x\) is inside the room or container \(y\). (\(EQ\) does not change
during play, but \(C\) does.) A fairly large set of binary predicates is built
into Inform, and the user is allowed to create more with sentences like
</p>
<blockquote>
<p>Lock-fitting relates one thing (called the matching key) to various things.</p>
</blockquote>
<p class="commentary">In the Inform documentation, binary predicates are called "relations".
The code to parse "relates" sentences and construct the binary predicate
implied can be found in the next section, "Relations.w".
</p>
<p class="commentary">Binary predicates are of central importance because they allow complex
sentences to be written which talk about more than one thing at a time,
with some connection between them. In excerpts like "an animal inside
something" or "a man who wears the top hat", the meanings of the two
connecting pieces of text &mdash; "inside" and "who wears" &mdash; are (pointers
to) binary predicates: the containment relation and the wearing relation.
</p>
<p class="commentary">Inform is rich in ways to create relations, and consequently the BPs are
many and varied. They turn up in one-off examples but also in whole families.
Still, despite the variation, what they share in common is greater yet,
and so a single <span class="extract"><span class="extract-syntax">binary_predicate</span></span> structure is used to represent them all.
</p>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>The values \(x\) and \(y\) to which a binary predicate \(B\) can apply are
called its "terms". For some relations, the source text gives these
names:
</p>
<blockquote>
<p>Lock-fitting relates one thing (called the matching key) to various things.</p>
</blockquote>
<p class="commentary">Here the \(x\) term has the name "matching key", whereas the \(y\) term is
anonymous. (More often, both are anonymous.) Internally the terms are not
named but are numbered 0 and 1: so we should really write \(B(x_0, x_1)\)
rather than \(B(x, y)\).
</p>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>Different BPs apply to different sorts of terms: for instance, the
numerical less-than comparison applies to numbers, whereas containment
applies to things. The two terms need not have the same domain: the
"wearing" relation, as seen in
</p>
<blockquote>
<p>Harry Smythe wears the tweed waistcoat.</p>
</blockquote>
<p class="commentary">is a binary predicate \(W(x_0, x_1)\) such that \(x_0\) ranges across people
and \(x_1\) ranges across things.
</p>
<p class="commentary">Inform represents this by allowing each BP to have either a
designated kind of object, or a designated kind of value, or no
restriction at all, for each term. (In practice, even the unrestricted
terms have limitations, but which are enforced by special code in the
type-checker to handle special predicates such as equality. For instance,
\(EQ(x, y)\) can be tested for any values \(x\) and \(y\) of the same kind, so
the two terms in effect constrain each other.)
</p>
<p class="commentary">In the S-parser, type-checking is used to make sure the source text doesn't
try to test or assert \(B(x, y)\) for any \(x\) or \(y\) which don't fit, so that
</p>
<blockquote>
<p>if 1 wears "Hello there", ...</p>
</blockquote>
<p class="commentary">will be rejected. Whereas in the A-parser, these restrictions are used to
infer information about otherwise unknown quantities: so writing
</p>
<blockquote>
<p>Harry Smythe wears the tweed waistcoat.</p>
</blockquote>
<p class="commentary">causes the A-parser to force the Harry Smythe object to be of kind
"person", and the tweed waistcoat of kind "thing".
</p>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>Some BPs are such that \(B(x, y)\) can be true for more or less any
combination of \(x\) and \(y\). Those can take a lot of storage and it is
difficult to perform any reasoning about them, because knowing that $B(x,
y)\( is true doesn't give you any information about \)B(x, z)$. For instance,
the BP created by
</p>
<blockquote>
<p>Suspicion relates various people to various people.</p>
</blockquote>
<p class="commentary">is stored at run-time in a bitmap of \(P^2\) bits, where \(P\) is the number
of people, and searching it ("if anyone suspects Harry") requires
exhaustive loops, which incur some speed overhead as well.
</p>
<p class="commentary">But other BPs have special properties restricting the circumstances in
which they are true, and in those cases we want to capitalise on that.
"Contains" is an example of this. A single thing \(y\) can be (directly)
inside only one other thing \(x\) at a time, so that if we know \(C(x, y)\)
and \(C(w, y)\) then we can deduce that \(x=w\). We write this common value
as \(f_0(y)\), the only possible value for term 0 given that term 1 is \(y\).
Another way to say this is that the only possible pairs making \(C\) true
have the form \(C(f_0(y), y)\).
</p>
<p class="commentary">And similarly for term 1. If we write \(T\) for the "on top of" relation
then it turns out that there is a function \(f_1\) such that the only cases
where \(T\) is true have the form \(T(x, f_1(x))\). Here \(f_1(x)\) is the thing
which directly supports \(x\).
</p>
<p class="commentary">Containment has an \(f_0\) but not an \(f_1\) function; "on top of" has an
\(f_1\) but not an \(f_0\). Many BPs (like "suspicion" above) have neither.
</p>
<p class="commentary">Note that if \(B\) does have an \(f_0\) function then its reversal \(R\) has an
identical \(f_1\) function, and vice versa.
</p>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>We never in fact need to calculate the value of \(f_0(y)\) from \(y\) during
compilation &mdash; only at run-time. So we store the function \(f_0(y)\) as what
is called an "I6 schema", basically a piece of I6 source code with a
place-holder where \(y\) is to be inserted. In the case of containment, the
schema is written
\(\) f_0(<span class="extract"><span class="extract-syntax">*1</span></span>) = <span class="extract"><span class="extract-syntax">ContainerOf(*1)</span></span> \(\)
and what this means is that we can calculate \(f_0(y)\) from an object \(y\)
at run-time by calling the <span class="extract"><span class="extract-syntax">ContainerOf</span></span> function, which tells us what
container (if any) is at present directly containing \(y\).
</p>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>To sum up, each term of a BP can specify: a name, a domain, and an
\(f_i\) function. Every one of these details is optional. They are gathered
together in a sub-structure called <span class="extract"><span class="extract-syntax">bp_term_details</span></span>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">called_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> "(called...)" name, if any exists</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">implies_infs</span><span class="plain-syntax">; </span><span class="comment-syntax"> the domain of values allowed</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">implies_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> the kind of these values</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">function_of_other</span><span class="plain-syntax">; </span><span class="comment-syntax"> the function </span>\(f_0\)<span class="comment-syntax"> or </span>\(f_1\)<span class="comment-syntax"> as above</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">index_term_as</span><span class="plain-syntax">; </span><span class="comment-syntax"> usually null, but if not, used in Phrasebook index</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure bp_term_details is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>Given any binary predicate \(B\), we may wish to do some or all of the
following at run-time:
</p>
<ul class="items"><li>(a) Test whether or not \(B(x, y)\) is true at run-time. Here Inform
needs to compile an I6 condition.
</li><li>(b) Assert that \(B(x, y)\) is true in the assertion sentences of
the source text. Inform will need to remember all pairs \(x, y\) for which \(B\)
has been asserted so that it can compile this information as the original
state of the I6 data structure containing the current state of \(B\).
</li><li>(c) Set \(B(x, y)\) true, or false, at run-time. Here Inform needs to
compile I6 code which will modify that data structure.
</li></ul>
<p class="commentary">Some BPs provide an I6 schema to achieve (a), others provide (a) and (b),
while a happy few provide all of (a), (b), (c).
</p>
<p class="commentary">The variety of BPs is such that different BPs use very different run-time
mechanisms. Some relations compile elaborate routines to test (a), some
look at parents or chidren in the I6 object tree, some look at I6 property
values, others look inside bitmaps. The actual work is often done by routines
in the I6 template, which are called by code generated by the I6 schema for
(a); and similarly for (b) and (c).
</p>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>Each BP has a partner which we call its "reversal". If \(B\) is the
original and \(R\) is its reversal, then \(B(x, y)\) is true if and only if
\(R(y, x)\) is true. Reversals sometimes occur quite naturally in English
language. "To wear" is the reversal of "to be worn by". "Contains" is
the reversal of being "inside". (Though not every BP has an interesting
reversal. The reversal of "is" &mdash; equality &mdash; looks much the same as the
original, because \(x=y\) if and only if \(y=x\).)
</p>
<p class="commentary">The following sentences express the same fact:
</p>
<blockquote>
<p>The ball is inside the trophy case.</p>
</blockquote>
<blockquote>
<p>The trophy case contains the ball.</p>
</blockquote>
<p class="commentary">...but when we parse them into their meanings, we could easily lose sight
that they are saying the same thing, because they involve different BPs:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> inside(ball, trophy case)| and |contains(trophy case, ball)</span>
</pre>
<p class="commentary">It's usually a bad idea for any computer program to represent the same
conceptual idea in more than one way. So for every pair of BPs \(X\) and \(Y\)
which are each other's reversal, Inform designates one as being
"the right way round" and the other as being "the wrong way round".
Whenever a sentence's meaning involves a BP which is "the wrong way
round", Inform swaps over the terms and replaces the BP by its reversal,
which is "the right way round". That makes it much easier to recognise
when pairs of sentences like the one above are duplicating each other's
meanings.
</p>
<p class="commentary">This is purely an internal implementation trick. There's no natural sense
in language or mathematics in which "contains" is the right way round
and "inside" the wrong way round.
</p>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>We can finally now declare the epic BP structure.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">relation_family</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_KBP</span></span><span class="comment-syntax"> constants defined below</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">form_of_relation</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">Relation_*</span></span><span class="comment-syntax"> constants defined below</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">relation_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> (which might have length 0)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp_created_at</span><span class="plain-syntax">; </span><span class="comment-syntax"> where declared in the source text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">debugging_log_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> used when printing propositions to the debug log</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp_package</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> when referred to as a constant</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">handler_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v2v_bitmap_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> only relevant for some relations</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">term_details</span><span class="plain-syntax">[2]; </span><span class="comment-syntax"> term 0 is the left term, 1 is the right</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reversal</span><span class="plain-syntax">; </span><span class="comment-syntax"> the </span>\(R\)<span class="comment-syntax"> such that </span>\(R(x,y)\)<span class="comment-syntax"> iff </span>\(B(y,x)\)
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">right_way_round</span><span class="plain-syntax">; </span><span class="comment-syntax"> was this BP created directly? or is it a reversal of another?</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> how to compile code which tests or forces this BP to be true or false:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp_by_routine_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> for relations by routine</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">test_function</span><span class="plain-syntax">; </span><span class="comment-syntax"> I6 schema for (a) testing </span>\(B(x, y)\)<span class="comment-syntax">...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">condition_defn_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> ...unless this I7 condition is used instead</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">make_true_function</span><span class="plain-syntax">; </span><span class="comment-syntax"> I6 schema for (b) "now </span>\(B(x, y)\)<span class="comment-syntax">"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">make_false_function</span><span class="plain-syntax">; </span><span class="comment-syntax"> I6 schema for (c) "now </span>\({\rm not}(B(x, y))\)<span class="comment-syntax">"</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> for use in the A-parser:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">arbitrary</span><span class="plain-syntax">; </span><span class="comment-syntax"> allow source to assert </span>\(B(x, y)\)<span class="comment-syntax"> for any arbitrary pairs </span>\(x, y\)
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set_property</span><span class="plain-syntax">; </span><span class="comment-syntax"> asserting </span>\(B(x, v)\)<span class="comment-syntax"> sets this prop. of </span>\(x\)<span class="comment-syntax"> to </span>\(v\)
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">property_pending_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> temp. version used until props created</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">relates_values_not_objects</span><span class="plain-syntax">; </span><span class="comment-syntax"> true if either term is necessarily a value...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">knowledge_about_bp</span><span class="plain-syntax">; </span><span class="comment-syntax"> ...and if so, here's the list of known assertions</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> for optimisation of run-time code:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">dynamic_memory</span><span class="plain-syntax">; </span><span class="comment-syntax"> stored in dynamically allocated memory</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">initialiser_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> and if so, this is the name of its initialiser</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i6_storage_property</span><span class="plain-syntax">; </span><span class="comment-syntax"> provides run-time storage</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">storage_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> kind of property owner</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_function_simplification</span><span class="plain-syntax">; </span><span class="comment-syntax"> allow Inform to make use of any </span>\(f_i\)<span class="comment-syntax"> functions?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">fast_route_finding</span><span class="plain-syntax">; </span><span class="comment-syntax"> use fast rather than slow route-finding algorithm?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax">; </span><span class="comment-syntax"> if not NULL, optimise loops using object tree</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">loop_parent_optimisation_ranger</span><span class="plain-syntax">; </span><span class="comment-syntax"> if not NULL, routine iterating through contents</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">record_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> we need to compile a small array of details in readable memory</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> details, filled in for right-way-round BPs only, for particular kinds of BP:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">a_listed_in_predicate</span><span class="plain-syntax">; </span><span class="comment-syntax"> (if right way) was this generated from a table column?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">same_property</span><span class="plain-syntax">; </span><span class="comment-syntax"> (if right way) if a "same property as..."</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comparative_property</span><span class="plain-syntax">; </span><span class="comment-syntax"> (if right way) if a comparative adjective</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">comparison_sign</span><span class="plain-syntax">; </span><span class="comment-syntax"> ...and </span><span class="extract"><span class="extract-syntax">+1</span></span><span class="comment-syntax"> or </span><span class="extract"><span class="extract-syntax">-1</span></span><span class="comment-syntax"> according to sign of definition</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">equivalence_partition</span><span class="plain-syntax">; </span><span class="comment-syntax"> (if right way) partition array of equivalence classes</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MEMORY_MANAGEMENT</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure binary_predicate is accessed in 6/rlt, 6/nv, 15/cr, 15/spr, 15/spr2, 19/lr and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>This seems a good point to lay out a classification of all of the BPs
existing within Inform. Broadly, they divide into two: the ones explicitly
created by the source text, in sentences like
</p>
<blockquote>
<p>Admiration relates various people to various people.</p>
</blockquote>
<p class="commentary">These are called "explicit". The others are "implicit" and are either
created automatically soon after Inform starts up, or else are created as
a consequence of something else being created by the source text, such as
</p>
<blockquote>
<p>Definition: A woman is tall if her height is 68 or more.</p>
</blockquote>
<p class="commentary">which implicitly creates a "taller than" relation. All explicit BPs are
constructed in the "Relations.w" section of the source code.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">EQUALITY_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> there is exactly one of these: the </span>\(x=y\)<span class="comment-syntax"> predicate</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">QUASINUMERIC_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> the inequality comparison </span>\(\leq\)<span class="comment-syntax">, </span>\(&lt;\)<span class="comment-syntax"> and so on</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SPATIAL_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> a relation associated with a map connection</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MAP_CONNECTING_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> a relation associated with a map connection</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PROPERTY_SETTING_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax"> </span><span class="comment-syntax"> a relation associated with a value property</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PROPERTY_SAME_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax"> </span><span class="comment-syntax"> another relation associated with a value property</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PROPERTY_COMPARISON_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax"> </span><span class="comment-syntax"> another relation associated with a value property</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">LISTED_IN_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax"> </span><span class="comment-syntax"> a relation for indirect table lookups, one for each column name</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PROVISION_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">9</span><span class="plain-syntax"> </span><span class="comment-syntax"> a relation for specifying which objects provide which properties</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">UNIVERSAL_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">10</span><span class="plain-syntax"> </span><span class="comment-syntax"> a relation for applying general other relations</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">EXPLICIT_KBP</span><span class="plain-syntax"> </span><span class="constant-syntax">100</span><span class="plain-syntax"> </span><span class="comment-syntax"> defined explicitly in the source text; the others are all implicit</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>The following constants are used to identify the "form" of a BP (in that the
<span class="extract"><span class="extract-syntax">form_of_relation</span></span> field of any BP always equals one of these and never changes).
These constant names (and values) exactly match a set of constants compiled
into every I6 program created by Inform, so they can be used freely both in
the Inform source code and also in the I6 template layer.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">Relation_Implicit</span><span class="plain-syntax"> -1 </span><span class="comment-syntax"> all implicit BPs have this form, and all others are explicit</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_OtoO</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> one to one: "R relates one K to one K"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_OtoV</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> one to various: "R relates one K to various K"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_VtoO</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> various to one: "R relates various K to one K"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_VtoV</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> various to various: "R relates various K to various K"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_Sym_OtoO</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax"> </span><span class="comment-syntax"> symmetric one to one: "R relates one K to another"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_Sym_VtoV</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax"> </span><span class="comment-syntax"> symmetric various to various: "R relates K to each other"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_Equiv</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax"> </span><span class="comment-syntax"> equivalence relation: "R relates K to each other in groups"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">Relation_ByRoutine</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax"> </span><span class="comment-syntax"> relation tested by a routine: "R relates K to L when (some condition)"</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>That completes the catalogue of the one-off cases, and we can move on
to the five families of implicit relations which correspond to other
structures in the source text.
</p>
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>The second family of implicit relations corresponds to any property which has
been given as the meaning of a verb, as in the example
</p>
<blockquote>
<p>The verb to weigh (it weighs, they weigh, it is weighing) implies the weight property.</p>
</blockquote>
<p class="commentary">This implicitly constructs a relation \(W(p, w)\) where \(p\) is a thing and
\(w\) a weight.
</p>
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. </b>The third family corresponds to defined adjectives which perform a
numerical comparison in a particular way, as here:
</p>
<blockquote>
<p>Definition: A woman is tall if her height is 68 or more.</p>
</blockquote>
<p class="commentary">This implicitly constructs a relation \(T(x, y)\) which is true if and only
if woman \(x\) is taller than woman \(y\).
</p>
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. </b>The fourth family corresponds to value properties, so that
</p>
<blockquote>
<p>A door has a number called street number.</p>
</blockquote>
<p class="commentary">implicitly constructs a relation \(SN(d_1, d_2)\) which is true if and only if
doors \(d_1\) and \(d_2\) have the same street number.
</p>
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </b>The fifth family corresponds to names of table columns. If any table includes
a column headed "eggs per clutch" then that will implicitly construct a
relation \(LEPC(n, T)\) which is true if and only if the number \(n\) is listed
as one of the eggs-per-clutch entries in the table \(T\), where \(T\) has to be
one of the tables which has a column of this name.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">VERB_MEANING_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">VERB_MEANING_REVERSAL</span><span class="plain-syntax"> </span><a href="6-bp.html#SP39" class="function-link"><span class="function-syntax">BinaryPredicates::get_reversal</span></a>
<span class="definition-keyword">define</span> <span class="constant-syntax">VERB_MEANING_EQUALITY</span><span class="plain-syntax"> </span><span class="identifier-syntax">R_equality</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">VERB_MEANING_UNIVERSAL</span><span class="plain-syntax"> </span><span class="identifier-syntax">R_universal</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">VERB_MEANING_POSSESSION</span><span class="plain-syntax"> </span><span class="identifier-syntax">a_has_b_predicate</span>
</pre>
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. Creating term details. </b>The essential point in defining a term is to describe the domain of values it
ranges over, which we do by giving an "inference subject" (INFS). An INFS is
roughly speaking anything in the model world which Inform can store knowledge
about; here it will almost always be a generality of things, such as "all
numbers", or "all rooms".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::new_term</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::new_term</span></span>:<br/><a href="6-bp.html#SP19">&#167;19</a>, <a href="6-bp.html#SP27">&#167;27</a>, <a href="6-bp.html#SP29">&#167;29</a><br/>The Universal Relation - <a href="6-tur.html#SP3">&#167;3</a><br/>The Equality Relation - <a href="12-ter.html#SP3">&#167;3</a><br/>Quasinumeric Relations - <a href="12-qr.html#SP3">&#167;3</a><br/>The Provision Relation - <a href="15-tpr.html#SP3">&#167;3</a><br/>Measurement Adjectives - <a href="15-ma.html#SP14_2">&#167;14.2</a><br/>Same Property Relation - <a href="15-spr.html#SP2">&#167;2</a><br/>Setting Property Relation - <a href="15-spr2.html#SP2">&#167;2</a><br/>Listed-In Relations - <a href="19-lr.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">called_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">function_of_other</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">implies_infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">infs</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">implies_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">index_term_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19"></a><b>&#167;19. </b>And there is also a fuller version, including the inessentials:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::full_new_term</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::full_new_term</span></span>:<br/>Relations - <a href="6-rlt.html#SP9_3_1">&#167;9.3.1</a><br/>The Equality Relation - <a href="12-ter.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax">, </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">implies_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">called_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CW</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">function_of_other</span><span class="plain-syntax"> = </span><span class="identifier-syntax">f</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. </b>In a few cases BPs need to be created before the relevant domains are known,
so that we must fill them in later, using the following:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::set_term_domain</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::set_term_domain</span></span>:<br/>Setting Property Relation - <a href="15-spr2.html#SP8">&#167;8</a><br/>Listed-In Relations - <a href="19-lr.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no BPTD"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">implies_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">implies_infs</span><span class="plain-syntax"> = </span><a href="13-kak.html#SP1" class="function-link"><span class="function-syntax">Kinds::Knowledge::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP21"></a><b>&#167;21. </b>Similarly:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::set_term_function</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::set_term_function</span></span>:<br/>Relations - <a href="6-rlt.html#SP9">&#167;9</a>, <a href="6-rlt.html#SP9_14">&#167;9.14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">, </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no BPTD"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">function_of_other</span><span class="plain-syntax"> = </span><span class="identifier-syntax">f</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_term_function</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_term_function</span></span>:<br/>Relations - <a href="6-rlt.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no BPTD"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_of_other</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22"></a><b>&#167;22. </b>Combining these:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::kind</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::kind</span></span>:<br/>Relations - <a href="6-rlt.html#SP15">&#167;15</a>, <a href="6-rlt.html#SP15_1">&#167;15.1</a>, <a href="6-rlt.html#SP15_1_4">&#167;15.1.4</a><br/>RValues - <a href="14-rv.html#SP23_2">&#167;23.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">R_equality</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_relation</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K0</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP23" class="function-link"><span class="function-syntax">BinaryPredicates::kind_of_term</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[0]));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K1</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP23" class="function-link"><span class="function-syntax">BinaryPredicates::kind_of_term</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[1]));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K0</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K0</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_relation</span><span class="plain-syntax">, </span><span class="identifier-syntax">K0</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP23"></a><b>&#167;23. </b>The kind of a term is:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::kind_of_term</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::kind_of_term</span></span>:<br/><a href="6-bp.html#SP22">&#167;22</a>, <a href="6-bp.html#SP25">&#167;25</a>, <a href="6-bp.html#SP38">&#167;38</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_kind</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_kind</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="16-is.html#SP21" class="function-link"><span class="function-syntax">InferenceSubjects::domain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP24"></a><b>&#167;24. </b>The table of relations in the index uses the textual name of an INFS, so:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::index_term_details</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::index_term_details</span></span>:<br/>Relations - <a href="6-rlt.html#SP31">&#167;31</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">index_term_as</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">index_term_as</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_infs</span><span class="plain-syntax">) </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="16-is.html#SP24" class="function-link"><span class="function-syntax">InferenceSubjects::get_name_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">); </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"--"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP25"></a><b>&#167;25. </b>The following routine adds the given BP term as a call parameter to the
routine currently being compiled, deciding that something is an object if
its kind indications are all blank, but verifying that the value supplied
matches the specific necessary kind of object if there is one.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::add_term_as_call_parameter</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::add_term_as_call_parameter</span></span>:<br/>Relations - <a href="6-rlt.html#SP30">&#167;30</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP23" class="function-link"><span class="function-syntax">BinaryPredicates::kind_of_term</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">PK</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Kinds::Compare::lt</span><span class="plain-syntax">(</span><span class="identifier-syntax">PK</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">))) </span><span class="identifier-syntax">PK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lv_s</span><span class="plain-syntax"> = </span><a href="24-lv.html#SP8" class="function-link"><span class="function-syntax">LocalVariables::add_call_parameter_as_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">.</span><span class="element-syntax">called_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">PK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Compare::lt</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">NOT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">OFCLASS_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lv_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="13-rsfk.html#SP3" class="function-link"><span class="function-syntax">Kinds::RunTime::I6_classname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::rfalse</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP26"></a><b>&#167;26. </b>And as a convenience:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::set_index_details</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::set_index_details</span></span>:<br/>The Equality Relation - <a href="12-ter.html#SP3">&#167;3</a><br/>Quasinumeric Relations - <a href="12-qr.html#SP3">&#167;3</a><br/>The Provision Relation - <a href="15-tpr.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">right</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">left</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[0].</span><span class="element-syntax">index_term_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">left</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[1].</span><span class="element-syntax">index_term_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">left</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">right</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[1].</span><span class="element-syntax">index_term_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">right</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[0].</span><span class="element-syntax">index_term_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">right</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP27"></a><b>&#167;27. Making the equality relation. </b>As we shall see below, BPs are almost always created in matched pairs. There
is one and only one exception to this rule: the equality predicate where
\(EQ(x, y)\) if \(x = y\). Equality plays a special role in the system of logic
we'll be using. Since \(x = y\) and \(y = x\) are exactly equivalent, it is safe
to make \(EQ\) its own reversal; this makes it impossible for equality to occur
"the wrong way round" in any proposition, even one which is not yet fully
simplified.
</p>
<p class="commentary">There is no fixed domain to which \(x\) and \(y\) belong: equality can be
used whenever \(x\) and \(y\) belong to the same domain. Thus "if the score is
12" and "if the location is the Pantheon" are both valid uses of \(EQ\),
where \(x\) and \(y\) are numbers in the former case and rooms in the latter.
It will take special handling in the type-checker to achieve
this effect. For now, we give \(EQ\) entirely blank term details.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::make_equality</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::make_equality</span></span>:<br/>The Equality Relation - <a href="12-ter.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP30" class="function-link"><span class="function-syntax">BinaryPredicates::make_single</span></a><span class="plain-syntax">(</span><span class="constant-syntax">EQUALITY_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"is"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(&lt;</span><span class="identifier-syntax">relation</span><span class="plain-syntax">-</span><span class="identifier-syntax">names</span><span class="plain-syntax">&gt;, </span><span class="constant-syntax">EQUALITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">; </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP28"></a><b>&#167;28. Making a pair of relations. </b>Every other BP belongs to a matched pair, in which each is the reversal of
the other, but only one is designated as being "the right way round".
The left-hand term of one behaves like the right-hand term of the other,
and vice versa.
</p>
<p class="commentary">The BP which is the wrong way round is never used in compilation, because
it will long before that have been reversed, so we only fill in details of
how to compile the BP for the one which is the right way round.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::make_pair</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::make_pair</span></span>:<br/><a href="6-bp.html#SP29">&#167;29</a><br/>The Universal Relation - <a href="6-tur.html#SP3">&#167;3</a><br/>The Equality Relation - <a href="12-ter.html#SP3">&#167;3</a><br/>Quasinumeric Relations - <a href="12-qr.html#SP3">&#167;3</a><br/>The Provision Relation - <a href="15-tpr.html#SP3">&#167;3</a><br/>Measurement Adjectives - <a href="15-ma.html#SP14_2">&#167;14.2</a><br/>Same Property Relation - <a href="15-spr.html#SP2">&#167;2</a><br/>Setting Property Relation - <a href="15-spr2.html#SP2">&#167;2</a><br/>Listed-In Relations - <a href="19-lr.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">family</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">left_term</span><span class="plain-syntax">, </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">right_term</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">namer</span><span class="plain-syntax">, </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mtf</span><span class="plain-syntax">, </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tf</span><span class="plain-syntax">, </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">source_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, *</span><span class="identifier-syntax">bpr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">nr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">n</span><span class="plain-syntax">, </span><span class="string-syntax">"nameless"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">nr</span><span class="plain-syntax">, </span><span class="identifier-syntax">namer</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">nr</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">nr</span><span class="plain-syntax">, </span><span class="string-syntax">"%S-r"</span><span class="plain-syntax">, </span><span class="identifier-syntax">n</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP30" class="function-link"><span class="function-syntax">BinaryPredicates::make_single</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">family</span><span class="plain-syntax">, </span><span class="identifier-syntax">left_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">right_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">n</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">mtf</span><span class="plain-syntax">, </span><span class="identifier-syntax">tf</span><span class="plain-syntax">, </span><span class="identifier-syntax">source_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bpr</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP30" class="function-link"><span class="function-syntax">BinaryPredicates::make_single</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">family</span><span class="plain-syntax">, </span><span class="identifier-syntax">right_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">left_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">nr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bpr</span><span class="plain-syntax">; </span><span class="identifier-syntax">bpr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="identifier-syntax">bpr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">source_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(&lt;</span><span class="identifier-syntax">relation</span><span class="plain-syntax">-</span><span class="identifier-syntax">name</span><span class="plain-syntax">-</span><span class="identifier-syntax">formal</span><span class="plain-syntax">&gt;, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">source_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MISCELLANEOUS_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_binary_predicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP29"></a><b>&#167;29. </b>When the source text declares new relations, it turns out to be convenient
to make their BPs in a two-stage process: to make sketchy, mostly-blank BP
structures for them early on &mdash; but getting their names registered &mdash; and
then fill in the correct details later. This is where such sketchy pairs are
made:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::make_pair_sketchily</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::make_pair_sketchily</span></span>:<br/>Relations - <a href="6-rlt.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">f</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">relname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">relname</span><span class="plain-syntax">, </span><span class="string-syntax">"%V"</span><span class="plain-syntax">, </span><span class="identifier-syntax">WordAssemblages::first_word</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">EXPLICIT_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">relname</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">relname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">f</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">f</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP30"></a><b>&#167;30. BP construction. </b>The following routine should only ever be called from the two above: provided
we stick to that, we ensure the golden rule that {\it every BP has a reversal
and a BP equals its reversal if and only if it is the equality relation}.
</p>
<p class="commentary">It looks a little asymmetric that the "make true function" schema <span class="extract"><span class="extract-syntax">mtf</span></span> is an
argument here, but the "make false function" isn't. That's because it happens
that the implicit relations defined in this section of code generally do
support making-true, but don't support making-false, so that such an argument
would always be <span class="extract"><span class="extract-syntax">NULL</span></span> in practice.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::make_single</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::make_single</span></span>:<br/><a href="6-bp.html#SP27">&#167;27</a>, <a href="6-bp.html#SP28">&#167;28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">family</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">left_term</span><span class="plain-syntax">, </span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">right_term</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mtf</span><span class="plain-syntax">, </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tf</span><span class="plain-syntax">, </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">rn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_family</span><span class="plain-syntax"> = </span><span class="identifier-syntax">family</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> = </span><span class="constant-syntax">Relation_Implicit</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_created_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">debugging_log_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_package</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">handler_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">v2v_bitmap_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">left_term</span><span class="plain-syntax">; </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[1] = </span><span class="identifier-syntax">right_term</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> the </span><span class="extract"><span class="extract-syntax">reversal</span></span><span class="comment-syntax"> and the </span><span class="extract"><span class="extract-syntax">right_way_round</span></span><span class="comment-syntax"> field must be set by the caller</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> for use in code compilation</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_by_routine_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">test_function</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">condition_defn_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_true_function</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mtf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_false_function</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> for use by the A-parser</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">arbitrary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">set_property</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">property_pending_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relates_values_not_objects</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">knowledge_about_bp</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="16-is.html#SP9" class="function-link"><span class="function-syntax">InferenceSubjects::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">relations</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">RELN_SUB</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_binary_predicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">), </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> for optimisation of run-time code</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dynamic_memory</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">initialiser_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">i6_storage_property</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">storage_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allow_function_simplification</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">fast_route_finding</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_ranger</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">record_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> details for particular kinds of relation</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">a_listed_in_predicate</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">same_property</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">comparative_property</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">comparison_sign</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">equivalence_partition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP31"></a><b>&#167;31. The package. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::package</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::package</span></span>:<br/><a href="6-bp.html#SP32">&#167;32</a>, <a href="6-bp.html#SP42">&#167;42</a><br/>Relations - <a href="6-rlt.html#SP9">&#167;9</a>, <a href="6-rlt.html#SP9_13">&#167;9.13</a>, <a href="6-rlt.html#SP20">&#167;20</a>, <a href="6-rlt.html#SP20_3">&#167;20.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null bp"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_package</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_package</span><span class="plain-syntax"> = </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package</span></a><span class="plain-syntax">(</span><a href="27-cm.html#SP5" class="function-link"><span class="function-syntax">Modules::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_created_at</span><span class="plain-syntax">), </span><span class="constant-syntax">RELATIONS_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_package</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP32"></a><b>&#167;32. The handler. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::handler_iname</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::handler_iname</span></span>:<br/>Relations - <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP15_2_9_1">&#167;15.2.9.1</a>, <a href="6-rlt.html#SP15_2_10_1">&#167;15.2.10.1</a>, <a href="6-rlt.html#SP15_2_12_1">&#167;15.2.12.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">handler_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP31" class="function-link"><span class="function-syntax">BinaryPredicates::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">handler_iname</span><span class="plain-syntax"> = </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HANDLER_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">handler_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP33"></a><b>&#167;33. As an INFS. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_get_name_text</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_get_name_text</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP24">&#167;24</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">; </span><span class="comment-syntax"> nameless</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_new_permission_granted</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_new_permission_granted</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL_GENERAL_POINTER</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_make_adj_const_domain</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_make_adj_const_domain</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nc</span><span class="plain-syntax">, </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_complete_model</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_complete_model</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">domain_size</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><a href="16-is.html#SP19" class="function-link"><span class="function-syntax">InferenceSubjects::as_bp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="6-bp.html#SP41" class="function-link"><span class="function-syntax">BinaryPredicates::store_dynamically</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">; </span><span class="comment-syntax"> handled at run-time instead</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="6-bp.html#SP37" class="function-link"><span class="function-syntax">BinaryPredicates::get_form_of_relation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) == </span><span class="constant-syntax">Relation_Equiv</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="6-rlt.html#SP24" class="function-link"><span class="function-syntax">Relations::equivalence_relation_make_singleton_partitions</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">domain_size</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">POSITIVE_KNOWLEDGE_LOOP</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><a href="6-bp.html#SP41" class="function-link"><span class="function-syntax">BinaryPredicates::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">), </span><span class="constant-syntax">ARBITRARY_RELATION_INF</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs0</span><span class="plain-syntax">, *</span><span class="identifier-syntax">infs1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="16-in.html#SP12" class="function-link"><span class="function-syntax">World::Inferences::get_references</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">infs0</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">infs1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-rlt.html#SP25" class="function-link"><span class="function-syntax">Relations::equivalence_relation_merge_classes</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">domain_size</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">infs0</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs1</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="6-rlt.html#SP26" class="function-link"><span class="function-syntax">Relations::equivalence_relation_add_properties</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_check_model</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_check_model</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP28">&#167;28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><a href="16-is.html#SP19" class="function-link"><span class="function-syntax">InferenceSubjects::as_bp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_OtoO</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_Sym_OtoO</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><a href="6-rlt.html#SP28" class="function-link"><span class="function-syntax">Relations::check_OtoO_relation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_OtoV</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_VtoO</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><a href="6-rlt.html#SP28" class="function-link"><span class="function-syntax">Relations::check_OtoV_relation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_emit_element_of_condition</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_emit_element_of_condition</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP29">&#167;29</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t0_s</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"BP in runtime match condition"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_compile_all</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_compile_all</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP30">&#167;30</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::SUBJ_compile</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::SUBJ_compile</span></span>:<br/>Inference Subjects - <a href="16-is.html#SP30">&#167;30</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><a href="16-is.html#SP19" class="function-link"><span class="function-syntax">InferenceSubjects::as_bp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="6-bp.html#SP41" class="function-link"><span class="function-syntax">BinaryPredicates::store_dynamically</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="26-rt.html#SP1" class="function-link"><span class="function-syntax">Routines::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">initialiser_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rtiname</span><span class="plain-syntax"> = </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RELATIONTEST_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">POSITIVE_KNOWLEDGE_LOOP</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><a href="6-bp.html#SP41" class="function-link"><span class="function-syntax">BinaryPredicates::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">), </span><span class="constant-syntax">ARBITRARY_RELATION_INF</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, *</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="16-in.html#SP12" class="function-link"><span class="function-syntax">World::Inferences::get_references_spec</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP42" class="function-link"><span class="function-syntax">BinaryPredicates::mark_as_needed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">rtiname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RELS_ASSERT_TRUE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="14-cfs.html#SP9" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="14-cfs.html#SP9" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="26-rt.html#SP4" class="function-link"><span class="function-syntax">Routines::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_VtoV</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_Sym_VtoV</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="6-rlt.html#SP20" class="function-link"><span class="function-syntax">Relations::compile_vtov_storage</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP34"></a><b>&#167;34. BP and term logging. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::log_term_details</span><span class="plain-syntax">(</span><span class="reserved-syntax">bp_term_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" function(%d): $i\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_of_other</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">called_name</span><span class="plain-syntax">)) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" term %d is '%W'\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">called_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_infs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="16-is.html#SP24" class="function-link"><span class="function-syntax">InferenceSubjects::get_name_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">implies_infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" term %d has domain %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::log</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::log</span></span>:<br/>Core Module - <a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;null-BP&gt;\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"BP%d &lt;%S&gt; - %s way round - %s\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">debugging_log_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax">?</span><span class="string-syntax">"right"</span><span class="plain-syntax">:</span><span class="string-syntax">"wrong"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP37" class="function-link"><span class="function-syntax">BinaryPredicates::form_to_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;2; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><a href="6-bp.html#SP34" class="function-link"><span class="function-syntax">BinaryPredicates::log_term_details</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" test: $i\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">test_function</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" make true: $i\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">make_true_function</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" make false: $i\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_false_function</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" storage property: $Y\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">i6_storage_property</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP35"></a><b>&#167;35. Relation names. </b>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.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">relation</span><span class="plain-syntax">-</span><span class="identifier-syntax">name</span><span class="plain-syntax">&gt; </span><span class="identifier-syntax">internal</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WordAssemblages::compare_with_wording</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_name</span><span class="plain-syntax">), </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">XP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP36"></a><b>&#167;36. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_log_name</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_log_name</span></span>:<br/>Relations - <a href="6-rlt.html#SP15_1_5">&#167;15.1.5</a>, <a href="6-rlt.html#SP29">&#167;29</a><br/>Refine Parse Tree - <a href="9-rpt.html#SP9_5_1">&#167;9.5.1</a><br/>Atomic Propositions - <a href="11-ap.html#SP25_2">&#167;25.2</a><br/>Inference Subjects - <a href="16-is.html#SP22">&#167;22</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">debugging_log_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP37"></a><b>&#167;37. Miscellaneous access routines. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::get_form_of_relation</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_form_of_relation</span></span>:<br/><a href="6-bp.html#SP33">&#167;33</a><br/>Explicit Relations - <a href="6-er.html#SP3">&#167;3</a>, <a href="6-er.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::is_explicit_with_runtime_storage</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::is_explicit_with_runtime_storage</span></span>:<br/>Explicit Relations - <a href="6-er.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_Implicit</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax"> == </span><span class="constant-syntax">Relation_ByRoutine</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::form_to_text</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::form_to_text</span></span>:<br/><a href="6-bp.html#SP34">&#167;34</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">form_of_relation</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_Implicit:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_Implicit"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_OtoO:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_OtoO"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_OtoV:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_OtoV"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_VtoO:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_VtoO"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_VtoV:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_VtoV"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_Sym_OtoO:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_Sym_OtoO"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_Sym_VtoV:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_Sym_VtoV"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_Equiv:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_Equiv"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">Relation_ByRoutine:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"Relation_ByRoutine"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"formless-BP"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_bp_created_at</span><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_created_at</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP38"></a><b>&#167;38. </b>Details of the terms:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::term_kind</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::term_kind</span></span>:<br/><a href="6-bp.html#SP47">&#167;47</a><br/>Relations - <a href="6-rlt.html#SP15_2_9_1">&#167;15.2.9.1</a>, <a href="6-rlt.html#SP15_2_10_1">&#167;15.2.10.1</a>, <a href="6-rlt.html#SP15_2_12_1">&#167;15.2.12.1</a>, <a href="6-rlt.html#SP20_2">&#167;20.2</a>, <a href="6-rlt.html#SP20_3">&#167;20.3</a>, <a href="6-rlt.html#SP20_4">&#167;20.4</a>, <a href="6-rlt.html#SP26">&#167;26</a><br/>The Creator - <a href="9-tc.html#SP1_2_2">&#167;1.2.2</a><br/>Sentence Conversions - <a href="11-sc.html#SP1_8">&#167;1.8</a><br/>Simplifications - <a href="11-sm.html#SP3_2">&#167;3.2</a>, <a href="11-sm.html#SP8">&#167;8</a>, <a href="11-sm.html#SP15">&#167;15</a><br/>Type Check Propositions - <a href="11-tcp.html#SP9">&#167;9</a>, <a href="11-tcp.html#SP11_1">&#167;11.1</a><br/>Assert Propositions - <a href="12-ap.html#SP9_11">&#167;9.11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to find kind of null relation"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="6-bp.html#SP23" class="function-link"><span class="function-syntax">BinaryPredicates::kind_of_term</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[</span><span class="identifier-syntax">t</span><span class="plain-syntax">]));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_term_as_function_of_other</span><button class="popup" onclick="togglePopup('usagePopup31')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup31">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_term_as_function_of_other</span></span>:<br/>Relations - <a href="6-rlt.html#SP15_2_4">&#167;15.2.4</a><br/>Terms - <a href="11-tr.html#SP10">&#167;10</a>, <a href="11-tr.html#SP11">&#167;11</a><br/>Simplifications - <a href="11-sm.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to find function of null relation"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">term_details</span><span class="plain-syntax">[</span><span class="identifier-syntax">t</span><span class="plain-syntax">].</span><span class="element-syntax">function_of_other</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP39"></a><b>&#167;39. </b>Reversing:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_reversal</span><button class="popup" onclick="togglePopup('usagePopup32')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup32">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_reversal</span></span>:<br/><a href="6-bp.html#SP17">&#167;17</a><br/>New Verbs - <a href="6-nv.html#SP9">&#167;9</a><br/>Refine Parse Tree - <a href="9-rpt.html#SP9_5">&#167;9.5</a><br/>The Creator - <a href="9-tc.html#SP1_2_2">&#167;1.2.2</a>, <a href="9-tc.html#SP8">&#167;8</a><br/>Relation Knowledge - <a href="9-rk.html#SP1_1">&#167;1.1</a>, <a href="9-rk.html#SP3">&#167;3</a><br/>Sentence Conversions - <a href="11-sc.html#SP1_13_1">&#167;1.13.1</a><br/>Simplifications - <a href="11-sm.html#SP11">&#167;11</a><br/>Valued Properties - <a href="15-vp.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to find reversal of null relation"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::is_the_wrong_way_round</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::is_the_wrong_way_round</span></span>:<br/>The Creator - <a href="9-tc.html#SP8">&#167;8</a><br/>Relation Knowledge - <a href="9-rk.html#SP3">&#167;3</a><br/>Simplifications - <a href="11-sm.html#SP11">&#167;11</a><br/>Type Check Propositions - <a href="11-tcp.html#SP6_7">&#167;6.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP40"></a><b>&#167;40. </b>For compiling code from conditions:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_test_function</span><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">test_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::can_be_made_true_at_runtime</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::can_be_made_true_at_runtime</span></span>:<br/>Relations - <a href="6-rlt.html#SP15_1_2">&#167;15.1.2</a>, <a href="6-rlt.html#SP15_2">&#167;15.2</a><br/>Explicit Relations - <a href="6-er.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_true_function</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_true_function</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP41"></a><b>&#167;41. </b>For the A-parser. The real code is all elsewhere; note that the
<span class="extract"><span class="extract-syntax">assertions</span></span> 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 <span class="extract"><span class="extract-syntax">instance</span></span> structure in question; that
can't be done if an assertion is about values, so they are stored under the
relation itself.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::allow_arbitrary_assertions</span><button class="popup" onclick="togglePopup('usagePopup35')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup35">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::allow_arbitrary_assertions</span></span>:<br/>Explicit Relations - <a href="6-er.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">arbitrary</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::store_dynamically</span><button class="popup" onclick="togglePopup('usagePopup36')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup36">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::store_dynamically</span></span>:<br/><a href="6-bp.html#SP33">&#167;33</a><br/>Explicit Relations - <a href="6-er.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dynamic_memory</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::relates_values_not_objects</span><button class="popup" onclick="togglePopup('usagePopup37')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup37">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::relates_values_not_objects</span></span>:<br/>Make Assertions - <a href="9-ma.html#SP3_3_34_3">&#167;3.3.34.3</a><br/>Relation Knowledge - <a href="9-rk.html#SP3_2">&#167;3.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relates_values_not_objects</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::as_subject</span><button class="popup" onclick="togglePopup('usagePopup38')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup38">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::as_subject</span></span>:<br/><a href="6-bp.html#SP33">&#167;33</a><br/>Relations - <a href="6-rlt.html#SP20_5_1">&#167;20.5.1</a>, <a href="6-rlt.html#SP28">&#167;28</a><br/>Inferences - <a href="16-in.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">knowledge_about_bp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP42"></a><b>&#167;42. </b>For use when optimising code.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_i6_storage_property</span><button class="popup" onclick="togglePopup('usagePopup39')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup39">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_i6_storage_property</span></span>:<br/>Relations - <a href="6-rlt.html#SP28">&#167;28</a><br/>Explicit Relations - <a href="6-er.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">i6_storage_property</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::allows_function_simplification</span><button class="popup" onclick="togglePopup('usagePopup40')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup40">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::allows_function_simplification</span></span>:<br/>Simplifications - <a href="11-sm.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allow_function_simplification</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">default_rr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::mark_as_needed</span><button class="popup" onclick="togglePopup('usagePopup41')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup41">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::mark_as_needed</span></span>:<br/><a href="6-bp.html#SP33">&#167;33</a><br/>Relations - <a href="6-rlt.html#SP9">&#167;9</a>, <a href="6-rlt.html#SP9_9">&#167;9.9</a>, <a href="6-rlt.html#SP9_11">&#167;9.11</a><br/>New Verbs - <a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a><br/>RValues - <a href="14-rv.html#SP24_3">&#167;24.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">record_needed</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_iname</span><span class="plain-syntax"> = </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RELATION_RECORD_HL</span><span class="plain-syntax">, </span><a href="6-bp.html#SP31" class="function-link"><span class="function-syntax">BinaryPredicates::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">default_rr</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default_rr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MEANINGLESS_RR_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="27-em.html#SP3" class="function-link"><span class="function-syntax">Emit::named_iname_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">default_rr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="27-hr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="27-em.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">record_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::iname</span><button class="popup" onclick="togglePopup('usagePopup42')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup42">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::iname</span></span>:<br/>Relations - <a href="6-rlt.html#SP9_9">&#167;9.9</a>, <a href="6-rlt.html#SP9_11">&#167;9.11</a>, <a href="6-rlt.html#SP9_15">&#167;9.15</a>, <a href="6-rlt.html#SP15">&#167;15</a>, <a href="6-rlt.html#SP15_1">&#167;15.1</a>, <a href="6-rlt.html#SP15_2_1">&#167;15.2.1</a>, <a href="6-rlt.html#SP17">&#167;17</a><br/>RValues - <a href="14-rv.html#SP24_3">&#167;24.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bp_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP43"></a><b>&#167;43. </b>For use with comparative relations.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::set_comparison_details</span><button class="popup" onclick="togglePopup('usagePopup43')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup43">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::set_comparison_details</span></span>:<br/>Measurement Adjectives - <a href="15-ma.html#SP14_2">&#167;14.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sign</span><span class="plain-syntax">, </span><span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">comparison_sign</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sign</span><span class="plain-syntax">; </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">comparative_property</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prn</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP44"></a><b>&#167;44. </b>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:
</p>
<p class="commentary">Loop a variable \(v\) (in the schema, <span class="extract"><span class="extract-syntax">*1</span></span>) over all possible \(x\) such that
\(R(x, t)\), for some fixed \(t\) (in the schema, <span class="extract"><span class="extract-syntax">*1</span></span>).
</p>
<p class="commentary">If we can't do this, it will still manage, but by the brute force method
of looping over all \(x\) in the left domain of \(R\) and testing every possible
\(R(x, t)\).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::write_optimised_loop_schema</span><button class="popup" onclick="togglePopup('usagePopup44')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup44">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::write_optimised_loop_schema</span></span>:<br/>Compile Deferred Propositions - <a href="12-cdp.html#SP5_1_1_1">&#167;5.1.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bp.html#SP44_1" class="named-paragraph-link"><span class="named-paragraph">Try loop ranger optimisation</span><span class="named-paragraph-number">44.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bp.html#SP44_2" class="named-paragraph-link"><span class="named-paragraph">Try loop parent optimisation subject to a proviso</span><span class="named-paragraph-number">44.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP44_1"></a><b>&#167;44.1. </b>Some relations \(R\) provide a "ranger" routine, <span class="extract"><span class="extract-syntax">R</span></span>, which is such that
<span class="extract"><span class="extract-syntax">R(t)</span></span> supplies the first "child" of \(t\) and <span class="extract"><span class="extract-syntax">R(t, n)</span></span> supplies the next
"child" after \(n\). Thus <span class="extract"><span class="extract-syntax">R</span></span> iterates through some linked list of all the
objects \(x\) such that \(R(x, t)\).
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try loop ranger optimisation</span><span class="named-paragraph-number">44.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_ranger</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="12-is.html#SP4_1" class="function-link"><span class="function-syntax">Calculus::Schemas::modify</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for (*1=%s(*2): *1: *1=%s(*2,*1))"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_ranger</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_ranger</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-bp.html#SP44">&#167;44</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP44_2"></a><b>&#167;44.2. </b>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 <span class="extract"><span class="extract-syntax">P</span></span>, is such that <span class="extract"><span class="extract-syntax">P(x) == t</span></span>. For example, \({\it worn-by}(x, t)\)
is true iff \(t\) is the parent of \(x\) and <span class="extract"><span class="extract-syntax">WearerOf(x) == t</span></span>. The proviso
ensures that we don't falsely pick up, say, items carried by \(t\) which
aren't being worn, or aren't even clothing.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try loop parent optimisation subject to a proviso</span><span class="named-paragraph-number">44.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="12-is.html#SP4_1" class="function-link"><span class="function-syntax">Calculus::Schemas::modify</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"objectloop (*1 in *2) if (%s(*1)==parent(*1))"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-bp.html#SP44">&#167;44</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP45"></a><b>&#167;45. The built-in BPs. </b>Here we create spatial relationships, numerical comparisons and a few others:
all of the BPs in the "exceptional one-off cases" part of the classification
above. This happens very early in compilation.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::make_built_in</span><button class="popup" onclick="togglePopup('usagePopup45')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup45">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::make_built_in</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="12-ter.html#SP3" class="function-link"><span class="function-syntax">Calculus::Equality::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="15-tpr.html#SP3" class="function-link"><span class="function-syntax">Properties::ProvisionRelation::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-tur.html#SP3" class="function-link"><span class="function-syntax">Relations::Universal::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="12-qr.html#SP3" class="function-link"><span class="function-syntax">Calculus::QuasinumericRelations::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PL::SpatialRelations::REL_create_initial_stock</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PL::MapDirections::REL_create_initial_stock</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><a href="15-spr2.html#SP1" class="function-link"><span class="function-syntax">Properties::SettingRelations::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="15-spr.html#SP1" class="function-link"><span class="function-syntax">Properties::SameRelations::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="15-cr.html#SP3" class="function-link"><span class="function-syntax">Properties::ComparativeRelations::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="19-lr.html#SP1" class="function-link"><span class="function-syntax">Tables::Relations::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-er.html#SP1" class="function-link"><span class="function-syntax">Relations::Explicit::REL_create_initial_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP46"></a><b>&#167;46. Other property-based relations. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::make_built_in_further</span><button class="popup" onclick="togglePopup('usagePopup46')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup46">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::make_built_in_further</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_6">&#167;2.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="12-ter.html#SP4" class="function-link"><span class="function-syntax">Calculus::Equality::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="15-tpr.html#SP4" class="function-link"><span class="function-syntax">Properties::ProvisionRelation::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-tur.html#SP4" class="function-link"><span class="function-syntax">Relations::Universal::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="12-qr.html#SP4" class="function-link"><span class="function-syntax">Calculus::QuasinumericRelations::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PL::SpatialRelations::REL_create_second_stock</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PL::MapDirections::REL_create_second_stock</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><a href="15-spr2.html#SP7" class="function-link"><span class="function-syntax">Properties::SettingRelations::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="15-spr.html#SP2" class="function-link"><span class="function-syntax">Properties::SameRelations::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="15-cr.html#SP4" class="function-link"><span class="function-syntax">Properties::ComparativeRelations::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="19-lr.html#SP4" class="function-link"><span class="function-syntax">Tables::Relations::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-er.html#SP1" class="function-link"><span class="function-syntax">Relations::Explicit::REL_create_second_stock</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP47"></a><b>&#167;47. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">DECLINE_TO_MATCH</span><span class="plain-syntax"> </span><span class="constant-syntax">1000</span><span class="plain-syntax"> </span><span class="comment-syntax"> not one of the three legal </span><span class="extract"><span class="extract-syntax">*_MATCH</span></span><span class="comment-syntax"> values</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">NEVER_MATCH_SAYING_WHY_NOT</span><span class="plain-syntax"> </span><span class="constant-syntax">1001</span><span class="plain-syntax"> </span><span class="comment-syntax"> not one of the three legal </span><span class="extract"><span class="extract-syntax">*_MATCH</span></span><span class="comment-syntax"> values</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::typecheck</span><button class="popup" onclick="togglePopup('usagePopup47')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup47">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::typecheck</span></span>:<br/>Type Check Propositions - <a href="11-tcp.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="reserved-syntax">tc_problem_kit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tck</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="constant-syntax">DECLINE_TO_MATCH</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_family</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EQUALITY_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="12-ter.html#SP5" class="function-link"><span class="function-syntax">Calculus::Equality::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROVISION_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="15-tpr.html#SP5" class="function-link"><span class="function-syntax">Properties::ProvisionRelation::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNIVERSAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="6-tur.html#SP5" class="function-link"><span class="function-syntax">Relations::Universal::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">QUASINUMERIC_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="12-qr.html#SP5" class="function-link"><span class="function-syntax">Calculus::QuasinumericRelations::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::SpatialRelations::REL_typecheck</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::MapDirections::REL_typecheck</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SETTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="15-spr2.html#SP9" class="function-link"><span class="function-syntax">Properties::SettingRelations::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SAME_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="15-spr.html#SP3" class="function-link"><span class="function-syntax">Properties::SameRelations::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_COMPARISON_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="15-cr.html#SP5" class="function-link"><span class="function-syntax">Properties::ComparativeRelations::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LISTED_IN_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="19-lr.html#SP5" class="function-link"><span class="function-syntax">Tables::Relations::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EXPLICIT_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="6-er.html#SP2" class="function-link"><span class="function-syntax">Relations::Explicit::REL_typecheck</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_of_terms</span><span class="plain-syntax">, </span><span class="identifier-syntax">kinds_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">tck</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"typechecked unknown KBP"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::assert</span><button class="popup" onclick="togglePopup('usagePopup48')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup48">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::assert</span></span>:<br/>Assert Propositions - <a href="12-ap.html#SP9_11">&#167;9.11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_family</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EQUALITY_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="12-ter.html#SP7" class="function-link"><span class="function-syntax">Calculus::Equality::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROVISION_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-tpr.html#SP6" class="function-link"><span class="function-syntax">Properties::ProvisionRelation::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNIVERSAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="6-tur.html#SP6" class="function-link"><span class="function-syntax">Relations::Universal::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">QUASINUMERIC_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="12-qr.html#SP6" class="function-link"><span class="function-syntax">Calculus::QuasinumericRelations::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::SpatialRelations::REL_assert</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::MapDirections::REL_assert</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SETTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-spr2.html#SP10" class="function-link"><span class="function-syntax">Properties::SettingRelations::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SAME_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-spr.html#SP4" class="function-link"><span class="function-syntax">Properties::SameRelations::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_COMPARISON_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-cr.html#SP6" class="function-link"><span class="function-syntax">Properties::ComparativeRelations::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LISTED_IN_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="19-lr.html#SP6" class="function-link"><span class="function-syntax">Tables::Relations::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EXPLICIT_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="6-er.html#SP3" class="function-link"><span class="function-syntax">Relations::Explicit::REL_assert</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj0</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec0</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj1</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec1</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"asserted unknown KBP"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryPredicates::get_i6_schema</span><button class="popup" onclick="togglePopup('usagePopup49')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup49">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::get_i6_schema</span></span>:<br/>Relations - <a href="6-rlt.html#SP15_2_2">&#167;15.2.2</a>, <a href="6-rlt.html#SP15_2_3">&#167;15.2.3</a>, <a href="6-rlt.html#SP15_2_4">&#167;15.2.4</a><br/>Compile Atoms - <a href="12-ca.html#SP6_7">&#167;6.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="reserved-syntax">annotated_i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">asch</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_family</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EQUALITY_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="12-ter.html#SP8" class="function-link"><span class="function-syntax">Calculus::Equality::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROVISION_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-tpr.html#SP7" class="function-link"><span class="function-syntax">Properties::ProvisionRelation::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNIVERSAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="6-tur.html#SP7" class="function-link"><span class="function-syntax">Relations::Universal::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">QUASINUMERIC_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="12-qr.html#SP7" class="function-link"><span class="function-syntax">Calculus::QuasinumericRelations::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::SpatialRelations::REL_compile</span><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::MapDirections::REL_compile</span><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SETTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-spr2.html#SP11" class="function-link"><span class="function-syntax">Properties::SettingRelations::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SAME_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-spr.html#SP5" class="function-link"><span class="function-syntax">Properties::SameRelations::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_COMPARISON_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-cr.html#SP7" class="function-link"><span class="function-syntax">Properties::ComparativeRelations::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LISTED_IN_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="19-lr.html#SP7" class="function-link"><span class="function-syntax">Tables::Relations::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EXPLICIT_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="6-er.html#SP5" class="function-link"><span class="function-syntax">Relations::Explicit::REL_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="identifier-syntax">asch</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"compiled unknown KBP"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">success</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEST_ATOM_TASK:</span><span class="plain-syntax"> </span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">test_function</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK:</span><span class="plain-syntax"> </span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_true_function</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK:</span><span class="plain-syntax"> </span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_false_function</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryPredicates::describe_for_problems</span><button class="popup" onclick="togglePopup('usagePopup50')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup50">Usage of <span class="code-font"><span class="function-syntax">BinaryPredicates::describe_for_problems</span></span>:<br/>Supplementary Quotes - <a href="2-sq.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_family</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EQUALITY_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="12-ter.html#SP9" class="function-link"><span class="function-syntax">Calculus::Equality::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROVISION_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-tpr.html#SP8" class="function-link"><span class="function-syntax">Properties::ProvisionRelation::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNIVERSAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="6-tur.html#SP8" class="function-link"><span class="function-syntax">Relations::Universal::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">QUASINUMERIC_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="12-qr.html#SP8" class="function-link"><span class="function-syntax">Calculus::QuasinumericRelations::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::SpatialRelations::REL_describe_for_problems</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PL::MapDirections::REL_describe_for_problems</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">SPATIAL_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAP_CONNECTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SETTING_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-spr2.html#SP13" class="function-link"><span class="function-syntax">Properties::SettingRelations::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_SAME_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-spr.html#SP7" class="function-link"><span class="function-syntax">Properties::SameRelations::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_COMPARISON_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="15-cr.html#SP8" class="function-link"><span class="function-syntax">Properties::ComparativeRelations::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LISTED_IN_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="19-lr.html#SP8" class="function-link"><span class="function-syntax">Tables::Relations::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EXPLICIT_KBP:</span><span class="plain-syntax"> </span><span class="identifier-syntax">success</span><span class="plain-syntax"> = </span><a href="6-er.html#SP6" class="function-link"><span class="function-syntax">Relations::Explicit::REL_describe_for_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">bp</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"found unknown KBP"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">success</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">success</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_name</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"the %A"</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">relation_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"a"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" relation"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K0</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP38" class="function-link"><span class="function-syntax">BinaryPredicates::term_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K0</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K0</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K1</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP38" class="function-link"><span class="function-syntax">BinaryPredicates::term_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bp</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" (between "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Compare::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K0</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Textual::write_plural</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">K0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Textual::write_articled</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">K0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" and "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Textual::write_articled</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">")"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-ipw.html">&#10094;</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-nl.html">3</a></li><li class="progresschapter"><a href="4-its.html">4</a></li><li class="progresschapter"><a href="5-lp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresscurrent">bp</li><li class="progresssection"><a href="6-rlt.html">rlt</a></li><li class="progresssection"><a href="6-er.html">er</a></li><li class="progresssection"><a href="6-tur.html">tur</a></li><li class="progresssection"><a href="6-nv.html">nv</a></li><li class="progresschapter"><a href="7-ptu.html">7</a></li><li class="progresschapter"><a href="8-ef.html">8</a></li><li class="progresschapter"><a href="9-ita.html">9</a></li><li class="progresschapter"><a href="10-aots.html">10</a></li><li class="progresschapter"><a href="11-itpc.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresschapter"><a href="14-sp.html">14</a></li><li class="progresschapter"><a href="15-pr.html">15</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresschapter"><a href="24-lv.html">24</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="6-rlt.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>