<replaceable>B</replaceable>, <replaceable>C</replaceable> of the
data type:
<itemizedlist>
<listitem>
<para>
<replaceable>A</replaceable> <literal>=</literal>
<replaceable>A</replaceable> is true
(<firstterm>reflexive law</firstterm>)
</para>
</listitem>
<listitem>
<para>
if <replaceable>A</replaceable> <literal>=</literal>
<replaceable>B</replaceable>,
then <replaceable>B</replaceable> <literal>=</literal>
<replaceable>A</replaceable>
(<firstterm>symmetric law</firstterm>)
</para>
</listitem>
<listitem>
<para>
if <replaceable>A</replaceable> <literal>=</literal>
<replaceable>B</replaceable> and <replaceable>B</replaceable>
<literal>=</literal> <replaceable>C</replaceable>,
then <replaceable>A</replaceable> <literal>=</literal>
<replaceable>C</replaceable>
(<firstterm>transitive law</firstterm>)
</para>
</listitem>
</itemizedlist>
</para>
</listitem>
<listitem>
<para>
A <literal><</literal> operator must be a strong ordering relation;
that is, for all non-null values <replaceable>A</replaceable>,
<replaceable>B</replaceable>, <replaceable>C</replaceable>:
<itemizedlist>
<listitem>
<para>
<replaceable>A</replaceable> <literal><</literal>
<replaceable>A</replaceable> is false
(<firstterm>irreflexive law</firstterm>)
</para>
</listitem>
<listitem>
<para>
if <replaceable>A</replaceable> <literal><</literal>
<replaceable>B</replaceable>
and <replaceable>B</replaceable> <literal><</literal>
<replaceable>C</replaceable>,
then <replaceable>A</replaceable> <literal><</literal>
<replaceable>C</replaceable>
(<firstterm>transitive law</firstterm>)
</para>
</listitem>
</itemizedlist>
</para>
</listitem>
<listitem>
<para>
Furthermore, the ordering is total; that is, for all non-null
values <replaceable>A</replaceable>, <replaceable>B</replaceable>:
<itemizedlist>
<listitem>
<para>
exactly one of <replaceable>A</replaceable> <literal><</literal>
<replaceable>B</replaceable>, <replaceable>A</replaceable>
<literal>=</literal> <replaceable>B</replaceable>, and
<replaceable>B</replaceable> <literal><</literal>
<replaceable>A</replaceable> is true
(<firstterm>trichotomy law</firstterm>)
</para>
</listitem>
</itemizedlist>
(The trichotomy law justifies the definition of the comparison support
function, of course.)
</para>
</listitem>
</itemizedlist>
<para>
The other three operators are defined in terms of <literal>=</literal>
and <literal><</literal> in the obvious way, and must act consistently
with them.
</para>
<para>
For an operator family supporting multiple data types, the above laws must
hold when <replaceable>A</replaceable>, <replaceable>B</replaceable>,
<replaceable>C</replaceable> are taken from any data types in the family.
The transitive laws are the trickiest to ensure, as in cross-type
situations they represent statements that the behaviors of two or three
different operators are consistent.
As an example, it would not work to put <type>float8</type>
and <type>numeric</type> into the same operator family, at least not with
the current semantics that <type>numeric</type> values are converted
to <type>float8</type> for comparison to a <type>float8</type>. Because
of the limited accuracy of <type>float8</type>, this means there are
distinct <type>numeric</type> values that will compare equal to the
same <type>float8</type> value, and thus the transitive law would fail.
</para>
<para>
Another requirement for a multiple-data-type family is that any implicit
or binary-coercion casts that are defined between data types included in
the operator family